天天看点

redis学习4:redis主从复制

目录

概述 

修改配置文件

设置主从关系

测试主从关系

实现原理

1)全量同步

2)增量同步

哨兵机制

缺点

概述 

前面介绍Redis,我们都在一台服务器上进行操作的,也就是说读和写以及备份操作都是在一台Redis服务器上进行的,那么随着项目访问量的增加,对Redis服务器的操作也越加频繁,虽然Redis读写速度都很快,但是一定程度上也会造成一定的延时,那么为了解决访问量大的问题,通常会采取的一种方式是主从架构Master/Slave,Master 以写为主,Slave 以读为主,Master 主节点更新后根据配置,自动同步到从机Slave 节点。

  接下来我们就来介绍如何进行主从架构的搭建。

  ps:这里我是在一台机器上模拟多个Redis服务器,与实际生产环境中相比,基本配置都是一样,仅仅是IP地址和端口号变化。

  

redis学习4:redis主从复制

修改配置文件

  首先将redis.conf 配置文件复制三份,通过修改端口分别模拟三台Redis服务器。

  

redis学习4:redis主从复制

  然后我们分别对这三个redis.conf 文件进行修改。

  ①、修改 daemonize yes

  

redis学习4:redis主从复制

  表示指定Redis以守护进程的方式启动(后台启动)

  ②、配置PID文件路径 pidfile

  

redis学习4:redis主从复制

  表示当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/redis/run/redis_6379.pid 文件里面

  ③、配置端口 port

  

redis学习4:redis主从复制

  ④、配置log 文件名字

  

redis学习4:redis主从复制

  ⑤、配置rdb文件名

  

redis学习4:redis主从复制

  依次将 6380redis.conf 、6381redis.conf 配置一次,则配置完毕。

  接下来我们分别启动这三个服务。

  

redis学习4:redis主从复制

  通过命令查看Redis是否启动:

  

redis学习4:redis主从复制

  接下来通过如下命令分别进入到这三个Redis客户端:

redis-cli -p 6379
redis-cli -p 6380
redis-cli -p 6381
           

设置主从关系

  ①、通过  info replication 命令查看节点角色

  

redis学习4:redis主从复制
redis学习4:redis主从复制

  我们发现这三个节点都是扮演的 Master 角色。那么如何将 6380 和 6381 节点变为 Slave 角色呢?

  ②、选择6380端口和6381端口,执行命令:SLAVEOF 127.0.0.1 6379

  

redis学习4:redis主从复制
redis学习4:redis主从复制

  我们再看 6379 节点信息:

  

redis学习4:redis主从复制

  这里通过命令来设置主从关系,一旦服务重启,那么角色关系将不复存在。想要永久的保存这种关系,可以通过配置redis.conf 文件来配置。

slaveof 127.0.0.1 6379
           

测试主从关系

  ①、增量复制

  主节点执行 set k1 v1 命令,从节点 get k1 能获取吗?

  

redis学习4:redis主从复制

  

redis学习4:redis主从复制

  

redis学习4:redis主从复制

  由上图可知是可以获取的。

  ②、全量复制

  通过执行 SLAVEOF 127.0.0.1 6379,如果主节点 6379 以前还存在一些 key,那么执行命令之后,从节点会将以前的信息也都复制过来吗?

  答案也是肯定的,这里我就不贴测试结果了。

  ③、主从读写分离

  主节点能够执行写命令,从节点能够执行写命令吗?

  

redis学习4:redis主从复制

  这里的原因是在配置文件 6381redis.conf 中对于 slave-read-only 的配置

  

redis学习4:redis主从复制

  如果我们将其修改为 no 之后,执行写命令是可以的。

  

redis学习4:redis主从复制

  但是从节点写命令的数据从节点或者主节点都不能获取的。

  ④、主节点宕机

  主节点 Maste 挂掉,两个从节点角色会发生变化吗?

  

redis学习4:redis主从复制

  

redis学习4:redis主从复制

  上图可知主节点 Master 挂掉之后,从节点角色还是不会改变的。

  ⑤、主节点宕机后恢复

  主节点Master挂掉之后,马上启动主机Maste,主节点扮演的角色还是 Master 吗?

  

redis学习4:redis主从复制

  也就是说主节点挂掉之后重启,又恢复了主节点的角色。

实现原理

Redis的主从同步,分为全量同步和增量同步。只有从机第一次连接上主机是全量同步,断线重连有可能触发全量同步也有可能是增量同步(master 判断 runid 是否一致),除此之外的情况都是增量同步。

redis学习4:redis主从复制

1)全量同步

Redis 的全量同步过程主要分三个阶段:

(1)同步快照阶段:Master 创建并发送快照给 Slave,Slave 载入并解析快照。Master 同时将此阶段所产生的新的写命令存储到缓冲区。

(2)同步写缓冲阶段:Master 向 Slave 同步存储在缓冲区的写操作命令。

(3)同步增量阶段:Master 向 Slave 同步写操作命令。

redis学习4:redis主从复制

2)增量同步

(1)Redis 增量同步主要指 Slave 完成初始化后开始正常工作时,Master 发生的写操作同步到 Slave 的过程。

(2)通常情况下,Master 每执行一个写命令就会向 Slave 发送相同的写命令,然后 Slave接收并执行。

哨兵机制

通过前面的配置,主节点Master 只有一个,一旦主节点挂掉之后,从节点没法担起主节点的任务,那么整个系统也无法运行。如果主节点挂掉之后,从节点能够自动变成主节点,那么问题就解决了,于是哨兵模式诞生了。

  哨兵模式就是不时地监控redis是否按照预期良好地运行(至少是保证主节点是存在的),若一台主机出现问题时,哨兵会自动将该主机下的某一个从机设置为新的主机,并让其他从机和新主机建立主从关系。

  

redis学习4:redis主从复制

  使用步骤:

       1、在Master对应redis.conf同目录下新建sentinel.conf文件,名字绝对不能错;

       2、配置哨兵,在sentinel.conf文件中填入内容:

             sentinel monitor 被监控数据库名字(自己起名字) ip port 1

             说明:上面最后一个数字1,表示主机挂掉后slave投票看让谁接替成为主机,得票数多少后成为主机。

      3、启动哨兵模式:

            命令键入:redis-sentinel  /myredis/sentinel.conf

           注:上述sentinel.conf路径按各自实际情况配置

缺点

 主从复制虽然解决了主节点的单点故障问题,但是由于所有的写操作都是在 Master 节点上操作,然后同步到 Slave 节点,那么同步就会有一定的延时,当系统很繁忙的时候,延时问题就会更加严重,而且会随着从节点slave的增多而愈加严重。

主要参考文章https://www.cnblogs.com/ysocean/p/9143118.html 以及 https://zhuanlan.zhihu.com/p/44376199

继续阅读