Redis主从复制原理及配置
Redis主从复制介绍
Redis的持久化功能在一定程度上保证了数据的安全性,即便是服务器宕机的情况下,也可以保证数据的丢失非常少。通常,为了避免服务的单点故障,会把数据复制到多个副本放在不同的服务器上,且这些拥有数据副本的服务器可以用于处理客户端的读请求,扩展整体的性能。
主从复制的好处:
- 数据冗余,实现数据的热备份
- 故障恢复,避免单点故障带来的服务不可用
- 读写分离,负载均衡。主节点负载读写,从节点负责读,提高服务器并发量
- 高可用基础,是哨兵机制和集群实现的基础
主从复制,master以写为主,slave以读为主,当master数据变化的时候,自动将新的数据异步同步到其他的slave数据库
主从复制配置
准备三台虚拟机,构成一主二仆的结构
修改配置文件
redis6379.conf为例,步骤如下:
- 开启daemonize yes
1
2# 设置为后台运行
daemonize yes - 注释掉bind 127.0.0.1
- protected-mode no
- 指定端口
- 指定当前工作目录,dir
- pid文件名字,pidfile
- log文件名字,logfile
- requiredpass,密码
- dump.rdb名字
- aof文件,appendfilename
- 从机访问主机的masterauth
一主二从
修改配置文件方式
- 修改从机配置文件
replicaof 主库IP 主库端口
- 先master后两台slave依次启动
- 主从关系查看
主机日志
从机日志
命令:info replication命令查看
主从问题
- 从机无法进行写操作,只能读
- 主机shutdown后,从机不动,原地待命,从机数据可以正常使用,等待主机重启归来
- 从机挂掉后,master存活,从机重启后,仍然为master的从机,能够正确活动。
- master挂掉后,重启之后主从关系不变,从机仍然为从机,可以进行复制。
- 从机切入点问题,从机跟随master后,在开始时会将master的数据全部写入,之后master修改的数据写一条,slave跟一条。
手动命令进行修改主从关系
将.conf配置文件注释掉,replicaof
ip 端口,info replication
分别查看主从关系信息
手动配置主从信息
salveof 主库IP 主库端口
区别
配置文件的主从关系永久生效,手动命令配置主从关系重启就会失效。
薪火相传
- 上一个slave可以是下一个slave的master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻主master的写压力
- 中途变更转向:会清除之前的数据,重新建立主从关系并拷贝最新的
- slaveof 新主库IP 新主库端口
反客为主
slaveof no one 使当前数据库停止与其他数据库的同步关系
复制原理和工作流程
slave启动,同步初请
- slave启动成功链接到master后会发送一个sync命令
- slave首次全新连接master,一次完全同步(全量复制)将被自动执行,slave自身原有数据会被master数据覆盖清除
首次连接,全量复制
- master节点收到sync命令后会开始在后台保存快照(即RDB持久化,主从复制时会触发RDB),同时收集所有接收到的用于修改数据集的命令并缓存起来,master节点执- 行RDB持久化完后,master将RDB快照文件和所有缓存的命令发送到所有slave,以完成一次完全同步
而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中,从而完成复制初始化
心跳持续,保持通信
repl-ping-replica-period 10
进入平稳,增量复制
- master继续将新的所有收集到的修改命令自动依次传送给slave,完成同步
从机下线,重连续传
- master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId,offset是保存在backlog中的。master只会把已经缓存的offset后面的数据复制给slave,类似断点续传
复制的缺点
由于所有的写操作都是先在Master上操作,然后同步更新到Slave上,所以从Master同步到Slave机器有一定的延迟,当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量的增加也会使这个问题更加严重。
master挂了怎么办?
默认情况下,不会在slave节点中自动选一个master
Redis的哨兵就是解决方法
参考:Redis主从复制的配置和实现原理
https://github.com/Romantic-Lei/Learning-in-practice/tree/master/Redis/8.Redis%E5%A4%8D%E5%88%B6(replica)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Gehina's Blog!