Redis④集群:主从复制 & 常用策略
主从复制:主机数据更新后,根据配置和策略自动同步到从机。
- 主从复制是在多台服务器下的概念,通常是一主多从。
- Master 以写操作为主,Slaver 只能读操作。
- 作用:读写分离,性能扩展、容灾快速恢复。
1、一主两从
1.1、搭建
以一主两从为例。
一主多从只需在此基础上添加配置个数。
-
创建配置文件
-
作为每个数据库实例的启动配置。
-
创建 3 个,代表 3 个实例(一主二从)
# redis6379.conf include /opt/etc/redis.conf pidfile /var/run/redis_6379.pid port 6379 dbfilename dump6379.rdb # redis6380.conf include /opt/etc/redis.conf pidfile /var/run/redis_6380.pid port 6380 dbfilename dump6380.rdb # redis6381.conf include /opt/etc/redis.conf pidfile /var/run/redis_6381.pid port 6381 dbfilename dump6381.rdb Copy
-
-
启动服务器
redis-server redis6379.conf redis-server redis6380.conf redis-server redis6381.conf -
配置从机:指定主服务器的主机端口号。
-
在命令行中运行,从服务器重启不再是从属于原来的主服务器。
-
将从机配置增加到文件中。永久生效。
slaveof
-
1.2、说明
- 主服务器可以读写操作(通常只写),从服务器只读。
- 若主服务器异常关闭,从服务器不会变成新的主服务器。
- 复制延时问题:从 Master 到 Slaver 的同步存在延迟。
- 原因:写操作先在 Master 上执行,再同步更新到 Slaver 上。
- 系统繁忙、Slaver 数目增加都会加重延迟问题。
1.3、复制原理
初连接
只要重连 Master,就会自动执行全量复制。
- Slaver 启动并成功连接到 Master 后,向 Master 发送
sync同步命令。 - Master 接到命令,执行全量复制。
同步
- 全量复制:通常是 Slaver 连接时
- Master 启动后台存盘进程(folk),对数据进行持久化操作。
- Master 也会收集写操作命令。
- 后台进程执行完毕后,将 rdb 文件传输给 Slaver。
- Slaver 接收 rbd 文件并存盘,加载到内存中并读取备份。
- 完成一次全量复制(完全同步)。
- Master 启动后台存盘进程(folk),对数据进行持久化操作。
- 增量复制:通常是 Master 执行写操作后。
- Master 将所有收集到的写操作命令依次传给 Slaver,完成同步。
2、常用主从策略
原做法:Master 下有多个 Slaver。

2.1、薪火相传
做法:Master 下只有一个直接的 Slaver,Slaver 之间形成链。
-
示例:Slaver1 作为 Master 下直接的从服务器,Slaver2 作为 Slaver1 的从服务器。
-
优点:降低 Master 的同步压力,去中心化。

说明
-
修改链中的主从关系:会清除之前的数据,同步最新数据。
-
当某个 Slaver 宕机,之后的 Slaver 无法备份。
-
Master 异常关闭后,无法进行写操作。
2.2、反客为主
做法:在薪火相传的基础上。
-
当链中某一台 Master 宕机,其直接的 Slaver 升为 Master。
slaveof no one -
之后的 Slaver 无需改变。
2.3、哨兵模式(?)
2.3.1、说明
反客为主的自动版
做法:后台监控主服务器是否故障,若故障则自动根据投票数将从库转换为主库。
步骤
-
创建
sentinel.conf文件/opt/etc/sentinel.conf -
配置哨兵
-
guardname:哨兵服务器名称。
-
master:哨兵监控的主服务器 IP 地址和端口号。
-
n:至少有 n 个哨兵同意才转换。
sentinel monitor [guardname] [master] [n]
-
-
启动哨兵
redis-sentinel /opt/etc/sentinel.conf
2.3.2、选举规则
redis.conf
优先级别:值越小优先级越高(默认100)
- 旧版:slave-priority
- 新版:replica-priority
选取规则如下顺序
-
选择优先级靠前的(
redis.config) -
选择偏移量大的(与主服务器的数据同步率最高的)
-
选择 runid 最小的服务(Redis 服务器实例启动时随机生成的 40 位二进制数)