本文主要介绍redis主从复制的原理和配置方式
更新于 2021-04-18
redis支持简单且易用的主从复制功能,该功能可以让从服务器成为主服务器的精确复制品。
redis主从复制重要方面
- redis使用异步复制,redis从服务器会每秒一次向主服务器报告复制流处理进度;
- 一个主服务器可以有多个从服务器,从服务器也可以有自己的从服务器;
- 复制功能不会阻塞主服务器,即使有多个从服务器正在进行数据同步;
- 复制功能不会阻塞从服务器,只要redis.conf进行了配置,即使从服务器进行初次数据同步,服务器也可以使用旧数据进行查询,但是在从服务器删除旧版数据载入新版数据期间会阻塞;
- 复制功能可以单纯用于数据冗余,也可以通过让从服务器处理只读命令来提升扩展性;
- 可以通过复制功能让主服务器不进行持久化操作,只要关闭主服务器持久化功能,让从服务器进行持久化即可;
在使用主从复制时如果关闭了主节点的持久化,则应该避免在主节点服务宕机后自动拉起,例如下面的例子:
- A节点作为主,关闭了持久化;B和C作为从,从A节点复制数据;
- 某时刻A宕机,然后自动或手动重启了A的服务,由于A没有持久化数据导致A的数据为空;
- B和C从A复制数据发现数据为空,于是B和C也删除了自己的数据;
所以在主节点关闭持久化的情况下自动拉起服务是非常危险的。
复制功能原理
- 当建立一个从服务器时,从服务器向主服务器发送PSYNC命令,接到该命令的主服务器开始执行BGSAVE,并在保存操作执行期间将所有新的写入命令保存到一个缓冲区;
- 执行完BGSAVE后,主将保存的rdb文件发送给从,从接受这个文件并将文件中的数据写入自己的内存;
- 之后主以redis命令协议的格式将命令缓冲区积累的内容发送到从服务器;
每次主从同步的时候都会比较一下和从的数据偏移量是否一致,不一致则全量数据同步,一致则进行部分数据同步。
如果是大内存并且在高频次写入时进行数据同步会有个问题:
- 主将进行BGSAVE操作,并把操作期间的写入命令保存在缓冲区;由于缓冲区大小有限,如果写入量很大则可能超过缓冲区大小,会导致主从之间不停地进行全量数据同步;
- 主进行BGSAVE操作产生的rdb文件很大,如果在传输期间有网络波动很可能导致传输失败,不得不重新进行全量同步;
配置主从复制
从服务器配置,修改配置文件,在配置文件中加入如下的一行,指定主服务器的地址和端口:
1 | slaveof 10.10.99.100 6379 |
或者使用命令行的方式指定主服务器,在从服务器命令行输入下面的命令开始主从同步:
1 | 127.0.0.1:6379> SLAVEOF 10.10.99.100 6379 |
生产建议使用命令的方式指定复制地址;
创建完成后可以在主和从上分别执行下面的指令查看角色:
1 | 10.10.62.17:6379> INFO replication |
只读从服务器
如果是从服务器,默认是只读模式,将拒绝任何写入命令
只读模式可以由redi.conf配置文件中slave-read-only
来进行控制。
主从切换
在将从服务器提升为主的时候,需要执行下面的命令:
1 | 127.0.0.1:6379> SLAVEOF NO ONE |