1、叢集的概念
- 叢集是一組相互獨立的、通過高速網路互聯的計算機,它們構成了一個組,並以單一系統的模式加以管理。一個客戶與叢集相互作用時,叢集像是一個獨立的伺服器。叢集配置是用於提高可用性和可縮放性。當請求到來首先由負載均衡伺服器處理,把請求轉發到另外的一臺伺服器上,redis叢集主要是緩解單臺伺服器同一時間大量請求帶來的的壓力,就算叢集中有伺服器當機,也不影響整體對外提供服務。
- Redis cluster在設計的時候,就考慮到了去中⼼化,去中介軟體,也就是說,叢集中 的每個節點都是平等的關係,都是對等的,每個節點都儲存各⾃的資料和整個集 群的狀態。每個節點都和其他所有節點連線,⽽且這些連線保持活躍,這樣就保 證了我們只需要連線叢集中的任意⼀個節點,就可以獲取到其他節點的資料
- Redis叢集沒有並使⽤傳統的⼀致性雜湊來分配資料,⽽是採⽤另外⼀種叫做雜湊槽 (hash slot)的⽅式來分配的。redis cluster 預設分配了 16384 個slot,當我們 set⼀個key 時,會⽤CRC16演算法來取模得到所屬的slot,然後將這個key 分到雜湊槽區間的節點上,具體演算法就是:CRC16(key) % 16384。
- Redis 叢集會把資料存在⼀個 master 節點,然後在這個 master 和其對應的salve 之間進⾏資料同步。當讀取資料時,也根據⼀致性雜湊演算法到對應的 master 節 點獲取資料。只有當⼀個master 掛掉之後,才會啟動⼀個對應的 salve 節點,充當 master。
2、組織架構
3、環境準備(每個節點都執行)
#建立目錄
mkdir -p /opt/{6380,6381}/{log,pid,etc}
#新增配置檔案
cat >/opt/6380/etc/redis.conf<<-EOF
bind 0.0.0.0
port 6380
daemonize yes
pidfile "/opt/6380/pid/redis.pid"
logfile "/opt/6380/log/redis.log"
dir /opt/6380/
dbfilename dump.rdb
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec
no-appendfsync-on-rewrite no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
EOF
cp /opt/6380/etc/redis.conf /opt/6381/etc/
sed -i "s/6380/6381/g" /opt/6381/etc/redis.conf
#啟動
redis-server /opt/6380/etc/redis.conf
redis-server /opt/6381/etc/redis.conf
#新增防火牆規則
#redis會在當前埠+10000的埠上進行叢集節點間的資料交流。
firewall-cmd --permanent --add-port=6380/tcp
firewall-cmd --permanent --add-port=6381/tcp
firewall-cmd --permanent --add-port=16380/tcp
firewall-cmd --permanent --add-port=16381/tcp
firewall-cmd --reload
4、手動搭建redis叢集
4.1、手動節點發現
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.162 6380
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.163 6380
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.161 6381
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.162 6381
redis-cli -h 192.168.20.161 -p 6380 CLUSTER MEET 192.168.20.163 6381
redis-cli -h 192.168.20.161 -p 6380 CLUSTER NODES
4.2、手動新增主從複製關係
redis-cli -h 192.168.20.161 -p 6381 CLUSTER REPLICATE 9bd06eadbaf32eff955a211a927fa6ab7dc4d56b
redis-cli -h 192.168.20.162 -p 6381 CLUSTER REPLICATE b1b2dfdea90fe6d833f5a83d77a7a8320bd7497b
redis-cli -h 192.168.20.163 -p 6381 CLUSTER REPLICATE d70d68d2b8557d753e2dcfd03b8aa707727adb11
redis-cli -h 192.168.20.161 -p 6380 CLUSTER NODES
4.2、手動分配槽位
#一共16384個槽位,只有當槽位全部分佈完成後,叢集才會正常工作,配置時使用的是槽位的序號,從0開始。
redis-cli -h 192.168.20.161 -p 6380 CLUSTER ADDSLOTS {0..5460}
redis-cli -h 192.168.20.162 -p 6380 CLUSTER ADDSLOTS {5461..10921}
redis-cli -h 192.168.20.163 -p 6380 CLUSTER ADDSLOTS {10922..16383}
redis-cli -h 192.168.20.161 -p 6380 CLUSTER NODES
redis-cli -h 192.168.20.161 -p 6380 CLUSTER INFO
5、驗證叢集的可用性
5.1、測試資料寫入
[root@node01 ~]# cat set.sh
#!/bin/bash
for i in `seq -w 10000`;
do
redis-cli -h 192.168.20.161 -p 6380 -c set k_$i v_$i
done
bash set.sh
5.2、驗證隨機性
redis-cli -c -h 192.168.20.161 -p 6380 keys \* > keys_all.txt
cat keys_all.txt |awk -F "_" '{print $2}'|sort -n | head
5.3、檢查叢集是否健康
#key分佈誤差
redis-cli --cluster rebalance 192.168.20.161:6380
>>> Performing Cluster Check (using node 192.168.20.161:6380)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
*** No rebalancing needed! All nodes are within the 2.00% threshold.
#key分佈情況
redis-cli --cluster info 192.168.20.161:6380
192.168.20.161:6380 (d70d68d2...) -> 3314 keys | 5461 slots | 1 slaves.
192.168.20.162:6380 (9bd06ead...) -> 3348 keys | 5461 slots | 1 slaves.
192.168.20.163:6380 (b1b2dfde...) -> 3338 keys | 5462 slots | 1 slaves.
[OK] 10000 keys in 3 masters.
0.61 keys per slot on average.
6、調整槽位分配錯誤
6.1、使用工具重新分配槽位
#重新分配槽位
redis-cli --cluster reshard 192.168.20.161:6380
#第一次互動:輸入遷出的槽的數量
How many slots do you want to move (from 1 to 16384)? 5461
#第二次互動:輸入接受的ID
What is the receiving node ID? cluster2的6380的ID
#第三次互動:輸入傳送者的ID
Please enter all the source node IDs.
Type 'all' to use all the nodes as source nodes for the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1: cluster1的6380的ID
Source node #2: done
#第四次互動:YES!
#重複上面的操作,將槽位正確分配給 192.168.20.162:6380,192.168.20.16:6380 節點
6.2、pipline
前提條件:
1.瞭解aof格式
2.瞭解新版本redis預設是開啟混合模式的
3.需要修改為普通的aof格式並重啟
4.恢復時使用-c引數無效,需要在每一個節點都執行
命令:
redis-cli -c -h 192.168.20.161 -p 6380 --pipe < redis.aof
redis-cli -c -h 192.168.20.162 -p 6380 --pipe < redis.aof
redis-cli -c -h 192.168.20.163 -p 6380 --pipe < redis.aof