Redis詳細叢集搭建管理_2018_lcf
目前Redis叢集搭建的方式有多種,例如使用zookeeper等,但從redis 3.0之後版本支援redis-cluster叢集,Redis-Cluster採用無中心結構,每個節點儲存資料和整個叢集狀態,每個節點都和其他所有節點連線
其結構特點:
1、所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬。
2、節點的fail是通過叢集中超過半數的節點檢測失效時才生效。
3、客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
4、redis-cluster把所有的物理節點對映到[0-16383]slot上(不一定是平均分配),cluster 負責維護node<->slot<->value。
5、Redis叢集預分好16384個桶,當需要在 Redis 叢集中放置一個 key-value 時,根據 CRC16(key) mod 16384的值,決定將一個key放到哪個桶中。
現在我們是三個主節點分別是:A, B, C 三個節點,它們可以是一臺機器上的三個埠,也可以是三臺不同的伺服器。那麼,採用雜湊槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:
節點A覆蓋0-5460;
節點B覆蓋5461-10922;
節點C覆蓋10923-16383.
A獲取資料:
如果存入一個值,按照redis cluster雜湊槽的演算法: CRC16('key')384 = 6782。 那麼就會把這個key 的儲存分配到 B 上了。同樣,當我連線(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的演算法,然後內部跳轉到B節點上獲取資料
B新增一個主節點:
新增一個節點D,redis cluster的這種做法是從各個節點的前面各拿取一部分slot到D上,我會在接下來的實踐中實驗。大致就會變成這樣:
節點A覆蓋1365-5460
節點B覆蓋6827-10922
節點C覆蓋12288-16383
節點D覆蓋0-1364,5461-6826,10923-12287
同樣刪除一個節點也是類似,移動完成後就可以刪除這個節點了。
2、Redis Cluster主從模式
redis cluster 為了保證資料的高可用性,加入了主從模式,一個主節點對應一個或多個從節點,主節點提供資料存取,從節點則是從主節點拉取資料備份,當這個主節點掛掉後,就會有這個從節點選取一個來充當主節點,從而保證叢集不會掛掉。
上面那個例子裡, 叢集有ABC三個主節點, 如果這3個節點都沒有加入從節點,如果B掛掉了,我們就無法訪問整個叢集了。A和C的slot也無法訪問。
所以我們在叢集建立的時候,一定要為每個主節點都添加了從節點, 比如像這樣, 叢集包含主節點A、B、C, 以及從節點A1、B1、C1, 那麼即使B掛掉系統也可以繼續正確工作。
B1節點替代了B節點,所以Redis叢集將會選擇B1節點作為新的主節點,叢集將會繼續正確地提供服務。 當B重新開啟後,它就會變成B1的從節點。
不過需要注意,如果節點B和B1同時掛了,Redis叢集就無法繼續正確地提供服務了。
--------------------------------------------------------
二、redis叢集的搭建
叢集中至少應該有奇數個節點,所以至少有三個節點,每個節點至少有一個備份節點,所以下面使用6節點(主節點、備份節點由redis-cluster叢集確定)
• 部署環境,六臺redis伺服器,三主三從
• 安裝包,6臺都安裝redis
#yum -y install gcc gcc-c++
#tar -zxvf redis-4.0.8.tar.gz //網上下載
#cd redis-4.0.8/
#make
#make install
#/redis-4.0.8/utils/install_server.sh
#/usr/local/bin/redis-server /etc/redis/6379.conf //啟動服務
---選擇其中一臺安裝叢集服務管理軟體
#yum -y install ruby rubygems //yum自帶
#rpm -ivh --nodeps ruby-devel-2.0.0.648-30.el7.x86_64.rpm //網上下載
#gem install redis-3.2.1.gem //網上下載
• 修改配置檔案
#vim /etc/redis/redis.conf
bind IP 地址 // 只寫物理介面 IP 地址
daemonize yes // 守護程序方式執行
port xxxx // 埠號不要使用預設的 6379
cluster-enabled yes // 開啟叢集
cluster-config-file nodes.conf // 叢集的配置檔案不要使用預設的名稱
cluster-node-timeout 5000 // 請求超時 5 秒
• 建立redis叢集
#cd /tmp/redis-4.0.8/src/ //進入到解壓後的redis-4.0.8裡的src目錄下
#./redis-trib.rb create --replicas 1 192.168.4.51:6351 192.168.4.52:6352 192.168.4.53:6353 192.168.4.54:6354 192.168.4.55:6355 192.168.4.56:6356
//create --replicas 1表示建立一個redis叢集 其中--replicas 1 表示 自動為每一個 master 節點分配一個 slave 節點
[[email protected] ~]# /tmp/redis-4.0.8/src/redis-trib.rb create --replicas 1 192.168.4.51:6351 192.168.4.52:6352 192.168.4.53:6353 192.168.4.54:6354 192.168.4.55:6355 192.168.4.56:6356
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.4.51:6351
192.168.4.52:6352
192.168.4.53:6353
Adding replica 192.168.4.55:6355 to 192.168.4.51:6351
Adding replica 192.168.4.56:6356 to 192.168.4.52:6352
Adding replica 192.168.4.54:6354 to 192.168.4.53:6353
M: c40ddf7cf748d0d903b3e8dce415790ec36087c2 192.168.4.51:6351
slots:0-5460 (5461 slots) master
M: 6c80c08f729deda1e8a9425339eb5aec3315158c 192.168.4.52:6352
slots:5461-10922 (5462 slots) master
M: 1dc6fe4c914b6436b72787a283c881b6d374442c 192.168.4.53:6353
slots:10923-16383 (5461 slots) master
S: 7b8d034b1e9b842dcdc75cf317aef925476fb194 192.168.4.54:6354
replicates 1dc6fe4c914b6436b72787a283c881b6d374442c
S: 0fa48365a5b6eeec79ca1db5cfe804ab8d53ddd5 192.168.4.55:6355
replicates c40ddf7cf748d0d903b3e8dce415790ec36087c2
S: 30a497290d03eb92bf326514e943341ff01c98f4 192.168.4.56:6356
replicates 6c80c08f729deda1e8a9425339eb5aec3315158c
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 192.168.4.51:6351)
M: c40ddf7cf748d0d903b3e8dce415790ec36087c2 192.168.4.51:6351
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 0fa48365a5b6eeec79ca1db5cfe804ab8d53ddd5 192.168.4.55:6355
slots: (0 slots) slave
replicates c40ddf7cf748d0d903b3e8dce415790ec36087c2
M: 6c80c08f729deda1e8a9425339eb5aec3315158c 192.168.4.52:6352
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 30a497290d03eb92bf326514e943341ff01c98f4 192.168.4.56:6356
slots: (0 slots) slave
replicates 6c80c08f729deda1e8a9425339eb5aec3315158c
S: 7b8d034b1e9b842dcdc75cf317aef925476fb194 192.168.4.54:6354
slots: (0 slots) slave
replicates 1dc6fe4c914b6436b72787a283c881b6d374442c
M: 1dc6fe4c914b6436b72787a283c881b6d374442c 192.168.4.53:6353
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
• 測試叢集
-在其中任意一臺上儲存資料 ,在其他任意一臺上都可以獲取資料,-c叢集模式登陸
[[email protected] /]# redis-cli -c -p 6352 -h 192.168.4.52 //登陸時必須加-c使用叢集模式建立或檢視變數
192.168.4.51:6351> set tt nice
-> Redirected to slot [14990] located at 192.168.4.53:6353
OK
------
[[email protected] 6379]# redis-cli -c -p 6355 -h 192.168.4.55
192.168.4.55:6355> get tt
-> Redirected to slot [14990] located at 192.168.4.53:6353
"nice"
退出redis叢集狀態重生加入新redis叢集(清空資料\刪除nodes.conf)
1--清空資料
[email protected] 6379]# redis-cli -p 6353 -h 192.168.4.53
192.168.4.53:6353> FLUSHALL
OK
192.168.4.53:6353> SAVE
OK
192.168.4.53:6353> exit
2--刪除nodes.conf
[[email protected] ~]# cd /var/lib/redis/6379/
[[email protected] 6379]# ls
dump.rdb nodes.conf
[[email protected] 6379]# rm -rf nodes.conf
1--重啟服務
[[email protected] 6379]# redis6379 restart
Stopping ...
Redis stopped
Starting Redis server...
3--叢集管理
redis-cli 命令
• 檢視命令幫助
– redis-cli -h
• 常用選項
– -h IP 地址
– -p 埠
– -c
------------------------
[[email protected] ~]# find / -type f -name redis-trib.rb
/tmp/redis-4.0.8/src/redis-trib.rb
• 語法格式
– Redis-trib.rb
選項 引數
• 選項
1、create:建立叢集
2、check:檢查叢集
3、info:檢視叢集資訊
4、fix:修復叢集
5、reshard:線上遷移slot
6、rebalance:平衡叢集節點slot數量
7、add-node:將新節點加入叢集
8、del-node:從叢集中刪除節點
9、set-timeout:設定叢集節點間心跳連線的超時時間
10、call:在叢集全部節點上執行命令
11、import:將外部redis資料匯入叢集
-------------------------
-----------------------------------------------------redis cluster命令
redis cluster命令
叢集(cluster)
cluster info 列印叢集的資訊
cluster nodes 列出叢集當前已知的所有節點(node),以及這些節點的相關資訊
節點(node)
cluster meet <ip> <port> 將ip和port所指定的節點新增到叢集當中,讓它成為叢集的一份子
cluster forget <node_id> 從叢集中移除node_id指定的節點
cluster replicate <node_id> 將當前節點設定為node_id指定的節點的從節點
cluster saveconfig 將節點的配置檔案儲存到硬盤裡面
cluster slaves <node_id> 列出該slave節點的master節點
cluster set-config-epoch 強制設定configEpoch
槽(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)
鍵(key)
cluster keyslot <key> 計算鍵key應該被放置在哪個槽上
cluster countkeysinslot <slot> 返回槽slot目前包含的鍵值對數量
cluster getkeysinslot <slot> <count> 返回count個slot槽中的鍵
其它
cluster myid 返回節點的ID
cluster slots 返回節點負責的slot
cluster reset 重置叢集,慎用
redis cluster配置
cluster-enabled yes
如果配置yes則開啟叢集功能,此redis例項作為叢集的一個節點,否則,它是一個普通的單一的redis例項。
cluster-config-file nodes-6379.conf
雖然此配置的名字叫"叢集配置檔案",但是此配置檔案不能人工編輯,它是叢集節點自動維護的檔案,主要用於記錄叢集中有哪些節點、他們的狀態以及一些持久化引數等,方便在重啟時恢復這些狀態。通常是在收到請求之後這個檔案就會被更新。
cluster-node-timeout 15000
這是叢集中的節點能夠失聯的最大時間,超過這個時間,該節點就會被認為故障。如果主節點超過這個時間還是不可達,則用它的從節點將啟動故障遷移,升級成主節點。注意,任何一個節點在這個時間之內如果還是沒有連上大部分的主節點,則此節點將停止接收任何請求。一般設定為15秒即可。
cluster-slave-validity-factor 10
如果設定成0,則無論從節點與主節點失聯多久,從節點都會嘗試升級成主節點。如果設定成正數,則cluster-node-timeout乘以cluster-slave-validity-factor得到的時間,是從節點與主節點失聯後,此從節點資料有效的最長時間,超過這個時間,從節點不會啟動故障遷移。假設cluster-node-timeout=5,cluster-slave-validity-factor=10,則如果從節點跟主節點失聯超過50秒,此從節點不能成為主節點。注意,如果此引數配置為非0,將可能出現由於某主節點失聯卻沒有從節點能頂上的情況,從而導致叢集不能正常工作,在這種情況下,只有等到原來的主節點重新迴歸到叢集,叢集才恢復運作。
cluster-migration-barrier 1
主節點需要的最小從節點數,只有達到這個數,主節點失敗時,它從節點才會進行遷移。更詳細介紹可以看本教程後面關於副本遷移到部分。
cluster-require-full-coverage yes
在部分key所在的節點不可用時,如果此引數設定為"yes"(預設值), 則整個叢集停止接受操作;如果此引數設定為”no”,則叢集依然為可達節點上的key提供讀操作。
-----------------------------------------------------redis cluster命令
----檢視狀態
[[email protected] ~]# redis-cli -c -p 6351 -h 192.168.4.51 //-c管理叢集模式登陸
192.168.4.51:6351>cluster info //檢視叢集資訊
....
192.168.4.51:6351>cluster nodes //檢視本機資訊
...
[[email protected] src]# /tmp/redis-4.0.8/src/redis-trib.rb check 192.168.4.56:6356 //檢視節點狀態
---將新主機新增到叢集中
/tmp/redis-4.0.8/src/redis-trib.rb add-node 新主機 Ip: 埠 192.168.4.51:6351
#cp /tmp/redis-4.0.8/src/redis-trib.rb /sbin/
[[email protected] src]# redis-trib.rb check 192.168.4.57:6357
>>> Performing Cluster Check (using node 192.168.4.57:6357)
M: f6e0f4c0a0f44e60e0541e21fb942f23667159a0 192.168.4.57:6357
slots: (0 slots) master
0 additional replica(s)
S: 7b8d034b1e9b842dcdc75cf317aef925476fb194 192.168.4.54:6354
slots: (0 slots) slave
replicates 1dc6fe4c914b6436b72787a283c881b6d374442c
S: 0fa48365a5b6eeec79ca1db5cfe804ab8d53ddd5 192.168.4.55:6355
slots: (0 slots) slave
replicates c40ddf7cf748d0d903b3e8dce415790ec36087c2
S: 6c80c08f729deda1e8a9425339eb5aec3315158c 192.168.4.52:6352
slots: (0 slots) slave
replicates 30a497290d03eb92bf326514e943341ff01c98f4
M: 30a497290d03eb92bf326514e943341ff01c98f4 192.168.4.56:6356
slots:5461-10922 (5462 slots) master
1 additional replica(s)
M: c40ddf7cf748d0d903b3e8dce415790ec36087c2 192.168.4.51:6351
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 1dc6fe4c914b6436b72787a283c881b6d374442c 192.168.4.53:6353
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
----對叢集重新分片reshard
[[email protected] 6379]# redis-cli -c -p 6357 -h 192.168.4.57
192.168.4.57:6357> CLUSTER NODES //新增完後檢視資訊,當成主了,但沒有分配有位置,這時要重新切片
7b8d034b1e9b842dcdc75cf317aef925476fb194 192.168.4.54:[email protected] slave 1dc6fe4c914b6436b72787a283c881b6d374442c 0 1528529256572 3 connected
0fa48365a5b6eeec79ca1db5cfe804ab8d53ddd5 192.168.4.55:[email protected] slave c40ddf7cf748d0d903b3e8dce415790ec36087c2 0 1528529256000 1 connected
f6e0f4c0a0f44e60e0541e21fb942f23667159a0 192.168.4.57:[email protected] myself,master - 0 1528529254000 0 connected
6c80c08f729deda1e8a9425339eb5aec3315158c 192.168.4.52:[email protected] slave 30a497290d03eb92bf326514e943341ff01c98f4 0 1528529255570 7 connected
30a497290d03eb92bf326514e943341ff01c98f4 192.168.4.56:[email protected] master - 0 1528529256071 7 connected 5461-10922
c40ddf7cf748d0d903b3e8dce415790ec36087c2 192.168.4.51:[email protected] master - 0 1528529255067 1 connected 0-5460
1dc6fe4c914b6436b72787a283c881b6d374442c 192.168.4.53:[email protected] master - 0 1528529256072 3 connected 10923-16383
-----------
//檢視到自己的ID號:f6e0f4c0a0f44e60e0541e21fb942f23667159a0
[[email protected] src]# redis-trib.rb reshard 192.168.4.51:6351
....
How many slots do you want to move (from 1 to 16384)? 4000 //詢問要分配多少個位置給新主
.....
What is the receiving node ID? f6e0f4c0a0f44e60e0541e21fb942f23667159a0 //填定剛新增的57新主節點ID
.....
Source node #1:all //輸入all,從各個主那裡拆分些位置給新主
.......
# ./redis-trib.rb add-node --slave --master-id id 值
----新增從節點
# ./redis-trib.rb add-node --slave --master-id id值 從節點 ip: 埠 192.168.4.51:6351
[[email protected] src]# redis-trib.rb add-node --slave 192.168.4.58:6358 192.168.4.57:6357
....
--移除從節點,
# redis-trib.rb del-node 192.168.4.51:6351 被移除節點主機 id
[[email protected] src]# redis-trib.rb del-node 192.168.4.58:6358 eb35b17e51876756de9a66d444ea474c883ea066
>>> Removing node eb35b17e51876756de9a66d444ea474c883ea066 from cluster 192.168.4.58:6358
>>> Sending CLUSTER FORGET messages to the cluster...
>>> SHUTDOWN the node.
--移除主節點
--->首先要先移除這個主節點上的位置
[[email protected] src]# redis-trib.rb reshard 192.168.4.51:6357 (任意寫一臺)
>>> Performing Cluster Check (using node 192.168.4.57:6357)
M: f6e0f4c0a0f44e60e0541e21fb942f23667159a0 192.168.4.57:6357
slots:0-1332,5461-6794,10923-12255 (4000 slots) master
0 additional replica(s)
S: 7b8d034b1e9b842dcdc75cf317aef925476fb194 192.168.4.54:6354
slots: (0 slots) slave
replicates 1dc6fe4c914b6436b72787a283c881b6d374442c
S: 0fa48365a5b6eeec79ca1db5cfe804ab8d53ddd5 192.168.4.55:6355
slots: (0 slots) slave
replicates c40ddf7cf748d0d903b3e8dce415790ec36087c2
S: 6c80c08f729deda1e8a9425339eb5aec3315158c 192.168.4.52:6352
slots: (0 slots) slave
replicates 30a497290d03eb92bf326514e943341ff01c98f4
M: 30a497290d03eb92bf326514e943341ff01c98f4 192.168.4.56:6356
slots:6795-10922 (4128 slots) master
1 additional replica(s)
M: c40ddf7cf748d0d903b3e8dce415790ec36087c2 192.168.4.51:6351
slots:1333-5460 (4128 slots) master
1 additional replica(s)
M: 1dc6fe4c914b6436b72787a283c881b6d374442c 192.168.4.53:6353
slots:12256-16383 (4128 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 4000 //填寫要移出多個位置
What is the receiving node ID? c40ddf7cf748d0d903b3e8dce415790ec36087c2 //位置移動哪臺主節點上,
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:f6e0f4c0a0f44e60e0541e21fb942f23667159a0 //要移主節點的ID
Source node #2:done //done表示就一個id
...
Do you want to proceed with the proposed reshard plan (yes/no)? yes
...
----------redis 清快取
[[email protected]_fitcome_bak shell]# redis-cli -h 172.17.171.10 -p 6388 -a Fitcom2015jiankangyun123456QWERTyuiop
172.17.171.10:6388> dbsize
(integer) 8496
172.17.171.10:6388> config set stop-writes-on-bgsave-error no
OK
172.17.171.10:6388> FLUSHALL
OK
172.17.171.10:6388> quit