20181029redis分片+主從叢集學習搭建
(1)所有的redis節點彼此互聯(PING-PONG機制),內部使用二進位制協議優化傳輸速度和頻寬.
(2)節點的fail是通過叢集中超過半數的節點檢測失效時才生效.
(3)客戶端與redis節點直連,不需要中間proxy層.客戶端不需要連線叢集所有節點,連線叢集中任何一個可用節點即可
(4)redis-cluster把所有的物理節點對映到[0-16383]slot(插槽)上,cluster 負責維護node<->slot<->value
首先先將剛才的幾個redis服務關閉。然後清空RDB檔案。保證資料庫為空
進入3個redis目錄,分別修改redis.conf配置:
- 設定不同的埠,6379、6380、6381
- 開啟叢集,cluster-enabled yes
- 指定叢集的配置檔案,cluster-config-file "nodes-xxxx.conf"
4.啟動每個redis
&& 是接下來需要做的事情,進去xxx 啟動redis ,返回上一級目錄
安裝ruby環境
因為redis-trib.rb是有ruby語言編寫的所以需要安裝ruby環境。
yum -y install zlib ruby rubygems
gem install redis
手動安裝:
yum -y install zlib ruby rubygems
rz上傳redis-3.2.1.gem
gem install -l redis-3.2.1.gem
建立叢集
1.進入安裝目錄下的src檔案下
2.執行此指令碼檔案
執行指令碼
./redis-trib.rb create --replicas 0 192.168.56.102:6379 192.168.56.102:6380 192.168.56.102:6381
--replicas 0:指定了從資料的數量為0
注意:這裡不能使用127.0.0.1,否則在Jedis客戶端使用時無法連線到!
確認“yes”
叢集搭建成功
測試
客戶端重新定向
redis-cli -c
set 一個值
退出重定向,進入192.168.206.66:6379 ,獲取123 得到abc,並且跳轉到6380埠
插槽分配,檢視插槽,使用cluster nodes 命令
該資訊反映出了叢集中的每個節點的id、身份、連線數、插槽數等。
當我們執行set abc 123命令時,redis是如何將資料儲存到叢集中的呢?執行步驟:
- 接收命令set 123 abc
- 通過key(abc)計算出插槽值,然後根據插槽值找到對應的節點。(123的插槽值為:7638)
- 重定向到該節點執行命令
整個Redis提供了16384個插槽,也就是說叢集中的每個節點分得的插槽數總和為16384。
./redis-trib.rb 指令碼實現了是將16384個插槽平均分配給了N個節點。
注意:如果插槽數有部分是沒有指定到節點的,那麼這部分插槽所對應的key將不能使用。
計算key的插槽值:
key的有效部分使用CRC16演算法計算出雜湊值,再將雜湊值對16384取餘,得到插槽值。
什麼是有效部分?
- 如果key中包含了’{‘符號,且在’{‘符號後存在’}’符號,並且’{‘和’}’之間至少有一個字元,則有效部分是指’{‘和’}’之間的部分;
- key={hello}_java的有效部分是hello
- 如果不滿足上一條情況,整個key都是有效部分;
- key=hello_java的有效部分是全部
新增節點
新增埠號為6382 的節點,
首先複製一份配置檔案6382 執行: cp 6381 6382 -r
刪除多餘的檔案,並更改配置檔案 port埠號,叢集檔案,cluster-config 三個地方
進入src目錄下執行 redis-trib.rb
執行指令碼:
./redis-trib.rb add-node 192.168.206.66:6382 192.168.206.66:6379
加入成功
但是新的節點並沒有插槽,所以資料也存不進去
需要其他的節點分一些插槽給新的節點
使用命令 ./redis-trib.rb reshard 192.168.206.66:6379
檢視節點資訊 redis-cli cluster nodes
6382 有了1000個插槽了
刪除節點
- 假設我們想要刪除6382這個節點
- 執行指令碼:./redis-trib.rb reshard 192.168.206.66:6382
選擇需要轉移的插槽的數量,因為6382有5128個,所以轉移1000個
檢視節點資訊 redis-cli cluster nodes
6382 已經沒有插槽了 這個時候可以移除6382 節點
./redis-trib.rb del-node 192.168.206.66:6382 66ede2b286aa162fcbba4a5fca92862417fe5b19
檢視節點資訊
6382節點已經被刪除了
分片叢集已經搭建好了 但是存在不足就是如果一臺宕機,資訊將會不可用,這裡再採用主從複製來增加redis叢集的高可用
- 叢集中的每個節點都會定期的向其它節點發送PING命令,並且通過有沒有收到回覆判斷目標節點是否下線;
- 叢集中每一秒就會隨機選擇5個節點,然後選擇其中最久沒有響應的節點放PING命令;
- 如果一定時間內目標節點都沒有響應,那麼該節點就認為目標節點疑似下線;
- 當叢集中的節點超過半數認為該目標節點疑似下線,那麼該節點就會被標記為下線(fail);
- 當叢集中的任何一個節點下線,就會導致插槽區有空檔,不完整,那麼該叢集將不可用;
- 如何解決上述問題?
- 在Redis叢集中可以使用主從模式實現某一個節點的高可用
- 當該節點(master)宕機後,叢集會將該節點的從資料庫(slave)轉變為(master)繼續完成叢集服務;
再複製三臺redis,並且分別更改配置檔案
複製之前,killall redis-server 並且刪除redis裡面所有資料
完成後,啟動六臺redis
建立叢集,指定了從庫數量為1,建立順序為主庫(3個)、從庫(3個):
./redis-trib.rb create --replicas 1 192.168.206.66:6379 192.168.206.66:6380 192.168.206.66:6381 192.168.206.66:6479 192.168.206.66:6480 192.168.206.66:6481
檢視節點資訊
redis-cli cluster nodes
可以測試
redis-cli -c
停掉6380 6480 變為master
再次獲取123
依舊可以獲得!
注意
- 叢集中的節點只能使用0號資料庫,如果執行SELECT切換資料庫會提示錯誤。