Redis实战(六)主从复制(Replica)

12

是什么?

其实就是主从复制,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节点。