redis哨兵

哨兵

监听端口是: 26379
sentinel是集合在redis包里面的
每个哨兵都要监听所有的主从集群主机,每个集群有自己的名称
使用sentinel后,客户端连接服务时,不再直接连redis,而是连哨兵,通过哨兵连接主节点

作用:

主从架构无法实现master和slave角色的自动切换,即当master出现redis服务异常、主机断电、磁盘损坏等问题导致master无法使用,而redis主从复制无法实现自动的故障转移(将slave 自动提升为新master),需要手动修改环境配置,才能切换到slave redis服务器,另外也无法横向扩展Redis服务的并行写入性能,当单台Redis服务器性能无法满足业务写入需求的时候,也需要解决以上的两个核心问题,即:1.master和slave角色的无缝切换,让业务无感知从而不影响业务使用 2.可横向动态扩展Redis服务器,从而实现多台服务器并行写入以实现更高并发的目的

Redis 集群实现方式:

  • 客户端分片: 由应用决定将不同的KEY发送到不同的Redis服务器
  • 代理分片: 由代理决定将不同的KEY发送到不同的Redis服务器,代理程序如:codis,twemproxy等(起到mycat类似的作用)
  • Redis Cluster

原理:

  1. 多个哨兵(sentinel),一般是奇数。发现并确认master有故障
  2. 选举出一个setinel上任
  3. 选出一个slave作为master
  4. 通知其余的slave进行master变更
  5. 通知客户端的主从变化
  6. 等待老的master复活成为新主的slave

image

哨兵的3个定时任务:

  • 每10s每个哨兵对master的channel交换信息(pub/sub)
    • 发现slave,确认主从关系
  • 每2s每个哨兵通过master的channel交换信息(pub/sub)
    • 通过sentinel_hello(发布订阅模式)频道交互
    • 交互对节点的“看法”和自身信息
  • 每1s每个哨兵对其他哨兵的redis执行ping(健康检测)

哨兵的配置文件解读:

/etc/redis-sentinel.conf

bind 0.0.0.0
port 26379
daemonize yes
pidfile "redis-sentinel.pid"
logfile "sentinel_26379.log"
dir "/usr/local/redis"			工作目录
sentinel monitor mymaster 1.1.1.25 6379 2 	当前哨兵监听的mymaster集群组,master为1.1.1.25,故障时2个票数通过就选举新master,一般是哨兵总数的2/3票
sentinel auth-pass mymaster 123456		mymaster集群主节点的密码
sentinel down-after-milliseconds mymaster 30000 	主观下线的时间(SDOWN),单位毫秒
sentinel parallel-syncs mymaster 1 	新master同步的slave数量(限制slave向新master连接,缓解压力,1为一次连接一个slave,排队同步,数量越小同步时间越长,越不会出现节点复制风暴)
sentinel failover-timeout mymaster 180000 	所有slaves指向新的master的超时时间
sentinel deny-scripts-reconfig yes 		禁止修改脚本

使用哨兵:

基于主从复制,需要先把master、slave搭建好
单独的哨兵配置文件,单独配置
image

1)所有节点上配置,确保密码一致,允许其他人访问

sed -i -e 's/bind 127.0.0.1/bind */' -e 's/^# masterauth .*/masterauth 123456/' -e 's/^# requirepass .*/requirepass 123456/' /etc/redis.conf

2)所有节点配置sentinel

懒得修改的,可直接清空文件,把博主的模板配置写入

#改哨兵配置文件
vim /etc/redis-sentinel.conf
port 26379
daemonize yes
pidfile /var/run/redis-sentinel.pid
logfile ""
dir /tmp
sentinel monitor myredis 2.2.2.12 6379 2
sentinel auth-pass myredis 123456
sentinel down-after-milliseconds myredis 30000
sentinel parallel-syncs myredis 1
sentinel failover-timeout myredis 180000
sentinel deny-scripts-reconfig yes
logfile /var/log/redis/sentinel.log

#直接复制配置文件给其他主机
rsync -av /etc/redis-sentinel.conf 2.2.2.22:/etc/
rsync -av /etc/redis-sentinel.conf 2.2.2.32:/etc/

systemctl restart redis-sentinel

3)检查是否成功启动哨兵

#检查26379端口
ss -nlt

#查看哨兵信息
redis-cli -a 123456 -p 26379 info

image

4)测试主节点下线

#在master节点执行,下线myrdis集群
redis-cli -p 26379 sentinel failover myredis	手动下线master

#主从同步的配置信息自动被更改为新选举出来的master
grep replicaof /etc/redis.conf

image

开启哨兵后连接redis

由于开启哨兵后,客户端连接只能先访问哨兵

  • client程序代码中有所有的哨兵地址,请求时(拿着sentinel节点集合+集群名)遍历所有sentinel节点,获取一个可用的哨兵节点
  • 由获取到的哨兵节点,client连接选出来的sentinel,并请求获取master节点的ip信息、集群名。sentinel处理请求,返回master节点信息
  • client向得到的master节点发送确认信息,确认无误则OK
  • client再订阅哨兵的相关频道,来获取master的信息变化,实现自动连接新master

哨兵模式连接代码:

java:

客户端连接redis: https://github.com/xetorthio/jedis/blob/master/pom.xml

<properties>
	<redis-hosts>
		localhost:6379,localhost:6380,localhost:6381
	</redis-hosts>
	<sentinel-hosts>
		localhost:26379,localhost:26380,localhost:26381
	</sentinel-hosts>
	<cluster-hosts>
		localhost:7379,localhost:7380,localhost:7381
	</cluster-hosts>
	<github.global.server>github</github.global.server>
</properties>

python:

需要安装python3以及redis模块,要epel

yum install -y python3 python3-redis
或者
pip3 install redis

#!/bin/env python3
import redis
from redis.sentinel import Sentinel

#连接哨兵服务器,支持主机名、ip、域名
sentinel=Sentinel([('2.2.2.12',26379),('2.2.2.22',26379),('2.2.2.32',26379)],socket_timeout=0.5)
redis_auth_pass='123456'

#从哨兵监听的集群中获取主服务器地址
master=sentinel.discover_master('myredis')
print(master)

#获取从服务器地址
slave=sentinel.discover_slaves('myredis')
print(slave)

#获取主服务器,进行数据写入
master=sentinel.master_for('myredis',socket_timeout=0.5,password=redis_auth_pass,db=0)
w_ret=master.set('name','hj')

#读取从节点数据
slave=sentinel.slave_for('myredis',socket_timeout=0.5,password=redis_auth_pass,db=0)
r_ret=slave.get('name')
print(r_ret)

image

posted @ 2022-02-16 22:29  suyanhj  阅读(213)  评论(0)    收藏  举报