博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2.客户端的挑战
阅读量:6404 次
发布时间:2019-06-23

本文共 1707 字,大约阅读时间需要 5 分钟。

《全面剖析Redis Cluster原理和应用》中,我们已经详细剖析了现阶段Redis Cluster的缺点:

  • 无中心化架构
    • Gossip消息的开销
    • 不停机升级困难
    • 无法根据统计区分冷热数据
  • 客户端的挑战
    • Cluster协议支持
    • 连接和路由表的维护开销
    • MultiOp和Pipeline支持有限
  • Redis实现问题
    • 不能自动发现
    • 不能自动Resharding
    • 无监控管理UI
    • 最终一致性和“脑裂”问题
    • 数据迁移以Key为单位,速度较慢
    • 数据迁移没有保存进度,故障时不能恢复
    • Slave“冷备”,不能缓解读压力

当然之前也说过了:“这与Redis的设计初衷有关,毕竟作者都已经说了,最核心的设计目标就是性能、水平伸缩和可用性”。但综合来看,要想在生产环境中使用Redis Cluster,我们还是有一些工作要做的。本文就从宏观层面上,列举一些架构优化的参考方案。


1.P2P架构副作用1.1 Gossip通信开销

Gossip消息的通信开销是P2P分布式系统带来的第一个副作用。有一篇关于Gossip通俗易懂的文章《Life in a Redis Cluster: Meet and Gossip with your neighbors》。Redis为集群操作的消息通信单独开辟一个TCP通道,交换二进制消息:

  • PING/PONG:Cluster的心跳,每个结点每秒随机PING几个结点。结点的选择方法是:超过cluster-node-timeout一半的时间还未PING过或未收到PONG的结点,所以这个参数会极大影响集群内部的消息通信量。心跳包除了结点自己的数据外,还包含一些其他结点(集群规模的1/10)的数据,这也是“Gossip流言”的含义。
  • MEET/PONG:只有MEET后的受信结点才能加入到上面的PING/PONG通信中。

关于Gossip的问题不可避免,我们只能通过参数调整和优化,在通信效率和开销之间找到一个平衡点。因为笔者还未搭建过大规模的Redis Cluster集群,关于集群的性能和参数调优还不能给出建议,留到积累足够经验再做整理吧。

1.2 不停机升级困难

以Nginx为例,修改配置甚至升级版本都不需要停机,Master会逐一启动新的Worker实例去替代旧的Worker。对于单机版的Redis,我们也可以用类似的方式实现的。但目前不知道Redis Cluster或者其他P2P分布式系统像Cassandra,是否有比较好的方案。

1.3 冷热数据无法区分

由于集群内结点都是对等的,所以像数据热度这种整体的统计数据就无处存放。当内存有限时,要想实现层次化存储,将冷数据Swap到慢存储如磁盘上时,就变得有些棘手了!

解决方法就是计算机界号称万能的“增加中间层”方法。增加一层Proxy,负责做数据统计、Swap甚至L1缓存。关于冷热数据的统计和处理,请参考《微博CacheService架构浅析》


2.客户端的挑战

Redis Cluster的引入会给客户端带来一些挑战。要么“勇敢面对”,通过引入最新的支持Cluster协议的Jedis客户端,再加以改造来应对这些挑战。要么增加Proxy,像防洪堤坝一样将危险隔离在外。

2.1 Cluster协议开发

对于Java,最主流的Jedis客户端已经早早开始支持Cluster协议了,但仔细看了一下,貌似处理集群中结点Failover时有些问题。Slave替换上来了,Jedis的确可以根据”MOVED”消息更新Slot与结点的对应关系,但是:

  • 原来Master结点的连接池没有处理
  • 结点IP列表没有更新,极端情况下有问题

不知道这算不算Jedis由来已久的问题了。因为之前Jedis就是只支持要么用分片连接池,要么用Sentinel连接池,没有两者的结合!还好有热心的程序员“出手相助”,详见《Jedis分片Sentinel连接池实验》。上面两个问题对应的源码看得不是很细,突然想到的这两个问题,要是说的不对还请指正!

本文作者:geelou
本文来自云栖社区合作伙伴rediscn,了解相关信息可以关注redis.cn网站。

转载地址:http://guiea.baihongyu.com/

你可能感兴趣的文章
自定义元素探秘及构建可复用组件最佳实践
查看>>
区块链是一个公共数据库,要放在一个块内
查看>>
Jenkins 用户文档(目录)
查看>>
系统常见指标
查看>>
使用crond构建linux定时任务及日志查看
查看>>
地图绘制初探——基于maptalks的2.5D地图绘制
查看>>
SpringBoot2.0之七 实现页面和后台代码的热部署
查看>>
Git 仓库大扫除
查看>>
设计模式-单例模式
查看>>
es6基础0x014:WeakMap
查看>>
九种 “姿势” 让你彻底解决跨域问题
查看>>
php中mysqli 处理查询结果集总结
查看>>
你不知道的JavaScript运算符
查看>>
小程序开发注意事项
查看>>
ECMAScript7规范中的instanceof操作符
查看>>
Hadoop HDFS原理分析
查看>>
【webpack4】基本配置和入门api
查看>>
Mac使用ssh公钥登录Linux
查看>>
【366天】跃迁之路——程序员高效学习方法论探索系列(实验阶段124-2018.02.06)...
查看>>
POJ3070-Fibonacci(矩阵快速幂)
查看>>