Redis 哨兵
为了保证redis最大程度上能够使用高可用,redis提供了主从同步+Sentinel哨兵机制
;
-
主从同步
slaveof host port # 或者在配置文件中进行配置
redis主从只有一个master,一般和哨兵机制一起使用
-
Sentinel哨兵机制
-
redis安装后,会自带sentinel哨兵程序–
sentinel.conf
,是一个运行在特殊模式下的Redis服务器;bind 127.0.0.1 # 哨兵运行的IP地址 port 26380 # 哨兵运行的端口号 daemonize yes # 以后台守护进程的方式运行 logfile /var/log/redis-sentinel.log sentinel monitor mymaster 127.0.0.1 6380 2 # mymaster:sentinel监护的redis主从群别名 # 127.0.0.1 6380:主从中任意一台机器的地址 # 2:有两台以上的sentinel认为某一台redis宕机之后,才会进行故障转移 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
启动方式:
redis-sentinel sentinel.conf
或者
redis-server /path/to/sentinel.conf --sentinel
-
Redis Sentinel 是一个分布式系统,可以在架构中运行多个sentinel进程;
-
sentinel进程之间使用
gossip protocols
通信,接收主服务器是否下线的消息 -
agreement protocols
,决定是否执行自动故障转移,以及选择哪个服务器作为新的主服务器 -
Monitoring(监控):
哨兵会持续检查master或者slave是否在正常工作心跳机制
-
Notification(提醒):
当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。 -
自动故障迁移(Automatic failover):
当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
-
-
注意事项
- 至少三个以上的sentinel
- sentinel要分散运行在不同的机器上
-
Python使用
# redis 哨兵
REDIS_SENTINELS = [
('127.0.0.1', '26380'),
('127.0.0.1', '26381'),
('127.0.0.1', '26382'),
]
REDIS_SENTINEL_SERVICE_NAME = 'mymaster'
from redis.sentinel import Sentinel
_sentinel = Sentinel(REDIS_SENTINELS)
redis_master = _sentinel.master_for(REDIS_SENTINEL_SERVICE_NAME)
redis_slave = _sentinel.slave_for(REDIS_SENTINEL_SERVICE_NAME)
# 读数据,master读不到去slave读
try:
real_code = redis_master.get(key)
except ConnectionError as e:
real_code = redis_slave.get(key)
# 写数据,只能在master里写
try:
current_app.redis_master.delete(key)
except ConnectionError as e:
logger.error(e)