主从复制+哨兵
主从环境搭建
主节点可以读写,从节点只能读,如果在从节点执行写命令会报错
-
每个服务器上准备 download redis
-
修改持久化方式为 RDB,关闭 AOF、关闭混合模式(主从节点都需要改)
-
启动每个 redis 服务
-
配置主从关系
如果在服务器启动后执行命令完成的配置只是临时的,重启后主从关系会失效,如果写在配置文件中就永久生效
- 只需要配置从节点,主节点不需要配,每个从节点需要指定主节点的ip和端口,命令如下
- 5.0 及以前:
slaveof <masterip> <masterport> - 5.0 以后:
slaveof <masterip> <masterport>
-
可以使用命令
info replication查看主从关系
主从同步原理
replid:replication id 简写,数据集的标识,如果标识一致说明是一个数据集,用来判断两个 redis 是否是同一个数据集
offset:数据偏移量(可以理解为数据量的大小),主从节点都会有,判断主节点和从节点的数据量差额,如果过大,说明从节点过于落后主节点,需要更新了
- redis 从节点启动后,发送自己的 replid 和 offset 给主节点
- 主节点收到同步请求后,判断从节点发过来的 replid 和自己的 replid 是否一致
- 如果 replid 不一致,说明是第一次同步,需要做全量同步
- 主节点执行 basave 异步生成 dump.rdb 文件,生成后发送给从节点
- 从节点收到 rdb 后清空自己的所有数据,保存 rdb 的数据
- 如果 replid 一致,说明不是第一次同步,需要做增量同步
- 执行全量同步的过程中主节点可能会有新的写入命令
- 这些新的写入命令主节点会记录到 rep_baklog 中
- 等全量同步完成,再把 rep_baklog 的数据发给从节点
- 从节点保存 rep_baklog 的数据
- 如果 replid 不一致,说明是第一次同步,需要做全量同步
同步就完成了,后续就是主节点每收到一个写命令就会发送给从节点完成实时同步(这里感觉也可以称为增量同步)
主从哨兵
- 当主从复制中的从节点宕机,影响是不大的,因为还有别的从节点,当宕机的从节点重新启动时,会再次全量同步主节点数据。就算从节点全都宕机,主节点是可写可读的,也不影响
- 当主节点宕机,从节点依旧可读,但是业务不能写入数据了,哨兵就是用来解决主节点宕机情况的
哨兵作用
- 监控:不断检查主从节点状态是否正常
- 自故障恢复:监控发现有主节点发生故障了,在从节点中选举一个节点作为新的主节点,原来的主节点恢复后会成为从节点
- 通知:当主节点挂了,会产生一个新的主节点,写入的节点地址就变化了,哨兵会通知客户端地址变化
哨兵原理
哨兵也是一个集群,
-
监控原理
- 每个哨兵每个一秒向每个 redis 节点发送 ping 命令,在规定的时间内,收到 pong 响应表示正常,没收到表示主观下线
- 超过指定数量(quorum,是配置文件中可配置的参数,如果自定义该值,建议过半)的哨兵都认为某个 redis 节点主管下线,则该 redis 节点表示真的宕机了,要客观下线
-
故障恢复原理
也就是当主节点宕机(客观下线)后,怎么选举新的主节点
- 判断每个从节点与主节点断开连接的时间,如果超过 down-after-milliseconds*10, 则排除。down-after-milliseconds 是配置文件中可配置的参数
- 剩下的节点中,再次判断 slave-priority 的值,值越小优先级越高,如果是 0 表示永不参加选举(默认都是1)
- 如果 salve-priority 的值一样,则判断 offset 的值,offset 越大,优先级越高(offset 是从节点每次和主节点同步后随着同步的数据量增加,越大说明和主节点数据越接近 )
- 如果上面三点排出后,还是有多个候选从节点,这时没有别的筛选条件了,随便选一个(哨兵的做法是找运行id最小的)
新的主节点确定了,要告知每个节点(也叫故障转移)
- 给新主节点发送
slaveof no one命令,让新节点不要再做从节点了 - 给别的从节点发送
slaveof 新主节点ip 新主节点端口,让其他从节点开始到新的主节点同步数据 - 哨兵会修改故障节点(原来的主节点)配置文件,写入
slaveof 新主节点ip 新主节点端口,当故障节点重启后自然而然就是从节点了
主从哨兵环境搭建
-
为每个 redis 节点创建一个用户哨兵工作的目录,假设 3 个 redis 的目录为 s1、s2、s3
-
每个目录中创建一个配置文件(sentinel.conf)内容如下
# 当前哨兵的端口(如果同一台服务器下注意端口不要重复) port 27001 # 当前哨兵所在服务器的ip,如果当前服务器只有一个ip这个配置不是必选项,当服务器有多个ip的时候需要 sentinel announce-ip 192.168.x.x # redis 主节点地址,mymaster 作为哨兵集群名称,自定义;ip和端口是主节点的;最后面的 2 是上面说的 quorum,选举用 # 只监控主节点就好了,不是不监控从节点,因为从节点信息可以到主节点获取 sentinel monitor mymaster 192.168.x.x 6379 2 # 用于故障监控(哨兵向节点发送 ping,超过这个时间未收到 pong 响应,视为客观下线) sentinel failover-timeout mymaster 60000 # 用于选举新主节点(如果某个从节点与主机断开连接的时间 > 这个时间*10 这个节点不会被选为新的主节点) sentinel down-after-milliseconds 5000 # 哨兵工作目录(保存哨兵的文件程序日志等等,因为是在进入到工作目录创建的配置文件,所以当前目录就是工作目录) dir "./" -
启动哨兵(在哨兵的工作目录运行命令),确保 redis 已经启动
# redis-sentinel 是 redis 带来的(也就是执行 redis 下的 redis-sentinel 可执行文件) # sentinel.config 是刚才创建的哨兵配置文件,直接 cd 到工作目录,文件就在当前文件夹,所以指定文件直接写文件名就行 redis-sentinel sentinel.config

浙公网安备 33010602011771号