Redis实战(六)主从复制(Replica)
是什么?
其实就是主从复制,Master是主节点,Slave是从节点,Master以写为主,Slave以读为主。当Master数据变化时,自动将数据以异步的方式写入Slave节点。
能干嘛?
Redis复制最终的结果是多台主机拥有相同的数据,这样做的好处如下:
- 读写分离,主节点主要提供写服务,从节点提供读服务
- 容灾恢复
- 冗余备份
- 水平扩展支持高并发
怎么玩?
配从库不配主库
Master如果配置了requirepass参数,需要密码登陆,那么slave就要配置masterauth来设置校验密码,否则的话master会拒绝slave的访问请求
基本命令
- info replication:可以查看复制节点的主从关系和配置信息
- replicaof 主库IP 主库端口:在slave中配置主库
- slaveof 主库IP 主库端口:用命令的方式来对slave进行动态配置,每次服务重启后都需要重写设置,允许在运行期间修改slave节点的信息,如果该节点已经是某个master节点的slave节点,那么会断开与该master的连接,转而连接新master
- slaveof no one:使当前数据库停止与其他数据库的同步,转而成为主数据库,自立为王
主从模式的特性
- master可写可读,slave可读不可写
- slave在刚启动时,全量复制;后续跟随
- 当master宕机后,slave原地不动,等待master上线,此时slave仍是只读不可写
- master宕机后上线,主从关系仍在;slave会进行重连
- 当slave宕机后重启,master将发送增量更新给slave
命令实操
一主两仆
该模式只对slave的配置进行修改,修改项如下:
# 配置master节点的连接密码
masterauth master_requirepass
# 配置master节点的IP和端口
replicaof 127.0.0.1 6379
如果是在一台机器上部署的多台redis实例,那么需要注意下面这几个配置不要重复:
- port:端口号
- pidfile:pid的文件路径
- logfile:logfile的文件路径,在日志中可以查看到主从数据同步的过程
- dir:保存rdb和aof文件的文件夹路径
Master节点的info replication
输出
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=6380,state=online,offset=69591,lag=0
slave1:ip=127.0.0.1,port=6381,state=online,offset=69591,lag=0
master_failover_state:no-failover
master_replid:5c9e614a2e89878b3bbf93198930124ecc733375
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:69591
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:19
repl_backlog_histlen:69573
role
表明当前节点是master节点,connected_slaves
表明当前该master节点下有两个从节点,且从节点状态online。
Slave节点的info replication
输出
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:5
master_sync_in_progress:0
slave_read_repl_offset:70123
slave_repl_offset:70123
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:5c9e614a2e89878b3bbf93198930124ecc733375
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:70123
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:69522
repl_backlog_histlen:602
role
表明当前节点为slave节点,并且输出了master节点的相关信息。
改换门庭
“改换门庭”就是不论当前节点是master节点还是slave节点,都将当前节点设置为指定master节点的slave节点,与之前的master节点将断开连接(如果有)。注意,这些命令是运行时命令,当redis重启时,该命令会失效。
- 在redis-cli中运行命令
slaveof 127.0.0.1 6381
将当前节点的master节点设置为127.0.0.1:6381节点。 - 也可以在终端中运行
redis-cli -p 6380 -a 123456 slaveof 127.0.0.1 6381
,将起到相同效果。
自立为王
“自立为王”就是将当前redis作为master节点,它将不在同步之前master节点的数据。注意,这些命令是运行时命令,当redis重启时,该命令会失效。
- 在redis-cli中运行命令
slaveof no one
可以将当前的节点转换为master节点。 - 也可以在终端运行
redis-cli -p 6381 -a 123456 slaveof no one
,将起到相同效果。
薪火相传
上一个slave可以是下一个slave的master,slave同样可以接收其他slave的连接和同步请求,那么该slave作为了链条中下一个slave的master节点,这样做可以避免所有的slave都连接到一个master上,可以减轻主master的写压力。
特性:
- 中途变更转向:会清楚之前的数据,重新建立拷贝最新的数据
- 减轻主master的写压力,但slave的链不宜过长
可以通过以下命令实现:
- 在配置项中进行配置,使用
replicaof ip port
实现链式数据同步 - 使用命令动态进行配置
slaveof ip port
主从复制的原理和工作流程
slave启动,同步初清
slave连接到master后,会发送一个sync命令;如果slave是首次连接,则一次全量复制将被执行,slave上现有的数据将被清除。
首次连接,全量复制
master在收到sync命令后,会开始在后台保存快照(即RDB持久化,主从复制时会自动触发),同时将所有用于修改的命令缓存起来,master节点完成RDB持久化后,master节点将rdb快照文件和所有缓存的命令一起发送给slave节点,以完成一次完全同步。
slave节点在收到rdb数据文件后,将其存盘并加载到内存中,完成数据的同步。
心跳持续,保持连接
master节点持续发送心跳包,从而判断slave节点是否在线,心跳包的发送周期可以在配置文件中进行配置,配置项为repl-ping-replica-period 10
。
进入平稳,增量复制
master继续将新的所有收集到的修改命令自动依次传给slave,完成增量同步。
从机下线,重连续传
slave重连后,master会检查backlog里面的offset,master和slave都会保存一个复制的offset还有一个masterId。master只会把已经复制的offset后面的数据复制给slave,类似于断点续传。
主从复制的缺点
复制延时,信号衰减
由于所有的写操作都是在master上进行,然后同步到slave上,所以从master同步到slave机器上有一定的延时;当系统很繁忙的时候,延迟问题会更加严重,slave机器数量的增加也会使这个问题更加严重。
不能保证Master高可用
系统严重依赖于master节点,当master节点宕机后,整个缓存处于不可写的状态。当master节点宕机后,没有选举机制,slave节点只会不断重新连接master节点。