ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

redis-py 热升级指南:用多数据库故障转移实现 Redis 模块零停机升级

redis-py 热升级指南:用多数据库故障转移实现 Redis 模块零停机升级 redis-py 热升级指南用多数据库故障转移实现 Redis 模块零停机升级【免费下载链接】redis-pyRedis Python client项目地址: https://gitcode.com/GitHub_Trending/re/redis-py给 Redis 换装一个新模块往往要重启进程才能加载业务连接随之断掉。redis-py 提供了多数据库multidb客户端内置多数据库故障转移与健康检查策略把多个互为冗余的实例交给同一个客户端节点掉线时它会自动把流量引向健康节点。围绕这套机制做 Redis 模块热升级可以做到零停机升级应用进程无需重启。 模块升级为什么会掐断连接Redis 模块搜索、JSON、时序等是注入 redis-server 进程中的动态库加载新版本需要重启进程。麻烦集中在三点现有连接集中断开应用瞬时收到大量连接错误重启窗口内该实例不可读写恢复速度取决于复制与数据量应用层若用单个Redis实例绑定这一个节点流量就没有退路。redis-py 热升级的思路是把切换这件事挪进客户端客户端同时持有两个或更多实例权重最高者处理请求另一个随时待命。升级时谁不带流量就重启谁业务侧因此感知不到重启动作。 多数据库客户端如何自动给流量让路入口是 redis/multidb/client.py 中的MultiDBClient配置对象定义在 redis/multidb/config.py。每个节点用DatabaseConfig声明权重决定优先级大家都健康时请求发给权重最高者其余节点作为备用。权重加熔断器决定流量走向每个节点背后挂一个熔断器见 redis/multidb/circuit.py状态分 CLOSED正常、OPEN已熔断、HALF_OPEN试探性闭合三种。默认故障转移策略WeightBasedFailoverStrategy定义在 redis/multidb/failover.py处理请求时按权重顺序扫描取第一个熔断器处于 CLOSED 的节点全部 OPEN 则抛出NoValidDatabaseException。外层还包着一层重试执行器用failover_attempts默认 10 次与failover_delay默认 12 秒控制探测节奏。找不到可用节点时抛出TemporaryUnavailableException而非直接失败等于给调用方留出一个约 120 秒的缓冲窗口正好覆盖模块重载的时间。主动探测与被动观测并行主动侧后台健康检查循环每隔health_check_interval默认 5 秒对各节点做一次探测被动侧CommandFailureDetector观察真实命令失败滑动窗口内失败率越线就打开熔断器。节点一旦熔断下一条请求直接落到次高权重节点应用代码不需要任何改动。健康检查策略的三种判定口径一次健康检查会连续发health_check_probes次探针默认 3 次每次间隔health_check_delay默认 0.5 秒整体受health_check_timeout默认 3 秒约束。探针默认是PingHealthCheck向节点发送 PING集群需每个节点都通过也可以自定义探针例如官方文档示例中的 ECHO 式EchoHealthCheck实现都在 redis/asyncio/multidb/healthcheck.py。判定口径由三个策略类承担通过MultiDbConfig的health_check_policy字段HealthCheckPolicies枚举选择策略类判定口径适用场景HealthyAllPolicy默认全部探针通过才算健康关键链路宁严勿松避免把半死不活的节点选进流量HealthyMajorityPolicy超过半数通过即可3 次探针允许 1 次失败网络偶发抖动的平衡之选HealthyAnyPolicy任意一次通过即健康可用性优先容忍探针偶发失败热升级场景下HealthyAllPolicy最稳妥重启中的实例不会因为某一次探针侥幸成功而被误判可用。热升级四步走从配客户端到切流双节点客户端怎么配下面定义主节点权重 1.0与备用节点权重 0.5并开启周期性自动回切高权重节点from redis.multidb.client import MultiDBClient from redis.multidb.config import MultiDbConfig, DatabaseConfig from redis.asyncio.multidb.healthcheck import HealthCheckPolicies cfg MultiDbConfig( databases_config[ DatabaseConfig(from_urlredis://db-primary:6379/0, weight1.0), DatabaseConfig(from_urlredis://db-standby:6379/0, weight0.5), ], health_check_policyHealthCheckPolicies.HEALTHY_ALL, auto_fallback_interval60, ) client MultiDBClient(cfg) client.set(key, value) # 首次调用触发初始化与健康检查升级、切流、回补的操作顺序升级备用节点此时流量全在主节点上。对备用节点执行模块重载或重启健康检查期间它熔断也不影响业务切换流量备用节点通过健康检查后用client.set_active_database(db_standby)主动切换或调update_database_weight抬升其权重让WeightBasedFailoverStrategy自然选中Pub/Sub 订阅会在新节点上自动重订升级原主节点它已转为备用状态重启加载新模块健康检查会在其恢复后把熔断器闭合回补为备用交给auto_fallback_interval自动回切高权重节点或用add_database/remove_database显式管理候选池。这套运行时管理 API 都在 redis/multidb/client.py 中。Redis Enterprise 环境可在健康检查列表里加挂LagAwareHealthCheck需在DatabaseConfig设置health_check_url通过 REST 接口确认实例间同步延迟让切流判断更稳。✅ 上线前自查与参数调优清单策略选型关键路径用HealthyAllPolicy可用性至上的链路再评估HealthyAnyPolicy重试与延迟failover_attempts × failover_delay是重试预算默认 10×12120 秒应略大于最长一次模块重载耗时上层要捕获TemporaryUnavailableException做本地重试NoValidDatabaseException则表示全池不可用两种异常要区别对待监控通过EventDispatcher注册ActiveDatabaseChanged事件监听器把切流时刻与新旧节点写进日志和指标故障演练上线前在预发环境实际模拟主节点熔断验证故障转移、订阅重订、回补路径。单测可以参考 tests/test_multidb/test_failover.py 里构造节点不可用的做法。完整配置字段见 docs/geographic_failover.rst。客户端容错铺好之后模块升级只剩先切流、再升级、双升级、再回切应用进程不必停一秒。【免费下载链接】redis-pyRedis Python client项目地址: https://gitcode.com/GitHub_Trending/re/redis-py创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表