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
原理:
- 多个哨兵(sentinel),一般是奇数。发现并确认master有故障
- 选举出一个setinel上任
- 选出一个slave作为master
- 通知其余的slave进行master变更
- 通知客户端的主从变化
- 等待老的master复活成为新主的slave

哨兵的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搭建好
单独的哨兵配置文件,单独配置

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

4)测试主节点下线
#在master节点执行,下线myrdis集群
redis-cli -p 26379 sentinel failover myredis 手动下线master
#主从同步的配置信息自动被更改为新选举出来的master
grep replicaof /etc/redis.conf
开启哨兵后连接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)



浙公网安备 33010602011771号