Redis主从复制机制详解

什么是主从复制redis的主从复制机制是指可以让从服务器(slave)能精确复制主服务器(master)的数据,如下图所示:

Redis主从复制机制详解

文章插图
 
上面的图表示的是一台master服务器与slave服务器的情况,其实一台master服务器也可以对应多台slave服务器,如下图所示:
Redis主从复制机制详解

文章插图
 
另外,slave服务器也可以有自己的slave服务器,这样的服务器称为sub-slave,而这些sub-slave通过主从复制最终数据也能与master保持一致,如下图所示:
Redis主从复制机制详解

文章插图
 
主从复制的方式和工作原理【Redis主从复制机制详解】Redis的主从复制是异步复制,异步分为两个方面,一个是master服务器在将数据同步到slave时是异步的,因此master服务器在这里仍然可以接收其他请求,一个是slave在接收同步数据也是异步的 。
复制方式
Redis主从复制分为以下三种方式:
一、当master服务器与slave服务器正常连接时,master服务器会发送数据命令流给slave服务器,将自身数据的改变复制到slave服务器 。
二、当因为各种原因master服务器与slave服务器断开后,slave服务器在重新连上master服务器时会尝试重新获取断开后未同步的数据即部分同步,或者称为部分复制 。
三、如果无法部分同步(比如初次同步),则会请求进行全量同步,这时master服务器会将自己的rdb文件发送给slave服务器进行数据同步,并记录同步期间的其他写入,再发送给slave服务器,以达到完全同步的目的,这种方式称为全量复制 。
工作原理
master服务器会记录一个replicationId的伪随机字符串,用于标识当前的数据集版本,还会记录一个当数据集的偏移量offset,不管master是否有配置slave服务器,replication Id和offset会一直记录并成对存在,我们可以通过以下命令查看replication Id和offset:
> info repliaction通过redis-cli在master或slave服务器执行该命令会打印类似以下信息(不同服务器数据不同,打印信息不同):
connected_slaves:1slave0:ip=127.0.0.1,port=6380,state=online,offset=9472,lag=1master_replid:2cbd65f847c0acd608c69f93010dcaa6dd551ceemaster_repl_offset:9472当master与slave正常连接时,slave使用PSYNC命令向master发送自己记录的旧master的replication id和offset,而master会计算与slave之间的数据偏移量,并将缓冲区中的偏移数量同步到slave,此时master和slave的数据一致 。
而如果slave引用的replication太旧了,master与slave之间的数据差异太大,则master与slave之间会使用全量复制的进行数据同步 。
配置主从复制Redis的主从配置非常简单,我们可以使用两种方式来配置主从服务器,在这时我们先假设Redis的master服务器地址为192.168.0.101 。
客户端发送同步命令
# 向客户端saveof 192.168.1.101 6379slave服务器配置主服务器
在这里slave服务器的redis.conf通过saveof选项,可以指定master服务器,如下:
slaveof 192.168.1.101 6379通过上面两种方式的配置,master服务器与slave服务器便已经可以开始进行数据同步了 。
master要求验证
上面配置的是master服务器没有设置密码的情况,如果master设置了密码,则可以在连接到slave服务器的redis-cli执行下面的命令:
# <password>指代实际的密码config set masterauth <password>或者在slave服务器的redis.conf中配置下面的选项:
# <password>指代实际的密码masterauth <password>避免slave被清空slave会被清空?slave不用同步了master的数据吗?备份的数据怎么会清空了呢?
当master服务器关闭了持久化时,如果发生故障后自动重启时,由本地没有保存持久化的数据,重启的Redis内存数据为空,而slave会自动同步master的数据,这时候,slave服务器的数据也会被清空 。
如何避免slave被清空呢?
如果条件允许(一般都可以的),master服务器还是要开启持久化,这样master故障重启时,可以快速恢复数据,而同步这台master的slave数据也不会被清空 。
如果master不能开启持久化,则不应该设置让master发生故障后重启(有些机器会配置自动重启),而是将某个slave服务器升级为master服务器,对外继续提供服务 。
slave默认为只读的在Redis2.6以后,slave只读模式是默认开启的,我们可以通过配置文件中的slave-read-only选项配置是否开启只读模式:
# 默认是yesslave-read-only yes/no


推荐阅读