目录
Redis主从复制(Master/Slave)
Redis主从复制(Master/Slave)
什么是主从复制?
数据一般是存储在数据库中,为了保证数据的高可用,一般使用多台数据库服务器做集群。选中其中的一台作为主服务器(Master),其余的作为从服务器(Slave)。Master上的数据更新后根据配置文件配置的策略,自动同步到Slave上,这就是主从复制
在Redis集群中,让若干个Redis服务器去复制另一个Redis服务器,定义被复制的服务器为主服务器(master),而对主服务器进行复制的服务器则被称为从服务器(slave),这种模式叫做主从复制模式。
数据流向是单向的,只能是从master到slave
主从切换技术的方法:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,优先考虑哨兵模式。
主从复制原理
(1)从服务器连接主服务器,发送SYNC命令
(2)主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
(3)主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
(4)从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
(5)主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
(6)从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令;(从服务器初始化完成)
(7)主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令(从服务器初始化完成后的操作)
主从复制有什么作用?
优点
(1)保证了数据的高可用。
因为数据在多台服务器上存储了多份,即使一台机器宕掉了,其余的机器还可以顶上
支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
(2)实现了数据读写分离
什么叫读写分离?
写数据在Master上,读数据是在Slave上,这就叫读写分离。
它缓解了以往 Master 既要处理读数据又要处理写数据的压力,Master上负责写,Slave 上负责读,大大提升了数据库服务器的性能。为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成
Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。
Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求。
Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
(3)容灾恢复
当主机宕掉了之后,就没有办法向数据库中写数据了,怎么办?
其余的Salve根据配置的策略,选出一台晋升为Master,其余的Slave成为新Master的从机,当原来宕掉的Master恢复后,自动成为Slave,实现了容灾恢复
缺点
(1)当master需要同步发送到slave上的数据量非常大的时候,会存在一定的时延
(2)当系统很繁忙或者slave机器数量非常多的时候也会使这个问题更加严重
(3)Redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复
(4)主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性
(5)Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂
Redis如何实现主从复制?
(1)开启多个redis服务
(2)使用不同的pidfile(文件名)
(3)指明不同的端口号
(4)生成不同的rdb或aof文件
(5)产生不同的日志文件
基本使用(操作在Slave上)
(1)命令slaveof
优点:无需重启。缺点:不便于管理
// 命令行使用
slaveof ip port // 使用命令后自身数据会被清空,但取消slave只是停止复制,并不清空
(2)修改配置文件(redis.conf)
优点:统一配置。缺点:需要重启
#配置文件中配置
slaveof ip port
slave-read-only yes # 只允许从节点进行读操作
全量复制过程
(1)Redis内部会发出一个同步命令,刚开始是Psync命令,Psync ? -1表示要求master主机同步数据
(2)主机会向从机发送run_id和offset,因为slave并没有对应的 offset,所以是全量复制
(3)从机slave会保存主机master的基本信息
(4)主节点收到全量复制的命令后,执行bgsave(异步执行),在后台生成RDB文件(快照),并使用一个缓冲区(称为复制缓冲区)记录从现在开始执行的所有写命令
(5)主机发送RDB文件给从机
(6)发送缓冲区数据
(7)刷新旧的数据。从节点在载入主节点的数据之前要先将老数据清除
(8)加载RDB文件将数据库状态更新至主节点执行bgsave时的数据库状态和缓冲区数据的加载
部分复制过程
(1)如果网络抖动(连接断开 connection lost)
(2)主机master 还是会写 repl_back_buffer(复制缓冲区)
(3)从机slave会继续尝试连接主机
(4)从机slave会把自己当前run_id和偏移量传输给主机master,并且执行pysnc命令同步
(5)如果master发现你的偏移量是在缓冲区的范围内,就会返回 continue命令
(6)同步了offset的部分数据,所以部分复制的基础就是偏移量offset