1. 程式人生 > >20181029redis分片+主從叢集學習搭建

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配置:

  1. 設定不同的埠,6379、6380、6381
  2. 開啟叢集,cluster-enabled yes
  3. 指定叢集的配置檔案,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是如何將資料儲存到叢集中的呢?執行步驟:

  1. 接收命令set 123 abc
  2. 通過key(abc)計算出插槽值,然後根據插槽值找到對應的節點。(123的插槽值為:7638)
  3. 重定向到該節點執行命令

整個Redis提供了16384個插槽,也就是說叢集中的每個節點分得的插槽數總和為16384。

./redis-trib.rb 指令碼實現了是將16384個插槽平均分配給了N個節點。

注意:如果插槽數有部分是沒有指定到節點的,那麼這部分插槽所對應的key將不能使用。

計算key的插槽值:

key的有效部分使用CRC16演算法計算出雜湊值,再將雜湊值對16384取餘,得到插槽值。

什麼是有效部分?

  1. 如果key中包含了’{‘符號,且在’{‘符號後存在’}’符號,並且’{‘和’}’之間至少有一個字元,則有效部分是指’{‘和’}’之間的部分;
    1. key={hello}_java的有效部分是hello
  2. 如果不滿足上一條情況,整個key都是有效部分;
    1. 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個插槽了

刪除節點

  1. 假設我們想要刪除6382這個節點
  2. 執行指令碼:./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叢集的高可用

  1. 叢集中的每個節點都會定期的向其它節點發送PING命令,並且通過有沒有收到回覆判斷目標節點是否下線;
  2. 叢集中每一秒就會隨機選擇5個節點,然後選擇其中最久沒有響應的節點放PING命令;
  3. 如果一定時間內目標節點都沒有響應,那麼該節點就認為目標節點疑似下線
  4. 當叢集中的節點超過半數認為該目標節點疑似下線,那麼該節點就會被標記為下線(fail)
  5. 當叢集中的任何一個節點下線,就會導致插槽區有空檔,不完整,那麼該叢集將不可用
  6. 如何解決上述問題?
    1. 在Redis叢集中可以使用主從模式實現某一個節點的高可用
    2. 當該節點(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

依舊可以獲得!

注意

  1. 叢集中的節點只能使用0號資料庫,如果執行SELECT切換資料庫會提示錯誤。