Redis主从复制
  TEZNKK3IfmPf 2023年11月14日 14 0
  • 如果所有用户都从同一台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安装包

Redis主从复制

Redis主从复制

  1. 修改主节点配置
bind 127.0.0.1                  #绑定ip地址
port 6380 #绑定端口号
  1. 修改从节点1配置
port 6381                       #绑定端口号
slaveof 127.0.0.1 6380 #主节点地址和端口
  1. 修改从节点2配置
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主从复制

Redis主从复制

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

Redis主从复制

  1. 查看主从状态
redis-cli -h 127.0.0.1 -p 6380
info replication

Redis主从复制

????测试主从复制

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

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)交换信息

Redis主从复制

  • 目的就是为故障判断,信息交互提供通道
  • 每1秒每个sentintel节点对master节点和slave节点以及其余的sentinel节点执行ping操作
  • 心跳检测节点是否发生故障

Redis-Sentinel选举规则

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

Redis主从复制

主观下线和客观下线

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

Redis-Sentinel搭建

  1. 首先搭建一个主从结构,搭建方式参考上方即可
  2. 然后搭建一个奇数个Sentinel节点的Sentinel

Redis主从复制

  1. 修改Sentinel配置文件(sentinel.conf)这个是需要自己创建配置的

Redis主从复制

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都差不多修改一下端口号即可,最好不要用有注释的。

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的安装目录中执行
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

Redis主从复制

Redis主从复制

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

sc delete 服务名称
  1. 测试Redis-Sentinel

把主节点服务停止

Redis主从复制

Redis主从复制

Redis主从复制

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

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月14日 0

暂无评论

推荐阅读
  TEZNKK3IfmPf   2024年05月31日   30   0   0 服务器
  TEZNKK3IfmPf   2024年05月31日   27   0   0 redis用户
  TEZNKK3IfmPf   2024年05月31日   29   0   0 dataredis
  TEZNKK3IfmPf   2024年05月31日   27   0   0 awkredis
  TEZNKK3IfmPf   2024年05月31日   51   0   0 linux服务器
  TEZNKK3IfmPf   2024年05月31日   30   0   0 linux服务器centos
  TEZNKK3IfmPf   2024年05月31日   37   0   0 服务器http
TEZNKK3IfmPf