Redis – 主从复制
     发布在:SQL      浏览:29      评论:0 条评论

是什么

Redis 的复制,也就是我们常说的主从复制读写分离,主机数据更新后根据配置和策略,自动同步到备机的 Master/Slaver 机制,Master 以写为主,Slave 以读为主

能干嘛

1、读写分离

2、容灾恢复

怎么玩

配从不配主

配置从库,不配主库

从库配置

> slaveof [Master IP] [Master port]

每次与 Master 断开连接后,都需要重新连接,除非在 redis.conf 中进行配置

info replication

修改配置文件细节操作

> cp /opt/redis-4.0.11/redis.conf /backup_conf/redis_6379.conf
> vim /backup_conf/redis_6379.conf
# ------------------------------------------
# 开启 daemonize 
daemonize yes
# 修改 pid 文件路径
pidfile /var/run/redis_6379.pid
# 修改端口
port 6379
# 修改 log 文件名
logfile "redis_6379.log"
# 修改 dump.rdb 文件名
dbfilename dump_6379.rdb

> cp /opt/redis-4.0.11/redis.conf /backup_conf/redis_6380.conf
> vim /backup_conf/redis_6380.conf
# ------------------------------------------
# 开启 daemonize 
daemonize yes
# 修改 pid 文件路径
pidfile /var/run/redis_6380.pid
# 修改端口
port 6379
# 修改 log 文件名
logfile "redis_6380.log"
# 修改 dump.rdb 文件名
dbfilename dump_6380.rdb

> cp /opt/redis-4.0.11/redis.conf /backup_conf/redis_6381.conf
> vim /backup_conf/redis_6381.conf
# ------------------------------------------
# 开启 daemonize 
daemonize yes
# 修改 pid 文件路径
pidfile /var/run/redis_6381.pid
# 修改端口
port 6379
# 修改 log 文件名
logfile "redis_6381.log"
# 修改 dump.rdb 文件名
dbfilename dump_6381.rdb

常用三招

一主二仆:中心化
  1. Init 初始化
Redis - 主从复制
Redis - 主从复制
  1. 一个 Master 两个 Slave
Redis - 主从复制
Redis - 主从复制
  1. 日志查看
Redis - 主从复制
  1. 主从问题演示
  • 读写分离:Master can read and write,Slave only read
Redis - 主从复制
  • 主机故障:Master shutdown,Slave waitting
Redis - 主从复制
  • 主机恢复:Master recover,Slave auto relink
Redis - 主从复制
  • 从机故障:Slave shutdown and then recover,but it become a master
Redis - 主从复制
  • 每次与 Master 断开连接后,都需要重新连接,除非在 redis.conf 中进行配置
Redis - 主从复制
薪火相传:去中心化

上一个 Slave 可以是下一个 Slave 的 Master,Slave 同样可以接收其他 Slave 的连接和同步请求,这样就可以有效的减轻 Master 的写压力

中途变更转向:会清除之前的数据,重新建立拷贝最新的

Redis - 主从复制
Redis - 主从复制
反客为主

Master shutdown,两个 Slave 中选择一个成为 Master

slaveof no one:使当前数据库停止与其他数据库的同步,转成主数据库

Redis - 主从复制

复制原理

1、 Slave 启动成功连接到 Master 后会发送一个 sync 命令

2、 Master 接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集的命令

3、 在后台进程执行完毕之后,Master 将传送整个数据文件到 Slave,以完成一次完全同步

4、 全量复制:而 Slave 服务在接收到数据库文件数据后,将其存盘并加载到内存中

5、 增量复制:Master 继续将新的所有收集到的修改命令依次传给 Slave,完成同步

6、 但是,只要是重新连接 Master,第一次完全同步(全量复制)将被自动执行

哨兵模式(Sentinel)

是什么

反客为主的自动版,能够后台监控 Master 是否故障,如果故障了根据投票数自动将从库转换为主库

怎么玩

1、调整结构:一主二仆

2、自定义目录下新建 sentinel.conf 文件,名字绝对不能错 touch /backup_conf/sentinel.conf

3、配置哨兵,填写内容

  • sentinel monitor 被监控数据库名字(自己起名字) 127.0.0.1 6379 1

上面最后一个数字 1,表示 Master shutdown 后,Slave 投票看让谁接替成为 Master,得票多者成为 Master

Redis - 主从复制

4、启动哨兵

  • redis-sentinel /backup_conf/sentinel.conf
Redis - 主从复制

5、正常主从演示

Redis - 主从复制

6、Master shutdown

7、投票新选

8、重新主从,继续开工

Redis - 主从复制

9、问题:如果之前的 Master 重启回来,是否会造成双 Master 冲突?

不会造成冲突,并且之前的 Master 会变成新 Master 的 Slave(老领导变小弟)

Redis - 主从复制

最后

一组 sentinel 能同时监控多个 Master

复制的缺点:复制延迟

由于所有的写操作都是优先 Master,然后同步更新到 Slave 上

因此从 Master 同步到 Slave 上会有一定的延迟

如果在高并发情况下,延迟问题会更加严重,Slave 数量的增加也会使这个问题更加严重

Responses