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)欢迎一起参与协作开发,这是我们在开发中的项目,希望大家能够提出好的意见。