公司动态
aredis哨兵模式指南:Redis高可用与自动故障转移配置全解
aredis哨兵模式指南Redis高可用与自动故障转移配置全解【免费下载链接】aredisredis client for Python asyncio (has support for redis server, sentinel and cluster)项目地址: https://gitcode.com/gh_mirrors/ar/aredisaredis 哨兵模式Sentinel是 Python 异步项目中搭建Redis 高可用架构的关键能力。作为专为 Python asyncio 打造的异步 Redis 客户端aredis 内置了完整的 Sentinel 支持自动发现主从节点、故障时自动转移连接、读写分离负载均衡让业务代码无需感知底层拓扑变化。本指南带你从零看懂并配好这一整套 Redis 高可用方案 为什么需要 Redis 哨兵模式单机 Redis 存在两个致命问题主节点宕机进程挂掉或机器故障读写请求全部中断从节点无法写入从库只读主库一倒应用端拿到的主地址就失效了。Redis Sentinel哨兵就是为了解决这个问题多个哨兵进程持续监控主从节点一旦判定主节点不可用ODOWN就自动选举新主节点并通知客户端。而 aredis 的哨兵模式让客户端自动跟上这次切换——你只配一次哨兵地址主节点漂移后连接池会重新查询哨兵、断开旧连接、接入新主节点全程对业务代码透明。aredis 哨兵模式的核心组成aredis 的 Sentinel 支持集中在两个模块中理解它们就理解了整个机制组件文件作用Sentinelaredis/sentinel.py哨兵集群入口负责发现主节点和存活从节点SentinelConnectionPoolaredis/sentinel.py哨兵管理的连接池主节点变化时自动断开旧连接SentinelManagedConnectionaredis/sentinel.py建立连接前先从哨兵查询目标地址的连接SENTINEL命令封装aredis/commands/sentinel.pysentinel_master()、sentinel_slaves()等命令官方文档对这一机制有更完整的说明可参考docs/source/sentinel.rst相关行为在tests/client/test_sentinel.py中有对应的测试覆盖例如哨兵节点宕机后的自动跳过、从节点轮询等场景。快速上手三步接入哨兵集群假设你已经部署了 1 主、2 从的 Redis以及一个默认监听26379端口的哨兵实例服务名为mymaster。接入 aredis 只需三步from aredis.sentinel import Sentinel # 1. 创建哨兵客户端可以传多个哨兵地址做冗余 sentinel Sentinel([(10.0.0.1, 26379), (10.0.0.2, 26379)], stream_timeout0.1) # 2. 获取主节点客户端 —— 用于写操作 master sentinel.master_for(mymaster, stream_timeout0.1) await master.set(foo, bar) # 3. 获取从节点客户端 —— 用于读操作 slave sentinel.slave_for(mymaster, stream_timeout0.1) print(await slave.get(foo)) # barmaster和slave都是标准的StrictRedis实例后续调用get、set、hset等 API 与单机模式完全一致。连接建立时客户端会先查询哨兵拿到真实地址再连接因此你不需要在代码里硬编码任何 Redis 主从 IP。 小贴士master_for/slave_for返回的客户端可以复用内部连接池会自动处理地址变更无需每次重建。自动故障转移是如何发生的这是哨兵模式最聪明的部分aredis 内部由三个机制协同完成1️⃣ 主节点发现与哨兵容错Sentinel.discover_master()会依次询问每个哨兵节点如果某个哨兵连接失败或超时就自动跳过、尝试下一个找到健康主节点后还会把这个哨兵挪到列表首位下次优先查询它天然实现了哨兵层自身的故障转移。同时会通过min_other_sentinels校验该哨兵是否还认识足够的同伴避免使用脑裂哨兵的过期信息。2️⃣ 主节点切换时自动重连当哨兵完成故障转移后旧主节点被降为从节点。SentinelManagedConnection在读取响应时捕获ReadOnlyError对主节点写入却返回只读错误会主动断开连接并抛出ConnectionError(The previous master is now a slave)。与此同时SentinelConnectionPool.get_master_address()发现主地址已变化会断开池中所有旧连接下一次请求自动向新主节点发起连接——业务层只需对偶发连接异常做一次重试即可。3️⃣ 从节点轮询与降级兜底读请求走slave_for时rotate_slaves()对所有存活从节点做轮询round-robin自动分散读压力如果所有从节点都不可达会降级回退到主节点连接保证读操作尽量可用若连主节点都找不到则抛出SlaveNotFoundError。关键配置参数速查表参数位置说明sentinelsSentinel构造哨兵地址列表建议传 2~3 个做冗余min_other_sentinelsSentinel构造要求哨兵感知的最少同伴数过低可能读到过期拓扑生产环境建议设为 1 以上sentinel_kwargsSentinel构造连接哨兵实例的参数缺省时复用socket_*选项connection_kwargsSentinel构造连接 Redis 主从节点时的通用参数如db、decode_responsesstream_timeout构造 /master_forI/O 超时异步场景务必设置避免请求永久挂起check_connectionmaster_for/slave_for建连后立即发PING校验可过滤掉看似活着的坏连接常见异常排查异常含义处理建议MasterNotFoundError所有哨兵都查不到健康主节点主节点 ODOWN/SDOWN或服务名写错检查哨兵日志与SENTINEL MASTERS输出确认service_name拼写正确SlaveNotFoundError无存活从节点且主节点也不可达确认从节点复制是否同步检查网络与安全组ReadOnlyError/ConnectionError(The previous master is now a slave)正在发生主从切换属预期行为客户端自动重连业务侧加一次短重试即可三者中前两者均继承自ConnectionError定义于aredis/exceptions.py可以用统一的方式做异常兜底。最佳实践清单 ✅哨兵地址至少配置2 个避免单个哨兵失联导致整个客户端失效生产环境设置min_other_sentinels 1拒绝孤证哨兵的过期答案读写分离写走master_for读走slave_for享受轮询负载均衡异步应用中始终显式设置超时stream_timeout哨兵查询和 Redis 请求都不应无限等待应用层对连接类异常做一次自动重试覆盖故障转移的几秒钟窗口期。参考文件哨兵核心实现aredis/sentinel.pySENTINEL 命令封装aredis/commands/sentinel.py官方文档Sentinel support 章节docs/source/sentinel.rst哨兵行为测试用例tests/client/test_sentinel.py异常定义aredis/exceptions.py掌握以上配置后你的 Python 异步服务就拥有了与 Redis 官方推荐一致的哨兵客户端行为拓扑自动发现、故障自动切换、读流量自动均衡——高可用不再只是运维的事也成了应用代码的一部分。【免费下载链接】aredisredis client for Python asyncio (has support for redis server, sentinel and cluster)项目地址: https://gitcode.com/gh_mirrors/ar/aredis创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考