基于vip和twemproxy代理实现redis集群的无感知弹性扩容
目标是实现redis集群的无感知弹性扩容
关键点
1是无感知,即对redis集群的用户来说服务ip和port保持不变
2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量。
最原始的twemproxy+redis集群架构如下图1所示

其中twemproxy-A代理后面接了3个redis实例,作为集群使用,如果1个redis示例有10G存储能力,那么
目前这个架构具有10G*3=30G的存储能力。
当业务猛增,存储空间不够时,最简单的扩容方案如下图2所示:

这个方案最大的问题有2个
1.后端新增一个redis实例之后,虽然有一致性hash保证大部分数据还会走原先的路由,但仍有小部分旧的数据会被
路由到新的redis-4中,即丢失一小部分旧的数据
2.扩容效果不理想,一开始时,redis-4的已用存储是0,理想最好的方式是旧的数据还走之前的路由,新的数据路由到redis-4中
为了解决上述方案的不同,我提出了一个twemproxy二级代理的方案,如下图3所示:

这个方案有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.一开始需要测试清楚,哪些()标示走哪些对应的二级代理。
这个方案实现了弹性扩容,但是没有实现无感知,即需要重启twemproxy-C,为了实现无感知所以需要使用vip
,如图4所示:

无感知的解决类似”双buffer交换“的思路,即上图的twemproxy-C和twemproxy-D,当需要重启一级代理时
1.vip只访问到twemproxy-C
2.更改twemproxy-D使用最新的配置,重启
3.vip切换服务到只访问twemproxy-D
当需要重启1级代理时,以此循环。
基于vip和twemproxy代理实现redis集群的无感知弹性扩容的更多相关文章
- 基于twemproxy和vip实现redis集群的无感知弹性扩容
目标是实现redis集群的无感知弹性扩容 关键点 1.是无感知,即对redis集群的用户来说服务ip和port保持不变 2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量. 1.业务场景 ...
- 为什么Redis集群要使用反向代理?
为什么要使用反向代理? 如果没有方向代理,一台Redis可能需要跟很多个客户端连接: 看着是不是很慌?看没关系,主要是连接需要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端建立 ...
- redis集群主流架构方案分析
Redis在互联网大数据平台有着广泛的应用,主要被用来缓存热点数据,避免海量请求压垮数据库,同时可以提升服务节点的响应速度和并发量.随着数据量的增多,由于redis是占用单台物理机或虚机的内存,内存资 ...
- [转载] Redis集群搭建最佳实践
转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...
- Redis集群搭建最佳实践
要搭建Redis集群.首先得考虑以下的几个问题; Redis集群搭建的目的是什么?或者说为什么要搭建Redis集群? Redis集群搭建的目的事实上也就是集群搭建的目的.全部的集群主要都是为了解决一个 ...
- 基于Twemproxy的Redis集群搭建以及想法
基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...
- 基于twemproxy的redis集群部署
一.系统及软件版本 操作系统:CentOS Linux release 7.3.1611 (Core) 内核版本:3.10.0-514.el7.x86_64 redis版本:3.2.8 twempro ...
- 基于Twemproxy的Redis集群方案(转载)
原文地址:基于Twemproxy的Redis集群方案 概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的 ...
- 基于Twemproxy的Redis集群方案
概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...
随机推荐
- php数据库操作小要点
保留小数点后两位 $ba = floor(($v[2]/$sum[0][0])*10000); //取整数 $bb = $ba/100; //两位小数 列的值加一可以直接用自身,不用单独查询出来 $s ...
- Rigidbody(刚体) and Collider(碰撞器)
关于刚体Rigidbody,手册上是这么描述的: Control of an object's position through physics simulation. 通过物理模拟控制一个物体的位置 ...
- JSP第六篇【自定义标签之传统标签】
为什么要使用自定义标签? JSTL标签库只提供了简单的输出等功能,没有实现任何的HTML代码封装,并且某些复杂类型转换,或者逻辑处理的时候,JSTL标签库完成不了,需要自定义标签! 编写自定义标签的步 ...
- System.getProperty()参数大全
System.getProperty()获取Java各种配置属性,参数如下: Java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vend ...
- UVW源码漫谈(番外篇)—— Emitter
这两天天气凉了,苏州这边连续好几天都是淅淅沥沥的下着小雨,今天天气还稍微好点.前两天早上起来突然就感冒了,当天就用了一卷纸,好在年轻扛得住,第二天就跟没事人似的.在这里提醒大家一下,天气凉了,睡凉席的 ...
- Python里Pure paths、PurePosixPath、PureWindowsPath的区别
Python是跨平台的,可以在不同的操作系统上运行.但是不同系统上路径 的表示方式是不一样的. 例如windows上路径使用“\”分割子目录和父目录,linux上是使用“/”来分割.这就是PurePo ...
- XCode消除警告、错误
1.集成支付宝SDK后,报一堆warning: (arm64) /Users/scmbuild/workspace/standard-pay/.....警告 解决方法: 1) Go to Build ...
- JAVA设计模式总结之六大设计原则
从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...
- JavaScript new Boolean(false) 其实是true
Boolean类型是JavaScript原始数据类型(primitive type)之一:常用来表示 真或假,是或否:这个类型只有两个值:保留字true和false 一般用于控制语句:如下 if(Bo ...
- http content-type accept的区别
1.Accept属于请求头, Content-Type属于实体头. Http报头分为通用报头,请求报头,响应报头和实体报头. 请求方的http报头结构:通用报头|请求报头|实体报头 响应方的http报 ...