Loading... <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> Redis在豌豆荚的使用历程——单实例==》多实例,业务代码中做sharding==》单个Twemproxy==》多个Twemproxy==》Codis,豌豆荚自己开发的分布式Redis服务。在大规模的Redis使用过程中,他们发现Redis受限于多个方面:单机内存有限、带宽压力、单点问题、不能动态扩容以及磁盘损坏时的数据抢救。 </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <img src="//cto.wang/usr/uploads/2016/07/20160703155656-33.jpg" alt="" /> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> Redis通常有3个使用途径:客户端静态分片,一致性哈希;通过Proxy分片,即Twemproxy;还有就是官方的Redis Cluster,但至今无一个新版本。随后刘奇更详细的分析了为什么不使用Twemproxy和Redis Cluster: </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> Twemproxy:最大的痛点是无法平滑的扩容或者缩容,甚至修改配置都需要重启服务;其次,不可运维,甚至没有Dashboard。 </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> Redis Cluster(官方):无中心化设计,程序难以编写;代码有点吓人,clusterProcessPacket函数有426行,人脑难以处理所有的状态切换;迟迟没有正式版本,等了4年之久;目前还缺乏最佳实践,没有人编写Redis Cluster的若干条注意事项;整个系统高度耦合,升级困难。 </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><span style="font-family:宋体">虽然我们有众多的选择,比如</span><span style="font-family:Helvetica">Tair</span><span style="font-family:宋体">、</span><span style="font-family:Helvetica">Couchbase</span><span style="font-family:宋体">等,但是如果你需要更复杂和优秀的数据结构,</span><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">可称为不二之选。基于这个原因,在</span><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">之上,豌豆荚设计了</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">,并将之开源。</span><span style="font-family:Helvetica"></span></span> </p> <h2 style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-family:Helvetica;font-size:13pt"><strong>Codis</strong></span><br /> </h2> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><span style="font-family:宋体">既然重新设计,那么</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">首先必须满足自动扩容和缩容的需求,其次则是必须避免单点故障和单点带宽不足,做一个高可用的系统。在这之后,基于原有的遗留系统,还必须可以轻松地将数据从</span><span style="font-family:Helvetica">Twemproxy</span><span style="font-family:宋体">迁移到</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">,并实现良好的运维和监控。基于这些,</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">的设计跃然纸面:</span><span style="font-family:Helvetica"></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;text-align:center;background-color:#FFFFFF"> <img src="//cto.wang/usr/uploads/2016/07/20160703155656-14.png" alt="" /><span style="font-family:Helvetica;font-size:10pt"></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><span style="font-family:宋体">然而,一个新系统的开发并不是件容易的事情,特别是一个复杂的分布式系统。刘奇表示,虽然当时团队只有</span><span style="font-family:Helvetica">3</span><span style="font-family:宋体">个人,但是他们几乎考量了可以考量的各种细节:</span><span style="font-family:Helvetica"></span></span> </p> <ul style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <li> <span style="font-size:10pt"><span style="font-family:宋体">尽量拆分,简化每个模块,同时易于升级</span><span style="font-family:Helvetica"></span></span> </li> <li> <span style="font-size:10pt"><span style="font-family:宋体">每个组件只负责自己的事情</span><span style="font-family:Helvetica"></span></span> </li> <li> <span style="font-size:10pt"><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">只作为存储引擎</span><span style="font-family:Helvetica"></span></span> </li> <li> <span style="font-size:10pt"><span style="font-family:Helvetica">Proxy</span><span style="font-family:宋体">的状态</span><span style="font-family:Helvetica"></span></span> </li> <li> <span style="font-size:10pt"><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">故障判定是否放到外部,因为分布式系统存活的判定异常复杂</span><span style="font-family:Helvetica"></span></span> </li> <li> <span style="font-size:10pt"><span style="font-family:宋体">提供</span><span style="font-family:Helvetica">API</span><span style="font-family:宋体">让外部调用,当</span><span style="font-family:Helvetica">Redis Master</span><span style="font-family:宋体">丢失时,提升</span><span style="font-family:Helvetica">Slave</span><span style="font-family:宋体">为</span><span style="font-family:Helvetica">Master</span></span> </li> <li> <span style="font-size:10pt"><span style="font-family:宋体">图形化监控一切:</span><span style="font-family:Helvetica">slot</span><span style="font-family:宋体">状态、</span><span style="font-family:Helvetica">Proxy</span><span style="font-family:宋体">状态、</span><span style="font-family:Helvetica">group</span><span style="font-family:宋体">状态、</span><span style="font-family:Helvetica">lock</span><span style="font-family:宋体">、</span><span style="font-family:Helvetica">action</span><span style="font-family:宋体">等等</span><span style="font-family:Helvetica"></span></span> </li> </ul> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><span style="font-family:宋体">而在考量了一切事情后,另一个争论摆在了眼前</span><span style="font-family:Helvetica">——Proxy</span><span style="font-family:宋体">或者是</span><span style="font-family:Helvetica">Smart Client</span><span style="font-family:宋体">:</span><span style="font-family:Helvetica">Proxy</span><span style="font-family:宋体">拥有更好的监控和控制,同时其后端信息亦不易暴露,易于升级;而</span><span style="font-family:Helvetica">Smart Client</span><span style="font-family:宋体">拥有更好的性能,及更低的延时,但是升级起来却比较麻烦。对比种种优劣,他们最终选择了</span><span style="font-family:Helvetica">Proxy</span><span style="font-family:宋体">,无独有偶,在</span><span style="font-family:Helvetica">codis</span><span style="font-family:宋体">开源后,</span><span style="font-family:Helvetica">twitter</span><span style="font-family:宋体">的一个分享提到他们也是基于</span><span style="font-family:Helvetica">proxy</span><span style="font-family:宋体">的设计。</span><span style="font-family:Helvetica"></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;text-align:center;background-color:#FFFFFF"> <img src="//cto.wang/usr/uploads/2016/07/20160703155656-1.png" alt="" /><span style="font-family:Helvetica;font-size:10pt"></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">主要包含</span><span style="font-family:Helvetica">Codis Proxy</span><span style="font-family:宋体">(</span><span style="font-family:Helvetica">codis-proxy</span><span style="font-family:宋体">)、</span><span style="font-family:Helvetica">Codis Manager</span><span style="font-family:宋体">(</span><span style="font-family:Helvetica">codis-config</span><span style="font-family:宋体">)、</span><span style="font-family:Helvetica">Codis Redis</span><span style="font-family:宋体">(</span><span style="font-family:Helvetica">codis-server</span><span style="font-family:宋体">)和</span><span style="font-family:Helvetica">ZooKeeper</span><span style="font-family:宋体">四大组件,每个部分都可动态扩容。</span><span style="font-family:Helvetica"></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="color:#7F6000;font-size:10pt"><span style="font-family:Helvetica"><strong>codis-proxy </strong></span><span style="font-family:宋体"><strong>。</strong><span style="color:#333333">客户端连接的</span></span><span style="font-family:Helvetica">Redis</span><span style="color:#333333"><span style="font-family:宋体">代理服务,本身实现了</span><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">协议,表现很像原生的</span><span style="font-family:Helvetica">Redis </span><span style="font-family:宋体">(就像</span><span style="font-family:Helvetica"> Twemproxy</span><span style="font-family:宋体">)。一个业务可以部署多个</span><span style="font-family:Helvetica"> codis-proxy</span><span style="font-family:宋体">,其本身是无状态的。</span><span style="font-family:Helvetica"></span></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="color:#7F6000;font-size:10pt"><strong><span style="font-family:Helvetica">codis-config</span><span style="font-family:宋体">。</span></strong><span style="color:#333333"><span style="font-family:Helvetica">Codis </span><span style="font-family:宋体">的管理工具,支持添加</span><span style="font-family:Helvetica">/</span><span style="font-family:宋体">删除</span><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">节点、添加</span><span style="font-family:Helvetica">/</span><span style="font-family:宋体">删除</span><span style="font-family:Helvetica">Proxy</span><span style="font-family:宋体">节点、发起数据迁移等操作。</span><span style="font-family:Helvetica">codis-config</span><span style="font-family:宋体">自带了一个</span><span style="font-family:Helvetica">http server</span><span style="font-family:宋体">,会启动一个</span><span style="font-family:Helvetica">dashboard</span><span style="font-family:宋体">,用户可以在浏览器上观察</span><span style="font-family:Helvetica"> Codis </span><span style="font-family:宋体">集群的运行状态。</span><span style="font-family:Helvetica"></span></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="color:#7F6000;font-size:10pt"><strong><span style="font-family:Helvetica">codis-server</span><span style="font-family:宋体">。</span></strong><span style="color:#333333"><span style="font-family:Helvetica">Codis </span><span style="font-family:宋体">项目维护的一个</span><span style="font-family:Helvetica">Redis</span><span style="font-family:宋体">分支,加入了</span><span style="font-family:Helvetica">slot</span><span style="font-family:宋体">的支持和原子的数据迁移指令。</span><span style="font-family:Helvetica"></span></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="color:#7F6000;font-size:10pt"><strong><span style="font-family:Helvetica">ZooKeeper</span><span style="font-family:宋体">。</span></strong><span style="color:#333333"><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">依赖</span><span style="font-family:Helvetica">ZooKeeper</span><span style="font-family:宋体">来存放数据路由表和</span><span style="font-family:Helvetica">codis-proxy</span><span style="font-family:宋体">节点的元信息,</span><span style="font-family:Helvetica">codis-config</span><span style="font-family:宋体">发起的命令会通过</span><span style="font-family:Helvetica"> ZooKeeper</span><span style="font-family:宋体">同步到各个存活的</span><span style="font-family:Helvetica">codis-proxy</span><span style="font-family:宋体">。</span><span style="font-family:Helvetica"></span></span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;text-align:center;background-color:#FFFFFF"> <img src="//cto.wang/usr/uploads/2016/07/20160703155656-84.png" alt="" /><span style="font-family:Helvetica;font-size:10pt"></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><span style="font-family:宋体">最后,刘奇还介绍详细的了</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">中</span><span style="font-family:Helvetica">Migration</span><span style="font-family:宋体">、</span><span style="font-family:Helvetica">lock (rwlock)</span><span style="font-family:宋体">等操作的实现过程和原理,以及从</span><span style="font-family:Helvetica">Twemproxy</span><span style="font-family:宋体">迁移到</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">的详细操作。更多</span><span style="font-family:Helvetica">Codis</span><span style="font-family:宋体">详情可移步</span><span style="font-family:Helvetica">Clodis</span><span style="font-family:宋体">开源页</span><span style="font-family:Helvetica"> GitHub</span></span> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> <span style="font-size:10pt"><br /> </span> </p> <h2 style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> 原文链接:http://www.cnblogs.com/shanyou/p/4268896.html<br /> </h2> <p> </p> <p style="color:#333333;font-family:verdana, 宋体, Arial;font-size:13.3333330154419px;background-color:#FFFFFF"> </p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信