前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis主从复制的无缝同步

Redis主从复制的无缝同步

原创
作者头像
BNTang
发布2023-09-17 11:52:25
5074
发布2023-09-17 11:52:25
举报
文章被收录于专栏:『学习与分享之旅』

Redis高可用性

  • 如果所有用户都从同一台Redis服务器上读写数据,那么如果这台Redis服务器宕机了,用户就不能进行读写了
  • 如果我们有多台Redis服务器,并且每台服务器中存储的内容都相同,那么即使有一台服务器宕机了,用户还可以继续使用其它的Redis服务器
  • 以上这种特点,我们就称之为高可用性

Redis数据安全性

  • 如果所有数据都保存在同一台Redis服务器上,那么如果这台Redis服务器坏了,那么很有可能会导致数据丢失
  • 如果我们有多台Redis服务器,并且每台服务器中存储的内容都相同,那么即使有一台服务器坏了,也不会导致数据丢失,因为我们还有其它保存了相同内容的Redis服务器
  • 以上这种特点,我们就称之为数据的安全性

Redis数据分流

  • 如果所有用户都从同一台Redis服务器上读写数据,那么由于服务器的性能限制和网络传输速度的限制,如果同一时刻用户量较多时,服务器负荷增大,数据处理速度变慢的问题
  • 如果我们有多台Redis服务器,如果我们把请求分流到不同的服务器,那么就可以降低了服务器压力,加快数据处理速度,并且如果我们将多台服务器安装到不同的区域,还可以采用就近原则访问,还可以进一步提升用户的访问速度
  • 以上这种特点,我们就称之为数据分流

Redis主从复制

  • 主从复制就是使用多台保存了相同内容的Redis服务器来组成一个数据库集群
  • 这个数据库集群中的每一台Redis服务我们称之为一个节点

🐤Redis主从复制特点

  • 主从复制中必须有一个主节点
  • 主节点主要负责写入数据和读取
  • 主从复制中除了主节点以外的节点我们称之为从节点
  • 副节点默认情况下只能读取数据,不能写入数据
  • 副节点主要负责从主节点不断复制数据

和MongoDB不同的是,Redis中的主从复制,主节点挂掉后不会自动选举,如果需要自动选举需要借助Redis Sentinel来实现

搭建Redis主从复制

我这里是以Windows10系统演示如果安装在服务器都差不多,就是需要修改bind的配置

  1. 下载Redis.Zip安装包,拷贝多份Redis安装包
  1. 修改主节点配置
代码语言:text
复制
bind 127.0.0.1                  #绑定ip地址
port 6380                       #绑定端口号
  1. 修改从节点1配置
代码语言:text
复制
port 6381                       #绑定端口号
slaveof 127.0.0.1 6380          #主节点地址和端口
  1. 修改从节点2配置
代码语言:text
复制
port 6382                       #绑定端口号
slaveof 127.0.0.1 6380          #主节点地址和端口

5 注册Redis服务启动Redis服务

命令行进入安装包路径下,执行如下指令

  • redis-server.exe --service-install redis.windows-service.conf --service-name Redis6380
  • redis-server.exe --service-install redis.windows-service.conf --service-name Redis6381
  • redis-server.exe --service-install redis.windows-service.conf --service-name Redis6382

进入任务管理器服务列表找到Redis服务分别启动刚刚注册的Redis服务

  1. 查看主从状态
代码语言:text
复制
redis-cli -h 127.0.0.1 -p 6380
代码语言:text
复制
info replication

🐤测试主从复制

  • 往主Redis设置一个String类型的数据你这时去从Redis获取一下如果存在的话就说明成功了,我这里就不在贴图了

Redis主从复制原理

🐤初始化同步

  1. 只要在任意一台Redis服务器上配置了或者执行了slaveof指令,那么就可以建立主从关系
  2. 主要建立关系,那么从节点就会自动给主节点发送全量复制请求
  3. 主节点收到从节点全量复制请求,会自动调用bgsave,生成RDB文件
  4. 主节点在生成RDB文件的过程中,如果接收到了其他指令,那么会先放在缓存区中
  5. 主节点生成好RDB文件之后,就会将RDB文件发送给从节点
  6. 主节点发送玩RDB文件之后,还会将缓存区中的指令也发送给从节点
  7. 从节点接受到RDB文件和缓存区指令之后,会先格式化自己,也就是清空自身原有的数据
  8. 加载RDB文件恢复数据,加载完RDB文件恢复完数据之后再执行缓存区中的指令

🦄后续同步

  • 主节点每执行一个写命令就会向从节点发送相同的写命令
  • 从节点接收到主节点发送过来的命令, 就执行对应的命令,以实现和主节点同步

主从复制存在的问题

  • 主从复制有效的解决了Redis数据安全性数据分流的问题,但是Redis主从复制并没有解决高可用性的问题
  • 在标准的主从复制中只有主节点可以读写数据,从节点只能读取数据,所以一旦主节点宕机了,那么用户就不能继续写入数据了
  • 也就是说在Redis的主从复制中,主节点宕机了,系统是不会自动重新选举一个主节点出来的

Redis-Sentinel

  • Redis-Sentinel是一个用来监控主从结构中每个节点的状态
  • 我们可以给Redis-Sentinel添加多个Sentinel节点,让这些节点来监控主从结构的状态
  • 一旦发现主节点挂掉了,再让这些Sentinel节点帮我们重新从从节点中选举出一个主节点

🐤Redis-Sentinel是如何做到高可用的

  • Redis-Sentinel有三个定时任务
    • 一个用于获取主从关系,发现新节点
    • 一个用于交换信息,投票选出新主服务器
    • 一个用于监听节点是否可用
  • 每10秒每个sentinel节点对master节点和slave节点执行info操作
    • 确定主从关系
    • 发现子节点
  • 每2秒每个sentinel节点通过master节点的channel(sentinel:hello)交换信息
  • 目的就是为故障判断,信息交互提供通道
  • 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作
    • 心跳检测节点是否发生故障

Redis-Sentinel选举规则

  • 第一个发现主节点挂掉的Sentinel会发起选举,这个Sentinel我们称之为候选Sentinel
  • 候选Sentinel会给其它Sentinel节点发送消息,其它Sentinel默认都会投出同意票
  • 只有其它Sentinel已经投过票才会投出反对票
  • 当同意的票数过半时,候选Sentinel就变成了领导者
  • 领导Sentinel节点会依次给所有子节点发送slaveof no one指令,让所有子节点脱离原来的主节点
  • 所有子节点脱离关系后
    • 领导Sentinel会优先选择优先级高的节点作为主节点(slave-priority配置)
    • 如果没有节点设置优先级,那么会自动选择数据最完整的节点作为主节点
    • 如果节点保存的数据都一样,那么会自动选择进程ID最小的节点作为主节点
  • 重新设置完主节点后,再让剩余节点与这个节点建立关系

主观下线和客观下线

  • 主观下线:一个Sentinel节点认为主节点下线
  • 客观下线:多个Sentinel节点认为主节点下线

Redis-Sentinel搭建

  1. 首先搭建一个主从结构,搭建方式参考上方即可
  2. 然后搭建一个奇数个Sentinel节点的Sentinel
  1. 修改Sentinel配置文件(sentinel.conf)这个是需要自己创建配置的
代码语言:text
复制
port 26380                                  # 当前Sentinel服务运行的端口
sentinel monitor mymaster 127.0.0.1 6380 2  # 主服务器名称 主服务器地址 主服务器端口,客观下线票数
sentinel down-after-milliseconds mymaster 10000 # 主观下线时间
sentinel parallel-syncs mymaster 1          # 故障转移之后,从节点是串行还是并行同步数据
sentinel failover-timeout mymaster 20000    # 故障转移超时时间
daemonize yes                               #以守护进程方式运行

上面一份配置是为了更好了理解该配置,以下配置可以用以实际当中,坑少,每个Sentinel都差不多修改一下端口号即可,最好不要用有注释的。

代码语言:text
复制
port 26380
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 10000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 20000
daemonize yes
  1. 注册sentinel服务,需要进去到Redis的安装目录中执行
代码语言:text
复制
redis-server.exe --service-install sentinel.conf --sentinel --service-name Sentinel26380
redis-server.exe --service-install sentinel.conf --sentinel --service-name Sentinel26381
redis-server.exe --service-install sentinel.conf --sentinel --service-name Sentinel26382

删除服务,管理员身份运行

代码语言:text
复制
sc delete 服务名称
  1. 测试Redis-Sentinel

把主节点服务停止

可以发现,6380Redis服务器已经访问不了,Redis-Sentinel已经为我们选举出了新的主节点,并且建立了主从关系,搭建完毕。

我正在参与 腾讯云开发者社区数据库专题有奖征文

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Redis高可用性
  • Redis数据安全性
  • Redis数据分流
  • Redis主从复制
  • 搭建Redis主从复制
  • Redis主从复制原理
  • 主从复制存在的问题
  • Redis-Sentinel
  • Redis-Sentinel选举规则
  • 主观下线和客观下线
  • Redis-Sentinel搭建
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档