redis-cluster研究和使用(轉)
一:關於redis cluster
1:redis cluster的現狀
作者的目標:Redis Cluster will support up to ~1000 nodes. 贊...
目前redis支援的cluster特性(已測試):
1):節點自動發現
2):slave->master 選舉,叢集容錯
3):Hot resharding:線上分片
4):叢集管理:cluster xxx
5):基於配置(nodes-port.conf)的叢集管理
6):ASK 轉向/MOVED 轉向機制.
2:redis cluster 架構
1)redis-cluster架構圖
架構細節:
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
(4)redis-cluster把所有的物理節點對映到[0-16383]slot上,cluster 負責維護node<->slot<->value
2) redis-cluster選舉:容錯
(1)領著選舉過程是叢集中所有master參與,如果半數以上master節點與master節點通訊超過(cluster-node-timeout),認為當前master節點掛掉.
(2):什麼時候整個叢集不可用(cluster_state:fail)?
a:如果叢集任意master掛掉,且當前master沒有slave.叢集進入fail狀態,也可以理解成叢集的slot對映[0-16383]不完成時進入fail狀態. ps : redis-3.0.0.rc1加入cluster-require-full-coverage引數,預設關閉,開啟叢集相容部分失敗.
b:如果叢集超過半數以上master掛掉,無論是否有slave叢集進入fail狀態.
ps:當叢集不可用時,所有對叢集的操作做都不可用,收到((error) CLUSTERDOWN The cluster is down)錯誤
二:redis cluster的使用
1:安裝redis cluster
1):安裝redis-cluster依賴:redis-cluster的依賴庫在使用時有相容問題,在reshard時會遇到各種錯誤,請按指定版本安裝.
(1)確保系統安裝zlib,否則gem install會報(no such file to load -- zlib)
Java程式碼- #download:zlib-1.2.6.tar
- ./configure
- make
- make install
(2)安裝ruby:version(1.9.2)
Java程式碼- # ruby1.9.2
- cd /path/ruby
- ./configure -prefix=/usr/local/ruby
- make
- make install
- sudo cp ruby /usr/local/bin
(3)安裝rubygem:version(1.8.16)
Java程式碼- # rubygems-1.8.16.tgz
- cd /path/gem
- sudo ruby setup.rb
- sudo cp bin/gem /usr/local/bin
(4)安裝gem-redis:version(3.0.0)
Java程式碼- gem install redis --version 3.0.0
- #由於源的原因,可能下載失敗,就手動下載下來安裝
- #download地址:http://rubygems.org/gems/redis/versions/3.0.0
- gem install -l /data/soft/redis-3.0.0.gem
(5)安裝redis-cluster
Java程式碼- cd /path/redis
- make
- sudo cp /opt/redis/src/redis-server /usr/local/bin
- sudo cp /opt/redis/src/redis-cli /usr/local/bin
- sudo cp /opt/redis/src/redis-trib.rb /usr/local/bin
2:配置redis cluster
1)redis配置檔案結構:
使用包含(include)把通用配置和特殊配置分離,方便維護.
2)redis通用配置.
Java程式碼- #GENERAL
- daemonize no
- tcp-backlog 511
- timeout 0
- tcp-keepalive 0
- loglevel notice
- databases 16
- dir /opt/redis/data
- slave-serve-stale-data yes
- #slave只讀
- slave-read-only yes
- #not use default
- repl-disable-tcp-nodelay yes
- slave-priority 100
- #開啟aof持久化
- appendonly yes
- #每秒一次aof寫
- appendfsync everysec
- #關閉在aof rewrite的時候對新的寫操作進行fsync
- no-appendfsync-on-rewrite yes
- auto-aof-rewrite-min-size 64mb
- lua-time-limit 5000
- #開啟redis叢集
- cluster-enabled yes
- #節點互連超時的閥值
- cluster-node-timeout 15000
- cluster-migration-barrier 1
- slowlog-log-slower-than 10000
- slowlog-max-len 128
- notify-keyspace-events ""
- hash-max-ziplist-entries 512
- hash-max-ziplist-value 64
- list-max-ziplist-entries 512
- list-max-ziplist-value 64
- set-max-intset-entries 512
- zset-max-ziplist-entries 128
- zset-max-ziplist-value 64
- activerehashing yes
- client-output-buffer-limit normal 0 0 0
- client-output-buffer-limit slave 256mb 64mb 60
- client-output-buffer-limit pubsub 32mb 8mb 60
- hz 10
- aof-rewrite-incremental-fsync yes
3)redis特殊配置.
Java程式碼- #包含通用配置
- include /opt/redis/redis-common.conf
- #監聽tcp埠
- port 6379
- #最大可用記憶體
- maxmemory 100m
- #記憶體耗盡時採用的淘汰策略:
- # volatile-lru -> remove the key with an expire set using an LRU algorithm
- # allkeys-lru -> remove any key accordingly to the LRU algorithm
- # volatile-random -> remove a random key with an expire set
- # allkeys-random -> remove a random key, any key
- # volatile-ttl -> remove the key with the nearest expire time (minor TTL)
- # noeviction -> don't expire at all, just return an error on write operations
- maxmemory-policy allkeys-lru
- #aof儲存檔案
- appendfilename "appendonly-6379.aof"
- #不開啟rdb儲存,只用於新增slave過程
- dbfilename dump-6379.rdb
- #cluster配置檔案(啟動自動生成)
- cluster-config-file nodes-6379.conf
- #部署在同一機器的redis例項,把auto-aof-rewrite搓開,因為cluster環境下記憶體佔用基本一致.
- #防止同意機器下瞬間fork所有redis程序做aof rewrite,佔用大量記憶體(ps:cluster必須開啟aof)
- auto-aof-rewrite-percentage 80-100
3:cluster 操作
Java程式碼- 叢集
- CLUSTER INFO 列印叢集的資訊
- CLUSTER NODES 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊。
- 節點
- CLUSTER MEET <ip> <port> 將 ip 和 port 所指定的節點新增到叢集當中,讓它成為叢集的一份子。
- CLUSTER FORGET <node_id> 從叢集中移除 node_id 指定的節點。
- CLUSTER REPLICATE <node_id> 將當前節點設定為 node_id 指定的節點的從節點。
- CLUSTER SAVECONFIG 將節點的配置檔案儲存到硬盤裡面。
- 槽(slot)
- CLUSTER ADDSLOTS <slot> [slot ...] 將一個或多個槽(slot)指派(assign)給當前節點。
- CLUSTER DELSLOTS <slot> [slot ...] 移除一個或多個槽對當前節點的指派。
- CLUSTER FLUSHSLOTS 移除指派給當前節點的所有槽,讓當前節點變成一個沒有指派任何槽的節點。
- CLUSTER SETSLOT <slot> NODE <node_id> 將槽 slot 指派給 node_id 指定的節點,如果槽已經指派給另一個節點,那麼先讓另一個節點刪除該槽>,然後再進行指派。
- CLUSTER SETSLOT <slot> MIGRATING <node_id> 將本節點的槽 slot 遷移到 node_id 指定的節點中。
- CLUSTER SETSLOT <slot> IMPORTING <node_id> 從 node_id 指定的節點中匯入槽 slot 到本節點。
- CLUSTER SETSLOT <slot> STABLE 取消對槽 slot 的匯入(import)或者遷移(migrate)。
- 鍵
- CLUSTER KEYSLOT <key> 計算鍵 key 應該被放置在哪個槽上。
- CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的鍵值對數量。
- CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 個 slot 槽中的鍵。
4:redis cluster 運維操作
1)初始化並構建叢集
(1)啟動叢集相關節點(必須是空節點,beta3後可以是有資料的節點),指定配置檔案和輸出日誌
Java程式碼- redis-server /opt/redis/conf/redis-6380.conf > /opt/redis/logs/redis-6380.log 2>&1 &
- redis-server /opt/redis/conf/redis-6381.conf > /opt/redis/logs/redis-6381.log 2>&1 &
- redis-server /opt/redis/conf/redis-6382.conf > /opt/redis/logs/redis-6382.log 2>&1 &
- redis-server /opt/redis/conf/redis-7380.conf > /opt/redis/logs/redis-7380.log 2>&1 &
- redis-server /opt/redis/conf/redis-7381.conf > /opt/redis/logs/redis-7381.log 2>&1 &
- redis-server /opt/redis/conf/redis-7382.conf > /opt/redis/logs/redis-7382.log 2>&1 &
(2):使用自帶的ruby工具(redis-trib.rb)構建叢集
Java程式碼- #redis-trib.rb的create子命令構建
- #--replicas 則指定了為Redis Cluster中的每個Master節點配備幾個Slave節點
- #節點角色由順序決定,先master之後是slave(為方便辨認,slave的埠比master大1000)
- redis-trib.rb create --replicas 1 10.10.34.14:6380 10.10.34.14:6381 10.10.34.14:6382 10.10.34.14:7380 10.10.34.14:7381 10.10.34.14:7382
(3):檢查叢集狀態
Java程式碼- #redis-trib.rb的check子命令構建
- #ip:port可以是叢集的任意節點
- redis-trib.rb check 10.10.34.14:6380
- [OK] All nodes agree about slots configuration.
- >>> Check for open slots...
- >>> Check slots coverage...
- [OK] All 16384 slots covered.
2):新增新master節點
(1)新增一個master節點:建立一個空節點(empty node),然後將某些slot移動到這個空節點上,這個過程目前需要人工干預
a):根據埠生成配置檔案(ps:establish_config.sh是我自己寫的輸出配置指令碼)
Java程式碼- sh establish_config.sh 6386 > conf/redis-6386.conf
b):啟動節點
Java程式碼- redis-server /opt/redis/conf/redis-6386.conf > /opt/redis/logs/redis-6386.log 2>&1 &
c):加入空節點到叢集
add-node 將一個節點新增到叢集裡面, 第一個是新節點ip:port, 第二個是任意一個已存在節點ip:port
- redis-trib.rb add-node 10.10.34.14:6386 10.10.34.14:6381
node:新節點沒有包含任何資料, 因為它沒有包含任何slot。新加入的加點是一個主節點, 當叢集需要將某個從節點升級為新的主節點時, 這個新節點不會被選中
d):為新節點分配slot
Java程式碼- redis-trib.rb reshard 10.10.34.14:6386
- #根據提示選擇要遷移的slot數量(ps:這裡選擇500)
- How many slots do you want to move (from 1 to 16384)? 500
- #選擇要接受這些slot的node-id
- What is the receiving node ID? f51e26b5d5ff74f85341f06f28f125b7254e61bf
- #選擇slot來源:
- #all表示從所有的master重新分配,
- #或者資料要提取slot的master節點id,最後用done結束
- Please enter all the source node IDs.
- Type 'all' to use all the nodes as source nodes for the hash slots.
- Type 'done' once you entered all the source nodes IDs.
- Source node #1:all
- #列印被移動的slot後,輸入yes開始移動slot以及對應的資料.
- #Do you want to proceed with the proposed reshard plan (yes/no)? yes
- #結束
3):新增新的slave節點
a):前三步操作同新增master一樣
b)第四步:redis-cli連線上新節點shell,輸入命令:cluster replicate 對應master的node-id
Java程式碼- cluster replicate 2b9ebcbd627ff0fd7a7bbcc5332fb09e72788835
note:線上新增slave 時,需要dump整個master程序,並傳遞到slave,再由 slave載入rdb檔案到記憶體,rdb傳輸過程中Master可能無法提供服務,整個過程消耗大量io,小心操作.
例如本次新增slave操作產生的rdb檔案
Java程式碼相關推薦
redis-cluster研究和使用(轉)
最近研究redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,等到redis3 release出來後,換掉memCache 叢集. 轉載請註明出處哈:http://hot66hot.iteye.com/admin/blogs/2050676 一:關於redis cluster 1:r
redis-cluster研究和使用
最近研究redis-cluster,正好搭建了一個環境,遇到了很多坑,系統的總結下,等到redis3 release出來後,換掉memCache 叢集. 轉載請註明出處哈:http://hot66hot.iteye.com/admin/blogs/2050676 一:關於redis cluster 1:
全面剖析Redis Cluster原理和應用
Redis3以上版本叢集方式,使用Ruby解本命令完成叢集、主從配置。前段時間配置redis主從時在配置哨兵模式時卡死了,主要是用YUM安裝的redis導致sentinel.conf配置失敗。現在使用Redis Cluster可以完美解決問題了,並且支援Jed
redis叢集(Redis Cluster)原理和應用
全面剖析Redis Cluster原理和應用 1.Redis Cluster總覽 1.1 設計原則和初衷 在官方文件Cluster Spec中,作者詳細介紹了Redis叢集為什麼要設計成現在的樣子。最核心的目標有三個: 效能:這
redis-cluster安裝和配置
redis-cluster是redis官方寫的叢集功能,目前還未加入穩定版,據說會在3.0上線的時候加入,但是開發版已經包含該功能 開發版的下載方式是git clone https://github.com/antirez/redis.git,前提是安裝了git 安裝配置過
redis cluster配置和簡單初始化
-------------環境安裝------------ #安裝redis wget http://download.redis.io/releases/redis-3.2.5.tar.gz tar xzf redis-3.2.5.tar.gz cd redis-3.2.
Redis叢集研究和實踐(基於redis 3.0.5)
前言 redis 是我們目前大規模使用的快取中介軟體,由於它強大高效而又便捷的功能,得到了廣泛的使用。現在的2.x的穩定版本是2.8.19,也是我們專案中普遍用到的版本。 redis在年初發布了3.0.0,官方支援了redis cluster,也就是叢集。至此結束了redi
虛擬機搭建redis單機版及redis-cluster,使用redis desktop manager和java(eclipse)連接redis過程遇到問題匯總
init clu centos 一律 有用 tex 保護模式 bin service 如果你看到這裏,我默認你已經安裝好了redis,並且已經成功的在虛擬機的Linux系統中ping通。 介紹一下我的環境:VMware虛擬機安裝centos 6.5版的Linux系統,red
predis連接redis sentinel和redis cluster
predis的使用 predis連redis cluster predis連redis sentinel 開發之前都是用phpredis連接redis服務的,後來隨著sentinel和redis cluster的成熟,redis主從都結合sentinel做了高可用,部分數據和並發大的業務使
Redis Cluster集群搭建後,客戶端的連接研究(Spring/Jedis)(待實踐)
turn ron 記錄 redis div println 刪除 clu name 說明:無論是否已經搭建好集群,還是使用什麽樣的客戶端去連接,都是必須把全部IP列表集成進去,然後隨機往其中一個IP寫。 這樣做的好處: 1、隨機IP寫入之後,Redis Cluster代
Linux下Redis的安裝和部署(轉)
分享圖片 rpo service bare moni res linux文件 情況下 遠程管理 一、Redis介紹 Redis是當前比較熱門的NOSQL系統之一,它是一個key-value存儲系統。和Memcache類似,但很大程度補償了Memcache的不足,它支
redis cluster + sentinel詳細過程和錯誤處理三主三備三哨兵
fig 統一 redis diff sch hash 設置密碼 sync var redis cluster + sentinel詳細過程和錯誤處理三主三備三哨兵1、基本架構192.168.70.215 7001 Master + sentinel 27001192.168
【docker】【redis】2.docker上設置redis集群---Redis Cluster部署、管理和測試【集群服務】
測試 details cluster red 集群 tail .net 設置 com 參考地址:https://www.cnblogs.com/zhoujinyi/p/6477133.html https://www.cnblogs.com/cxbhakim/p/91517
Redis Cluster高可用叢集線上遷移操作記錄【轉】
之前介紹了redis cluster的結構及高可用叢集部署過程,今天這裡簡單說下redis叢集的遷移。由於之前的redis cluster叢集環境部署的伺服器效能有限,需要遷移到高配置的伺服器上。考慮到是線上生產環境,決定線上遷移,遷移過程,不中斷服務。操作過程如下: 一、機器環境
【轉】redis-cluster安裝配置
create source make edi onf 存儲 置配 down 配置文件 需要三臺虛擬機(生產環境是3個物理機),分配靜態IP。cluster中共6個節點。3主3從。本文中每個虛擬機上的redis端口:6379 6380。 需要註意的兩點: 3個主節點分別位於3
另外一種獲取redis cluster主從關係和slot分佈的方法
條條大路通羅馬,通過最近學習redis cluster 觀察其輸出,發現了另外一種獲取master-slave關係的方法。 [[email protected] ~]$ cat get_master_slave2.sh redis-cli -h $1 -p
redis的哨兵和cluster在java程式碼中的配置
1.哨兵: applicationContext.xml: <!-- redis sentinel 配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig
Redis叢集的兩種實現方式之Redis Sharding和Redis Cluster
在當前網際網路的背景下,企業的業務需求越來越大,所以一般的業務+資料庫已經不能滿足需求了,所以大批的記憶體式資料庫應運而生,Redis是一個應用比較廣泛的資料庫。用它來實現分散式的操作得心應手。目前有兩種實現分散式的方式,基於Redisx2的Redis Sharding,
redis-cluster的配置和學習
概述操作在/opt/clusters中分別建立6379 6380 6381 6382 6383 6384目錄,用於存放對應的資料檔案將redis.conf配置檔案複製到建立好的目錄中,並進行修改6379修改一下引數:bind 192.168.1.200 port 6379 d
redis cluster配置檔案和叢集狀態詳解
redis cluster命令 叢集(cluster) cluster info 列印叢集的資訊 cluster nodes 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊 節點(node) cluster meet <ip