重要配置
cluster-enabled <yes/no>
cluster-config-file <filename>
# 指定一个文件,供cluster模式下redis实例存放集群状态,包括集群中其他机器信息,
# 比如节点的上下线,故障转移等
cluster-node-timeout <milliseconds>
# 节点存活时长,超过一定时长,认为节点宕机,master宕机会触发主备切换,slave宕机就不会提供服务
配置文件路径
存放redis配置文件: /etc/redis
存放redis持久化文件:/var/redis/6379
存放redis运行日志文件: /var/log/redis
存放redis-cluster集群状态文件: /etc/redis-cluster/
基本配置信息
port <port>
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-<port>.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_<port>.pid
dir /var/redis/7001
logfile /var/log/redis/7001.log
bind <ip>
appendonly yes
配置及启动流程
实例配置及启动
(1)将上面的配置文件,在/etc/redis
下存放6个,分别是 7001.conf、7002.conf、7003.conf、7004.conf、7005.conf、7006.conf
;
(2)准备启动脚本/etc/init.d
,修改启动脚本对应的端口号;
PIDFILE=/var/run/redis_7001.pid
CONF="/etc/redis/7001.conf"
REDISPORT="7001"
(3)使用启动脚本进行redis-server启动: /etc/init.d/redis_7001 start
;
(4)将每个配置文件的slaveof/replicaof
配置信息删除;
(5)分别在3台机器上,启动6个redis实例。
集群部署
yum install -y ruby
yum install -y rubygem
yum install redis
# 安装ruby、gem相关依赖
cp /usr/local/redis-5.0.8/src/redis-trib.rb /usr/local/bin
cd /usr/local/bin
redis-trib.rb create --replicas 1 192.168.0.10:7001 192.168.0.10:7002 192.168.0.11:7003 192.168.0.11:7004 192.168.0.12:7005 192.168.0.12:7006
# --replicas 每一个master有几个slave
# 6台机器,3个master,3个salve
redis-trib.rb check 192.168.0.10
# 验证集群搭建情况
部署示例
集群实验
redis cluster集群搭建完毕,提供了多个master和多个slave。
master负责数据的写入操作;
slave可以支撑读写分离操作,同时,可以保证在master节点宕机的时候,自动切换为master,实现高可用。
实验多master写入数据
在redis cluster写入数据时,会计算写入数据的key对应的CRC16值,然后对16384个hash slot取模,找到key对应的hash slot,然后也能找到hash slot对应的master。
如果计算出来的hash slot对应的master就在本地的话,set 和 get操作都能正常处理。
如果计算出来的hash slot对应的master不再本地的话,则会返回给客户端一个moved error
,告诉需要到哪个master上去u执行set 和 get命令。
可以通过 redis-cli -c
实现操作数据的重定向。
实验不同master+slave的读写分离
在redis cluster中,如果要在slave节点读取数据,需要先执行readonly
指令,然后再进行get操作。
> readonly
> get key1
redis cluster实现的每个master挂载多个slave的操作,主要是为了实现集群节点的高可用,保证如果master节点出现故障,可以进行主备切换。
针对读写分离的支持并不友好。读写分离的本质是为了建立一主多从的架构,然后能够横向扩展slave节点去支撑更大的读吞吐量。在redis cluster架构下,本身是可以针对master进行任意扩展的,如果要支撑更大的读写吞吐量,可以直接针对master进行横向扩容。
实验自动故障的主备切换
使用kill -9
命令杀掉其中一个master节点的进程,然后观察对应的slave节点是否切换为master
redis-trib.rb check 192.168.0.10:7001
查看slave节点192.168.0.11:7004
的运行日志
日志中记录了slave节点切换为master节点的过程,切换完毕后,会基本aof进行数据的rewrite操作。
旧master节点重新启动,会自动作为slave节点挂载到新的master节点192.168.0.11:7004
上面去。
Master节点扩容
(1)配置redis.conf
(7007.conf)
port 7007
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7007.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7007.pid
dir /var/redis/7007
logfile /var/log/redis/7007.log
bind 192.168.0.11
appendonly yes
(2)配置redis_7007
启动脚本
(3)手动启动一个新的redis实例,并加入到cluster集群
# 添加节点
redis-trib.rb add-node 192.168.0.12:7007 192.168.0.10:7001
# 确认节点是否加入到集群
redis-trib.rb check 192.168.31.187:7001
(4)reshard移动一些hash slot数据到新节点
redis-trib.rb reshard 192.168.0.10:7001 # master节点
redis-trib.rb reshard 192.168.0.11:7003 # master节点
redis-trib.rb reshard 192.168.0.12:7005 # master节点
# How many slots do you want to move (from 1 to 16384)?
# 1000
(5)添加新节点作为slave
mkdir -p /var/redis/7008
=== 7008.conf====
port 7008
cluster-enabled yes
cluster-config-file /etc/redis-cluster/node-7008.conf
cluster-node-timeout 15000
daemonize yes
pidfile /var/run/redis_7008.pid
dir /var/redis/7008
logfile /var/log/redis/7008.log
bind 192.168.0.12
appendonly yes
=== 7008.conf====
# 添加新节点作为slave
redis-trib.rb add-node --slave --master-id <master-id> 192.168.0.12:7008 192.168.0.10:7001
# 检验是否添加成功
redis-trib.rb check 192.168.31.187:7001
删除集群节点
(1)先用reshard将hash slot数据移到其他节点,确保节点数据为空后,才进行删除节点操作;
(2)当清空一个master的hashslot后,redis cluster会自动将slave挂载到其他的master节点上;
(3)删除master节点。
redis-trib.rb del-node 192.168.0.10:7001 <master-id>
Slave节点自动迁移
redis cluster集群中,存在一个master节点有多个slave节点,即master节点出现了slave冗余。
如果此时某个master的slave节点挂了,那么redis cluster会自动迁移一个冗余的slave节点给那个master节点。
保证在如果这个master节点宕机后,仍然有可用的slave节点可以做主备切换,保证其高可用性。
可以通过 redis-trib.rb check 192.168.9.10:7001
进行检查。
具体查看下slave节点做自动迁移的日志信息打印