【Redis】Redis主从复制

偏执的太偏执、 2023-10-11 23:59 57阅读 0赞

文章目录

  • 前言
  • 1、配置主从复制
    • 1.1 创建master-slave文件夹,复制redis.conf到该文件夹
    • 1.2 创建master的配置文件
    • 1.3 创建slave配置文件
    • 1.4 启动master/slave
    • 1.5 查看master/slave信息
    • 1.6 验证主从复制
  • 2、主从复制原理
  • 3、薪火相传
    • 3.1 流程图
      • 3.1.1 在/opt/master-slave/中添加redis-6382.conf,并配置
      • 3.1.2 连接6382,查看配置,获取数据
  • 4、哨兵(Sentinel)模式
    • 4.1 手动实现
      • 4.1.1 选择一个slave,并执行replicaof no one或slaveof no one
      • 4.1.2 在其他slave上设置replicaof/slave,绑定新的master
      • 4.1.3 缺点
    • 4.2 哨兵(Sentinel)模式
      • 4.2.1 原理
      • 4.2.2 实现
        • 4.2.2.1 创建sentinel目录,并将sentinel.conf拷贝到当前目录
        • 4.2.2.2 复制三个sentinel.conf,并进行配置
        • 4.2.2.3 启动sentinel
        • 4.2.2.4 查看sentinel信息
        • 4.2.2.5 验证sentinel
        • 4.2.2.6 恢复旧master
  • 总结

前言

下面我们来看看redis的主从复制。
为了提高redis的性能,需要将读写进行分类,例如:一台redis负责写,其他redis负责读,此时就需要用到redis的读写分离,即:Master-Slave。

1、配置主从复制

我们以一主二从(1个master,2个slave)为例进行redis的主从配置,现实中需要三台机器,为了方便我们在一台机器上进行配置,以实现主从复制。

1.1 创建master-slave文件夹,复制redis.conf到该文件夹

创建master-slave文件,所有的操作都在该文件夹下进行

  1. mkdir /opt/master-slave
  2. cp /usr/local/redis/redis-6.2.1/redis.conf /opt/master-slave/

在这里插入图片描述

1.2 创建master的配置文件

为了做区分,master的配置文件命名为:redis-6379.conf。修改配置文件信息如下:

  1. cp /opt/master-slave/redis.conf /opt/master-slave/redis-6379.conf
  2. vim redis-6379.conf
  3. #设置当前redis后台运行,其实是设置为守护线程
  4. daemonize yes
  5. #本机IP
  6. bind 192.168.23.102
  7. #配置密码
  8. requirepass 123456
  9. #持久化文件的目录
  10. dir /opt/master-slave/
  11. #日志文件名称
  12. logfile /opt/master-slave/log_6379.log
  13. #端口
  14. port 6379
  15. #rdb文件
  16. dbfilename dump_6379.rdb
  17. #pid文件
  18. pidfile /var/run/redis_6379.pid

1.3 创建slave配置文件

从redis中命名:redis-6380.conf,redis-6381.conf。修改配置信息如下:

  1. cp /opt/master-slave/redis.conf /opt/master-slave/redis-6380.conf
  2. vim redis-6380.conf
  3. daemonize yes
  4. bind 192.168.23.102
  5. requirepass 123456
  6. dir /opt/master-slave/
  7. port 6380
  8. dbfilename dump_6380.rdb
  9. pidfile /var/run/redis_6380.pid
  10. logfile /opt/master-slave/log_6380.log
  11. #用来指定主机:旧版本:slaveof 主机ip 端口,新版本:replicaof 主机ip 端口
  12. replicaof 192.168.23.102 6379
  13. #主机的密码
  14. masterauth 123456

配置redis-6381.conf,只需要将上面配置的6380改成6381即可。

1.4 启动master/slave

  1. redis-server /opt/master-slave/redis-6379.conf
  2. redis-server /opt/master-slave/redis-6380.conf
  3. redis-server /opt/master-slave/redis-6381.conf

3台启动后,产生3个日志文件,说明启动正常。

1.5 查看master/slave信息

  1. redis-cli -h 192.168.23.102 -p 6379 -a 123456
  2. redis-cli -h 192.168.23.102 -p 6380 -a 123456
  3. redis-cli -h 192.168.23.102 -p 6381 -a 123456

在这里插入图片描述

查看master,可以看到其role是master和两个slave
在这里插入图片描述

查看slave,其role是slave,master的地址,端口等信息。

1.6 验证主从复制

我们在master上写入数据,在slave上读取数据。

  1. set key1 val1
  2. set key2 val2

在这里插入图片描述

slave上读取数据:

  1. mget key1 key2

在这里插入图片描述
在这里插入图片描述

2、主从复制原理

在这里插入图片描述

  1. slave启动成功连接master后,并向master发送sync命令,请求同步数据。
  2. master接收到slave发送的消息后,把主服务器的数据持久化到RDB文件,同时会收集接收到的修改数据命令,master将RDB文件传给slave,完成一次全量同步。

    全量同步:salve服务在接收到master发送的RDB文件后,将其存盘并加载到内存中
    增量同步:master继续将收集到的修改命令一次传给slave,完成同步

  3. slave每次连接master,都会进行一次全量同步。

小结:

  • 主redis宕机后,从redis会选取一个作为主redis,还是等待?
    从redis会继续等待,除非设置了哨兵模式或手动进行切换
  • 从redis宕机后,恢复会继续从主redis同步数据吗?
    会同步数据,从redis每次连接master时,都会完成一次全量同步,而后master传修改的命令

3、薪火相传

redis的薪火相传指:slave也可以作为master,然后设置slave进行数据同步。

3.1 流程图

在这里插入图片描述

3.1.1 在/opt/master-slave/中添加redis-6382.conf,并配置

  1. cp /opt/master-slave/redis.conf /opt/master-slave/redis-6382.conf
  2. vim redis-6382.conf
  3. daemonize yes
  4. bind 192.168.23.102
  5. requirepass 123456
  6. dir /opt/master-slave/
  7. port 6382
  8. dbfilename dump_6382.rdb
  9. pidfile /var/run/redis_6382.pid
  10. logfile /opt/master-slave/log_6382.log
  11. #用来指定主机:旧版本:slaveof 主机ip 端口,新版本:replicaof 主机ip 端口
  12. replicaof 192.168.23.102 6380
  13. #主机的密码
  14. masterauth 123456

我们将6382的配置文件中的replicaof改成6380,而6380也是一个slave。

3.1.2 连接6382,查看配置,获取数据

  1. redis-cli -h 192.168.23.102 -p 6382 -a 123456
  2. info Replication
  3. mget key1 key2

执行查询结果:
在这里插入图片描述

此时配置成功了薪火相传。
注:如果此时slave作为master宕机了,则处于它下面的slave会处于等待状态。

4、哨兵(Sentinel)模式

在redis中存在一种反客为主的现象,即当master宕机后,会从slave中选择一个做为master,而master恢复后只能作为slave提供服务。

4.1 手动实现

4.1.1 选择一个slave,并执行replicaof no one或slaveof no one

执行replicaof no one(旧版:slave no one)是将当前slave转换成master。例如:我们选择上面的6380做为新的master。

  1. replicaof no one
  2. info replication

在这里插入图片描述

4.1.2 在其他slave上设置replicaof/slave,绑定新的master

执行命令或修改对应conf配置文件信息。例如:我们修改之前的6381,将其master改成6380。

  1. replicaof 192.168.23.102 6380
  2. info replication

在这里插入图片描述

我们查看6381后,发现他的master已经改成了6380。

4.1.3 缺点

需要手动去执行命令,操作不方便,也没有实效性。

4.2 哨兵(Sentinel)模式

哨兵模式(Sentinel)是反客为主的自动版,能够监听master是否发生了故障,发生故障后会根据投票数从slave中挑选一个master,其他的slave会自动转向同步新的master,实现故障自动转移。

4.2.1 原理

在这里插入图片描述

  • 创建奇数个哨兵(Sentinel),定时向master发送ping请求
  • master需在指定时间内做出正常响应,若有半数以上响应不正常,则认为master宕机
  • sentinel投票选举一个slave做为新的master,而其他失去master的slave则指向新的master

注:在redis需要选择多个sentinel,一般奇数个,如果只有一个sentinel可能会因为网络问题导致在规定的时间接收不到master的响应,从而发生误判。

4.2.2 实现

4.2.2.1 创建sentinel目录,并将sentinel.conf拷贝到当前目录
  1. mkdir sentinel
  2. cp /usr/local/redis/redis-6.2.1/sentinel.conf /opt/sentinel/
4.2.2.2 复制三个sentinel.conf,并进行配置

我们配置的三个sentinel的端口分别是16380,16381,16382。

  1. cp sentinel.conf sentinel-16380.conf
  2. vim sentinel-16380.conf
  3. # 配置文件目录
  4. dir /opt/sentinel/
  5. # 日志文件位置
  6. logfile "./sentinel-16380.log"
  7. # pid文件
  8. pidfile /var/run/sentinel_16380.pid
  9. # 是否后台运行
  10. daemonize yes
  11. # 端口
  12. port 16380
  13. # 监控主服务器master的名字:mymaster,IP:192.168.200.129,port:6379,最后的数字2表示当Sentinel集群中有2个Sentinel认为master存在故障不可用,则进行自动故障转移
  14. sentinel monitor mymaster 192.168.23.102 6380 2
  15. # master响应超时时间(毫秒),Sentinel会向master发送ping来确认master,如果在60秒内,ping不通master,则主观认为master不可用
  16. sentinel down-after-milliseconds mymaster 60000
  17. # 故障转移超时时间(毫秒),如果3分钟内没有完成故障转移操作,则视为转移失败
  18. sentinel failover-timeout mymaster 180000
  19. # 故障转移之后,进行新的主从复制,配置项指定了最多有多少个slave对新的master进行同步,那可以理解为1是串行复制,大于1是并行复制
  20. sentinel parallel-syncs mymaster 1
  21. # 指定mymaster主的密码(没有就不指定)
  22. # sentinel auth-pass mymaster 123456

其他端口配置则复制sentinel.conf,修改端口号即可。

4.2.2.3 启动sentinel
  1. redis-sentinel sentinel-16380.conf
  2. redis-sentinel sentinel-16381.conf
  3. redis-sentinel sentinel-16382.conf

在这里插入图片描述

4.2.2.4 查看sentinel信息
  1. redis-cli -p sentinel的端口
  2. info sentinel

在这里插入图片描述

从执行结果我们可以看到,sentinel监听的master是192.168.23.102,两个slave,三个sentinel。

4.2.2.5 验证sentinel

验证sentinel,我们只需要把当前master关闭,等待故障转移设定的时间,再查看结果。
1、关闭master

  1. #查询redis信息
  2. ps -ef|grep redis
  3. #关闭master
  4. kill -9 130516

在这里插入图片描述

2、查看转移结果

在这里插入图片描述
在这里插入图片描述

从上述查询的结果发现,原来处于slave的6382转变成了master。

4.2.2.6 恢复旧master

重新启动旧master6380

  1. redis-server /opt/master-slave/redis-6380.conf

在这里插入图片描述

从执行结果上我们发现旧的master不再是master,而是变成slave,他所监听的正是sentinel选出来的新的master。

总结

上述就是Redis的主从复制,希望对大家理解redis有所帮助。谢谢

发表评论

表情:
评论列表 (有 0 条评论,57人围观)

还没有评论,来说两句吧...

相关阅读