你见过不长毛的羊吗

Redis(十)-主从复制+哨兵模式

2019.08.11

1. 是什么?

  • 主从复制:即 Master/Slave模式。Master主写,Slave主读。当Master数据一有更新就根据配置和策略自动同步到Slave上。

2. 两种种模式(非官方,自我总结)

  • 主从模式:就是集群只有一个Master,所有的从机都直接与master相连接
  • 主从主从模式:即 一台机器既是slave也是master。 举个例子,A是master,B是A的salve,与此同时,B又是C的master。使用info replication查看时,redis仍然认为B是slave,只不过它还有slave。当然此时的B也不能执行写操作。

3. 怎么用?

  • 原则:配从(库)不配主(库)

  • 使用:执行命令slaveof master-ip master-port,确定master的ip与port即可

  • 其他说明,如果是单机模拟多客户端的话,建议进行一下配置

    1. 拷贝多个redis.conf文件
    2. 设置属性为:daemonize yes
    3. 设置单独的Pid文件名称:pidfile /var/run/redis_6380.pid
    4. 设置单独的端口:port 6380
    5. 指定Log文件名称:logfile /opt/redis-5.0.5/logs/redis_6380.log
    6. 指定rdb文件名称:dbfilename dump_6380.rdb
    7. 指定aof文件名称:appendfilename "appendonly_6380.aof"

4. 相关命令

  • slaveof master-ip master-port:确定master 注意:会清空从库数据,并且数据与主库保持同步 此时,从库不允许写入
  • info replication:查看当前客户端主从情况即其他信息
  • slaveof no one:手动将slave变成master。保持之前slave的数据
  • redis-sentinel /opt/redis-5.0.5/sentinel.conf:启动哨兵(后面有介绍)

5. 复制原理

  1. slave启动成功并连接到master后会发送一个sync命令
  2. master接收到命令后启动后台的存盘进程,同时收集所有接收到的修改数据的命令。在后台执行完成后,master将传送整个数据文件到slave,就完成了一次主从复制
  3. 全量赋值:slave服务在接收到数据文件后,将其存盘并加载到内存中
  4. 增量复制:master继续将新的用于修改的命令依次传给slave,以完成同步。但是只要是重新连接master,就会执行一次全量复制

6. 故障处理说明

  • 主机宕机后,从机原地待命,没有变成master。待master恢复后,就像什么都没发生一样,数据仍然保持与master同步。
  • 从机宕机,再恢复,此时变成了master。 从机每次与master断开后,都需要重新连接主机,除非配置进redis.conf文件
  • 在配置了哨兵的情况下,当master宕机,在master恢复前,选出了新的master后再恢复master,原master会自动被设置为slave

7. 主从复制的缺点

  1. 由于写操作都在master上执行,然后同步到slave上,所以存在一定的延迟。当系统cpu、内存吃紧时,问题更加严重。

  2. slave数量增加也会导致这个问题。

8. 主从复制的好帮手-哨兵

什么是哨兵?

在后台监控master是否故障,如果master挂了,自动在slave中进行投票选举出新的master

配置

  1. 在自定义目录下,新建sentinel_test.conf文件。
  2. 在sentinel_test.conf文件中添加
# 指示 Sentinel 监视的主服务器的名称(随便写)、ip、port。
# poll_N:当master挂了,需要一个再次确认的过程。只有当至少有poll_N个 Sentinel判定master失效时,该master才会真的被判定为失效,并且才会执行故障迁移(投票选举新的master)
sentinel monitor  master_name master_ip master_port poll_N

# 指定 Sentinel 认为服务器已经断线所需的毫秒数
sentinel down-after-milliseconds master_name 60000 

# 故障转移的超时时间(单位毫秒),如果故障转移在指定时间内无法完成,则认为故障转移失败
sentinel failover-timeout master_name 180000

# 指定在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步, 这个数字越小, 完成故障转移所需的时间就越长
sentinel parallel-syncs master_name 1 

# 根据实际情况选择,在sentinel_test.conf文件中指定sentinel实例的运行端口
port  26380
  1. 执行命令:redis-sentinel /opt/redis-5.0.5/sentinel_test.confredis-server /opt/redis-5.0.5/sentinel_test.conf --sentinel启动哨兵

关于哨兵的其他知识点

  1. 一个sentinel实例能同时监控多个master,一个master能被多个sentinel实例同时监控。
  2. 一个 Sentinel 可以与其他多个 Sentinel 进行连接, 各个 Sentinel 之间可以互相检查对方的可用性, 并进行信息交换。
  3. 参考:http://www.redis.cn/topics/sentinel.html