Redis主从架构
单节点Redis的并发能力是有上限的,要进一步提高redis的并发能力,就需要搭建主从集群,实现读写分离。
修改每个文件夹内的配置文件,将端口分别修改为7001、7002、7003,将rdb文件保存位置都修改为自己所在目录(在/tmp目录执行下列命令):
sed -i -e 's/6379/7001/g' -e 's/dir .\//dir \/tmp\/7001\//g' 7001/redis.conf
sed -i -e 's/6379/7002/g' -e 's/dir .\//dir \/tmp\/7002\//g' 7002/redis.conf
sed -i -e 's/6379/7003/g' -e 's/dir .\//dir \/tmp\/7003\//g' 7003/redis.conf
修改每个实例的声明IP
虚拟机本身有多个IP,为了避免将来混乱,我们需要在redis.conf文件中指定每一个实例的绑定ip信息,格式如下:
# redis实例的声明 IP
replica-announce-ip 192.168.150.101
开启主从关系
现在三个实例还没有任何关系,要配置主从可以使用replicaof 或者slaveof(5.0以前)命令。
有临时和永久两种模式:
-
修改配置文件(永久生效)
- 在redis.conf中添加一行配置:
slaveof <masterip> <masterport>
- 在redis.conf中添加一行配置:
-
使用redis-cli客户端连接到redis服务,执行slaveof命令(重启后失效):
slaveof <masterip> <masterport>
主从节点之间会实现数据共享,主节点负责写,从节点负责读,如果从节点要写入数据是会被拒绝的。
数据同步原理
主从第一次同步是全量同步:
master如何判断slave是不是第一次来同步数据?
- Replication Id:简称replid,是数据集的标记,id一致则说明是同一个数据集。每一个master都有一个唯一的replid,而slave会继承master节点的replid。
- offset:偏移量,随着repl_baklog中的数据逐渐增多。slave完成同步的时候也会记录当前的offset,如果master的offset大于slave的offset的话就需要更新。
因此slave做数据同步,必须向master声明自己的replication id和offset,master才知道要同步哪些数据。
增量同步
如何进行优化?
Redis哨兵
Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下:
- 监控:Sentinel会不断检查master和slave是否按照预期工作
- 自动故障恢复:如果master节点故障了,Sentinel会将其中一个slave提升为master。当故障实例恢复后也以新的master为主
- 通知:Sentinel充当Redis客户端的服务发现来源,当集群发生故障转移的时候,会将最新消息推送给Redis的客户端
服务状态监控
Sentinel基于心跳检测机制检测服务状态,每隔1秒向集群中的每一个实例发送Ping命令:
- 主观下线:如果某个Sentinel节点发现某个实例没有在规定的时间内响应,就认为这个实例主观下线
- 客观下线:如果超过指定数量(quorum)的sentinel都认为该实例主观下线了,则该实例客观下线。quorum的值最好超过Sentinel值的一半
选举新的master
一旦发现master故障,Sentinel需要在slave中选择一个作为新的master节点,选择依据:
- 首先会判断slave节点与master节点断开时间的长短,如果时间超过了指定值(down-after-millisecond*10)就会排除这个slave节点
- 然后判断slave节点的slave-priority值,越小优先级越高,0则不参与选举
- 如果slave-priority一样,则判断slave节点的offset值,offset越大,说明数据越新,优先级越高
- 最后是判断slave节点的运行id大小,越小的优先级越高
如何实现故障转移
当选中了其中一个slave作为新的master,故障转移的步骤如下:
- Sentinel给备选的slave1节点发送
slaveof no one
命令,让其成为master节点 - sentinel会给其他的slave节点发送
slaveof slave1 port
命令,让这些slave成为新master的从节点,开始从新的master节点上同步数据 - 最后,Sentinel将故障节点标记为slave(直接修改配置文件),当故障节点恢复过来的时候,也会自动成为新master的slave节点