测试 redis replication & sentinel & python

更新日期: 2015-12-12 阅读次数: 17153 分类: Redis

测试目的

测试一下在 redis 主从配置下,单点故障对应用层 (Python) 的影响。

测试环境

  • 系统: Ubuntu 14.10
  • redis 版本: 2.8.17 (redis-server -v)
  • Python 版本: 2.7.8
  • Python Redis 版本: 2.10.3 (python -c "import redis; print redis.VERSION")

Redis Replication and Sentinel

Redis 官网给出的 Sentinel 配置示例,实际上是模拟了对两个不同 redis replication 的监控。

sentinel monitor mymaster 127.0.0.1 6379 2
sentinel down-after-milliseconds mymaster 60000
sentinel failover-timeout mymaster 180000
sentinel parallel-syncs mymaster 1

sentinel monitor resque 192.168.1.3 6380 4
sentinel down-after-milliseconds resque 10000
sentinel failover-timeout resque 180000
sentinel parallel-syncs resque 5

配置规范

读写逻辑

  • 读写均在 master 上
  • 当前的 master IP, port 通过本机的 sentinel 获取

需确认的逻辑

  • 代码实现层: 是否每次 redis 操作,都需要额外的拉取 master 逻辑? redis python 模块能否主动发现? 主动发现的逻辑是否是通过异常实现的?
  • 逻辑实现层: 每次都需要去 sentinel 那里获取 master 信息造成的性能损耗是多少?

sentinel 在挂掉一台时,选举失败

配置了两台 sentinel 实例,其中一台挂掉时,并关闭 redis master,sentinel log 出现报错

-failover-abort-not-elected master mymaster .... Next failover delay: I will not start a failover before ....

python redis 模块端报错

No master found for 'master'

原因是 sentinel 实例数少于 3,只配置了两个。增加一个 sentinel 实例就 OK 了。

关闭一台 master 会看到那些错误提示

redis server (slave) 端看到的错误信息

Error condition on socket for SYNC: Connection refused MASTER MODE enabled (user request)

python redis 模块看到的错误信息

Error 111 connecting to 127.0.0.1:6380. Connection refused.

注意事项

  • sentinel 实例必须 3 个以上,2个判定为宕机才算
  • 如果 master/slave 设置了密码, sentinel 的实例配置也必须写明密码

参考

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式