Redis的哨兵模式基本已經可以實現(xiàn)高可用,讀寫分離 ,但是在這種模式下每臺 Redis 服務器都存儲相同的數據,很浪費內存,所以在 redis3.0上加入了Cluster 集群模式,實現(xiàn)了 Redis 的分布式存儲,也就是說每臺 Redis 節(jié)點上存儲不同的內容。下面是Cluster 集群模式的一些特點:
- Sentinel模式基本可以滿足一般生產的需求,具備高可用性。但是當數據量過大到一臺服務器存放不下的情況時,主從模式或sentinel模式就不能滿足需求了,這個時候需要對存儲的數據進行分片,將數據存儲到多個Redis實例中。cluster模式的出現(xiàn)就是為了解決單機Redis容量有限的問題,將Redis的數據根據一定的規(guī)則分配到多臺機器。
- Cluster可以說是sentinel+主從模式的結合體,通過cluster可以實現(xiàn)主從和master重選功能,所以如果配置兩個副本三個分片的話,就需要六個Redis實例。因為Redis的數據是根據一定規(guī)則分配到cluster的不同機器的,當數據量過大時,可以新增機器進行擴容。
- 使用集群,只需要將redis配置文件中的cluster-enable配置打開即可,每個集群中至少需要三個主數據庫才能正常運行,新增節(jié)點非常方便。
下面是Cluster 集群模式的架構示意圖。
可以看到,Cluster集群模式有如下一些特點:
- 多個redis節(jié)點網絡互聯(lián),數據共享;
- 所有的節(jié)點都是一主一從(也可以是一主多從),其中從不提供服務,僅作為備用;
- 不支持同時處理多個key(如MSET/MGET),因為redis需要把key均勻分布在各個節(jié)點上,并發(fā)量很高的情況下同時創(chuàng)建key-value會降低性能并導致不可預測的行為;
- 支持在線增加、刪除節(jié)點;
- 客戶端可以連接任何一個主節(jié)點進行讀寫。
#環(huán)境說明
為了模擬Cluster 集群模式,我們需要準備至少三臺機器,然后分別開啟三個redis服務,即每個節(jié)點都要是一主兩從模式。
| IP | 主機名 | 端口 | 節(jié)點 | |---|---|---| | 192.168.182.110 | local-168-182-110 | 7001, 70002, 7003 | node1 | | 192.168.182.111 | local-168-182-111 | 7001, 70002, 7003 | node2 | | 192.168.182.112 | local-168-182-112 | 7001, 70002, 7003 | node3 |
#修改配置
接下來,我們基于主從模式的配置進行如下修改。
# 創(chuàng)建存儲目錄
mkdir -p /opt/software/redis-7.0.3/cluster/redis_{7001..7003}
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7001.conf
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7002.conf
cp /usr/local/redis/redis.conf /usr/local/redis/cluster_redis_7003.conf
chown -R redis:redis /usr/local/redis ;chown -R redis:redis /opt/software/redis-7.0.3/cluster
然后,修改位于/usr/local/redis/cluster_redis_7001.conf
目錄的配置文件
cluster_redis_7001.conf。
# 【注意】節(jié)點不一樣,IP不一樣,記得修改這個bind配置
bind 192.168.182.110
port 7001
daemonize yes
pidfile "/var/run/cluster_redis_7001.pid"
logfile "/usr/local/redis/cluster_redis_7001.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7001"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 開啟集群模式
cluster-enabled yes
# 雖然此配置的名字叫"集群配置文件",但是此配置文件不能人工編輯,它是集群節(jié)點自動維護的文件,主要用于記錄集群中有哪些節(jié)點、他們的狀態(tài)以及一些持久化參數等,方便在重啟時恢復這些狀態(tài)。通常是在收到請求之后這個文件就會被更新。
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
然后,修改配置文件cluster_redis_7002.conf
,位于/usr/local/redis/cluster_redis_7002.conf
目錄下。
# 【注意】節(jié)點不一樣,IP不一樣,記得修改這個bind配置
bind 192.168.182.110
port 7002
daemonize yes
pidfile "/var/run/cluster_redis_7002.pid"
logfile "/usr/local/redis/cluster_redis_7002.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7002"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 配置yes則開啟集群功能,此redis實例作為集群的一個節(jié)點,否則,它是一個普通的單一的redis實例。
cluster-enabled yes
# 雖然此配置的名字叫"集群配置文件",但是此配置文件不能人工編輯,它是集群節(jié)點自動維護的文件,主要用于記錄集群中有哪些節(jié)點、他們的狀態(tài)以及一些持久化參數等,方便在重啟時恢復這些狀態(tài)。通常是在收到請求之后這個文件就會被更新。
cluster-config-file nodes_7002.conf
cluster-node-timeout 15000
然后,繼續(xù)修改配置文件cluster_redis_7003.conf
,文件目錄位于/usr/local/redis/cluster_redis_7003.conf
。
# 【注意】節(jié)點不一樣,IP不一樣,記得修改這個bind配置
bind 192.168.182.110
port 7003
daemonize yes
pidfile "/var/run/cluster_redis_7003.pid"
logfile "/usr/local/redis/cluster_redis_7003.log"
dir "/opt/software/redis-7.0.3/cluster/redis_7003"
#replicaof 192.168.182.110 6379
masterauth "123456"
requirepass "123456"
appendonly yes
# 配置yes則開啟集群功能,此redis實例作為集群的一個節(jié)點,否則,它是一個普通的單一的redis實例。
cluster-enabled yes
# 雖然此配置的名字叫"集群配置文件",但是此配置文件不能人工編輯,它是集群節(jié)點自動維護的文件,主要用于記錄集群中有哪些節(jié)點、他們的狀態(tài)以及一些持久化參數等,方便在重啟時恢復這些狀態(tài)。通常是在收到請求之后這個文件就會被更新。
cluster-config-file nodes_7003.conf
cluster-node-timeout 15000
其它兩臺機器配置與192.168.182.110
一致,只是ip不同,此處省略。
# 將配置copy到另外兩個節(jié)點
scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-111:/usr/local/redis/
scp -r /usr/local/redis/cluster_redis_{7001..7003}.conf local-168-182-112:/usr/local/redis/
# 在node2上執(zhí)行
sed -i 's/192.168.182.110/192.168.182.111/g' /usr/local/redis/cluster_redis_{7001..7003}.conf
# 在node3上執(zhí)行
sed -i 's/192.168.182.110/192.168.182.112/g' /usr/local/redis/cluster_redis_{7001..7003}.conf
#啟動Redis服務
接下來,啟動Redis服務的所有的節(jié)點。
redis-server /usr/local/redis/cluster_redis_7001.conf
netstat -tnlp|grep 7001
redis-server /usr/local/redis/cluster_redis_7002.conf
netstat -tnlp|grep 7002
redis-server /usr/local/redis/cluster_redis_7003.conf
netstat -tnlp|grep 7003
tail -f /usr/local/redis/cluster_redis_7001.log
tail -f /usr/local/redis/cluster_redis_7002.log
tail -f /usr/local/redis/cluster_redis_7003.log
啟動成功之后,如下圖。
#創(chuàng)建集群
為了能夠正常工作,我們需要集群的一個主節(jié)點有2個從節(jié)點。
# –cluster-replicas 2 : 表示集群的一個主節(jié)點有2個從節(jié)點,就是一主兩從模式
redis-cli -a 123456 --cluster create \
192.168.182.110:7001 192.168.182.110:7002 192.168.182.110:7003 \
192.168.182.111:7001 192.168.182.111:7002 192.168.182.111:7003 \
192.168.182.112:7001 192.168.182.112:7002 192.168.182.112:7003 \
--cluster-replicas 2
接著,系統(tǒng)會會自動生成nodes.conf文件,然后打開文件即可看到集群的相關信息。
ll /opt/software/redis-7.0.3/cluster/redis_{7001..7003}