Redis的哨兵模式基本已經(jīng)可以實(shí)現(xiàn)高可用,讀寫分離 ,但是在這種模式下每臺(tái) Redis 服務(wù)器都存儲(chǔ)相同的數(shù)據(jù),很浪費(fèi)內(nèi)存,所以在 redis3.0上加入了Cluster 集群模式,實(shí)現(xiàn)了 Redis 的分布式存儲(chǔ),也就是說(shuō)每臺(tái) Redis 節(jié)點(diǎn)上存儲(chǔ)不同的內(nèi)容。下面是Cluster 集群模式的一些特點(diǎn):
- Sentinel模式基本可以滿足一般生產(chǎn)的需求,具備高可用性。但是當(dāng)數(shù)據(jù)量過(guò)大到一臺(tái)服務(wù)器存放不下的情況時(shí),主從模式或sentinel模式就不能滿足需求了,這個(gè)時(shí)候需要對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行分片,將數(shù)據(jù)存儲(chǔ)到多個(gè)Redis實(shí)例中。cluster模式的出現(xiàn)就是為了解決單機(jī)Redis容量有限的問(wèn)題,將Redis的數(shù)據(jù)根據(jù)一定的規(guī)則分配到多臺(tái)機(jī)器。
- Cluster可以說(shuō)是sentinel+主從模式的結(jié)合體,通過(guò)cluster可以實(shí)現(xiàn)主從和master重選功能,所以如果配置兩個(gè)副本三個(gè)分片的話,就需要六個(gè)Redis實(shí)例。因?yàn)镽edis的數(shù)據(jù)是根據(jù)一定規(guī)則分配到cluster的不同機(jī)器的,當(dāng)數(shù)據(jù)量過(guò)大時(shí),可以新增機(jī)器進(jìn)行擴(kuò)容。
- 使用集群,只需要將redis配置文件中的cluster-enable配置打開(kāi)即可,每個(gè)集群中至少需要三個(gè)主數(shù)據(jù)庫(kù)才能正常運(yùn)行,新增節(jié)點(diǎn)非常方便。
下面是Cluster 集群模式的架構(gòu)示意圖。
可以看到,Cluster集群模式有如下一些特點(diǎn):
- 多個(gè)redis節(jié)點(diǎn)網(wǎng)絡(luò)互聯(lián),數(shù)據(jù)共享;
- 所有的節(jié)點(diǎn)都是一主一從(也可以是一主多從),其中從不提供服務(wù),僅作為備用;
- 不支持同時(shí)處理多個(gè)key(如MSET/MGET),因?yàn)閞edis需要把key均勻分布在各個(gè)節(jié)點(diǎn)上,并發(fā)量很高的情況下同時(shí)創(chuàng)建key-value會(huì)降低性能并導(dǎo)致不可預(yù)測(cè)的行為;
- 支持在線增加、刪除節(jié)點(diǎn);
- 客戶端可以連接任何一個(gè)主節(jié)點(diǎn)進(jìn)行讀寫。
#環(huán)境說(shuō)明
為了模擬Cluster 集群模式,我們需要準(zhǔn)備至少三臺(tái)機(jī)器,然后分別開(kāi)啟三個(gè)redis服務(wù),即每個(gè)節(jié)點(diǎn)都要是一主兩從模式。
| IP | 主機(jī)名 | 端口 | 節(jié)點(diǎn) | |---|---|---| | 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 |
#修改配置
接下來(lái),我們基于主從模式的配置進(jìn)行如下修改。
# 創(chuàng)建存儲(chǔ)目錄
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é)點(diǎn)不一樣,IP不一樣,記得修改這個(gè)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
# 開(kāi)啟集群模式
cluster-enabled yes
# 雖然此配置的名字叫"集群配置文件",但是此配置文件不能人工編輯,它是集群節(jié)點(diǎn)自動(dòng)維護(hù)的文件,主要用于記錄集群中有哪些節(jié)點(diǎn)、他們的狀態(tài)以及一些持久化參數(shù)等,方便在重啟時(shí)恢復(fù)這些狀態(tài)。通常是在收到請(qǐng)求之后這個(gè)文件就會(huì)被更新。
cluster-config-file nodes_7001.conf
cluster-node-timeout 15000
然后,修改配置文件cluster_redis_7002.conf
,位于/usr/local/redis/cluster_redis_7002.conf
目錄下。
# 【注意】節(jié)點(diǎn)不一樣,IP不一樣,記得修改這個(gè)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則開(kāi)啟集群功能,此redis實(shí)例作為集群的一個(gè)節(jié)點(diǎn),否則,它是一個(gè)普通的單一的redis實(shí)例。
cluster-enabled yes
# 雖然此配置的名字叫"集群配置文件",但是此配置文件不能人工編輯,它是集群節(jié)點(diǎn)自動(dòng)維護(hù)的文件,主要用于記錄集群中有哪些節(jié)點(diǎn)、他們的狀態(tài)以及一些持久化參數(shù)等,方便在重啟時(shí)恢復(fù)這些狀態(tài)。通常是在收到請(qǐng)求之后這個(gè)文件就會(huì)被更新。
cluster-config-file nodes_7002.conf
cluster-node-timeout 15000
然后,繼續(xù)修改配置文件cluster_redis_7003.conf
,文件目錄位于/usr/local/redis/cluster_redis_7003.conf
。
# 【注意】節(jié)點(diǎn)不一樣,IP不一樣,記得修改這個(gè)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則開(kāi)啟集群功能,此redis實(shí)例作為集群的一個(gè)節(jié)點(diǎn),否則,它是一個(gè)普通的單一的redis實(shí)例。
cluster-enabled yes
# 雖然此配置的名字叫"集群配置文件",但是此配置文件不能人工編輯,它是集群節(jié)點(diǎn)自動(dòng)維護(hù)的文件,主要用于記錄集群中有哪些節(jié)點(diǎn)、他們的狀態(tài)以及一些持久化參數(shù)等,方便在重啟時(shí)恢復(fù)這些狀態(tài)。通常是在收到請(qǐng)求之后這個(gè)文件就會(huì)被更新。
cluster-config-file nodes_7003.conf
cluster-node-timeout 15000
其它兩臺(tái)機(jī)器配置與192.168.182.110
一致,只是ip不同,此處省略。
# 將配置copy到另外兩個(gè)節(jié)點(diǎn)
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
#啟動(dòng)Redis服務(wù)
接下來(lái),啟動(dòng)Redis服務(wù)的所有的節(jié)點(diǎn)。
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
啟動(dòng)成功之后,如下圖。
#創(chuàng)建集群
為了能夠正常工作,我們需要集群的一個(gè)主節(jié)點(diǎn)有2個(gè)從節(jié)點(diǎn)。
# –cluster-replicas 2 : 表示集群的一個(gè)主節(jié)點(diǎn)有2個(gè)從節(jié)點(diǎn),就是一主兩從模式
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)會(huì)會(huì)自動(dòng)生成nodes.conf文件,然后打開(kāi)文件即可看到集群的相關(guān)信息。
ll /opt/software/redis-7.0.3/cluster/redis_{7001..7003}