一:背景
前面我们实现了redis的主从同步和哨兵模式,解决了单机redis的故障转移和流量分担,但是不管是主从或者哨兵模式都是一个主服务对应一个或者多个从服务,并且主服务和从服务的数据是一样的,这样就实现不了redis大数据量写的问题,不能分担写服务到多个redis服务,那么有没有一种模式能够实现redis内存的横向扩展,多主对应多从,并且实现故障转移自动修复。答案是一定的redis的设计者已经为我们提供了现成的设计方案,那就是使用Redis Cluster。下面我们来实操下利用Redis Cluster实现redis的集群部署。
二:实现方式
1:环境准备
我们为了部署方便使用单台主机部署3个主服务,3个从服务组成redis集群,对应的主机和端口如下:
主服务:
master1 192.168.56.101 6381
master2 192.168.56.101 6382
master3 192.168.56.101 6383
从服务:
slave1 192.168.56.101 6391
slave2 192.168.56.101 6392
slave3 192.168.56.101 6393
2: 创建配置文件
mkdir /usr/local/redis-cluster
cp /usr/local/bin/redis.conf redis_master_1.conf
修改redis_master_1.conf的配置如下:
# 守护进行模式启动
daemonize yes
# 绑定地址,需要修改
bind 0.0.0.0
# 绑定端口,需要修改
port 6381
# pid文件存储位置,文件名需要修改
pidfile "/var/run/redis_6381.pid"
# log文件存储位置,文件名需要修改
logfile "/var/run/redis_6381.log"
# RDB快照备份文件名,文件名需要修改
dbfilename "redis_6381.rdb"
# 本地数据库存储目录,需要修改
dir "/usr/local/redis/redis_6381"
# 集群相关配置
# 是否以集群模式启动
cluster-enabled yes
# 集群节点回应最长时间,超过该时间被认为下线
cluster-node-timeout 15000
# 生成的集群节点配置文件名,文件名需要修改
cluster-config-file nodes-6381.conf
# aof持久化
appendonly yes
#修改各自的aof文件名
appendfilename "appendonly6381.aof"
#设置密码
requirepass 123456
masterauth 123456
修改其他5份配置文件,改变对应的端口和文件路径
3:启动服务
/usr/local/bin/redis-server /usr/local/redis-cluster/redis_master_1.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/redis_master_2.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/redis_master_3.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/redis_slave_1.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/redis_slave_2.conf
/usr/local/bin/redis-server /usr/local/redis-cluster/redis_slave_3.conf
4:这时候这6个服务是没有任何关联的,我们需要将他们加入集群
进入任意一个redis服务
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6381
auth 123456
cluster meet 192.168.56.101 6382
cluster meet 192.168.56.101 6383
cluster meet 192.168.56.101 6391
cluster meet 192.168.56.101 6392
cluster meet 192.168.56.101 6393
然后查看所有节点:
cluster nodes
发现三个主服务和三个从服务,同时查看端口监听,可以发现10000+端口,说明集群的服务之间已经可以通信
5:配置主从服务
我们需要查看主服务的节点id,查看8381-6383的主服务node id
进入对应的从服务,配置主服务node id
进入6391从服务:
cluster replicate e9e7bcf9ff199e2a99d8dfb5342deebfe1462a8a
进入6392从服务:
cluster replicate f48f4528f051a1e585df05601217772a3ecbfb64
进入6393从服务:
cluster replicate 542bba27134e01c306c8c326b5deaac750234107
6:分配槽位
为了考虑今后的写入操作能分配均匀,槽位也要进行均匀分配。
仅在Master上进行分配,从库不进行分配,仅做主库的备份和读库使用。
节点 槽位数量
6381 0 - 5461
6382 5461 - 10922
6383 10922 - 16383
编写脚本:
#!/bin/bash
n=0
for ((i=n;i<=5461;i++))
do
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6381 -a 123456 CLUSTER ADDSLOTS $i 2>/dev/null
done
#!/bin/bash
n=5462
for ((i=n;i<=10922;i++))
do
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6382 -a 123456 CLUSTER ADDSLOTS $i 2>/dev/null
done
#!/bin/bash
n=10923
for ((i=n;i<=16383;i++))
do
/usr/local/bin/redis-cli -h 127.0.0.1 -p 6383 -a 123456 CLUSTER ADDSLOTS $i 2>/dev/null
done
执行完查看状态:
CLUSTER info
状态已经显示成功