redis:redis集群方案 迈不过友情╰ 2022-08-28 09:56 198阅读 0赞 由于redis出众的性能,其在众多的移动互联网企业中得到广泛的应用。redis在3.0版本前只支持单实例模式,虽然现在的服务器内存可以到100GB、200GB的规模,但是单实例模式限制了redis没法满足业务的需求(比如新浪微博就曾经用redis存储了超过1TB的数据)。redis的开发者Antrres早在博客上就提出在redis3.0版本中加入集群的功能,但3.0版本等到2015年才发布正式版。各大企业在3.0版本还没有发布前为了解决redis的存储瓶颈,纷纷推出了各自的**redis集群**方案。这些方案的核心思想就是**把数据分片(sharding)存储在多个redis实例中,每一片就是一个redis实例**。 下面就来具体介绍一下 # 客户端分片 # 客户端分片是**把分片的逻辑放在redis客户端实现,通过redis客户端预先定义好的路由规则,把对key的访问转发到不同的实例中,最后把返回结果汇集**。这种方案的模式如下: ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAT2NlYW4mJlN0YXI_size_14_color_FFFFFF_t_70_g_se_x_16] 客户端分片的好处就是所有的逻辑都是可控的,不依赖于第三方分布式中间件。开发人员清除怎么实现分片、路由的规则,不用担心踩坑 客户端分片方案有如下缺点: * 这是一种静态的分片方案,需要增加或者减少redis实例的数量,需要手动调整分片的程序 * 可运维性差。集群的数据出了任何问题都需要运维人员和开发人员一起合作,减缓了解决问题的速度,增加了跨部门沟通的成本 * 在不同的客户端程序中,维护相同的分片逻辑成本巨大。比如,系统中有两套业务系统共用一套redis集群,一套业务系统用java实现,另一套业务系统用php实现。为了保持分片逻辑的一致性,在java客户端中实现的分片逻辑也需要在php客户端实现一次。相同的逻辑在不同的系统中分别实现,这种设备本来就非常糟糕,而且需要耗费巨大的开发成本保证两套业务系统分片逻辑的一致性。 # Twemproxy # Twemproxy是由Twitter开源的redis代理,其基本原理是:**redis客户端把请求发送到Twemproxy,Twemproxy根据路由规则发送到正确的redis实例,最后Twemproxy把结果汇集返回给客户端**。 Twemproxy通过引入一个代理层,将多个redis实例进行同一管理,使得redis客户端只需要在Twemproxy上进行操作,而不需要关心后面有多少个redis实例,从而实现了redis集群。 Twemproxy集群架构如下图: ![在这里插入图片描述][watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAT2NlYW4mJlN0YXI_size_16_color_FFFFFF_t_70_g_se_x_16] Twemproxy的优点如下: * 客户端像连接redis实例一样连接Twemproxy,不需要改任何的代码逻辑 * 支持无效的redis实例的自动删除 * Twemproxy与redis实例保持连接,减少了客户端与redis实例的连接数 Twemproxy的缺点如下: * 由于redis客户端的每个请求都经过Twemproxy代理才能到达redis服务器,这个过程中会产生性能损失 * 没有友好的监控管理后台界面,不利于运维监控 * 最大的问题在于Twemproxy无法平滑的增加redis实例。对于运维人员来说,当因为业务需要增加redis实例时工作量非常大 Twemproxy作为最被广泛使用、最久经考验、稳定性最高的Redis代理,在业界被广泛使用。 # Codis # Twemproxy不能平滑增加Redis实例的问题带来了很大的不便,于是豌豆荚自主研发了Codis,一个支持平滑增加Redis实例的Redis代理软件,其基于Go和C语言开发,并于2014年11月在GitHub上开源。 Codis包含如下四个部分: * Codis Proxy:redis客户端连接到redis实例的代理,实现了redis的协议,redis客户端连接到 Codis Proxy进行各种操作。 Codis Proxy是无状态的,可以用Keepalived等负载均衡软件部署多个Codis Proxy实现高可用 * CodisRedis:Codis项目维护的Redis分支,添加了slot和原子的数据迁移命令。Codis上层的 Codis Proxy和Codisconfig只有与这个版本的Redis通信才能正常运行。 * Codisconfig:Codis管理工具。可以执行添加删除CodisRedis节点、添加删除Codis Porxy、数据迁移等操作。另外,Codisconfig自带了HTTP server,里面集成了一个管理界面,方便运维人员观察Codis集群的状态和进行相关的操作,极大地提高了运维的方便性,弥补了Twemproxy的缺点。 * ZooKeeper: [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAT2NlYW4mJlN0YXI_size_14_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/8bda7242bd4c45e990537fd05b25b1b7.png [watermark_type_ZHJvaWRzYW5zZmFsbGJhY2s_shadow_50_text_Q1NETiBAT2NlYW4mJlN0YXI_size_16_color_FFFFFF_t_70_g_se_x_16]: /images/20220828/5da41c61d90442309db727407475584c.png
还没有评论,来说两句吧...