四川网站建设找哪家,能引流的都有什么平台,做网站找哪家公司比较好,教师遭网课入侵直播录屏曝光口文章目录 一、redis 哨兵#xff08;sentinel#xff09;redis 集群介绍哨兵#xff08;Sentinel#xff09;工作原理sentinel 架构和故障转移sentinel中的三个定时任务 实时哨兵启动哨兵验证哨兵端口查看哨兵日志当前sentinel状态停止Redis Master测试故障转移恢复故障的m… 文章目录 一、redis 哨兵sentinelredis 集群介绍哨兵Sentinel工作原理sentinel 架构和故障转移sentinel中的三个定时任务 实时哨兵启动哨兵验证哨兵端口查看哨兵日志当前sentinel状态停止Redis Master测试故障转移恢复故障的master重新加入redis集群sentinel 运维python连接redispython连接Sentinel哨兵 一、redis 哨兵sentinel
redis 集群介绍
主从架构无法实现master和slave角色的自动切换即当master出现redis服务异常、主机断电、磁盘损坏等问题导致master无法使用而redis主从复制无法实现自动的故障转移(将slave 自动提升为新master)需要手动修改环境配置,才能切换到slave redis服务器另外也无法横向扩展Redis服务的并行写入性能当单台Redis服务器性能无法满足业务写入需求的时候,也需要解决以上的两个核心问题
master和slave角色的无缝切换让业务无感知从而不影响业务使用可横向动态扩展Redis服务器从而实现多台服务器并行写入以实现更高并发的目的。
Redis 集群实现方式
客户端分片: 由应用决定将不同的KEY发送到不同的Redis服务器代理分片: 由代理决定将不同的KEY发送到不同的Redis服务器,代理程序如:codis,twemproxy等Redis Cluster
哨兵Sentinel工作原理
sentinel 架构和故障转移 Sentinel 进程是用于监控redis集群中Master主服务器工作的状态在Master主服务器发生故障的时候可以实现Master和Slave服务器的切换保证系统的高可用此功能在redis2.6的版本已引用Redis的哨兵模式到了2.8版本之后就稳定了下来。一般在生产环境也建议使用Redis的2.8版本的以后版本
哨兵(Sentinel) 是一个分布式系统可以在一个架构中运行多个哨兵(sentinel) 进程这些进程使用流言协议(gossip protocols)来接收关于Master主服务器是否下线的信息并使用投票协议(AgreementProtocols)来决定是否执行自动故障迁移,以及选择哪个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服务器节点然后自动修改相关配置并开启故障转移failover
Sentinel 机制可以解决master和slave角色的自动切换问题但单个 Master 的性能瓶颈问题无法解决,类似于MySQL中的MHA功能
Redis Sentinel中的Sentinel节点个数应该为大于等于3且最好为奇数
客户端初始化时连接的是Sentinel节点集合不再是具体的Redis节点但Sentinel只是配置中心不是代理。
Redis Sentinel 节点与普通redis 没有区别,要实现读写分离依赖于客户端程序
redis 3.0 之前版本中,生产环境一般使用哨兵模式,但3.0后推出redis cluster功能后,可以支持更大规模的生产环境
sentinel中的三个定时任务
每10秒每个sentinel对master和slave执行info 发现slave节点确认主从关系 每2秒每个sentinel通过master节点的channel交换信(pub/sub) 通过sentinel_hello频道交互交互对节点的“看法”和自身信息 每1秒每个sentinel对其他sentinel和redis执行ping
实时哨兵 哨兵的准备实现主从复制架构 哨兵的前提是已经实现了一个redis的主从复制的运行环境从而实现一个一主两从基于哨兵的高可用redis架构注意: master 的配置文件中masterauth 和slave 都必须相同
# 在所有主从节点执行这里以master为例
[rootmaster ~]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0
masterauth centos
requirepass centos
[rootmaster ~]# echo -e net.core.somaxconn 1024\nvm.overcommit_memory 1 /etc/sysctl.conf
[rootmaster ~]# sysctl -p
net.core.somaxconn 1024
vm.overcommit_memory 1
net.core.somaxconn 1024
vm.overcommit_memory 1
[rootmaster ~]# echo never /sys/kernel/mm/transparent_hugepage/enabled
[rootmaster ~]# echo echo never /sys/kernel/mm/transparent_hugepage/enabled /etc/rc.d/rc.local
[rootmaster ~]# chmod x /etc/rc.d/rc.local
[rootmaster ~]# systemctl restart redis设置主从复制
#在所有从节点执行这里以slave1为例
[rootslave1 ~]# echo replicaof 192.168.64.129 6379 /apps/redis/etc/redis.conf
[rootslave1 ~]# systemctl restart redismaster服务器状态
[rootmaster ~]# redis-cli
127.0.0.1:6379 auth centos
OK
127.0.0.1:6379 info replication
# Replication
role:master
connected_slaves:2
slave0:ip192.168.175.20,port6379,stateonline,offset112,lag0
slave1:ip192.168.175.30,port6379,stateonline,offset112,lag0
master_replid:ec21203b0f3034282e18d6532055379b3de45f82
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:112
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:112编辑哨兵的配置文件 Sentinel实际上是一个特殊的redis服务器,有些redis指令支持,但很多指令并不支持.默认监听在26379/tcp端口哨兵可以不和Redis服务器部署在一起但一般部署在一起所有redis节点使用相同的配置文件
# 如果是编译安装在源码目录有sentinel.conf复制到安装目录即可
[rootmaster ~]# cp redis-5.0.9/sentinel.conf /apps/redis/etc/
[rootmaster ~]# grep -Ev ^(#|$) /apps/redis/etc/sentinel.conf
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile
dir /tmp #工作目录
sentinel monitor mymaster 127.0.0.1 6379 2
#指定当前mymaster集群中master服务器的地址和端口
#2为法定人数限制(quorum)即有几个sentinel认为master down了就进行故障转移一般此值是所有sentinel节点(一般总数是3的 奇数,如:3,5,7等)的一半以上的整数值比如总数是3即3/21.5取整为2,是master的ODOWN客观下线的依据
sentinel auth-pass master-name password
#mymaster集群中master的密码注意此行要在上面行的下面
sentinel down-after-milliseconds mymaster 30000
#(SDOWN)判断mymaster集群中所有节点的主观下线的时间单位毫秒建议30000
sentinel parallel-syncs mymaster 1
#发生故障转移后同时向新master同步数据的slave数量数字越小总同步时间越长但可以减轻新master的负载压力
sentinel failover-timeout mymaster 180000
#所有slaves指向新的master所需的超时时间单位毫秒
sentinel deny-scripts-reconfig yes
#禁止修改脚本三个哨兵服务器的配置都如下以master为例
[rootmaster ~]# grep -Ev ^(#|$) /apps/redis/etc/sentinel.conf
port 26379
daemonize no
pidfile /apps/redis/run/redis-sentinel.pid
logfile /apps/redis/log/sentinel.log
dir /tmp
sentinel monitor mymaster 192.168.64.129 6379 2
sentinel auth-pass mymaster centos
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
[rootmaster ~]# chown redis.redis /apps/redis/etc/sentinel.conf启动哨兵
三台哨兵服务器都要启动
# 添加哨兵服务
[rootmaster ~]# cat EOF /lib/systemd/system/redis-sentinel.service
[Unit]
DescriptionRedis Sentinel
Afternetwork.target
Afternetwork-online.target
Wantsnetwork-online.target
[Service]
ExecStart/apps/redis/bin/redis-sentinel /apps/redis/etc/sentinel.conf --supervised systemd
ExecStop/usr/libexec/redis-shutdown redis-sentinel
Typenotify
Userredis
Groupredis
RuntimeDirectoryredis
RuntimeDirectoryMode0755
[Install]
WantedBymulti-user.target
EOF
[rootmaster ~]# systemctl daemon-reload
# 确保每个哨兵主机myid不同
#在master上
[rootmaster ~]# systemctl enable --now redis-sentinel
[rootmaster ~]# grep myid /apps/redis/etc/sentinel.conf
sentinel myid 4e119d69b1b0bee2a660bcb3162b6116907672e3
# 在slave1上
[rootslave1 ~]# systemctl enable --now redis-sentinel
[rootslave1 ~]# grep myid /apps/redis/etc/sentinel.conf
sentinel myid 946a5a7cb7ab39f46043e2db4f2f41ca1a04ec45
#在slave2上
[rootslave2 ~]# systemctl enable --now redis-sentinel
[rootslave2 ~]# grep myid /apps/redis/etc/sentinel.conf
sentinel myid 8d40b041b85bd197b33a34358169ee7b08de0ecc
# 以下内容在服务启动后自动生成不需要修改
[rootmaster ~]# grep mymaster /apps/redis/etc/sentinel.conf
# sentinel auth-pass mymaster MySUPER--secret-0123passw0rd
sentinel monitor mymaster 192.168.175.10 6379 2
sentinel down-after-milliseconds mymaster 3000
sentinel auth-pass mymaster centos
# sentinel notification-script mymaster /var/redis/notify.sh
# sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
sentinel config-epoch mymaster 0
# instead of the normal ones. For example if the master mymaster, and the
# SENTINEL rename-command mymaster CONFIG GUESSME
# SENTINEL rename-command mymaster CONFIG CONFIG
sentinel leader-epoch mymaster 0
sentinel known-replica mymaster 192.168.175.30 6379
sentinel known-replica mymaster 192.168.175.20 6379
sentinel known-sentinel mymaster 192.168.175.30 263798d40b041b85bd197b33a34358169ee7b08de0ecc
sentinel known-sentinel mymaster 192.168.175.20 26379946a5a7cb7ab39f46043e2db4f2f41ca1a04ec45验证哨兵端口
[rootmaster ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 511 *:26379 *:*查看哨兵日志
[rootmaster ~]# tail /apps/redis/log/sentinel.log
18077:X 10 Jul 2021 11:23:34.486 # Current maximum open files is 4096.maxclients has been reduced to 4064 to compensate for low ulimit. If you need higher maxclients increase ulimit -n.
18077:X 10 Jul 2021 11:23:34.487 * Running modesentinel, port26379.
18077:X 10 Jul 2021 11:23:34.487 # Sentinel ID is 4e119d69b1b0bee2a660bcb3162b6116907672e3
18077:X 10 Jul 2021 11:23:34.487 # monitor master mymaster 192.168.175.10 6379 quorum 2
18077:X 10 Jul 2021 11:23:37.553 # sdown slave 192.168.175.30:6379 192.168.175.30 6379 mymaster 192.168.175.10 6379
18077:X 10 Jul 2021 11:23:37.553 # sdown slave 192.168.175.20:6379 192.168.175.20 6379 mymaster 192.168.175.10 6379
18077:X 10 Jul 2021 11:33:18.954 * sentinel sentinel 946a5a7cb7ab39f46043e2db4f2f41ca1a04ec45 192.168.175.20 26379 mymaster 192.168.175.10 6379
18077:X 10 Jul 2021 11:33:22.007 # sdown sentinel 946a5a7cb7ab39f46043e2db4f2f41ca1a04ec45 192.168.175.20 26379 mymaster 192.168.175.10 6379
18077:X 10 Jul 2021 11:33:48.674 * sentinel sentinel 8d40b041b85bd197b33a34358169ee7b08de0ecc 192.168.175.30 26379 mymaster 192.168.175.10 6379
18077:X 10 Jul 2021 11:33:51.763 # sdown sentinel 8d40b041b85bd197b33a34358169ee7b08de0ecc 192.168.175.30 26379 mymaster 192.168.175.10 6379当前sentinel状态
在sentinel状态中尤其是最后一行涉及到masterIP是多少有几个slave有几个sentinels必须是符合全部服务器数量
[rootmaster ~]# 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:namemymaster,statusok,address192.168.175.10:6379,slaves2,sentinels3停止Redis Master测试故障转移
yum install psmisc -y
[rootmaster ~]# killall redis-server查看各节点上哨兵信息
[rootslave1 ~]# 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:namemymaster,statusok,address192.168.175.30:6379,slaves2,sentinels3故障转移后的redis配置文件会被自动修改
[rootslave1 ~]# grep ^replicaof /apps/redis/etc/redis.conf
replicaof 192.168.175.30 6379哨兵配置文件的sentinel monitor IP 同样也会被修改
[rootslave1 ~]# grep monitor /apps/redis/etc/sentinel.conf
sentinel monitor mymaster 192.168.175.30 6379 2新的master 状态
[rootslave2 ~]# redis-cli -a centos --no-auth-warning
127.0.0.1:6379 info replication
# Replication
role:master
connected_slaves:1
slave0:ip192.168.175.20,port6379,stateonline,offset74161,lag1
master_replid:62c8c8c818b352be6a1afa248c1c0813f57bc1f8
master_replid2:88af3671612025201653c7467ebb880e6eae0912
master_repl_offset:74161
second_repl_offset:42755
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:74161恢复故障的master重新加入redis集群
[rootmaster ~]# systemctl start redis
[rootmaster ~]# grep ^replicaof /apps/redis/etc/redis.conf
replicaof 192.168.175.30 6379
[rootmaster ~]# redis-cli -a centos --no-auth-warning
127.0.0.1:6379 info replication
# Replication
role:slave
master_host:192.168.175.30
master_port:6379
master_link_status:up
master_last_io_seconds_ago:2
master_sync_in_progress:0
slave_repl_offset:306155
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:de66459a2ecc3f0652fcefc6be633855ccda5c1e
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:306155
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:261652
repl_backlog_histlen:44504sentinel 运维
手动让主节点下线
# 指定优先级,值越小sentinel会优先将之选为新的master,默为值为100
[rootmaster ~]# vim /apps/redis/etc/redis.conf
replica-priority 10
[rootmaster ~]# systemctl restart redis
[rootmaster ~]# redis-cli -p 26379
127.0.0.1:26379 sentinel failover mymaster #手动发起哨兵切换不用对redis实例进行关机模拟主节点下降防止影响业务
OK
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:namemymaster,statusok,address192.168.175.10:6379,slaves2,sentinels3python连接redis
客户端连接sentinel工作原理 选举出一个sentinel 由这个sentinel 通过masterName 获取master节点信息 sentinel 发送role指令确认mater的信息 客户端订阅sentinel的相关频道,获取新的master 信息变化,并自动连接新的master python连接Sentinel哨兵
[rootmaster ~]# yum -y install epel-release
[rootmaster ~]# yum -y install python3 python3-redis
[rootmaster ~]# vim sentinel_test.py
#!/usr/bin/python3
import redis
from redis.sentinel import Sentinel
#连接哨兵服务器(主机名也可以用域名)
sentinel Sentinel([(192.168.175.10, 26379),(192.168.175.20, 26379),(192.168.175.30, 26379)],socket_timeout0.5)
redis_auth_pass centos
#mymaster 是配置哨兵模式的redis集群名称此为默认值,实际名称按照个人部署案例来填写
#获取主服务器地址
master sentinel.discover_master(mymaster)
print(master)
#获取从服务器地址
slave sentinel.discover_slaves(mymaster)
print(slave)
#获取主服务器连接进行写入
master sentinel.master_for(mymaster, socket_timeout0.5,
passwordredis_auth_pass, db0)
w_ret master.set(name, eagle)
#输出True
#获取从服务器进行读取默认是round-roubin
slave sentinel.slave_for(mymaster, socket_timeout0.5,
passwordredis_auth_pass, db0)
r_ret slave.get(name)
print(r_ret)
#输出eagle[rootmaster ~]# python3 sentinel_test.py
(192.168.175.10, 6379)
[(192.168.175.20, 6379), (192.168.175.30, 6379)]
beagle