Redis哨兵机制以及发布订阅_redis sentinel订阅

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

1 哨兵Sentinel机制

Sentinel(哨兵是Redis 的高可用性解决方案由一个或多个Sentinel 实例组成的Sentinel 系统可以监视任意多个主服务器以及这些主服务器属下的所有从服务器并在被监视的主服务器进入下线状态时自动将下线主服务器属下的某个从服务器升级为新的主服务器。简单的说哨兵就是带有自动故障转移功能的主从架构

无法解决: 1.单节点并发压力问题 2.单节点内存和磁盘物理上限

主从切换技术的方法是当主服务器宕机后需要手动把一台从服务器切换为主服务器这就需要人工干预费事费力还会造成一段时间内服务不可用。这不是一种推荐的方式更多时候我们优先考虑哨兵模式

2 哨兵架构原理

在这里插入图片描述

单机单个哨兵

在这里插入图片描述

哨兵的作用

  • 通过发送命令让Redis服务器返回监控其运行状态包括主服务器和从服务器。
  • 当哨兵监测到master宕机会自动将slave切换成master然后通过发布订阅模式通知其他的从服务器修改配置文件让它们切换主机。

然而一个哨兵进程对redis服务器进行监控可能会出现问题为此我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控这样就形成了多哨兵模式。

在这里插入图片描述

假设主服务器宕机哨兵1先检测到这个结果系统并不会立马进行failover过程仅仅是哨兵1主观的认为主服务器不可用这个现象称为主观下线。当后面的哨兵也检测到主服务器不可用并且达到一定数量那么哨兵之间会进行一次投票投票的结果由一个哨兵发起进行failover(故障转移操作。q切换成功后通过发布订阅模式让各个哨兵把自己的监控的从服务器实现切换主机这个过称为客观下线

哨兵的核心配置

sentinel monitor mymaster 127.0.0.1 6379 1
  • 数字1表示 当一个哨兵主观认为主机断开就可以客观认为主机故障然后开始选举新的主机。

3 搭建哨兵架构

1.在主节点上创建哨兵配置

  • 在Master对应redis.conf同目录下新建sentinel.conf文件名字绝对不能错;
    $ vi sentinel.conf
    

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

  • sentinel monitor 被监控数据库名字(自己起名字 ip port 1
  • 1 代表有多少个哨兵认为主机挂了就开始选
    说明:这个后面的数字2,是指当有两个及以上的sentinel服务检测到master宕机才会去执行主从切换的功能。
    $ sentinel monitor myredis 127.0.0.1 6379 1
    

3.启动哨兵模式进行测试

- redis-sentinel  config/sentinel.conf
如果master节点断开了就会从从机中选择一个作为主机。

如果主机此时回来了只能归并到新的主机下当作从机这就是哨兵模式的规则。

优点

  1. 哨兵集群基于主从复制模式所有主从配置的优点他都有
  2. 主从可以切换故障可以转移系统可用性会更好
  3. 哨兵模式就是主从模式的升级手动到自动更加健壮

缺点

  1. redis不好在线扩容集群容量一旦到达上限在线扩容就十分麻烦
  2. 实现哨兵模式的配置其实是很麻烦的里面有很多选择

完整的哨兵配置

# Example sentinel.conf
 
# 哨兵sentinel实例运行的端口 默认26379
port 26379
 
# 哨兵sentinel的工作目录
dir /tmp
 
# 哨兵sentinel监控的redis主节点的 ip port 
# master-name  可以自己命名的主节点名字 只能由字母A-z、数字0-9 、这三个字符".-_"组成。
# quorum 当这些quorum个数sentinel哨兵认为master主节点失联 那么这时 客观上认为主节点失联了
# sentinel monitor <master-name> <ip> <redis-port> <quorum>
sentinel monitor mymaster 127.0.0.1 6379 1
 
# 当在Redis实例中开启了requirepass foobared 授权密码 这样所有连接Redis实例的客户端都要提供密码
# 设置哨兵sentinel 连接主从的密码 注意必须为主从设置一样的验证密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
 
 
# 指定多少毫秒之后 主节点没有应答哨兵sentinel 此时 哨兵主观上认为主节点下线 默认30秒
# sentinel down-after-milliseconds <master-name> <milliseconds>
sentinel down-after-milliseconds mymaster 30000
 
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步
这个数字越小完成failover所需的时间就越长
但是如果这个数字越大就意味着越 多的slave因为replication而不可用。
可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
# sentinel parallel-syncs <master-name> <numslaves>
sentinel parallel-syncs mymaster 1
 
 
 
# 故障转移的超时时间 failover-timeout 可以用在以下这些方面 
#1. 同一个sentinel对同一个master两次failover之间的间隔时间。
#2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那里同步数据时。
#3.当想要取消一个正在进行的failover所需要的时间。  
#4.当进行failover时配置所有slaves指向新的master所需的最大时间。不过即使过了这个超时slaves依然会被正确配置为指向master但是就不按parallel-syncs所配置的规则来了
# 默认三分钟
# sentinel failover-timeout <master-name> <milliseconds>
sentinel failover-timeout mymaster 180000
 
# SCRIPTS EXECUTION
 
#配置当某一事件发生时所需要执行的脚本可以通过脚本来通知管理员例如当系统运行不正常时发邮件通知相关人员。
#对于脚本的运行结果有以下规则
#若脚本执行后返回1那么该脚本稍后将会被再次执行重复次数目前默认为10
#若脚本执行后返回2或者比2更高的一个返回值脚本将不会重复执行。
#如果脚本在执行过程中由于收到系统中断信号被终止了则同返回值为1时的行为相同。
#一个脚本的最大执行时间为60s如果超过这个时间脚本将会被一个SIGKILL信号终止之后重新执行。
 
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等将会去调用这个脚本
#这时这个脚本应该通过邮件SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时将传给脚本两个参数
#一个是事件的类型
#一个是事件的描述。
#如果sentinel.conf配置文件中配置了这个脚本路径那么必须保证这个脚本存在于这个路径并且是可执行的否则sentinel无法正常启动成功。
#通知脚本
# sentinel notification-script <master-name> <script-path>
  sentinel notification-script mymaster /var/redis/notify.sh
 
# 客户端重新配置主节点参数脚本
# 当一个master由于failover而发生改变时这个脚本将会被调用通知相关的客户端关于master地址已经发生改变的信息。
# 以下参数将会在调用脚本时传给脚本:
# <master-name> <role> <state> <from-ip> <from-port> <to-ip> <to-port>
# 目前<state>总是“failover”,
# <role>是“leader”或者“observer”中的一个。 
# 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的
# 这个脚本应该是通用的能被多次调用不是针对性的。
# sentinel client-reconfig-script <master-name> <script-path>
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh

4 通过springboot操作哨兵

# redis sentinel 配置
# master书写是使用哨兵监听的那个名称
spring.redis.sentinel.master=mymaster
# 连接的不再是一个具体redis主机,书写的是多个哨兵节点
spring.redis.sentinel.nodes=192.168.202.206:26379

注意:如果连接过程中出现如下错误RedisConnectionException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command ‘CONFIG SET protected-mode no’ from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2

解决方案在哨兵的配置文件中加入bind 0.0.0.0 开启远程连接权限

一般在port下面加入即可bind 0.0.0.0

Redis发布订阅

redis发布订阅(pub/sub是一种消息通测试

发布者

127.0.0.1:6379> PUBLISH xxx hello,qqqq   # 发布消息helloqqq到xxx频道
(integer) 1
127.0.0.1:6379> PUBLISH xxx hello,redis
(integer) 1

订阅者

127.0.0.1:6379> SUBSCRIBE xxx       # 订阅频道
Reading messages... (press Ctrl-C to quit)

1) "subscribe"
2) "xxx"
3) (integer) 1

#等待消息

1) "message"        # 消息
2) "xxx"            # 消息频道
3) "hello,qqqq"     # 消息内容
4) "message"
5) "xxx"
6) "hello,redis"

原理

Redis是使用C实现的通过分析redis源码里的pubsub.cc文件了解发布和订阅机制的底层实现借此加深堆redis的理解。
redis是通过PUBLISH、SUBSCRIBE和PSUBSCRIBE等命令实现发布和订阅功能。
通过SUBSCRIBE命令订阅某频道后redis-server里维护了一个字典字典的键就是一个一个个channel 而字典的值则是一个链表链表中保存了所有订阅这个channel的客户端。SUBSCRIBE命令的关键就是将客户端添加到给定的channel的订阅链表中。
通过PUBLISH命令向订阅者发送消息redis-server会使用给定的频道作为键在它所维护的channel字典中查找记录了订阅这个频道的客户端的链表遍历这个链表将消息发布给所有的订阅者。
pub/sub从字面上理解就是发布(Publish和订阅(Subscribe在redis中可以设定对某一个key值进行消息发布几消息订阅当一个key值上进行了消息发布后所有订阅它的客户端都会收到相应的消息。这一功能最明显的用法就是用作实时消息系统比如一个普通的即时聊天群聊等。

  • 使用场景
    实时消息系统
    实时聊天(频道当做聊天室将信息回显给所有人即可
    订阅关注系统都是可以的
    稍微复杂的场景我们就是用消息中间件MQ Kafka…信模式;
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis

“Redis哨兵机制以及发布订阅_redis sentinel订阅” 的相关文章