Redis哨兵模式

1 、引言

        项目中用到了Redis的主从模式,但是需要程序自己进行主机和备机的切换以及故障转移,并且每次执行命令,需要判断主备机,再进行操作,十分繁琐。因此决定采用Redis哨兵模式,采用一主二从三哨兵的模式。

2、哨兵模式部署

       因为机器有限,采用在一台电脑上实现。

2.1 下载Redis

   下载路径:Downloads - Redis

   

2.2 安装Redis

解压源码
 

tar -xzf redis-4.0.2.tar.gz

进入目录

cd redis-4.0.2

编译&安装

make && make install

2.3 配置文件

在同一台电脑上部署三个Redis

在 etc 文件夹下新建redis文件夹

从redis-4.0.2 文件夹下复制redis.conf到/etc/redis下,复制三份,分别命名为redis1.conf、redis2.conf、redis3.conf。

修改内容如下:

redis1.conf
# 指定端口号  
port 6379 
  
# 指定PID文件路径  
pidfile /var/run/redis/redis_6379.pid  
  
# 指定日志文件路径  
logfile /var/log/redis/redis_6379.log  
  
# 指定数据文件路径  
dbfilename dump_6379.rdb  
  
# 其他配置项...
bind 0.0.0.0
protected-mode no
daemonize no


redis2.conf
# 指定端口号  
port 6380 
  
# 指定PID文件路径  
pidfile /var/run/redis/redis_6380.pid  
  
# 指定日志文件路径  
logfile /var/log/redis/redis_6380.log  
  
# 指定数据文件路径  
dbfilename dump_6380.rdb  
  
# 其他配置项...
bind 0.0.0.0
protected-mode no
daemonize no
slaveof 192.168.116.134 6379



redis3.conf
# 指定端口号  
port 6381 
  
# 指定PID文件路径  
pidfile /var/run/redis/redis_6381.pid  
  
# 指定日志文件路径  
logfile /var/log/redis/redis_6381.log  
  
# 指定数据文件路径  
dbfilename dump_6381.rdb  
  
# 其他配置项...
bind 0.0.0.0
protected-mode no
daemonize no
slaveof 192.168.116.134 6379

配置哨兵进程

从redis-4.0.2 文件夹下复制sentinel.conf到/etc/redis下,复制三份,分别命名为sentinel1.conf、sentinel2conf、sentinel3.conf。

sentinel1.conf
# 端口号  
port 26379
  
# 是否以后台守护进程的方式运行  
daemonize yes  

protected-mode no
  
# PID文件路径  
pidfile /var/run/redis/sentinel-26379.pid  
  
# 日志文件路径  
logfile /var/log/redis/sentinel-26379.log  
  
# Sentinel的工作目录  
dir /tmp  
  
# 监控的Redis主节点信息  
# master-name 是自定义的主节点名称  
# 127.0.0.1 是Redis主节点的IP地址  
# 6379 是Redis主节点的端口号  
# 2 是哨兵认为主节点不可用的票数(这里假设有三个哨兵)  
sentinel monitor mymaster 127.0.0.1 6379 2  
  
# 其他配置项...  
sentinel down-after-milliseconds mymaster 30000  
sentinel parallel-syncs mymaster 1  
sentinel failover-timeout mymaster 180000

sentinel2.conf
# 端口号  
port 26380  
  
# 是否以后台守护进程的方式运行  
daemonize yes  

protected-mode no
  
# PID文件路径  
pidfile /var/run/redis/sentinel-26380.pid  
  
# 日志文件路径  
logfile /var/log/redis/sentinel-26380.log  
  
# Sentinel的工作目录  
dir /tmp  
  
# 监控的Redis主节点信息  
# master-name 是自定义的主节点名称  
# 127.0.0.1 是Redis主节点的IP地址  
# 6379 是Redis主节点的端口号  
# 2 是哨兵认为主节点不可用的票数(这里假设有三个哨兵)  
sentinel monitor mymaster 127.0.0.1 6379 2  
  
# 其他配置项...  
sentinel down-after-milliseconds mymaster 30000  
sentinel parallel-syncs mymaster 1  
sentinel failover-timeout mymaster 180000

sentinel3.conf
# 端口号  
port 26381 
  
# 是否以后台守护进程的方式运行  
daemonize yes  

protected-mode no
  
# PID文件路径  
pidfile /var/run/redis/sentinel-26381.pid  
  
# 日志文件路径  
logfile /var/log/redis/sentinel-26381.log  
  
# Sentinel的工作目录  
dir /tmp  
  
# 监控的Redis主节点信息  
# master-name 是自定义的主节点名称  
# 127.0.0.1 是Redis主节点的IP地址  
# 6379 是Redis主节点的端口号  
# 2 是哨兵认为主节点不可用的票数(这里假设有三个哨兵)  
sentinel monitor mymaster 127.0.0.1 6379 2  
  
# 其他配置项...  
sentinel down-after-milliseconds mymaster 30000  
sentinel parallel-syncs mymaster 1  
sentinel failover-timeout mymaster 180000

启动Redis服务

redis-server /etc/redis/redis1.conf
redis-server /etc/redis/redis2.conf
redis-server /etc/redis/redis3.conf

启动哨兵

redis-sentinel /etc/redis/sentinel1.conf --sentinel
redis-sentinel /etc/redis/sentinel2.conf --sentinel
redis-sentinel /etc/redis/sentinel3.conf --sentinel

3、测试获取主机信息及故障转移

3.1 获取主机信息

连接任意一个哨兵,发送 sentinel masters命令,即可获取

3.2 测试故障转移

关闭主机Redis_6379,   连接哨兵查询当前主机是否转移。

4、python 实现 连接哨兵,并执行操作

安装redis-py库

pip install redis

from redis.sentinel import Sentinel  
  
# 哨兵实例的列表  
# 每个哨兵实例由一个元组表示,包含(host, port)  
sentinels = [  
    ('sentinel_host1', 26379),  
    ('sentinel_host2', 26379),  
    # 你可以添加更多的哨兵实例  
]  
  
# 哨兵监控的主节点名称  
master_name = 'mymaster'  
  
# 创建Sentinel实例  
sentinel = Sentinel(sentinels, socket_timeout=0.1)  
  
# 通过Sentinel获取主节点实例  
# 这将自动处理故障转移,并返回当前的主节点实例  
master = sentinel.master_for(master_name, socket_timeout=0.1)  
  
# 现在你可以像使用普通Redis连接一样使用master实例了  
# 例如,设置和获取键值对  
master.set('foo', 'bar')  
print(master.get('foo'))  # 输出: b'bar'  
  
# 如果你需要连接到从节点,可以这样做  
slave = sentinel.slave_for(master_name, socket_timeout=0.1, db=0)  
slave.set('baz', 'qux')  
print(slave.get('baz'))  # 输出: b'qux'  
  
# 注意:从节点可能包含过时的数据,因为它们正在复制主节点的数据

5、哨兵模式遇到的问题

5.1 关闭防火墙

1. 查看防火墙状态
sudo systemctl status firewalld

2. 临时关闭防火墙
sudo systemctl stop firewalld
3. 永久关闭防火墙
sudo systemctl disable firewalld

5.2 单点故障风险

        虽然哨兵模式通过多个哨兵节点来降低单点故障的风险,但如果哨兵节点本身也出现故障,或者网络隔离导致哨兵节点无法相互通信,那么整个哨兵系统可能会失效。因此,需要采取额外的措施来确保哨兵节点的高可用性和稳定性。

5.3 获取主机Redis信息

       获取信息可以从任何一个哨兵进程获取。

5.4 推荐redis库

最后打算使用 redis-plus-plus处理哨兵模式

      

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值