Redis Sentinel安装配置的示例分析

66次阅读
没有评论

共计 12656 个字符,预计需要花费 32 分钟才能阅读完成。

丸趣 TV 小编给大家分享一下 Redis Sentinel 安装配置的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

Redis Sentinel 概述

我们知道 Redis 类似 MySQL 数据库自带主从复制结构,产品环境中,如果一旦 master 发生 crash, 我们希望 slave 可以立即自动提升为主,接替业务提供服务,如何实现这个功能呢?redis sentinel 集群可以帮助我们实现这个功能;

Redis Sentinel 是 Redis 官方原生高可用解决方案,Redis Sentinel 部署架构主要包括两部分:Redis Sentinel 集群和 Redis master-slave 集群,其中 Redis Sentinel 集群是由若干 Sentinel 节点组成的分布式集群;

可以实现故障发现、故障转移、配置中心和客户端通知。Redis Sentinel 的节点数量要满足 2n+1(n =1)的奇数个 (官方建议至少 3 个)。

Redis Sentinel 特点

(1)master 与 slave 之间的 failover 是通过 sentinel 来监控,如果共有 5 个 sentinel,配置参数中设置只要有 2 个 sentinel 认为 master crash 了,就会进行 failover, 但是进行 failover 的那个 sentinel 必须先获得至少 3 个 sentinel 的授权才能实行 failover;

(2)sentinel 集群不会同一时间多个 sentinel 并发执行 failover, 如果第一个进行 failover 的 sentinel 失败了,另外一个将会在一定时间内重新进行 failover, 以此类推;

(3) 当 failover 后,sentinel 会获得 master 的最新的一个配置版本号,然后在广播给其他 sentinel, 所以一个能够互相通信的 sentinel 集群最终会采用版本号最高且相同的配置;

(4)Redis Sentinel version1 开始于 Redis2.6, Redis Sentinel version 2 开始于 Redis 2.8, 建议使用 Sentinel 2;

(5)Redis-Sentinel 是 Redis 官方推荐的高可用性 (HA) 解决方案,Redis-sentinel 本身也是一个独立运行的进程,它能监控多个 master-slave 集群,发现 master 宕机后能进行自动切换。Sentinel 可以监视任意多个主服务器(复用),以及主服务器属下的从服务器,并在被监视的主服务器下线时,自动执行故障转移操作。

SDOWN 和 ODOWN

SDOWN(主观宕机) 是 sentinel 自己主观检测到 master 的状态是 down;

ODOWN(客观宕机) 需要大多数的 sentinel 都认为 master 宕机;

从 SDOWN 切换到 ODOWN 不需要任何一致性算法,只需要一个 gossip 协议,如果一个 sentinel 收到了足够多的 sentinel 发来消息告诉它某个 master 已经 down 掉了,SDOWN 状态就会变成 ODOWN 状态。如果之后 master 可用了,这个状态就会相应地被清理掉。

Sentinel.conf 相关参数

port 26379

#sentinel 的端口号

sentinel monitor mymaster 127.0.0.1 6379 2

#sentinel 监控的 master 名称默认是 mymaster,最后数字 2 表示如果有两个 sentinel 认为 master 挂了,则这个 master 即认为不可用;

注意:我们可以通过配置不同的 master 名称,让一套 Sentinel Cluster 监控多个 Redis master-slave 集群;

sentinel down-after-milliseconds mymaster 30000

# 默认 30 秒,sentinel 会通过 ping 来判断 master 是否存活,如果在 30 秒内 master 返回 pong 给 sentinel, 则认为 master 是好的, 否则 sentinel 认为 master 不可用;

sentinel parallel-syncs mymaster 1

# 当 Sentinel 节点集合对主节点故障判定达成一致时,Sentinel 领导者节点会做故障转移操作,选出新的主节点,原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为 1

sentinel failover-timeout mymaster 180000

#  故障转移超时时间为 3min

Redis Sentinel 中的身份验证

当一个 master 配置为需要密码才能连接时,客户端和 slave 在连接时都需要提供密码;

master 通过 requirepass 设置自身的密码,不提供密码无法连接到这个 master;

slave 通过 masterauth 来设置访问 master 时的密码;

但是当使用了 sentinel 时,由于一个 master 可能会变成一个 slave,一个 slave 也可能会变成 master,所以需要同时设置上述两个配置项。

安装 Redis Sentinel

(1)Redis sentinel 架构图和节点环境

RoelHostIPPortSentinel1sht-sgmhadoopnn-01172.16.101.5426379Sentinel2sht-sgmhadoopnn-01172.16.101.5526379Sentinel3sht-sgmhadoopnn-02172.16.101.5626379Mastersht-sgmhadoopdn-01172.16.101.586379Slave1sht-sgmhadoopdn-02172.16.101.596379Slave2sht-sgmhadoopdn-03172.16.101.606379

(2) 配置 Redis 主从复制

[root@sht-sgmhadoopdn-01 redis]# vim redis.conf
bind 172.16.101.58
[root@sht-sgmhadoopdn-01 redis]# src/redis-server redis.conf
[root@sht-sgmhadoopdn-02 redis]# vim redis.conf
bind 172.16.101.59
slaveof 172.16.101.58 6379
[root@sht-sgmhadoopdn-02 redis]# src/redis-server redis.conf
[root@sht-sgmhadoopdn-03 redis]# vim redis.conf
bind 172.16.101.60
slaveof 172.16.101.58 6379
[root@sht-sgmhadoopdn-03 redis]# src/redis-server redis.conf

检查主从复制的设置

[root@sht-sgmhadoopdn-01 redis]# src/redis-cli -h 172.16.101.58
172.16.101.58:6379  client list
id=3 addr=172.16.101.59:35718 fd=7 name= age=26 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
id=4 addr=172.16.101.60:33986 fd=8 name= age=22 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
id=5 addr=172.16.101.58:38875 fd=9 name= age=4 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
172.16.101.58:6379  info replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.16.101.59,port=6379,state=online,offset=57,lag=0
slave1:ip=172.16.101.60,port=6379,state=online,offset=57,lag=0
master_repl_offset:57
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:56

(3) 配置 sentinel 集群

三个 sentinel 节点的 sentinel.conf 文件配置一样,如果是在同一个主机上,则需要使用不同的端口号

[root@sht-sgmhadoopcm-01 redis]# vim sentinel.conf
port 26379
daemonize yes
protected-mode no
logfile  sentinel.log 
dir /usr/local/redis
sentinel monitor mymaster 172.16.101.58 6379 2
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1

sentinel 节点有两种启动方法:

src/redis-sentinel sentinel.conf
src/redis-server sentinel.conf --sentinel
[root@sht-sgmhadoopcm-01 redis]# src/redis-sentinel sentinel.conf
[root@sht-sgmhadoopnn-01 redis]# src/redis-sentinel sentinel.conf
[root@sht-sgmhadoopnn-02 redis]# src/redis-sentinel sentinel.conf
[root@sht-sgmhadoopcm-01 redis]# ps -ef|grep redis|grep -v grep
root 7541 1 0 22:33 ? 00:00:00 src/redis-sentinel *:26379 [sentinel]

(4) 检查整个集群的状态

[root@sht-sgmhadoopcm-01 redis]# src/redis-cli -h 172.16.101.54 -p 26379
172.16.101.54:26379  client list
id=3 addr=172.16.101.55:43182 fd=13 name=sentinel-ab45fe6c-cmd age=138 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=4 addr=172.16.101.56:60016 fd=15 name=sentinel-e32f20c0-cmd age=136 idle=1 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=5 addr=172.16.101.54:35342 fd=17 name= age=26 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client
172.16.101.54:26379  info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=172.16.101.58:6379,slaves=2,sentinels=3
[root@sht-sgmhadoopdn-01 redis]# src/redis-cli -h 172.16.101.58 -p 6379
172.16.101.58:6379  client list
id=16 addr=172.16.101.54:56510 fd=10 name=sentinel-30393e76-pubsub age=326 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
id=17 addr=172.16.101.54:56508 fd=11 name=sentinel-30393e76-cmd age=326 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=18 addr=172.16.101.55:57444 fd=12 name=sentinel-ab45fe6c-cmd age=177 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=publish
id=19 addr=172.16.101.55:57446 fd=13 name=sentinel-ab45fe6c-pubsub age=177 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
id=3 addr=172.16.101.59:35718 fd=7 name= age=3936 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=replconf
id=4 addr=172.16.101.60:33986 fd=8 name= age=3932 idle=0 flags=S db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=replconf
id=20 addr=172.16.101.56:55648 fd=14 name=sentinel-e32f20c0-cmd age=173 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=ping
id=21 addr=172.16.101.56:55650 fd=15 name=sentinel-e32f20c0-pubsub age=173 idle=0 flags=N db=0 sub=1 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=0 events=r cmd=subscribe
id=5 addr=172.16.101.58:38875 fd=9 name= age=3914 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

当我们启动主从节点和 sentinel 节点后,sentinel.conf 配置文件会自动添加或修改参数

[root@sht-sgmhadoopcm-01 redis]# cat sentinel.conf
sentinel myid 30393e76e002cb64db92fb8bcb88d79f2d85a82b
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 172.16.101.60 6379
sentinel known-slave mymaster 172.16.101.59 6379
sentinel known-sentinel mymaster 172.16.101.55 26379 ab45fe6c0f010473ce3b7b4d2120e1a83776b736
sentinel known-sentinel mymaster 172.16.101.56 26379 e32f20c0f315e712c9921371f15729246f3816a0
sentinel current-epoch 0
[root@sht-sgmhadoopnn-01 redis]# cat sentinel.conf
sentinel myid ab45fe6c0f010473ce3b7b4d2120e1a83776b736
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 172.16.101.60 6379
sentinel known-slave mymaster 172.16.101.59 6379
sentinel known-sentinel mymaster 172.16.101.56 26379 e32f20c0f315e712c9921371f15729246f3816a0
sentinel known-sentinel mymaster 172.16.101.54 26379 30393e76e002cb64db92fb8bcb88d79f2d85a82b
sentinel current-epoch 0
[root@sht-sgmhadoopnn-02 redis]# cat sentinel.conf
sentinel myid e32f20c0f315e712c9921371f15729246f3816a0
sentinel config-epoch mymaster 0
sentinel leader-epoch mymaster 0
# Generated by CONFIG REWRITE
sentinel known-slave mymaster 172.16.101.60 6379
sentinel known-slave mymaster 172.16.101.59 6379
sentinel known-sentinel mymaster 172.16.101.54 26379 30393e76e002cb64db92fb8bcb88d79f2d85a82b
sentinel known-sentinel mymaster 172.16.101.55 26379 ab45fe6c0f010473ce3b7b4d2120e1a83776b736
sentinel current-epoch 0

测试自动 failover

[root@sht-sgmhadoopdn-01 redis]# ps -ef|grep redis
root 15128 1 0 21:17 ? 00:00:05 src/redis-server 172.16.101.58:6379
[root@sht-sgmhadoopdn-01 redis]# kill -9 15128
[root@sht-sgmhadoopcm-01 redis]# tail -f sentinel.log
7541:X 05 Aug 22:55:48.052 # +sdown master mymaster 172.16.101.58 6379 #sentinel 主观认为 master crash;
7541:X 05 Aug 22:55:48.143 # +odown master mymaster 172.16.101.58 6379 #quorum 2/2 # 只要有两个 sentinel 节点认为 master crash, 则客观认为 master crash
7541:X 05 Aug 22:55:48.143 # +new-epoch 1
7541:X 05 Aug 22:55:48.143 # +try-failover master mymaster 172.16.101.58 6379
7541:X 05 Aug 22:55:48.165 # +vote-for-leader 30393e76e002cb64db92fb8bcb88d79f2d85a82b 1
7541:X 05 Aug 22:55:48.166 # ab45fe6c0f010473ce3b7b4d2120e1a83776b736 voted for ab45fe6c0f010473ce3b7b4d2120e1a83776b736 1
7541:X 05 Aug 22:55:48.173 # e32f20c0f315e712c9921371f15729246f3816a0 voted for ab45fe6c0f010473ce3b7b4d2120e1a83776b736 1
7541:X 05 Aug 22:55:48.544 # +config-update-from sentinel ab45fe6c0f010473ce3b7b4d2120e1a83776b736 172.16.101.55 26379 @ mymaster 172.16.101.58 6379
7541:X 05 Aug 22:55:48.544 # +switch-master mymaster 172.16.101.58 6379 172.16.101.60 6379
7541:X 05 Aug 22:55:48.545 * +slave slave 172.16.101.59:6379 172.16.101.59 6379 @ mymaster 172.16.101.60 6379
7541:X 05 Aug 22:55:48.545 * +slave slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379 # 从这一步到下一步执行 failover 成功之间需要等待 30s,这是由于参数 sentinel down-after-milliseconds mymaster 控制,master 30s 之内没有响应 sentinel 才会真正的 failover;
7541:X 05 Aug 22:56:18.562 # +sdown slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379

master 和 slave 发生了变化,IP60 成为新的 master,IP58 成为 slave 

[root@sht-sgmhadoopcm-01 redis]# src/redis-cli -h 172.16.101.54 -p 26379
172.16.101.54:26379  sentinel masters
1) 1)  name 
 2)  mymaster 
 3)  ip 
 4)  172.16.101.60 
......
172.16.101.54:26379  sentinel slaves mymaster
1) 1)  name 
 2)  172.16.101.58:6379 
 3)  ip 
 4)  172.16.101.58 
 9)  flags 
 10)  s_down,slave,disconnected 
2) 1)  name 
 2)  172.16.101.59:6379 
 3)  ip 
 4)  172.16.101.59 
 9)  flags 
 10)  slave

重启修复好的旧 master 之后,会自动成为新 master 的从库

[root@sht-sgmhadoopdn-01 redis]# src/redis-server redis.conf
[root@sht-sgmhadoopcm-01 redis]# tail -f sentinel.log
7541:X 05 Aug 23:11:10.556 # -sdown slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379
7541:X 05 Aug 23:11:20.518 * +convert-to-slave slave 172.16.101.58:6379 172.16.101.58 6379 @ mymaster 172.16.101.60 6379

Failover 过程分析:

Each Sentinel detects the master is down with an +sdown event.

This event is later escalated to +odown, which means that multiple Sentinels agree about the fact the master is not reachable.

Sentinels vote a Sentinel that will start the first failover attempt.

The failover happens.

sentinel 节点会定期通过 ping 检测 redis 的 master 是否存活,一旦 master crash,

首先 sentinel 自己会主观认为 master crash, 然后三个 sentinel 之间彼此通信,只要有两个 sentinel 节点认为 master crash, 则客观认为 master crash,

接着三个 sentinel 节点会投票,得到两票的一个 sentinel 会去执行 failover,

最后 master 30s 之内没有响应 sentinel 才会真正的 failover;

一旦挂掉的旧 master 修复,重新启动后,会作为新 master 的从库存在;

FAQ

Error1:

[root@sht-sgmhadoopcm-01 redis]# src/redis-cli -h 172.16.101.54 -p 26379
172.16.101.54:26379  ping
(error) 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) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to  no , and then restarting the server. 
3) If you started the server manually just for testing, restart it with the  --protected-mode no  option.
4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
解决方法:[root@sht-sgmhadoopcm-01 redis]# vim sentinel.conf
protected-mode no

看完了这篇文章,相信你对“Redis Sentinel 安装配置的示例分析”有了一定的了解,如果想了解更多相关知识,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-24发表,共计12656字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)