目标是实现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集群的无感知弹性扩容的更多相关文章

  1. 基于twemproxy和vip实现redis集群的无感知弹性扩容

    目标是实现redis集群的无感知弹性扩容 关键点 1.是无感知,即对redis集群的用户来说服务ip和port保持不变 2.弹性扩容,指的是在需要时刻可以按照业务扩大redis存储容量. 1.业务场景 ...

  2. 为什么Redis集群要使用反向代理?

    为什么要使用反向代理? 如果没有方向代理,一台Redis可能需要跟很多个客户端连接: 看着是不是很慌?看没关系,主要是连接需要消耗线程资源,没有代理的话,Redis要将很大一部分的资源用在与客户端建立 ...

  3. redis集群主流架构方案分析

    Redis在互联网大数据平台有着广泛的应用,主要被用来缓存热点数据,避免海量请求压垮数据库,同时可以提升服务节点的响应速度和并发量.随着数据量的增多,由于redis是占用单台物理机或虚机的内存,内存资 ...

  4. [转载] Redis集群搭建最佳实践

    转载自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool 要搭建Redis集群,首先得考虑下面的几个问 ...

  5. Redis集群搭建最佳实践

    要搭建Redis集群.首先得考虑以下的几个问题; Redis集群搭建的目的是什么?或者说为什么要搭建Redis集群? Redis集群搭建的目的事实上也就是集群搭建的目的.全部的集群主要都是为了解决一个 ...

  6. 基于Twemproxy的Redis集群搭建以及想法

    基于Twemproxy的Redis集群方案(转) redis3.0 已经发布了几个月了,但是我这等菜鸟到网上还是没有找到很好的关于搭建redis3.0集群的文章,而且好像很多公司的redis版本还保持 ...

  7. 基于twemproxy的redis集群部署

    一.系统及软件版本 操作系统:CentOS Linux release 7.3.1611 (Core) 内核版本:3.10.0-514.el7.x86_64 redis版本:3.2.8 twempro ...

  8. 基于Twemproxy的Redis集群方案(转载)

    原文地址:基于Twemproxy的Redis集群方案 概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的 ...

  9. 基于Twemproxy的Redis集群方案

    概述 由于单台redis服务器的内存管理能力有限,使用过大内存redis服务器的性能急剧下降,且服务器发生故障将直接影响大面积业务.为了获取更好的缓存性能及扩展型,我们将需要搭建redis集群来满足需 ...

随机推荐

  1. Java、javax、org、sun、Java.util等常用包的区别、详解、实例

    Java.javax.org.sun包都是jdk提供的类包,且都是在rt.jar中.rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就 ...

  2. java: Java中this和super的用法总结

    this this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this的用法在java中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this相当于是指向当前对象本 ...

  3. js中变量base64加密传输

    首先对base64进行定义: var Base64 = { _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01 ...

  4. 《MySQL必知必会》[01] 基本查询

    <MySQL必知必会>(点击查看详情) 1.写在前面的话 这本书是一本MySQL的经典入门书籍,小小的一本,也受到众多网友推荐.之前自己学习的时候是啃的清华大学出版社的计算机系列教材< ...

  5. 字符、字符集、编码,以及它们python中会遇到的一些问题(下)

    在看了很多的博客文章之后,总结整理得到了以下文章,非常感谢这些无私奉献的博主! 文章末尾有本文引用的文章的链接,如果有漏掉的文章引用,可以发邮件联系我,随后再次附上链接! 侵删!!! 这一部分是下篇, ...

  6. 我的Java设计模式-工厂方法模式

    女朋友dodo闹脾气,气势汹汹的说"我要吃雪糕".笔者心里啊乐滋滋的,一支雪糕就能哄回来,不亦乐乎?! 但是,雪糕买回来了,她竟然说"不想吃雪糕了,突然想吃披萨" ...

  7. 【SQL】- 基础知识梳理(六) - 游标

    游标的概念 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标(Cursor): 是处理数据的一种方法. 它可以定位到结果集中的某一行,对数据进行读写. 也可以移动游标定位到你需要的 ...

  8. NIO通讯框架之Mina

          在两三年前,阿堂在技术博客(http://blog.sina.com.cn/heyitang)上曾经写过"JAVA新I/O学习系列笔记(1)"和"JAVA新I ...

  9. GCD之线程挂起与恢复

    我们可以使用dispatch_suspend函数暂停一个queue以阻止它执行block对象;使用dispatch_resume函数继续dispatch queue.调用dispatch_suspen ...

  10. 【个人笔记】《知了堂》mysql表连接

    为什么使用表连接 什么是表连接? 如果数据来自多个表,那么可以采用链接查询的方式来实现.因此表连接就是多个表连接合在一起实现查询效果 表连接的原理 表连接采用的是笛卡尔乘积,称之为横向连接. 笛卡尔乘 ...