Redis集群簡介
Redis是我們?cè)陧?xiàng)目中經(jīng)常都會(huì)使用到的緩存系統(tǒng),為程序的高并發(fā)提供強(qiáng)有力的保障支撐。因此,保證Redis的高可用對(duì)應(yīng)用程序來說是非常重要的。
在Redis3.0之前,只支持單實(shí)例模式,主要是通過主從模式、哨兵模式來解決單點(diǎn)故障的問題,保證Redis的高可用性。在3.0開始推出集群模式來保證Redis的高可用。
Redis集群采用P2P模式,完全去中心化,把所有的key分為16384個(gè)slot,每個(gè)Redis實(shí)例負(fù)責(zé)其中的一部分。集群的所有信息都通過定期的數(shù)據(jù)交換更新。
Redis集群安裝環(huán)境
- 系統(tǒng)版本:CentOS 7
- Redis版本: 4.0.2
安裝步驟
Redis集群的安裝至少需要6個(gè)節(jié)點(diǎn),三主三從,本文采用的是在一臺(tái)機(jī)器上模擬Redis集群的方式。
創(chuàng)建集群相關(guān)的文件
在系統(tǒng)中新建一個(gè)目錄,用于專門存在與集群相關(guān)的文件:
mkdir /usr/local/redis-cluster
cd redis-cluster/
Redis集群需要6個(gè)實(shí)例,所有需要6個(gè)端口,然后分別為各個(gè)端口建立文件夾,并創(chuàng)建data目錄用于存放Redis中的日志和持久化文件,分別用端口名作為名稱:
mkdir -p 9001/data 9002/data 9003/data 9004/data 9005/data 9006/data
將已安裝好的Redis中的配置文件復(fù)制一份,分別放在每個(gè)端口文件夾下面:
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/9001
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/9002
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/9003
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/9004
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/9005
cp /usr/local/redis/redis.conf /usr/local/redis-cluster/9006
修改每一個(gè)實(shí)例中的redis.conf配置文件,主要修改的配置項(xiàng)如下,在修改的時(shí)候需要注意涉及到端口的要做相應(yīng)的修改:
port 9001(每個(gè)節(jié)點(diǎn)的端口號(hào))
daemonize yes (后臺(tái)啟動(dòng))
bind 192.168.0.103(綁定當(dāng)前機(jī)器 IP)
dir /usr/local/redis-cluster/9001/data/(數(shù)據(jù)文件存放位置)
pidfile /var/run/redis_9001.pid(pid 9001和port要對(duì)應(yīng))
cluster-enabled yes(啟動(dòng)集群模式)
cluster-config-file nodes9001.conf(9001和port要對(duì)應(yīng))
cluster-node-timeout 15000
appendonly yes
安裝集群需要的ruby環(huán)境
在執(zhí)行創(chuàng)建集群的命令時(shí),命令時(shí)ruby腳本,所以需要安裝相關(guān)的ruby環(huán)境:
yum install ruby
yum install rubygems
gem install redis
啟動(dòng)Redis實(shí)例
redis-server /usr/local/redis-cluster/9001/redis.conf
redis-server /usr/local/redis-cluster/9002/redis.conf
redis-server /usr/local/redis-cluster/9003/redis.conf
redis-server /usr/local/redis-cluster/9004/redis.conf
redis-server /usr/local/redis-cluster/9005/redis.conf
redis-server /usr/local/redis-cluster/9006/redis.conf
使用ps -ef | grep redis 檢查Redis實(shí)例是否正確啟動(dòng)
創(chuàng)建集群
執(zhí)行如下命令,創(chuàng)建Redis集群:
/usr/local/redis-cluster/bin/redis-trib.rb create --replicas 1 192.168.0.103:9001 192.168.0.103:9002 192.168.0.103:9003 192.168.0.103:9004 192.168.0.103:9005 192.168.0.103:9006
上面的命令調(diào)用 ruby 命令來進(jìn)行創(chuàng)建集群,--replicas 1 表示主從復(fù)制比例為 1:1,即一個(gè)主節(jié)點(diǎn)對(duì)應(yīng)一個(gè)從節(jié)點(diǎn);然后,默認(rèn)給我們分配好了每個(gè)主節(jié)點(diǎn)和對(duì)應(yīng)從節(jié)點(diǎn)服務(wù),以及 solt 的大小,因?yàn)樵?Redis 集群中有且僅有 16383 個(gè) solt ,默認(rèn)情況會(huì)給我們平均分配。
當(dāng)出現(xiàn)如下信息,則說明集群創(chuàng)建成功:
Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
192.168.0.103:9001
192.168.0.103:9002
192.168.0.103:9003
Adding replica 192.168.0.103:9004 to 192.168.0.103:9001
Adding replica 192.168.0.103:9005 to 192.168.0.103:9002
Adding replica 192.168.0.103:9006 to 192.168.0.103:9003
M: 474280fc4af302669773625526b44c52aeb7bac1 192.168.0.103:9001
slots:0-5460 (5461 slots) master
M: 9d14b24e6c5fa7507f4dd4c19d8b8d9673cfe625 192.168.0.103:9002
slots:5461-10922 (5462 slots) master
M: 5bb170e75e15ec12b465fcac71dedd66f97910ac 192.168.0.103:9003
slots:10923-16383 (5461 slots) master
S: 9e825c139bbdbc9d6e05eb7bdcf32c1b0b12b3ae 192.168.0.103:9004
replicates 474280fc4af302669773625526b44c52aeb7bac1
S: 45d33b0e289ff818b39c966aea694f867f7ba727 192.168.0.103:9005
replicates 9d14b24e6c5fa7507f4dd4c19d8b8d9673cfe625
S: 22218139444004a5d1a30547c5ff28227efe935f 192.168.0.103:9006
replicates 5bb170e75e15ec12b465fcac71dedd66f97910ac
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join.........
>>> Performing Cluster Check (using node 192.168.0.103:9001)
M: 474280fc4af302669773625526b44c52aeb7bac1 192.168.0.103:9001
slots:0-5460 (5461 slots) master
1 additional replica(s)
M: 9d14b24e6c5fa7507f4dd4c19d8b8d9673cfe625 192.168.0.103:9002
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 22218139444004a5d1a30547c5ff28227efe935f 192.168.0.103:9006
slots: (0 slots) slave
replicates 5bb170e75e15ec12b465fcac71dedd66f97910ac
M: 5bb170e75e15ec12b465fcac71dedd66f97910ac 192.168.0.103:9003
slots:10923-16383 (5461 slots) master
1 additional replica(s)
S: 45d33b0e289ff818b39c966aea694f867f7ba727 192.168.0.103:9005
slots: (0 slots) slave
replicates 9d14b24e6c5fa7507f4dd4c19d8b8d9673cfe625
S: 9e825c139bbdbc9d6e05eb7bdcf32c1b0b12b3ae 192.168.0.103:9004
slots: (0 slots) slave
replicates 474280fc4af302669773625526b44c52aeb7bac1
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
當(dāng)集群創(chuàng)建成功后,會(huì)將集群中各個(gè)節(jié)點(diǎn)的信息顯示出來,包括主節(jié)點(diǎn)以及對(duì)于的從節(jié)點(diǎn),每個(gè)節(jié)點(diǎn)上slot的分布情況等等。
到此,集群的創(chuàng)建完畢。
驗(yàn)證集群的可用性
使用Redis客戶端登錄,使用set命名驗(yàn)證:
redis-cli -c -h 192.168.0.103 -p 9001
192.168.0.103:9001> set key1 test
-> Redirected to slot [9189] located at 192.168.0.103:9002
OK
192.168.0.103:9002>
當(dāng)連接端口為9001的節(jié)點(diǎn),并保存數(shù)據(jù)時(shí),會(huì)根據(jù)key自動(dòng)保存到9002節(jié)點(diǎn)。