基于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集群来满足需 ...
随机推荐
- 動態SQL運用實例
動態SQL運用實例 語法8.1.6之前: EXECUTE IMMEDIATE dynamic_sql_string [INTO {define_var1 [, define_var2] ... | p ...
- LeetCode 中级 - 从前序与中序遍历序列构造二叉树(105)
一个前序遍历序列和一个中序遍历序列可以确定一颗唯一的二叉树. 根据前序遍历的特点, 知前序序列(PreSequence)的首个元素(PreSequence[0])为二叉树的根(root), 然后在中 ...
- C++ primer 练习9.52 适配器stack 中缀表达式
//调试环境 VS2015//本人菜鸟一枚,不喜勿喷! 谢谢!!!//主要思想引自 http://www.cnblogs.com/dolphin0520/p/3708602.html//主要代码引自 ...
- multimap的使用
multimap由于允许有重复的元素,所以元素插入.删除.查找都与map不同. 插入insert(pair<a,b>(value1,value2)) #include <iostre ...
- springMVC中接收请求参数&&数据转发
### 1. 接收请求参数 #### 1.1. [不推荐] 通过HttpServletRequest获取请求参数 假设存在: <form action="handle_login.do ...
- lvs集群实现lvs-dr模型和lvs-nat模型
ipvsadm ipvsadm命令是lvs集群在应用层的管理工具,我们可以通过此ipvsadm来管理lvs的配置,其实现了集群服务管理:增.删.改,集群服务的RS管理:增.删.改以及查看集群状态. 管 ...
- jQuery代码解释(基本语法)
html中jquery的以下用法 求解: var header = {}; header.ajaxCallComplete = false; header.login = false; header. ...
- JAVAOOP多线程
进程每个独立运行的任务对应一个进程,每个进程可以产生多个线程 特点:1,进程是系统运行程序的基本单位 2,每一个进程都有自己独立的一块内存空间,一组系统资源 3,每一个进程的内部数据和状态都是完全独立 ...
- Vue简单使用,
一些零碎的知识点: 在js中变量的声明 有三种方式: let,var, const let: 对应的是一个块级作用域 { let a = 12 } console.log(a) 这是未声明的, var ...
- 阿里云提醒 网站被WebShell木马后门的处理过程
昨晚凌晨收到新客户的安全求助,说是阿里云短信提示,网站有webshell木马文件被植入,我们SINE安全公司立即成立,安全应急响应小组,客户提供了阿里云的账号密码,随即登陆阿里云进去查看到详情,登陆云 ...