redis主从复制

Author:SimpleWu

什么是主从复制?

主从复制,是用来建立一个和主数据库(master)完全一样的数据库环境,称为从数据库(slave)。

主从复制的作用和使用场合一般有几个:

一是容灾恢复,主数据库服务器故障后,可迅速从从数据库恢复。

二是读写分离、主数据库主要做写的操作,从数据库做读的操作。

主从复制应用场景

电子商务网站上的商品,一般都是一次上传,无数次浏览的,说专业点也就是”多读少写”。

对于这种场景我可以一使用主数据库(master)做写操作,所有的从服务器做读操作。

具体说明:

我们将一台Redis服务器作主库(Matser),其他多台作为从库(Slave),主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,而从库只负责读数据。这样一来,就有了两个好处:

  1. 读写分离,不仅可以提高服务器的负载能力,并且可以根据读请求的规模自由增加或者减少从库的数量,棒极了;
  2. 数据被复制成了了好几份,就算有一台机器出现故障,也可以使用其他机器的数据快速恢复。

注意事项:在Redis主从模式中,一台主库可以拥有多个从库,但是一个从库只能隶属于一个主库

主从复制实现方式

一主二(多)仆:从字面上来理解就是,一个主数据库(master)二(多)台从数据库(slave)。

在三台机器上配置好redis环境,并修改相应的配置文件。

只需要在从数据库加配置如下代码:

slaveof 主数据库地址 主数据库端口

slaveof 127.0.0.1 6379

注意:可以通过info replication查看当前主机状态。

要模拟三台机器需要:

  1. 拷贝多个redis.conf文件。
  2. 开启daemonize yes。
  3. pid文件名字。pidfile /var/run/redis_6379.pid
  4. 修改端口号。 port ????
  5. log文件名字。 logfile “????”
  6. dump.rdb的名字。dbfilename dump.rdb

默认情况下从服务器只读模式不可以写入。如果执意要将从库关闭只读模式:

slave-read-only no#将yes修改为no

但是,因为从库中修改的数据不会被同步到任何其他数据库,并且一旦主库修改了数据,从库的数据就会因为自动同步被覆盖,所以一般情况下,不建议将从库设置为可写

主库宕机

当主库意外关闭时,从库是什么情况?

  • 当主库关闭时,从库继续保持从库状态,但是和主库的连接丢失,不能在同步更新数据。如果主库恢复,从库也会恢复到连接状态
  • 当从库1关闭时,主库和从库N都不受影响。但是当从库重新恢复时,丢失和主库的连接状态,必须重新关联。

薪火相传

上一个Slave可以是下一个slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master,可以有效减轻master的写压力

中途变更转向:会清除之前的数据,重新建立拷贝最新的

实现方式:

slaveof 新主库IP 新主库端口

master->slave1->slave2

反客为主

字面上来看就是将从数据库变成主数据库

指令:

SLAVEOF no one
复制原理
  • 当一个从数据库启动时,会向主数据库发送sync命令。
  • Master接到命令启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master将传送整个数据文件到slave,以完成一次完全同步。
  • 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
  • 增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步。
  • 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。
主从复制的问题

由于所有的写操作是先在master上操作,然后更新到slave上,所以从master同步到slave机器有一定的延迟。

当系统很繁忙的时候,延迟问题会更加严重,Slave机器数量也会导致这个问题更加严重。

版权声明:本文为SimpleWu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/SimpleWu/p/9999582.html