Redis——基于主从复制实现高可用(redis-sentinel)

news/2024/7/16 6:34:59

一.sentinel哨兵模式介绍

Sentinel(哨兵)是用于监控redis集群中Master状态的工具,是Redis
的高可用性解决方案,sentinel哨兵模式已经被集成在redis2.4之后的版本中。sentinel是redis高可用的解决方案,sentinel系统可以监视一个或者多个redis master服务,以及这些master服务的所有从服务;当某个master服务下线时,自动将该master下的某个从服务升级为master服务替代已下线的master服务继续处理请求。

sentinel可以让redis实现主从复制,当一个集群中的master失效之后,sentinel可以选举出一个新的master用于自动接替master的工作,集群中的其他redis服务器自动指向新的master同步数据。一般建议sentinel采取奇数台,防止某一台sentinel无法连接到master导致误切换。

在这里插入图片描述
图来自网络

redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行自动切换。Sentinel由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。

Sentinel作用:

  • 1)Master状态检测

  • 2)如果Master异常,则会进行Master-Slave切换,将其中一个Slave作为Master,将之前的Master作为Slave。

  • 3)Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换。

Redis配置文件/etc/redis/sentinel.conf中几个重要的配置项含义

port 26379

sentinel监听端口,默认是26379,可以修改。

daemonize  no

默认情况下,sentinel是不是在后台运行的,如果需要在后台运行,把该项的值更改为yes。

sentinel auth-pass <master-name> <password>

设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因此master和slave的密码应该设置相同。

配置示例:

sentinel auth-pass mymaster 0123passw0rd
sentinel monitor <master-name> <ip> <redis-port> <quorum>

告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效。master-name只能包含英文字母,数字,和“.-_”这三个字符
需要注意的是master-ip 要写真实的ip地址而不要用回环地址(127.0.0.1)。

    所以一般设置的redis的主从个数为奇数个。

    配置示例:

    sentinel  monitor  mymaster  172.25.83.1  6379  2
sentinel down-after-milliseconds <master-name> <milliseconds> 

这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是毫秒,默认为30秒

配置示例:

sentinel  down-after-milliseconds  mymaster  10000
 sentinel failover-timeout <master-name> <milliseconds>

failover-timeout 可以用在以下这些方面:
1.同一个sentinel对同一个master两次failover之间的间隔时间。
2 . 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
3.当想要取消一个正在进行的failover所需要的时间。
4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个时件,slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。

配置示例:

sentinel  failover-timeout  mymaster1  180000

二.使用(redis-sentinel)配置高可用

前提:

这个实验是基于redis的主从复制的,具体的配置请看上一篇博客,我们在配置好一主一从的前提下,新增加一从——server3(该从的配置同server2)

具体的安装redis就不展示了,这里只显示配置server3的redis:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

重启服务:

在这里插入图片描述

查看redis的信息:此时的存储数据是“mengmeng”,master是server1,salve是server2和server3

[root@server1 ~]# redis-cli
127.0.0.1:6379> get name
127.0.0.1:6379> info replication

在这里插入图片描述

配置redis高可用实验过程如下所示:

第一步:将sentinel配置文件拷贝到/etc/redis目录中并编辑

[root@server1 redis-5.0.3]# cp sentinel.conf /etc/redis/
[root@server1 redis-5.0.3]#cd  /etc/redis
[root@server1 redis]# vim sentinel.conf
 protected-mode  no        #关闭保护模式,可以进行远程连接
 sentinel monitor mymaster 172.25.27.1 6379 2      #监控的名称是mymaster,ip是 172.25.27.1,端口是6379,2表示裁决,三台主机只有半数以上同意方可切换。
 sentinel down-after-milliseconds mymaster 10000    #10秒收不到master的数据包,就认为master已经down。

在这里插入图片描述

在这里插入图片描述

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

第二步:为了方便,将server1配好的sentinel配置文件发送到server2

注意将server1上配好的sentinel文件发送给server2,一定要在server1开启sentinel之前。这是因为sentinel是一个动态的服务。如果开启sentinel,然后再发送,那么sentinel配置文件就不会发生改变。这时,在server2上启动sentinel会报错。

在这里插入图片描述
第三步:在server1/2/3开启服sentinel务

[root@server1 redis]# redis-server /etc/redis/sentinel.conf --sentinel

server1:
在这里插入图片描述

在这里插入图片描述

server2:

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

此时的server1也可以查看到:

在这里插入图片描述
server3:

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

此时的server1/2也可以查看到!

在这里插入图片描述

在这里插入图片描述

我们server1/2/3都可以看到主从复制和sentinel的变化,所以我们后面的实验变化图就不一一都放上,只挑一台主机的就好

查看sentinel的状态:

在这里插入图片描述

在这里插入图片描述

第四步:测试

重新开server1的终端并shutdown模拟master坏掉(因为之前的终端被sentinel的开启占用)

在这里插入图片描述

我们可以看到变化的过程(只是主从复制坏了,sentinel没坏所以看到过程):

在这里插入图片描述

查看redis主从复制的状态:

在这里插入图片描述
第五步:将server1恢复,加入主从复制

因为server1现在是slave,所以需要配置
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

查看变化过程:

在这里插入图片描述

重新查看redis主从复制状态:

  • server1已经加入主从复制

在这里插入图片描述

  • server1现在是slave
    在这里插入图片描述

http://www.niftyadmin.cn/n/2864066.html

相关文章

hibernate学习之第八篇

组件映射 关联的属性是个复杂类型的持久化类&#xff0c;但不是实体即&#xff1a;数据库中没有表与该属性对应&#xff0c;但该类的属性要持久保存的。 对于单表的对象细分&#xff0c;在hibernate中可借助Component节点的定义完成。 何谓Component&#xff1f;从名字上来看&…

hibernate学习之第九篇

hibernate中的集合类型 引入&#xff1a; Hibernate可以持久化以下java集合的实例, 包括java.util.Map, java.util.Set, java.util.SortedMap, java.util.SortedSet, java.util.List, 和任何持久实体或值的数组。类型为java.util.Collection或者java.util.List的属性还可以使用…

Redis——集群方案之redis cluster的搭建部署

一.redis的集群之redis cluster的概念 对于Redis集群方案有好多种&#xff0c;基本常用的就是twemproxy&#xff0c;codis&#xff0c;redis cluster这三种解决方案。 本文介绍redis cluster。 上篇博文实现redis的高可用&#xff0c;针对的主要是master宕机的情况&#xff…

hibernate学习之第十篇

级联和关系维护 Cascade 用来说明当对主对象进行某种操作时&#xff0c;是否对其关联的从对象也作类似的操作&#xff0c;常用的cascade&#xff1a;none,all,save-update,delete,lock,refresh,evict,replicate,persist,merge,delete-orphan(one-to-many).一般对many-to-many&…

Redis——基于lamp架构做mysql的缓存服务器和配置gearman实现数据同步

一.前言 对一个关系型数据库进行调优以获得高查询性能可能会比较困难。如果对数据模型优化和对查询调优不起作用&#xff0c;DBA就可以使用缓存系统&#xff0c;比如Redis&#xff0c;它是一个可以提供内存和永久数据存储的键值数据存储系统。 由于Redis能够将数据快速读写至…

hibernate学习之第十一篇(1)

hibernate的继承映射 《一》一张表映射一棵继承树 使用discriminator&#xff08;鉴别标志&#xff09; 类Worker和Farmer都继承自Person 类Person的源代码如下&#xff1a; package hibernate.extend; public class Person { private int id; private String name; private…

Redis——redis集群方案之codis集群的搭建部署

一.什么是codis集群 codis集群简介 Codis是一个分布式的Redis解决方案&#xff0c;对于上层的应用来说&#xff0c;连接Codis Proxy和连接原生的Redis Server没有明显的区别&#xff08;不支持的命令列表&#xff09;&#xff0c;上层应用可以像使用单机的Redis一样使用&#…

hibernate学习之第十一篇(2)

《二》每个子类映射到一张表&#xff08;joined-subclass&#xff09; 配置文件修改为&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" &qu…