redis基础之redis-sentinel(哨兵集群)(六)

redis简单的主从复制在生产的环境下可能是不行的,因为从服务器只能读不能写,如果主服务器挂掉,那么整个缓存系统不能写入了。redis自带了sentinel(哨兵)机制可以实现高可用。

redis-sentinel集群

哨兵机制的主要功能

  • 不断监控主服务器和从服务器的是否正常运行;

  • 出现问题是可以自动报告;

  • 当一个节点出现问题可以进行故障转移,主服务器故障可以通过投票机制选出新的主服务器;

  • 自动发现主服务器和从服务器;

redis-sentinel基本介绍

  • redis-sentinel是一个单独的进程,可以通过配置文件sentinel.conf单独启动,也可以在启动redis-server是指定--sentinel启动;

配置redis-sentinel

  • redis的源码中有一份sentinel.conf文件可以用来配置redis-sentinel。

  • 使用哨兵机制集群redis实例如果需要配置密码,那么主从服务器的密码需要保持一致,否则故障切换可能出错。

# redis.conf

masterauth '123' # 主服务器密码

requirepass '123' # 本身的密码
# sentinel.conf

port 26379  # 端口

# 格式为  sentinel <选项的名字> <服务器的名字> <选项的值>
# 配置sentinel去监听名为mymaster的服务器,ip加端口,判断失效需要2个sentinel才能进行故障迁移;
sentinel monitor mymaster 127.0.0.1 6379 2  
# 如果3000ms没有反应就认为mymaster挂掉
sentinel down-after-milliseconds mymaster 3000
# 设置故障转移时,同时有多少个从服务器对新主服务进行同步,越少需要的时间越长,但越多,同步时从服务器不能工作;
sentinel parallel-syncs mymaster 1 
# failover超时时间,即触发failover切换操作后,如果10000ms还没有任何的failover故障切换即认为失败
sentinel failover-timeout mymaster 10000
# 设置前后台运行yes表示后台运行
daemonize yes
#指定工作目录
dir "/home/redis/sentinel-work"
# 默认情况下sentinel只能访问本地主机,设置为no后禁用保护模式
protected-mode no
# 指定日志文件
logfile "/home/redis/sentinellog/sentinel.log"
#redis主节点密码
sentinel auth-pass mymaster 123456
  • 注意

  • 没有的文件目录需要主动创建,否则启动失败;

  • 可以在不同的服务器上启动多个sentinel,它们的配置相同,都去监视主服务器的redis。

启动redis-sentinel

redis-server /path/sentinel.conf --sentinel

# 可以使用supervisor对redis-sentinel进行管理,将sentinel设置为前台运行

使用redis-cli查看redis-sentinel的状态

# 登录
redis-cli -h 192.168.1.20 -p 26379 

# 命令参考:http://www.redis.cn/topics/sentinel.html

python连接redis集群

  • redis使用sentinel模式后,原来的python连接redis方案由于主从服务器可能发生切换变得不可用了。
import redis
r2 = redis.StrictRedis() # 如果该实例死机将变得不可用
  • 使用Sentinel对象
import redis
from redis.sentinel import Sentinel
# 创建一个连接对象,连接所有的哨兵,其会自动发现redis实例
sentinel = Sentinel([('192.168.1.20', 26379)], socket_timeout=0.5)

# 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5, db=1)
w_ret = master.set('foo', 'bar')

# 获取从服务器进行读取
slave = sentinel.slave_for('mymaster', socket_timeout=0.5, db=1)
r_ret = slave.get('foo')

# master和slave的用法和前面的redis对象一样了,不过slave只能读不能写

猜你喜欢

转载自www.cnblogs.com/cwp-bg/p/9264169.html