7.Rdis主从复制

145 阅读5分钟

一、什么是主从复制?

概念:

主从复制:将一台redis服务器数据,复制到其它的redis服务器。前者称为主节点(master),后者称为从节点(slave);数据的复制是单向的,只能由主节点到从节点。

默认情况下,每台redis服务器都是主节点;且一个主节点可以有多个从节点(或没有从节点),但一个从节点只能有一个主节点。

作用:

1.数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

2.故障恢复:当主节点出现问题时,可由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。

3.负载均衡:在主从复制的基础上,配合读写分离,可由主节点提供写服务,从节点提供读服务(写操作连接主节点redis服务器,读操作连接从节点redis服务器),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担负载,可大大提高redis服务器并发量

4.高可用基石:主从复制还是哨兵和集群能够实施的基础,因此主从复制是redis高可用的基石

模型:

u=1356877242,806277881&fm=253&fmt=auto&app=138&f=PNG.png

二、如何实现主从复制

1、复制修改配置文件

 1.1)修改配置文件81.conf端口号,pid进程,日志文件名,rdb文件名等
 port 638
 pidfile /var/run/redis-6381.pid
 logfile "81.log"
 dbfilename dump81.rdb
 
 1.2)修改配置文件82.conf端口号,pid进程,日志文件名,rdb文件名等
 port 6382
 pidfile /var/run/redis-6381.pid
 logfile "82.log"
 dbfilename dump82.rdb
 
 1.3)修改配置文件83.conf端口号,pid进程,日志文件名,rdb文件名等
 port 6383
 pidfile /var/run/redis-6383.pid
 logfile "83.log"
 dbfilename dump83.rdb
 

2、分别通过三个配置文件启动三个redis服务

2.1、依次启动81,82,83三个redis服务

#启动81redis服务
[root@VM-0-12-centos bin]# ./redis-cli -p 6381
127.0.0.1:6380> set k1 v1
OK
127.0.0.1:6380> get k1
"v1"

#启动82redis服务
[root@VM-0-12-centos bin]# ./redis-cli -p 6382
127.0.0.1:6381> set k3 v3
OK

#启动83redis服务
[root@VM-0-12-centos bin]# ./redis-cli -p 6383
127.0.0.1:6382> set k2 v2
OK

2.2、调用info replication命令查看服务信息(默认情况下,每个节点都是主节点,主从复制需要我们配置,一般情况下我们配置从机就可以了)

Image.png

3、slaveof配置主从复制

3.1、查看各服务角色

Image.png

Image.png

3.2、使用slaveof命令进行配置

127.0.0.1:6381> slaveof 127.0.0.1 6380
OK
127.0.0.1:6383> slaveof 127.0.0.1 6380
OK

3.3、通过从机配置文件进行配置

# slaveof <masterip> <masterport>    指定主节点ip + 端口(如果主机设定了密码,则需要验证密码)

3.4、查看配置信息

Image.png

Image.png

3.5、测试

81,82服务获取k5,获取不到,通过82 set k5 v5,后在81,83服务再次获取 get k5

Image.png

量复制:所有主节点的键值对,都能在从机中获取

主从读写分离:主机主要负责读操作,从机只能读不能写。

主节点宕机后,从节点角色会发生变化吗?

Image.png

实验证明即是主节点宕机,各从节点角色并未发生任何变化。且主节点宕机后重启,又继续恢复为主节点的角色

三、主从复制原理

redis的复制功能分为同步和命令传播两个操作

全量同步:

master服务器会开启一个后台进程用于将redis中的数据生成一个rdb文件。与此同时,服务器会缓存所有接收到的来自客户端的写命令。
处理完毕后,会将该rdb文件传递给slave服务器,而slave服务器会将rdb文件保存在磁盘并荣国读取该文件将数据加载到内存。
在此之后,master服务器会将这些命令通过redis传输协议发送给slave服务器,
然后slave服务器将这些命令依次作用于自己本地数据集并最终达到数据一致性

部分同步:

从redis 2.8版本以前,并不支持部分同步,当主从服务器之间的连接断掉之后,master服务器和slave服务器之间都是进行全量数据同步,但是从redis 2.8开

始,即使主从连接中途断掉,也不需要进行全量同步,因为从这个版本开始融入了部分同步的概念。部分同步的实现依赖于在master服务器内存中给每个slave服务器维护了

一份同步日志和同步标识,每个slave服务器在跟master服务器进行同步时都会携带自己的同步标识和上次同步的最后位置。当主从连接断掉之后,slave服务器隔断时间

(默认1s)主动尝试和master服务器进行连接,如果从服务器携带的偏移量标识还在master服务器上的同步备份日志中,那么就从slave发送的偏移量开始继续上次的同步

操作,如果slave发送的偏移量已经不再master的同步备份日志中(可能由于主从之间断掉的时间比较长或者在断掉的短暂时间内master服务器接收到大量的写操作),则

必须进行一次全量更新。在部分同步过程中,master会将本地记录的同步备份日志中记录的指令依次发送给slave服务器从而达到数据一致。