基于twemproxy和vip实现redis集群的无感知弹性扩容
目标是实现redis集群的无感知弹性扩容
关键点
1.是无感知,即对redis集群的用户来说服务ip和port保持不变
2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量。
1.业务场景
- 1.redis集群某个业务容量不足,需要扩容
- 2.redis集群需要一个为一个新业务分配存储容量
- 3.redis集群在扩容的时候服务不是停止的,而是服务中,即无感知
最好的解决方式
对客户端无感知,即客户端不需要任何操作就实现了redis集群的扩容
2.最朴素的twemproxy+redis集群架构

其中twemproxy-A代理后面接了3个redis实例,作为集群使用,如果1个redis示例有10G存储能力,
那么目前这个架构具有10G*3=30G的存储能力,其中根据twemproxy的配置来实现负载均衡。
3.最直接的扩容方案:

这个方案扩容是最直接的,即在代理后面直接新加一个redis-4,来扩充这个redis集群的容量。
这种方式最直接,但是问题也比较大,主要有2个:
- 1.后端新增一个redis实例之后,虽然有一致性hash保证大部分数据还会走原先的路由,
- 但仍有小部分旧的数据会被路由到新的redis-4中,即丢失一小部分旧的数据
- 2.扩容效果不理想,一开始时,redis-4的已用存储是0,理想最好的方式是旧的数据还走之前的路由
- ,新的数据路由到redis-4中
为了解决上述方案的不足,本文提出了一个新的方案如下
4.一个twemproxy二级代理的方案:

这个方案有1个关键点,即怎么实现旧的数据走之前的路由,新的数据走redis-4的路由,这就用到了
hash_tag的预分配(即提前占坑的思想)技术,使用hash_tag作为二级twemproxy的路由标示,具体操作如下:
- 1.twemproxy-C的hash_tag 设置为(),twemproxy-A和twemproxy-B的hash_tag设置为{}
- 2.插入形如key_(0)_{1},key_(1)_{1}的2个key,假设key_(0)_{1}路由到了twemproxy-A,key_(1)_{1}路由到了twemproxy-B
- 3.那么旧的服务插入数据的标示就是key_(0)_{xxxx},新的数据插入的标示就是key_(1)_{xxxx}
注意点如下:
- 1.一开始可以预先分配多一些二级代理,以备不时只需
- 2.一开始需要测试清楚,哪些()标示走哪些对应的二级代理。
好处:
- 1.自动的完成了旧的数据走旧路由,新的数据走新路由
- 2.新的数据也可以如图与之前的业务数据存储完全隔离
- 3.新的路由还可以复用之前的存储,即redis-1到redis-3的存储
5.最终真正实现无感知弹性扩容方案
如图4所示:

最终的方案新增了一个VIP,用这个VIP来解决无感知的问题,即扩容对客户端来说是无感知的。
无感知的解决类似”双buffer交换“的思路,即上图的twemproxy-C和twemproxy-D,当需要重启twemproxy代理时,
可以进行如下操作:
- 1.现假设vip只访问到twemproxy-C
- 2.更改twemproxy-D使用最新的配置,重启
- 3.vip切换服务到只访问twemproxy-D
当还需要重启代理时,以此循环。
基于twemproxy和vip实现redis集群的无感知弹性扩容的更多相关文章
- 基于vip和twemproxy代理实现redis集群的无感知弹性扩容
目标是实现redis集群的无感知弹性扩容 关键点 1是无感知,即对redis集群的用户来说服务ip和port保持不变 2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量. 最原始的twe ...
- 使用Docker Compose部署基于Sentinel的高可用Redis集群
使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...
- Redis集群架构
Redis集群概述 集群的核心意义只有一个:保证一个节点出现了问题之后,其他的节点可以继续提供服务使用. Redis基础部分讲解过主从配置:对于主从配置可以有两类:一主二从,层级关系.开发者一主二从是 ...
- (转)理想化的 Redis 集群
一个豁达的关键是正确乐观的面对失败的系统.不需要过多的担心,需要一种去说那又怎样的能力.因此架构的设计是如此的重要.许多优秀的系统没有进一步成长的能力,我们应该做的是去使用其他的系统去共同分担工作. ...
- redis(二十三):Redis 集群(proxy 型)二
redis的确是一个非常高效的缓存服务器,但是单台redis服务器的内存管理能力有限,如果一味的加大内存的话会导致redis服务器的性能下降,所以就必须要搭建redis集群来提供服务.在redis官方 ...
- 基于Twemproxy的Redis集群搭建以及想法
基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...
- 基于Twemproxy的Redis集群方案(转载)
原文地址:基于Twemproxy的Redis集群方案 概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的 ...
- 基于Twemproxy的Redis集群方案
概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...
- 基于 twemproxy 搭建 redis 集群
概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...
随机推荐
- Anaconda的使用—Spyder常用快捷键
Ctrl + 1: 注释/反注释 Ctrl + 4/5: 块注释/块反注释 Ctrl + L: 跳转到行号 Tab/Shift + Tab: 代码缩进/反缩进 Ctrl +I:显示帮助
- iOS 从0到1搭建高可用App框架
iOS 从0到1搭建高可用App框架 最近在搭建新项目的iOS框架,一直在思考如何才能搭建出高可用App框架,能否避免后期因为代码质量问题的重构.以前接手过许多“烂代码”,架构松散,底层混乱,缺少规范 ...
- 关于truthy 和 falsy
一,强制类型转换 JavaScript 在需要用到布尔类型值的上下文中使用强制类型转换(Type Conversion )将值转换为布尔值,比如:在条件语句或者循环语句中 一,truthy 在java ...
- 范围for语句的整理
1.如何处理stirng中的每个字符?(来自C++Primer中文版5th中P83) 使用基于范围的for语句,比如下面的例子,输出每个字符 #include<iostream> #inc ...
- 【Win10分区教程】
Win10怎么分区?如何为Win10硬盘分区? 注:本教程适用于Win7.Win8.Win8.1和Win10系 到了Windows10时代,TB级硬盘已经很普及了,那么在Win10系统下如何为这些大容 ...
- 01javascript基础
1.JavaScript:直接写入 HTML 输出流 实例:(只能在 HTML 输出中使用 document.write.如果在文档加载后使用该方法,会覆盖整个文档) <!DOCTYPE htm ...
- 序列化serialize()与反序列化unserialize()的实例
在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...
- 上传文件到阿里云linux服务器
在“运行”中输入cmd,打开控制台,切换到刚才Putty的安装目录下,我的是E:\Putty,然后输入pscp命令,我们需要这个命令来实现文件的上传.如下图所示,命令格式为: pscp D:\recy ...
- 【ssh服务配置】
根据项目需求,搭建好拓扑图如下: 第一种验证方式:给予密码和用户名登录 Ssh server配置: 首先在服务器上创建一个rsa加密算法的秘钥对: 对ssh服务进行开启: 创建用户的虚拟终端登录界面: ...
- C# Winform WebBrowser控件
C# WinForm WebBrowser 1.主要用途:使用户可以在窗体中导航网页. 2.注意:WebBrowser 控件会占用大量资源.使用完该控件后一定要调用 Dispose 方法,以便确保及时 ...