CentOS-RedisCluster

第一部分 測試環(huán)境
一、 簡要信息節(jié)點機:操作系統(tǒng): 版本 CentOS 7.2.1511 內核 3.10.0-327.36.2.el7.x86_64IP: 10.10.0.110.10.0.210.10.0.310.10.0.410.10.0.510.10.0.6管理機:操作系統(tǒng): 版本 Ubuntu 16.04.1 LTS 內核 4.4.0-42-generic
二、 環(huán)境準備1、節(jié)點機關閉selinux。打開selinux配置文件:$ sudo vim /etc/selinux/config將SELINUX設為disabled2、關閉防火墻。$ sudo systemctl stop firewalld$ sudo systemctl disable firewalld
第二部分 redis cluster介紹
redis3.0 提供cluster的功能,使用redis-trib.rb工具構建Redis Cluster。Redis Cluster采用無中心結構,每個節(jié)點保存數(shù)據(jù)和整個集群狀態(tài), 每個節(jié)點都和其他所有節(jié)點連接。節(jié)點之間使用gossip協(xié)議傳播信息以及發(fā)現(xiàn)新節(jié)點。Redis集群中節(jié)點不作為client請求的代理,client根據(jù)node返回的錯誤信息重定向請求。
一、基本架構? 無中心自組織的結構? 各節(jié)點維護Key->Server的映射關系? Client可以向任意節(jié)點發(fā)起請求,節(jié)點不會轉發(fā)請求,只是重定向Client? 如果在Client第一次請求和重定向請求之間,Cluster拓撲發(fā)生改變,則第二次重定向請求將被再次重定向,直到找到正確的Server為止
數(shù)據(jù)分片算法:Key空間被劃分為16384個區(qū)間,每個Master節(jié)點負責一部分區(qū)間。
二、水平擴容 ? 支持通過運行時增加Master節(jié)點來水平擴容,提升存儲容量,盡力降低命中率波動? 存在節(jié)點A,需要遷出其中的部分Key區(qū)間。新增節(jié)點B,接收由節(jié)點A遷出的Key區(qū)間。? 相應Key區(qū)間的請求首先還是會發(fā)送給A節(jié)點:如果請求為新建Key則直接重定向到B節(jié)點;如果請求不是新建Key且A節(jié)點存儲有對應的Key則直接作出響應,否則重定向到B節(jié)點? 同時Cluster會調用實用工具redis-trib向A節(jié)點發(fā)送MIGRATE命令,把遷移區(qū)間內的所有Key原子的遷移到B節(jié)點:同時鎖住A、B節(jié)點=》在A節(jié)點刪除Key=》在B節(jié)點新建Key=》解鎖? 運行時動態(tài)遷移大尺寸鍵值可能造成響應時延
三、主從備份沒有主從備份的節(jié)點一旦故障,將導致整個集群失?。簾o法寫入/讀取任何Key;無法進行數(shù)據(jù)重新分片。
四、 架構圖


五、功能限制? 當Client連接到集群的主體部分時可能有少量的寫丟失,當Client連接到集群的小部分時可能有顯著的寫丟失 ? 復雜的多Key操作(Set求并/求交)不能跨節(jié)點操作,可以通過使用Hash Tag使相關Key強制哈希到同一Server,但是在數(shù)據(jù)重新分片期間,還是可能有時間不可用 ? 不支持MULTI/EXEC
第三部分 redis cluster實踐
一、節(jié)點機安裝和配置redis下載安裝包并安裝$ wget ftp://195.220.108.108/linux/remi/enterprise/7/remi/x86_64/redis-3.2.4-1.el7.remi.x86_64.rpm$ sudo rpm -ivh redis-3.2.4-1.el7.remi.x86_64.rpm打開配置文件。$ sudo vim /etc/redis.conf修改下列配置項。port 6379bind 0.0.0.0cluster-enabled yescluster-config-file nodes-6379.confcluster-node-timeout 15000appendonly yes
啟動并設置成開機啟動。$ sudo systemctl start redis$ sudo systemctl enable redis
查看啟動情況。$ sudo systemctl is-active redisactive$ redis-cli pingPONG說明啟動成功。如果沒有成功,可以到/var/log/redis/redis.log查看日志。
二、管理機安裝redis-trib.rb下載redis-trib.rb$ wget https://raw.githubusercontent...$ sudo cp redis-trib.rb /usr/local/bin/redis-trib.rb$ sudo chmod 755 /usr/local/bin/redis-trib.rb$ sudo apt install ruby ruby-redis
三、將節(jié)點構建成集群使用redis自帶的redis-trib.rb工具實現(xiàn)集群創(chuàng)建、節(jié)點添加/刪除、重新劃分等功能。在管理機執(zhí)行命令,構建集群:$ redis-trib.rb create --replicas 1 10.10.0.1:6379 10.10.0.2:6379 10.10.0.3:6379 10.10.0.4:6379 10.10.0.5:6379 10.10.0.6:6379 命令執(zhí)行完畢,如果顯示:[OK] All 16384 slots covered.則說明集群構建成功。
四、測試集群使用redis-cli登陸任何一個節(jié)點,進行保存、刪除、獲取等操作。$ redis-cli -c -h 10.10.0.1 -p 637910.10.0.1:6379> set a 100-> Redirected to slot [15495] located at 10.10.0.3:6379OK10.10.0.1:6379> get a"100"10.10.0.1:6379> set b mmm-> Redirected to slot [3300] located at 10.10.0.1:6379OK10.10.0.1:6379> get b"mmm"10.10.0.1:6379> quit
五、重新分配哈希槽使用redis-cli登陸任何一個節(jié)點,查看當前節(jié)點信息,包括節(jié)點ID、節(jié)點上哈希槽數(shù)目、主從等信息。$ redis-cli -c -h 10.10.0.1 -p 637910.10.0.1:6379> cluster nodes3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472613177176 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472613175661 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472613175158 2 connected 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472613177176 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 0-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472613176670 5 connected
命令格式:redis-trib.rb reshard --from <node-id> --to <node-id> --slots <number of slots> --yes <host>:<port>
在管理機執(zhí)行命令:$ redis-trib.rb reshard --from f3ee1b205b449b7ef751a31507173a8b3811e061 --to 23a9df9ac74be3d613d1e75eef47337e84447750 --slots 100 --yes 10.10.0.1:6379表示由節(jié)點10.10.0.1上移動100個哈希槽到節(jié)點10.10.0.2上。
命令執(zhí)行完成,再次查看:10.10.0.1:6379> cluster nodes3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472613338926 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472613337916 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472613338020 7 connected 0-99 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472613338623 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472613339929 7 connected
注意節(jié)點10.10.0.1和10.10.0.2上哈希槽數(shù)目變化,說明移動成功。
六、添加新的節(jié)點1、添加新的主節(jié)點先查看現(xiàn)有集群的節(jié)點情況:$ redis-cli -c -h 10.10.0.1 -p 637910.10.0.1:6379> cluster nodes3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472613338926 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472613337916 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472613338020 7 connected 0-99 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472613338623 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472613339929 7 connected
在管理機執(zhí)行命令:$ redis-trib.rb add-node 10.10.0.7:6379 10.10.0.1:6379表示將節(jié)點10.10.0.7添加到節(jié)點10.10.0.1所在的集群。出現(xiàn)如下信息說明命令執(zhí)行成功:[OK] New node added correctly.
再次查看集群節(jié)點情況:10.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472614557239 0 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472614557239 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472614558254 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472614557741 7 connected 0-99 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472614559265 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472614558764 7 connected
10.10.0.7已經(jīng)作為主節(jié)點在集群中了。給新加入的主節(jié)點分配哈希槽,就可以使用了。
2、添加新的從節(jié)點先查看現(xiàn)有集群的節(jié)點情況:$ redis-cli -c -h 10.10.0.1 -p 637910.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472614557239 0 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472614557239 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472614558254 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472614557741 7 connected 0-99 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472614559265 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472614558764 7 connected
在管理機執(zhí)行命令:$ redis-trib.rb add-node --slave --master-id c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.8:6379 10.10.0.1:6379表示將節(jié)點10.10.0.8添加到節(jié)點10.10.0.1所在的集群,并且指定主節(jié)點為10.10.0.7。出現(xiàn)如下信息說明命令執(zhí)行成功:[OK] New node added correctly.
再次查看集群節(jié)點情況:10.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472620265061 0 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472620264551 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472620265061 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472620266065 7 connected 0-99 5461-109224dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472620266266 8 connected012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472620265563 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472620264049 7 connected
10.10.0.8已經(jīng)作為從節(jié)點在集群中了,并且主節(jié)點是10.10.0.7。
七、刪除集群中已有的節(jié)點1、刪除從節(jié)點先查看現(xiàn)有集群的節(jié)點情況:$ redis-cli -c -h 10.10.0.1 -p 637910.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472620265061 0 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472620264551 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472620265061 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472620266065 7 connected 0-99 5461-109224dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472620266266 8 connected012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472620265563 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-546000ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472620264049 7 connected
在管理機執(zhí)行命令:$ redis-trib.rb del-node 10.10.0.1:6379 00ee58ae2ff19dca866d3bbfd7076b61f7eb1761表示將節(jié)點10.10.0.5由節(jié)點10.10.0.1所在的集群中刪除。出現(xiàn)如下信息說明命令執(zhí)行成功:SHUTDOWN the node.
再次查看集群節(jié)點情況:10.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472621229736 0 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472621229224 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472621230753 4 connected23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472621231255 7 connected 0-99 5461-109224dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472621230753 8 connected012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472621230240 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
10.10.0.5已經(jīng)從集群中刪除了。
2、刪除主節(jié)點欲刪除的主節(jié)點必須是空的。否則刪除時會報錯:[ERR] Node 10.10.0.2:6379 is not empty! Reshard data away and try again.必須先將欲刪除的主節(jié)點的哈希槽轉移給其他的主節(jié)點,以清空該主節(jié)點。然后就可以刪除了。操作方法和刪除從節(jié)點一樣。不贅述。
八、查看集群狀態(tài)在管理機執(zhí)行命令:$ redis-trib.rb check 10.10.0.1:6379表示查看節(jié)點10.10.0.1所在的集群的狀態(tài)。出現(xiàn)如下信息說明集群正常:[OK] All 16384 slots covered.
九、獲取集群信息在管理機執(zhí)行命令:$ redis-trib.rb info 10.10.0.1:6379表示獲取節(jié)點10.10.0.1所在的集群的信息。出現(xiàn)如下信息說明執(zhí)行成功:[OK] 7 keys in 3 masters.執(zhí)行成功會列出集群主節(jié)點,每個主節(jié)點保存的鍵個數(shù)和所擁有的從節(jié)點。
十、節(jié)點不可用測試先查看現(xiàn)有集群的節(jié)點情況:$ redis-cli -c -h 10.10.0.1 -p 637910.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472621978887 9 connected 0-99 5461-109223fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472621980916 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472621979893 4 connected4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472621980404 9 connected012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472621980916 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
將10.10.0.7關機,再次查看集群節(jié)點情況:10.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master,fail - 1472624375231 1472624373622 9 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472624406864 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472624405845 4 connected4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 master - 0 1472624406864 10 connected 0-99 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472624405342 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460可知節(jié)點10.10.0.7已經(jīng)不可用。原來10.10.0.7的從節(jié)點10.10.0.8自動變成主節(jié)點,并將10.10.0.7上的哈希槽復制過來。
再將10.10.0.8關機,再次查看集群節(jié)點情況:10.10.0.1:6379> cluster nodesc0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master,fail - 1472624375231 1472624373622 9 connected3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472624861850 3 connected 10923-1638341d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472624862855 4 connected4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 master,fail - 1472624827957 1472624827656 10 connected 0-99 5461-10922012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472624861348 6 connectedf3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
可知節(jié)點10.10.0.8已經(jīng)不可用。此時整個集群不可用。10.10.0.1:6379> cluster infocluster_state:failcluster_slots_assigned:16384cluster_slots_ok:10822cluster_slots_pfail:0cluster_slots_fail:5562cluster_known_nodes:6cluster_size:3cluster_current_epoch:10cluster_my_epoch:1cluster_stats_messages_sent:59550cluster_stats_messages_received:59389
需要重新構建集群。即:集群中的片的所有節(jié)點不能同時不可用,否則整個集群不可用。
十一、客戶端Ruby客戶端: https://github.com/antirez/re...Python客戶端:https://github.com/Grokzen/re...
第三部分 參考資料
一、redis官方指南: http://redis.io/topics/cluste...http://ifeve.com/redis-cluste...二、redis集群方案比較:http://chong-zh.iteye.com/blo...http://h2ex.com/1130http://www.infoq.com/cn/artic...三、redis集群介紹和搭建測試:http://blog.csdn.net/zhu_tian...http://blog.csdn.net/zhu_tian...http://blog.csdn.net/zhu_tian...http://redisdoc.com/topic/clu...http://www.cnblogs.com/gomysq...四、redis rpm包倉庫:https://www.rpmfind.net/linux...五、redis-trib.rb講解http://weizijun.cn/2016/01/08...

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容