Redis Cluster 生产实践整理

1、最佳实践

1.1 做好容错机制

  • 连接或者请求异常,进行连接retry和reconnect。
  • 做存储使用的 Redis systemd 去掉 Auto Restart 配置,避免Master加载空dump.rdb,replicate到Slave,刷掉Slave数据。
  • 重试时间应该大于cluster-node-time时间
    还是强调容错,这个不是针对cluster,所有的应用设计都适用。

1.2 制定开发规范

  • 慢查询,进程cpu 100%、客户端请求变慢,甚至超时。
  • 避免产生hot-key,导致节点成为系统的短板。
  • 避免产生big-key,导致网卡打爆、慢查询。
  • 应用端分不清Cache/Storage,经常可以做成 Cache的Key,不加TTL导致无效内存占用。
  • 避免大量key在同一时间段过期,会导致请求变慢。
  • 规范Key命名规则。
  • 避免使用阻塞操作,不建议使用事务。
  • 避免部分hset过大,超过几十万条记录,造成查询卡顿。

1.3 优化连接池使用

  • 主要避免server端维持大量的连接。
  • 合理的连接池大小。
  • 合理的心跳检测时间。
  • 快速释放使用完的连接。
  • Jedis一个连接创建异常问题(fixed):
    https://github.com/xetorthio/jedis/issues/1252

连接问题是redis开发使用中最常见的问题,connection timeout/read timeout,还有borrow connection的问题。

1.4 区分redis和cluster的使用

  • redis建议使用pipeline和multi-keys操作,减少RTT次数,提高请求效率。
  • redis cluster不建议使用pipeline和multi-keys操作,减少max redirect产生的场景。
  • redis cluster不支持事物操作。

区分redis和cluster的使用,一方面是数据分片引起的;另一方面与client的实现支持相关。

1.5 几个需要调整的参数

1)设置系统参数vm.overcommit_memory=1,可以避免bgsave/aofrewrite失败。

2)设置timeout值大于0,可以使redis主动释放空闲连接。

3)设置repl-backlog-size 64mb。默认值是1M,当写入量很大时,backlog溢出会导致增量复制不成功。

4)client buffer参数调整
client-output-buffer-limit normal 256mb 128mb 60
client-output-buffer-limit slave  512mb  256mb 180

2、运维经验总结

2.1 自动化管理

  • CMDB管理所有的资源信息。
  • Agent方式上报硬软件信息。
  • 标准化基础设置。机型、OS内核参数、软件版本。
  • Puppet管理和下发标准化的配置文件、公用的任务计划、软件包、运维工具。
  • 资源申请自助服务。

2.2 自动化监控

  • zabbix作为主要的监控数据收集工具。
  • 开发实时性能dashboard,对开发提供查询。
  • 单机部署多个redis,借助于zabbix discovery。
  • 开发DB响应时间监控工具Titan。
  • 基本思想来源于pt-query-degest,通过分析tcp应答报文产生日志。flume agent + kafka收集,spark实时计算,hbase作为存储。最终得到hotquery/slowquery,request source等性能数据。

2.3 自动化运维

  • 资源申请自助服务化。
  • 如果申请合理,一键即可完成cluster集群部署。
    能不动手的,就坚决不动手,另外,监控数据对开发开发很重要,让他们了解自己服务性能,有时候开发会更早发现集群的一些异常行为,比如数据不过期这种问题,运维就讲这么多了,后面是干货中的干货,由deep同学开发的几个实用工具。

2.4 redis开源工具介绍

1) redis实时数据迁移工具

1)在线实时迁移
2)redis/twemproxy/cluster 异构集群之间相互迁移。
3)github:https://github.com/vipshop/redis-migrate-tool

2) redis cluster管理工具

1)批量更改集群参数
2)clusterrebalance
3)很多功能,具体看github :
https://github.com/deep011/redis-cluster-tool

3) 多线程版本Twemproxy

1)大幅度提升单个proxy的吞吐量,线程数可配置。
2)压测情况下,20线程达到50w+qps,最优6线程达到29w。
3)完全兼容twemproxy。
4)github:
https://github.com/vipshop/twemproxies

4) 在开发的中的多线redis

1)Github:
https://github.com/vipshop/vire

2)欢迎一起参与协作开发,这是我们在开发中的项目,希望大家能够提出好的意见。

上一篇:Git跳过本地证书命令


下一篇:Redis 数据过期策略