So in practical terms, what you get with Redis Cluster?
- The ability to automatically split your dataset among multiple nodes.
- The ability to continue operations when a subset of the nodes are experiencing failures or are unable to communicate with the rest of the cluster.
如官方文檔所說,redis 集群解決的兩個核心問題就是:
- 節(jié)點生而平等
- 節(jié)點團結共生
1 安裝 Redis
請參考鏈接。
2 搭建集群
2.1 創(chuàng)建文件夾
生產環(huán)境中,我們不會把服務都集中到一臺機器上;所以接下來我們假設有兩臺機器,搭建集群。
每臺機器上 Redis 節(jié)點的端口號為 9001-9003 ,端口號即集群下各實例文件夾。數(shù)據(jù)存放在 端口號/data 文件夾中。
mkdir /usr/local/redis-cluster
cd redis-cluster/
mkdir -p 9001/data 9002/data 9003/data
2.2 復制執(zhí)行腳本
在 /usr/local/redis-cluster 下創(chuàng)建 bin 文件夾,用來存放集群運行腳本,并把安裝好的 Redis 的 src 路徑下的運行腳本拷貝過來。
mkdir redis-cluster/bin
cd /usr/local/redis/src
cp mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump
redis-cli redis-server redis-trib.rb /usr/local/redis-cluster/bin
2.3 復制一個新 Redis 實例
我們現(xiàn)在從已安裝好的 Redis 中復制一個新的實例到 9001 文件夾,并修改 redis.conf 配置。
cp /usr/local/redis/* /usr/local/redis-cluster/9001
啟動每個節(jié)點時配置文件很重要,redis.conf 除了常規(guī)的配置外集群時需要注意:
port 9001(每個節(jié)點的端口號)
daemonize yes
bind 192.168.151.216(綁定當前機器 IP)
dir /usr/local/redis-cluster/9001/data/(數(shù)據(jù)文件存放位置)
pidfile /var/run/redis_9001.pid(pid 9001和port要對應)
cluster-enabled yes(啟動集群模式)
cluster-config-file nodes9001.conf(9001和port要對應)
cluster-node-timeout 15000
appendonly yes
2.4 再復制兩個新 Redis 實例
把 9001 實例 復制到另外兩個文件夾中
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9002
cp -rf /usr/local/redis-cluster/9001/* /usr/local/redis-cluster/9003
2.5 修改 9002/9003 的 redis.conf 文件
進入相應的節(jié)點文件夾,做全局替換。
vim redis.conf
:%s/9001/9002/g
2.6 安裝集群所需軟件
yum install ruby
yum install rubygems
gem install redis
2.7 創(chuàng)建集群
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.151.216:9001
192.168.151.216:9002 192.168.151.216:9003
192.168.151.217:9001 192.168.151.217:9002 192.168.151.217:9003
簡單解釋一下這個命令:調用 ruby 命令來進行創(chuàng)建集群,--replicas 1 表示主從復制比例為 1:1,即一個主節(jié)點對應一個從節(jié)點;然后,默認給我們分配好了每個主節(jié)點和對應從節(jié)點服務,以及 solt 的大小,因為在 Redis 集群中有且僅有 16383 個 solt ,默認情況會給我們平均分配,當然你可以指定,后續(xù)的增減節(jié)點也可以重新分配。
當詢問是否同意集群配置時,輸入 yes 后,會開始集群創(chuàng)建。
2.8 測試集群
通過客戶端命令連接上,通過集群命令看一下狀態(tài)和節(jié)點信息等。
/usr/local/redis-cluster/bin/redis-cli -c -h 192.168.119.131 -p 9001
cluster info
cluster nodes

2.9 Haproxy + Redis
關于Haproxy的配置可以參考鏈接,也可閱讀我上一篇文章。
在 haproxy.cfg 添加集群監(jiān)聽:
listen test1 0.0.0.0:6380
server s1 192.168.139.161:9001 check inter 2000 rise 2 fall 5
server s2 192.168.139.161:9002 check inter 2000 rise 2 fall 5
server s3 192.168.139.161:9003 check inter 2000 rise 2 fall 5
server s4 192.168.139.193:9001 check inter 2000 rise 2 fall 5
server s5 192.168.139.193:9002 check inter 2000 rise 2 fall 5
server s6 192.168.139.193:9003 check inter 2000 rise 2 fall 5
2.10 簡易架構圖

3 總結
redis cluster在設計的時候,就考慮到了去中心化,去中間件,也就是說,集群中的每個節(jié)點都是平等的關系,都是對等的,每個節(jié)點都保存各自的數(shù)據(jù)和整個集群的狀態(tài)。每個節(jié)點都和其他所有節(jié)點連接,而且這些連接保持活躍,這樣就保證了我們只需要連接集群中的任意一個節(jié)點,就可以獲取到其他節(jié)點的數(shù)據(jù)。
Redis 集群沒有并使用傳統(tǒng)的一致性哈希來分配數(shù)據(jù),而是采用另外一種叫做哈希槽 (hash slot)的方式來分配的。redis cluster 默認分配了 16384 個slot,當我們set一個key 時,會用CRC16算法來取模得到所屬的slot,然后將這個key 分到哈希槽區(qū)間的節(jié)點上,具體算法就是:CRC16(key) % 16384。
Redis 集群會把數(shù)據(jù)存在一個 master 節(jié)點,然后在這個 master 和其對應的salve 之間進行數(shù)據(jù)同步。當讀取數(shù)據(jù)時,也根據(jù)一致性哈希算法到對應的 master 節(jié)點獲取數(shù)據(jù)。只有當一個master 掛掉之后,才會啟動一個對應的 salve 節(jié)點,充當 master 。
需要注意的是:必須要3個或以上的主節(jié)點,否則在創(chuàng)建集群時會失??;并且當存活的主節(jié)點數(shù)小于總節(jié)點數(shù)的一半時,整個集群就無法提供服務了。