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

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#