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即可 - 其他说明,如果是单机模拟多客户端的话,建议进行一下配置
- 拷贝多个redis.conf文件
- 设置属性为:
daemonize yes
- 设置单独的Pid文件名称:
pidfile /var/run/redis_6380.pid
- 设置单独的端口:
port 6380
- 指定Log文件名称:
logfile /opt/redis-5.0.5/logs/redis_6380.log
- 指定rdb文件名称:
dbfilename dump_6380.rdb
- 指定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. 复制原理
- slave启动成功并连接到master后会发送一个sync命令
- master接收到命令后启动后台的存盘进程,同时收集所有接收到的修改数据的命令。在后台执行完成后,master将传送整个数据文件到slave,就完成了一次主从复制
- 全量赋值:slave服务在接收到数据文件后,将其存盘并加载到内存中
- 增量复制:master继续将新的用于修改的命令依次传给slave,以完成同步。但是只要是重新连接master,就会执行一次全量复制
6. 故障处理说明
- 主机宕机后,从机原地待命,没有变成master。待master恢复后,就像什么都没发生一样,数据仍然保持与master同步。
- 从机宕机,再恢复,此时变成了master。
从机每次与master断开后,都需要重新连接主机,除非配置进redis.conf文件 - 在配置了哨兵的情况下,当master宕机,在master恢复前,选出了新的master后再恢复master,原master会自动被设置为slave
7. 主从复制的缺点
- 由于写操作都在master上执行,然后同步到slave上,所以存在一定的延迟。当系统cpu、内存吃紧时,问题更加严重。
slave数量增加也会导致这个问题。
8. 主从复制的好帮手-哨兵
- 什么是哨兵?
在后台监控master是否故障,如果master挂了,自动在slave中进行投票选举出新的master - 配置
- 在自定义目录下,新建sentinel_test.conf文件。
- 在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
- 执行命令:
redis-sentinel /opt/redis-5.0.5/sentinel_test.conf
或redis-server /opt/redis-5.0.5/sentinel_test.conf --sentinel
启动哨兵
- 关于哨兵的其他知识点
- 一个sentinel实例能同时监控多个master,一个master能被多个sentinel实例同时监控。
- 一个 Sentinel 可以与其他多个 Sentinel 进行连接, 各个 Sentinel 之间可以互相检查对方的可用性, 并进行信息交换。
- 参考:http://www.redis.cn/topics/sentinel.html