程序笔记   发布时间:2022-07-16  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了NoSQL数据库之Redis(Sentinel)哨兵大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

redis 哨兵(SenTinel)

redis 集群介绍

主从架构无法实现Master和Slave角色的自动切换,即当master出现redis服务异常、主机断电、磁盘损
坏等问题导致master无法使用,而redis主从复制无法实现自动的@R_871_10772@(将slave 自动提升为新
master),需要手动修改环境配置,才能切换到slave redis服务器,另外当单台redis服务器性能无法满足
业务写入需求的时候,也无法横向扩展redis服务的并行写入性能

需要解决以上的两个核心问题:
Master和Slave角色的无缝切换,让业务无感知从而不影响业务使用
可横向动态扩展redis服务器,从而实现多台服务器并行写入以实现更高并发的目的。
redis 集群实现方式:
客户端分片: 由应用决定将不同的KEY发送到不同的redis服务器
代理分片: 由代理决定将不同的KEY发送到不同的redis服务器,代理程序如:codis,twemproxy等
redis Cluster
@H_801_6@

哨兵 (SenTinel) 工作原理

senTinel 架构和@R_871_10772@

SenTinel 进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时
候,可以实现Master和Slave服务器的切换,保证系统的高可用,此功能在redis2.6+的版本已引用,
redis的哨兵模式到了2.8版本之后就稳定了下来。一般在生产环境也建议使用redis的2.8版本的以后版
本
哨兵(SenTinel) 是一个分布式系统,可以在一个架构中运行多个哨兵(senTinel) 进程,这些进程使用流言
协议(gossip protocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement
Protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master
每个哨兵(SenTinel)进程会向其它哨兵(SenTinel)、Master、Slave定时发送消息,以确认对方是否”活”
着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的”
主观认为宕机” (主观(单个):是每个成员都具有的独自的而且可能相同也可能不同的意识),英文名称:
Subjective Down,简称SDOWN

有主观宕机,对应的有客观宕机。当“哨兵群”中的多数SenTinel进程在对Master主服务器做出SDOWN
的判断,并且通过 SENTinEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”(客观(多个):是不依赖于某种意识而已经实际存在的一切事物),英文名称是:
Objectively Down, 简称 ODOWN
通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修
改相关配置,并开启@R_871_10772@(failover)
SenTinel 机制可以解决Master和Slave角色的自动切换问题,但单个 Master 的性能瓶颈问题无法解决,
类似于MySQL中的MHA功能
redis SenTinel中的SenTinel节点个数应该为大于等于3且最好为奇数
客户端初始化时连接的是SenTinel节点集合,不再是具体的redis节点,但SenTinel只是配置中心不是代
理。
redis SenTinel 节点与普通redis 没有区别,要实现读写分离依赖于客户端程序
redis 3.0 之前版本中,生产环境一般使用哨兵模式,3.0后推出redis cluster功能,可以支持更大规模的生产环境
@H_801_6@

senTinel中的三个定时任务

每10秒每个senTinel对Master和Slave执行info发现slave节点确认主从关系

每2秒每个senTinel通过master节点的chAnnel交换信息(pub/sub)通过senTinel__:Hello频道交互
交互对节点的“看法”和自身信息

每1秒每个senTinel对其他senTinel和redis执行ping
@H_801_6@

实现哨兵

哨兵的准备实现主从复制架构

哨兵的前提是已经实现了一个redis的主从复制的运行环境,从而实现一个一主两从基于哨兵的高可用 redis架构 注意: master 的配置文件中masterauth 和slave 都必须相同 所有主从节点的redis.conf中关键配置

范例: 准备主从环境配置

#在所有主从节点执行
[root@centos8 ~]# yum -y install redis
[root@centos8 ~]# vim /etc/redis.conf
bind 0.0.0.0
masterauth "123456"
requirepass "123456"

#或者非交互执行
[root@centos8 ~]# sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/' -e 's/^# masterauth.*/masterauth 123456/' -e 's/^#requirepass .*/requirepass 123456/' /etc/redis.conf

#在所有从节点执行
[root@centos8 ~]# echo "replicaof 172.31.0.8 6379" >> /etc/redis.conf

#在所有主从节点执行
[root@centos8 ~]# systemctl enable --now redis
@H_801_6@
@H_414_2@master服务器状态

[root@redis-master ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface may not
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.31.0.28,port=6379,state=online,offset=112,lag=1
slave1:ip=172.31.0.18,port=6379,state=online,offset=112,lag=0
...
@H_801_6@

配置slave1

[root@redis-slave1 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface may not be safe.
127.0.0.1:6379> REPLICAOF 172.31.0.8 6379
OK
127.0.0.1:6379> CONFIG SET masterauth "123456"
OK
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.31.0.8
master_port:6379
master_link_status:up
...
@H_801_6@

配置slave2

[root@redis-slave2 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface may not be safe.
127.0.0.1:6379> REPLICAOF 172.31.0.8 6379
OK
127.0.0.1:6379> CONFIG SET masterauth "123456"
OK
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.31.0.8
master_port:6379
master_link_status:up
@H_801_6@

编辑哨兵的配置文件

senTinel配置

SenTinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在26379/tcp端口. 哨兵可以不和redis服务器部署在一起,但一般部署在一起以节约成本

所有redis节点使用相同的以下示例的配置文件

#如果是编译安装,在源码目录有senTinel.conf,复制到安装目录即可,
如:/apps/redis/etc/senTinel.conf
[root@centos8 ~]# vim /etc/redis-senTinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "/var/run/redis-senTinel.pid"
logfile "/var/log/redis/senTinel_26379.log"
dir "/tmp" #工作目录
senTinel monitor mymaster 172.31.0.8 6379 2
#mymaster是集群的名称,此行指定当前mymaster集群中master服务器的地址和端口
#2为法定人数限制(quorum),即有几个senTinel认为master down了就进行@R_871_10772@,一般此值是所有
senTinel节点(一般总数是>=3的奇数,如:3,5,7等)的一半以上的整数值,比如,总数是3,即3/2=1.5,取整为2,是master的ODOWN客观下线的依据
senTinel auth-pass mymaster 123456
#mymaster集群中master的密码,注意此行要在上面行的下面
senTinel down-after-milliseconds mymaster 30000
#(SDOWN)判断mymaster集群中所有节点的主观下线的时间,单位:毫秒,建议3000
senTinel parallel-syncs mymaster 1
#发生@R_871_10772@后,可以同时向新master同步数据的slave的数量,数字越小总同步时间越长,但可以减轻新master的负载压力
senTinel failover-timeout mymaster 180000
#所有slaves指向新的master所需的超时时间,单位:毫秒
senTinel deny-scripts-reconfig yes #禁止修改脚本
logfile /var/log/redis/senTinel.log
@H_801_6@

三个哨兵服务器的配置都如下

[root@redis-master ~]#grep -vE "^#|^$" /etc/redis-senTinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-senTinel.pid"
logfile "/var/log/redis/senTinel.log"
dir "/tmp"
senTinel monitor mymaster 172.31.0.8 6379 2 #修改此行
senTinel auth-pass mymaster 123456 #增加此行
senTinel down-after-milliseconds mymaster 3000 #修改此行
senTinel parallel-syncs mymaster 1
senTinel failover-timeout mymaster 180000
senTinel deny-scripts-reconfig yes

#以下内容自动生成,不需要修改
senTinel myid 50547f34ed71fd48c197924969937e738a39975b
#此行自动生成必须唯一,修改此值需重启redis和senTinel服务
.....
# Generated by CONFIG REWRITE
protected-mode yes
supervised systemd
senTinel leader-epoch mymaster 0
senTinel known-replica mymaster 172.31.0.28 6379
senTinel known-replica mymaster 172.31.0.18 6379
senTinel current-epoch 0

# 如果是配置好一台然后使用远程拷贝文件的,
[root@redis-master ~]# scp /etc/redis-senTinel.conf redis-slave1:/etc/
[root@redis-master ~]# scp /etc/redis-senTinel.conf redis-slave2:/etc/
@H_801_6@

注意:改好配置文件先不要启动redisredis-senTinel服务,等所有节点都拷贝完成再启动,不然myid会出现相同的问题

启动哨兵, 三台哨兵服务器都要启动

#确保每个哨兵主机myid不同
[root@redis-slave1 ~]# grep myid /etc/redis-senTinel.conf

senTinel myid 9088ef55d94627b6078c22968dde240ced300b14

[root@redis-slave2 ~]# grep myid /etc/redis-senTinel.conf
senTinel myid ad0e1f899fa97fba92d286b3ba5baa997eac59f8

[root@redis-master ~]# systemctl enable --now redis-senTinel.service
[root@redis-slave1 ~]# systemctl enable --now redis-senTinel.service
[root@redis-slave2 ~]# systemctl enable --now redis-senTinel.service

#如果是编译安装在所有节点生成新的service文件
[root@redis-master ~]# cat /lib/systemd/system/redis-senTinel.service
[Unit]
Description=redis SenTinel
After=network.target
[service]
ExecStart=/apps/redis/bin/redis-senTinel /apps/redis/etc/redis-senTinel.conf --
supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectorymode=0755
[Install]
WantedBy=multi-user.target

#注意所有节点的目录权限,否则无法启动服务
[root@redis-master ~]# chown -R redis.redis /apps/redis/
@H_801_6@

如果是编译安装,在所有哨兵服务器执行下面操作启动哨兵

[root@redis-master ~]# vim /apps/redis/etc/senTinel.conf
bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-senTinel.pid"
Logfile "senTinel_26379.log"
dir "/apps/redis/data"
senTinel monitor mymaster 172.31.0.8 6379 2
senTinel auth-pass mymaster 123456 (如果是master不需要设置这个密码)
senTinel down-after-milliseconds mymaster 15000
senTinel parallel-syncs mymaster 1
senTinel failover-timeout mymaster 180000
senTinel deny-scripts-reconfig yes

#/apps/redis/bin/redis-senTinel /apps/redis/etc/senTinel.conf
@H_801_6@

验证哨兵端口

[root@redis-master ~]# ss -ntl
26379
@H_801_6@

查看哨兵日志 master的哨兵日志

[root@redis-master ~]# tail -f /var/log/redis/senTinel.log
38028:X 20 Feb 2021 17:13:08.702 # oO0OoO0OoO0Oo redis is starTing oO0OoO0OoO0Oo
38028:X 20 Feb 2021 17:13:08.702 # redis version=5.0.3, bits=64,
commit=00000000, modified=0, pid=38028, just started
@H_801_6@

slave的哨兵日志

[root@redis-slave1 ~]# tail -f /var/log/redis/senTinel.log
25509:X 20 Feb 2021 17:13:27.435 * Removing the pid file.
25509:X 20 Feb 2021 17:13:27.435 # SenTinel is now ready to exit, bye bye...
25572:X 20 Feb 2021 17:13:27.448 # oO0OoO0OoO0Oo redis is starTing oO0OoO0OoO0Oo
25572:X 20 Feb 2021 17:13:27.448 # redis version=5.0.3, bits=64,
commit=00000000, modified=0, pid=25572, just started
@H_801_6@

当前senTinel状态

在senTinel状态中尤其是最后一行,涉及到masterIP是多少,有几个slave,有几个senTinels,必须是符合全部服务器数量

[root@redis-master ~]# redis-cli -p 26379
127.0.0.1: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.31.0.8:6379,slaves=2,senTinels=3 #两个
slave,三个senTinel服务器,如果senTinels值不符合,检查myid可能冲突
@H_801_6@

停止redis Master 节点测试@R_871_10772@

[root@redis-master ~]# killall redis-server
@H_801_6@

查看各节点上哨兵信息:

[root@redis-master ~]# redis-cli -a 123456 -p 26379
Warning: Using a password with '-a' or '-u' option on the command linE interface
may not be safe.
127.0.0.1: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.31.0.18:6379,slaves=2,senTinels=2
@H_801_6@

@R_871_10772@时senTinel的信息:

[root@redis-master ~]# tail -f /var/log/redis/senTinel.log
38028:X 20 Feb 2021 17:42:27.362 # +sdown master mymaster 172.31.0.8 6379
38028:X 20 Feb 2021 17:42:27.418 # +odown master mymaster 172.31.0.8 6379 #quorum
@H_801_6@

@R_871_10772@后的redis配置文件会被自动修改

@R_871_10772@后redis.conf中的replicaof行的master IP会被修改

[root@redis-slave2 ~]# grep ^replicaof /etc/redis.conf
replicaof 172.31.0.18 6379
@H_801_6@

哨兵配置文件的senTinel monitor IP 同样也会被修改

[root@redis-slave1 ~]# grep "^[a-Z]" /etc/redis-senTinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-senTinel.pid"
logfile "/var/log/redis/senTinel.log"
dir "/tmp"
senTinel myid 50547f34ed71fd48c197924969937e738a39975b
senTinel deny-scripts-reconfig yes
senTinel monitor mymaster 172.31.0.18 6379 2 #自动修改此行

[root@redis-slave2 ~]# grep "^[a-Z]" /etc/redis-senTinel.conf
port 26379
daemonize yes
pidfile "/var/run/redis-senTinel.pid"
logfile "/var/log/redis/senTinel.log"
dir "/tmp"
senTinel myid 50547f34ed71fd48c197924969937e738a39975d
senTinel deny-scripts-reconfig yes
senTinel monitor mymaster 172.31.0.18 6379 2 #自动修改此行
@H_801_6@

当前 redis状态 新的master 状态

[root@redis-slave1 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface
may not be safe.
127.0.0.1:6379> INFO Replication
# Replication
role:master #提升为master
connected_slaves:1
slave0:ip=172.31.0.28,port=6379,state=online,offset=56225,lag=1
@H_801_6@

另一个slave指向新的master

[root@redis-slave2 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface
may not be safe.
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.31.0.18 #指向新的master
master_port:6379
master_link_status:up
@H_801_6@

恢复故障的原master重新加入redis集群

[root@redis-master ~]# cat /etc/redis.conf
#senTinel会自动修改下面行指向新的master
replicaof 172.31.0.18 6379
@H_801_6@

在原 master上观察状态

[root@redis-master ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface
may not be safe.
127.0.0.1:6379> INFO Replication
# Replication
role:slave
master_host:172.31.0.18
master_port:6379
master_link_status:up
...
[root@redis-master ~]# redis-cli -p 26379
127.0.0.1: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.31.0.18:6379,slaves=2,senTinels=3
@H_801_6@

观察新master上状态和日志

[root@redis-slave1 ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command linE interface
may not be safe.
127.0.0.1:6379> INFO Replication
# Replication
role:master
connected_slaves:2
slave0:ip=172.31.0.28,port=6379,state=online,offset=769027,lag=0
slave1:ip=172.31.0.8,port=6379,state=online,offset=769027,lag=0

[root@redis-slave1 ~]# tail -f /var/log/redis/senTinel.log
25717:X 20 Feb 2021 17:42:33.757 # +sdown slave 172.31.0.8:6379 10.0.0.8 6379 @
mymaster 172.31.0.18 6379
25717:X 20 Feb 2021 18:41:29.566 # -sdown slave 172.31.0.8:6379 172.31.0.8 6379 @
mymaster 172.31.0.18 6379
@H_801_6@

senTinel 运维

手动让主节点下线

senTinel failover <masterName>
@H_801_6@

范例: 手动@R_871_10772@

[root@centos8 ~]# vim /etc/redis.conf
replica-priority 10 #指定优先级,值越小senTinel会优先将之选为新的master,默为值为100
[root@centos8 ~]# redis-cli -p 26379
127.0.0.1:26379> senTinel failover mymaster
OK
@H_801_6@

应用程序如何连接 redis

redis 官方客户端:https://redis.io/clients
@H_801_6@

客户端连接 senTinel 工作原理

1. 客户端获取senTinel节点集合,选举出一个senTinel
2. 由这个senTinel通过masterName获取master节点信息,客户端通过senTinel get-master-addr-byname master-name这个api来获取对应主节点信息
3. 客户端发送role指令确认mater的信息,验证当前获取的“主节点”是真正的主节点,这样的目的是为了防止@R_871_10772@期间主节点的变化
4. 客户端保持和senTinel节点集合的联系,即订阅senTinel节点相关频道,时刻获取关于主节点的相关信息,获取新的master 信息变化,并自动连接新的master
@H_801_6@

java 连接SenTinel哨兵

java 客户端连接redishttps://github.com/xetorthio/jedis/blob/master/pom.xml
@H_801_6@

python 连接SenTinel哨兵

[root@centos8 ~]# yum -y install python3 python3-redis
[root@centos8 ~]# cat senTinel_test.py
@H_801_6@

报错

[root@centos8 ~]# tail -f /var/log/redis/senTinel.log

34767:X 08 Jul 2021 05:58:08.885 # +new-epoch 10
34767:X 08 Jul 2021 05:58:08.886 # +vote-for-leader bfde7cf3bed44d35a9ff08699d705219bfeb2bdf 10
34767:X 08 Jul 2021 05:58:08.886 # +sdown master mymaster 172.31.0.8 6379
34767:X 08 Jul 2021 05:58:08.886 # +odown master mymaster 172.31.0.8 6379 #quorum 1/1
34767:X 08 Jul 2021 05:58:08.886 # Next failover delay: I will not start a failover before Thu Jul  8 06:04:09 2021
@H_801_6@

解决办法:

添加这个参数:
senTinel failover-timeout mymaster 180000
#所有slaves指向新的master所需的超时时间,单位:毫秒
@H_801_6@

大佬总结

以上是大佬教程为你收集整理的NoSQL数据库之Redis(Sentinel)哨兵全部内容,希望文章能够帮你解决NoSQL数据库之Redis(Sentinel)哨兵所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。