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

时间: 2024-10-21 14:35:36

Redis Cluster 生产实践整理的相关文章

唯品会Redis cluster大规模生产实践经验

嘉宾:陈群很高兴有机会给大家分享redis cluster的生产实践经验.目前在唯品会主要负责redis/hbase的运维和开发支持工作,也参与工具开发工作. Outline一.生产应用场景二.存储架构演变三.应用最佳实践四.运维经验总结第1.2节:介绍redis cluster在唯品会的生产应用场景,以及存储架构的演变.第3节:redis cluster的稳定性,应用成熟度,踩到过那些坑,如何解决这些问题?这部分是大家比较关心的内容.第4节:简单介绍大规模运营的一些经验,包括部署.监控.管理以

饿了么Redis Cluster集群化演进

2017运维/DevOps在线技术峰会上,饿了么运维负责人程炎岭带来题为"饿了么Redis Cluster集群化演进"的演讲.本文主要从数据和背景开始谈起,并对redis的治理进行分析,接着分享了redis cluster的优缺点,重点分析了corvus,包括commands.逻辑架构和物理部署等,最后分享了redis的运维和开发,并作了简要总结,一起来瞧瞧吧.   以下是精彩内容整理: 近几个月,运维事件频发.从"炉石数据被删"到"MongoDB遭黑客勒

全面剖析Redis Cluster原理和应用 (good)

redis redis cluster注意的问题 : 1.'cluster-require-full-coverage'参数的设置.该参数是redis配置文件中cluster模式的一个参数,从字面上基本就能看出它的作用:需要全部覆盖! 具体点是redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务. redis默认是'yes',即需要全覆盖!建议设置成'no'. 2.阻塞命令产生failover.由于

redis 如何用redis Cluster 实现共享session

问题描述 redis 如何用redis Cluster 实现共享session 10C 在分布式服务器上部署了服务,希望能够达到session同步,所以希望把session存储到redis cluster中,目前网上都都是针对tomcat修改配置后存储到redis单个节点的,请问有人实现过使用redis集群配置的吗?或者有相关资料参考也不甚感激.PS:我已经用redis集群搭建了四主四从8个节点,采用redis-trib命令搭建的,想请问的是如何使用该集群存储session 解决方案 基于Red

Redis Cluster 实践

一:关于redis cluster 1:redis cluster的现状 reids-cluster计划在redis3.0中推出,可以看作者antirez的声明:http://antirez.com/news/49 (ps:跳票了好久,今年貌似加快速度了),目前的最新版本见:https://raw.githubusercontent.com/antirez/redis/3.0/00-RELEASENOTES 作者的目标:Redis Cluster will support up to ~1000

Redis Cluster迁移遇到的各种运维坑及解决方案

引子 这个7月注定不平凡,通过7月连续的Redis故障,细心如你,一定会对技术.公司.同事.职业有了更深刻的认识和反思,先回忆下吧-- 本文主要涉及到的故障包括: 1.网卡故障 2.这该死的连接数 3.疑似 Cluster 脑裂? 4.Bgsave传统的典型问题 5.主库重启 Flush 掉从库 好的,敬请欣赏. Redis Cluster 的迁移之路 我们Redis 部署特点如下: ◆集中部署,N台机器专职负责某个产品线. ◆传统 Twemproxy 方式,额外会有自己定制几套 Twempro

Redis Cluster 高可用方案

一.Redis Cluster Cluster介绍  Redis 集群采用无中心的方式,为了维护集群状态统一,节点之间需要互相交换消息.Redis采用交换消息的方式被称为 Gossip ,基本思想是节点之间互相交换信息最终所有节点达到一致,更多关于 Gossip 可参考 https://en.wikipedia.org/wiki/Gossip_protocol .   Redis 集群是一个提供在多个Redis间节点间共享数据的程序集.   Redis集群并不支持处理多个keys的命令,因为这需

安全稳定实现redis cluster自动化迁移

背景    目前redis集群最火的是codis和redis cluster(官方),但官方自带工具并没有支持密码操作.那么需要密码认证使用redis cluster集群的同学要仔细看了哦.   相信大家很多人已经使用了redis cluster,而且也肯定会用到核心应用,你是否考虑过如下问题?   redis cluster无密码,被改数据 redis cluster无密码,被flushall (你是否有要哭的冲动哈哈) redis cluster无密码,数据在光天化日(你对用户不负责) re

redis cluster中添加删除重分配节点例子

redis cluster配置好,并运行一段时间后,我们想添加节点,或者删除节点,该怎么办呢. 一,redis cluster命令行     //集群(cluster)  CLUSTER INFO 打印集群的信息  CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息.     //节点(node)  CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子.  CLUSTER