第一部分 測試環境php
1、 簡要信息
節點機:
操做系統: 版本 CentOS 7.2.1511 內核 3.10.0-327.36.2.el7.x86_64
IP: 10.10.0.1
10.10.0.2
10.10.0.3
10.10.0.4
10.10.0.5
10.10.0.6
管理機:
操做系統: 版本 Ubuntu 16.04.1 LTS 內核 4.4.0-42-generichtml
2、 環境準備
一、節點機關閉selinux。打開selinux配置文件:
$ sudo vim /etc/selinux/config
將SELINUX設爲disabled
二、關閉防火牆。
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalldnode
第二部分 redis cluster介紹mysql
redis3.0 提供cluster的功能,使用redis-trib.rb工具構建Redis Cluster。Redis Cluster採用無中心結構,每一個節點保存數據和整個集羣狀態, 每一個節點都和其餘全部節點鏈接。節點之間使用gossip協議傳播信息以及發現新節點。Redis集羣中節點不做爲client請求的代理,client根據node返回的錯誤信息重定向請求。 linux
1、基本架構
無中心自組織的結構
各節點維護Key->Server的映射關係
Client能夠向任意節點發起請求,節點不會轉發請求,只是重定向Client
若是在Client第一次請求和重定向請求之間,Cluster拓撲發生改變,則第二次重定向請求將被再次重定向,直到找到正確的Server爲止 git
數據分片算法:
Key空間被劃分爲16384個區間,每一個Master節點負責一部分區間。 github
2、水平擴容
支持經過運行時增長Master節點來水平擴容,提高存儲容量,盡力下降命中率波動
存在節點A,須要遷出其中的部分Key區間。新增節點B,接收由節點A遷出的Key區間。
相應Key區間的請求首先仍是會發送給A節點:若是請求爲新建Key則直接重定向到B節點;若是請求不是新建Key且A節點存儲有對應的Key則直接做出響應,不然重定向到B節點
同時Cluster會調用實用工具redis-trib向A節點發送MIGRATE命令,把遷移區間內的全部Key原子的遷移到B節點:同時鎖住A、B節點=》在A節點刪除Key=》在B節點新建Key=》解鎖
運行時動態遷移大尺寸鍵值可能形成響應時延 redis
3、主從備份
沒有主從備份的節點一旦故障,將致使整個集羣失敗:沒法寫入/讀取任何Key;沒法進行數據從新分片。 算法
4、 架構圖
sql
5、功能限制
當Client鏈接到集羣的主體部分時可能有少許的寫丟失,當Client鏈接到集羣的小部分時可能有顯著的寫丟失
複雜的多Key操做(Set求並/求交)不能跨節點操做,能夠經過使用Hash Tag使相關Key強制哈希到同一Server,可是在數據從新分片期間,仍是可能有時間不可用
不支持MULTI/EXEC
第三部分 redis cluster實踐
1、節點機安裝和配置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 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 15000
appendonly yes
啓動並設置成開機啓動。
$ sudo systemctl start redis
$ sudo systemctl enable redis
查看啓動狀況。
$ sudo systemctl is-active redis
active
$ redis-cli ping
PONG
說明啓動成功。
若是沒有成功,能夠到/var/log/redis/redis.log查看日誌。
2、管理機安裝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
3、將節點構建成集羣
使用redis自帶的redis-trib.rb工具實現集羣建立、節點添加/刪除、從新劃分等功能。
在管理機執行命令,構建集羣:
$ 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
命令執行完畢,若是顯示:
[OK] All 16384 slots covered.
則說明集羣構建成功。
4、測試集羣
使用redis-cli登錄任何一個節點,進行保存、刪除、獲取等操做。
$ redis-cli -c -h 10.10.0.1 -p 6379
10.10.0.1:6379> set a 100
-> Redirected to slot [15495] located at 10.10.0.3:6379
OK
10.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:6379
OK
10.10.0.1:6379> get b
"mmm"
10.10.0.1:6379> quit
5、從新分配哈希槽
使用redis-cli登錄任何一個節點,查看當前節點信息,包括節點ID、節點上哈希槽數目、主從等信息。
$ redis-cli -c -h 10.10.0.1 -p 6379
10.10.0.1:6379> cluster nodes
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472613177176 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472613175661 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472613175158 2 connected 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472613177176 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 0-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 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>
在管理機執行命令:
$ redis-trib.rb reshard --from f3ee1b205b449b7ef751a31507173a8b3811e061 --to 23a9df9ac74be3d613d1e75eef47337e84447750 --slots 100 --yes 10.10.0.1:6379
表示由節點10.10.0.1上移動100個哈希槽到節點10.10.0.2上。
命令執行完成,再次查看:
10.10.0.1:6379> cluster nodes
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472613338926 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472613337916 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472613338020 7 connected 0-99 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472613338623 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472613339929 7 connected
注意節點10.10.0.1和10.10.0.2上哈希槽數目變化,說明移動成功。
6、添加新的節點
一、添加新的主節點
先查看現有集羣的節點狀況:
$ redis-cli -c -h 10.10.0.1 -p 6379
10.10.0.1:6379> cluster nodes
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472613338926 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472613337916 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472613338020 7 connected 0-99 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472613338623 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472613339929 7 connected
在管理機執行命令:
$ redis-trib.rb add-node 10.10.0.7:6379 10.10.0.1:6379
表示將節點10.10.0.7添加到節點10.10.0.1所在的集羣。
出現以下信息說明命令執行成功:
[OK] New node added correctly.
再次查看集羣節點狀況:
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472614557239 0 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472614557239 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472614558254 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472614557741 7 connected 0-99 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472614559265 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472614558764 7 connected
10.10.0.7已經做爲主節點在集羣中了。
給新加入的主節點分配哈希槽,就可使用了。
二、添加新的從節點
先查看現有集羣的節點狀況:
$ redis-cli -c -h 10.10.0.1 -p 6379
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472614557239 0 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472614557239 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472614558254 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472614557741 7 connected 0-99 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472614559265 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472614558764 7 connected
在管理機執行命令:
$ redis-trib.rb add-node --slave --master-id c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.8:6379 10.10.0.1:6379
表示將節點10.10.0.8添加到節點10.10.0.1所在的集羣,而且指定主節點爲10.10.0.7。
出現以下信息說明命令執行成功:
[OK] New node added correctly.
再次查看集羣節點狀況:
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472620265061 0 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472620264551 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472620265061 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472620266065 7 connected 0-99 5461-10922
4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472620266266 8 connected
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472620265563 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472620264049 7 connected
10.10.0.8已經做爲從節點在集羣中了,而且主節點是10.10.0.7。
7、刪除集羣中已有的節點
一、刪除從節點
先查看現有集羣的節點狀況:
$ redis-cli -c -h 10.10.0.1 -p 6379
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472620265061 0 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472620264551 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472620265061 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472620266065 7 connected 0-99 5461-10922
4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472620266266 8 connected
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472620265563 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
00ee58ae2ff19dca866d3bbfd7076b61f7eb1761 10.10.0.5:6379 slave 23a9df9ac74be3d613d1e75eef47337e84447750 0 1472620264049 7 connected
在管理機執行命令:
$ redis-trib.rb del-node 10.10.0.1:6379 00ee58ae2ff19dca866d3bbfd7076b61f7eb1761
表示將節點10.10.0.5由節點10.10.0.1所在的集羣中刪除。
出現以下信息說明命令執行成功:
SHUTDOWN the node.
再次查看集羣節點狀況:
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472621229736 0 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472621229224 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472621230753 4 connected
23a9df9ac74be3d613d1e75eef47337e84447750 10.10.0.2:6379 master - 0 1472621231255 7 connected 0-99 5461-10922
4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472621230753 8 connected
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472621230240 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
10.10.0.5已經從集羣中刪除了。
二、刪除主節點
欲刪除的主節點必須是空的。不然刪除時會報錯:
[ERR] Node 10.10.0.2:6379 is not empty! Reshard data away and try again.
必須先將欲刪除的主節點的哈希槽轉移給其餘的主節點,以清空該主節點。
而後就能夠刪除了。操做方法和刪除從節點同樣。不贅述。
8、查看集羣狀態
在管理機執行命令:
$ redis-trib.rb check 10.10.0.1:6379
表示查看節點10.10.0.1所在的集羣的狀態。
出現以下信息說明集羣正常:
[OK] All 16384 slots covered.
9、獲取集羣信息
在管理機執行命令:
$ redis-trib.rb info 10.10.0.1:6379
表示獲取節點10.10.0.1所在的集羣的信息。
出現以下信息說明執行成功:
[OK] 7 keys in 3 masters.
執行成功會列出集羣主節點,每一個主節點保存的鍵個數和所擁有的從節點。
10、節點不可用測試
先查看現有集羣的節點狀況:
$ redis-cli -c -h 10.10.0.1 -p 6379
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master - 0 1472621978887 9 connected 0-99 5461-10922
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472621980916 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472621979893 4 connected
4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 slave c0217425f82b58b897a677621d22d42c68ce9072 0 1472621980404 9 connected
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472621980916 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
將10.10.0.7關機,再次查看集羣節點狀況:
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master,fail - 1472624375231 1472624373622 9 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472624406864 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472624405845 4 connected
4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 master - 0 1472624406864 10 connected 0-99 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472624405342 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
可知節點10.10.0.7已經不可用。原來10.10.0.7的從節點10.10.0.8自動變成主節點,並將10.10.0.7上的哈希槽複製過來。
再將10.10.0.8關機,再次查看集羣節點狀況:
10.10.0.1:6379> cluster nodes
c0217425f82b58b897a677621d22d42c68ce9072 10.10.0.7:6379 master,fail - 1472624375231 1472624373622 9 connected
3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 10.10.0.3:6379 master - 0 1472624861850 3 connected 10923-16383
41d77bba738c1b00ff35f8b1d9757137f7c3ef62 10.10.0.4:6379 slave f3ee1b205b449b7ef751a31507173a8b3811e061 0 1472624862855 4 connected
4dd86339b87818fa8deafc5aabd0c46b4c8603c6 10.10.0.8:6379 master,fail - 1472624827957 1472624827656 10 connected 0-99 5461-10922
012d2e589794478fa87e15fecccaae39523c5f1c 10.10.0.6:6379 slave 3fdf4f00afc66aa254915c3c9aff30c7d1c89f87 0 1472624861348 6 connected
f3ee1b205b449b7ef751a31507173a8b3811e061 10.10.0.1:6379 myself,master - 0 0 1 connected 100-5460
可知節點10.10.0.8已經不可用。此時整個集羣不可用。
10.10.0.1:6379> cluster info
cluster_state:fail
cluster_slots_assigned:16384
cluster_slots_ok:10822
cluster_slots_pfail:0
cluster_slots_fail:5562
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:10
cluster_my_epoch:1
cluster_stats_messages_sent:59550
cluster_stats_messages_received:59389
須要從新構建集羣。
即:集羣中的片的全部節點不能同時不可用,不然整個集羣不可用。
11、客戶端
Ruby客戶端: https://github.com/antirez/re...
Python客戶端:https://github.com/Grokzen/re...
第三部分 參考資料
1、redis官方指南:
http://redis.io/topics/cluste...
http://ifeve.com/redis-cluste...
2、redis集羣方案比較:
http://chong-zh.iteye.com/blo...
http://h2ex.com/1130
http://www.infoq.com/cn/artic...
3、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...
4、redis rpm包倉庫:
https://www.rpmfind.net/linux...
5、redis-trib.rb講解
http://weizijun.cn/2016/01/08...