Redis学习(十二):主从数据库

详细配置请参考:redis主从数据库搭建

一、复制的概念

通过持久化功能,Redis能保证即使服务器重启也不会损失(或少量损失)数据,但是由于数据是存储在一台服务器上的,如果这台服务器出现硬盘故障,会导致数据丢失。为了避免单点故障,通常的做法是将数据库复制多个副本以部署在多个服务器上,这样即使一台服务器损坏,其他的服务器还可以正常工作。Redis提供了复制的功能,可以实现当其中一台数据库数据更新后,自动将更新的内容同步到其他数据库中。

二、配置

在复制的概念中,一类是主数据库(master),一类是从数据库(slave)主数据库可以进行读写操作,当写操作导致数据变化后自动将数据同步给从数据库。从数据库一般是只读的,并接收主数据库同步过来的记录,一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。

只需要在从数据库的配置文件中加入“ slaveof 主数据库地址 主数据库端口号 ”即可;

直接启动服务的命令为:

redis-server --slaveof 主数据库地址 主数据库端口号

还可以使用SLAVEOF NO ONE 命令来使当前数据库停止接收其他数据库同步的数据并转换成为主数据库。

三、复制过程和原理

  1. 复制初始化(SYNC):当一个从数据库启动后,会向主数据库发送SYNC命令,同时主数据库收到命令之后开始在后台保存快照(RDB持久化过程),并将保存快照期间接受到的命令缓存起来。当快照完成后,主数据库会将快照文件和缓存的命令一同发给从数据库。从数据库接收后会载入快照文件并执行缓存命令;
  2. 复制同步阶段:复制初始化结束后,主数据库每次执行写操作都会将命令同步给从数据库,以保证数据的一致性。
  3. 主从数据库断开重连:Redis2.6之前的版本会重新进行复制初始化,哪怕断线期间只有少量的命令执行,此种方式容易导致数据恢复过程效率很低。

断线重连—增量复制:2.8版本之后可用,需满足以下三个条件:

(1)从数据库存储主数据库的运行ID,每个数据库都有一个运行ID,并且是唯一的,重启之后会更新;

(2)在复制同步阶段,主数据库每同步一条命令,就会将该命令存放在一个积压队列中,并记录下当前积压队列中存放命令的偏移量范围;

(3)同时从数据库接收主数据库同步过来的命令,会记录下该条命令的偏移量

2.8版本之后,当主从连接就绪后,从数据库发送的命令式PSYNC而不是SYNC,格式为:

PSYNC 主数据库运行ID 断开前最新命令的偏移量

主数据库接收到PSYNC命令之后,执行以下判断来确定是否需要增量复制:

(1)首先判断该运行时ID是否与本身相同,以避免接收其他主数据库的从数据库发送的错误信息;

(2)判断从数据库发送的最后同步成功的命令的偏移量是否在积压队列之中,如果存在则进行增量复制,并将积压队列中的命令发送给从数据库。如果不满足则进行一次全部同步。

增量复制对于开发者来说是透明的,唯一需要设置的是积压队列的长度,通过配置文件的repl-backlog-size来设置。默认情况下为1M,很明显值越大允许断线的时间越长。另一个配置是:repl-backlog-ttl,表示当所有主从数据库全部断线之后,经过多久时间释放积压队列的内存空间,默认为1小时。

猜你喜欢

转载自blog.csdn.net/StringBuff/article/details/88383379