Redis-Cluster 5.0.4 集群部署


一、redis-cluster設計

Redis集群搭建的方式有多種,開始使用主從模式做集群,若master宕機需要手動配置slave轉為master;后來為了高可用提出來(redis-sentinel)哨兵模式,該模式下有一個哨兵監視master和slave,若master宕機可自動將slave轉為master,但它也有一個問題,就是不能動態擴充;從redis 3.0之后版本支持redis-cluster集群.

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放到哪個桶中。

1、redis cluster節點分配

 現在我們是三個主節點分別是:A, B, C 三個節點,它們可以是一台機器上的三個端口,也可以是三台不同的服務器。那么,采用哈希槽 (hash slot)的方式來分配16384個slot 的話,它們三個節點分別承擔的slot 區間是:

   節點A覆蓋0-5460;
   節點B覆蓋5461-10922;
   節點C覆蓋10923-16383.

獲取數據:

   如果存入一個值,按照redis cluster哈希槽的算法: CRC16('key')%16384 = 6782。 那么就會把這個key 的存儲分配到 B 上了。同樣,當我連接(A,B,C)任何一個節點想獲取'key'這個key時,也會這樣的算法,然后內部跳轉到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集群就無法繼續正確地提供服務了。

二、redis5.0.4 集群部署

集群中至少應該有奇數個節點,所以至少有三個節點,每個節點至少有一個備份節點,所以下面使用6節點(主節點、備份節點由redis-cluster集群確定)。

1.准備工作

 本文使用兩台centOS7主機,一台機器3個節點,創建出3 master、3 salve 環境,master(192.168.6.42) salve(192.168.6.43)

 2.安裝過程

1.> 安裝支持的庫文件:

yum -y install gcc automake autoconf libtool make

2.> redis安裝

# cd /data/
# tar -zxvf redis-5.0.4.tar.gz 
# cd redis-5.0.4/
# make PREFIX=/data/redis install
# cd src
# cp redis-trib.rb /data/redis/bin/

3.> 創建 Redis 節點.

首先在 192.168.6.42 機器上 創建 redis_cluster 目錄;

# mkdir /data/redis_cluster/

在 redis_cluster 目錄下,創建名為 6379、6380、6381的目錄,並將 redis.conf 拷貝到這三個目錄中.

# mkdir 6379 6380 6381
# cp redis.conf redis_cluster/6379
# cp redis.conf redis_cluster/6380 
# cp redis.conf redis_cluster/6381 

分別修改這三個配置文件,修改如下內容

port 6379      //端口6379,6380,6381 
bind 本機ip     //默認ip為127.0.0.1 需要改為其他節點機器可訪問的ip 否則創建集群時無法訪問對應的端口,無法創建集群 
daemonize yes   //redis后台運行 
pidfile /var/run/redis_6379.pid   //pidfile文件對應6379,6380,6381 
cluster-enabled yes           //開啟集群 把注釋#去掉 
cluster-config-file nodes_6379.conf //集群的配置 配置文件首次啟動自動生成 6379,6380,6381 把注釋#去掉 
cluster-node-timeout 15000       //請求超時 默認15秒,可自行設置  把注釋#去掉 
appendonly yes             //aof日志開啟 有需要就開啟,它會每次寫操作都記錄一條日志

接着在另外一台機器上(192.168.6.43),的操作重復以上三步,只是把目錄改為6382、6383、6384,對應的配置文件也按照這個規則修改即可.

4.> 啟動各節點

第一台機器上執行:

# redis-server /data/redis_cluster/6379/redis.conf
# redis-server /data/redis_cluster/6380/redis.conf
# redis-server /data/redis_cluster/6381/redis.conf

另外一台機器上執行:

# redis-server /data/redis_cluster/6382/redis.conf
# redis-server /data/redis_cluster/6383/redis.conf
# redis-server /data/redis_cluster/6384/redis.conf

5.>  檢查 redis 啟動情況

# ps -ef | grep redis //查看redis啟動情況
# netstat -tnlp | grep redis//查看redis端口開啟情況

 6.> 創建集群

原命令 redis-trib.rb 這個工具目前已經廢棄,使用redis-cli

#使用create命令 --replicas 1 參數表示為每個主節點創建一個從節點,其他參數是實例的地址集合。其中,前三個 ip:port 為第一台機器的節點,剩下三個為第二台機器.

./redis-cli --cluster create --cluster-replicas 1 192.168.6.42:6379 192.168.6.42:6380 192.168.6.42:6381 \
192.168.6.43:6382 192.168.6.43:6383 192.168.6.43:6384

輸入 yes 即可,然后出現ok字樣,說明安裝成功.

在第一台機器上連接集群的6379端口的節點,在另外一台連接6382節點,連接方式為 

# redis-cli -h 192.168.6.42 -c -p 6379

在6379節點執行命令  set name saneri ,執行結果如下:

 然后在另外一台6382端口,查看 key 為 hello 的內容, get hello  ,執行結果如下:

 

參考文檔:https://blog.csdn.net/fengshizty/article/details/51368004#

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM