从Redis到Codis移植实践
一、 背景
随着业务的发展,线上Redis的数据越来越多,所以必须考虑扩容的事情了。对于redis的扩容,目前可选的方案有三种:1、client自己做sharding,一般是按key的hash值取模,对应到指定的redis server;2、采用redis3以上版本自带的cluster;3、Twitter开源的Twemproxy;4、国人开发的Codis。经过一番评估,我们决定采用Codis,原因不多说了,网上有很多。总结一句话:codis比较适合那种数据库比较大,但并发量不是特别高的系统。
二、 codis架构方案
Codis的原理和使用方法这里就不介绍了,网上有很多资料可以搜。这里说一下codis的proxy负载,有两种方案,如下:
方案一:通过HAProxy或F5来做负载均衡

方案优点:
1、 仍然可以使用Jedis作为客户端,原有系统的代码基本不用改
2、 方便扩容,扩容时代码基本无感知
方案缺点:
1、运维工作量增加,需要配置HA负载策略,并且每次扩容需要重新调整HA策略
方案二:通过Jodis客户端来做负载均衡

方案优点:
1、 简化运维
2、 少一个流程节点,降低了故障的概率
方案缺点:
1、 原有系统的代码全部需要修改,动作还是挺大的
2、 客户端依赖Jodis和zookeeper,相对比较重
备注:
如果使用Jodis客户端,jedis需要使用2.9.0及以上版本,同时spring-data-redis需要升级到1.5.0及以上版本。
我们最终选择的是第一个方案。主要是不用改已有的代码,否则研发人员会疯了。
三、 从Redis到Codis的上线步骤
2.1、上线步骤
1) 搭建生产环境下的codis集群,建议至少包括2个proxy、3个codis-server
2) 上线前:迁移redis数据到codis集群。数据迁移工具我们采用的是redis-port。Redis-port的使用和性能测试后续我再写文章介绍。需要注意的是:redis-port的sync操作,同步完成以后可以持续同步新写入的数据,切记不要关闭redis-port的sync进程,以保证codis集群的数据能够包括所有redis服务器的数据
3) 上线时,修改各个系统的redis连接信息,指向新codis集群,并重启服务
4) 观察各个系统是否运行正常
5) 观察原redis服务是否已经无请求接入
四、codis-HA
Codis-HA是codis提供的一个主从切换的工具,在codis3.1及以下版本中使用,codis3.2已经不推荐使用了,而是推荐使用sentinel。Codis-ha有几个问题:
1) 发生主从切换时,如果原来有多个slave,则没有提升为master的slave指向的master不会自动切换到新的master上
2) 被摘掉的master不会自动恢复,必须进行人工干预
综合来看,目前还是建议使用Sentinel + VIP的方式来实现主从切换。
五、报表监控
实时数据监控:
通过codis自带的控制台即可查看集群的实时数据,包括key数量、占用内存大小、实时请求数等
历史访问数据:
可以通过运维监控来实现,包括内存、CPU、IO、Load、请求数等的历史曲线,并可以设置监控报警
实时数据查询:
可以通过codis提供的restful api来实现,并嵌入到codis控制台中, 包括: 给定key,获得slot、group信息、以及最终数据,或者给定多个key,获得slot、group和最终数据
六、Codis后续扩容步骤
Codis可以实现在线不停服务进行扩容,具体的步骤如下:
1) 安装配置codis-server主从
2) 打开codis管理界面,新建server group、并添加刚刚安装的redis实例(注意:codis默认第一个添加的是master)
3) 规划slot分布,把部分slot迁移到新的server group中
说明:
3.1 slot迁移的过程中,Codis服务可以正常访问,codis的迁移机制可以保证数据的一致性
3.2 迁移时,key都是单个进行迁移,并且不能同时运行多个迁移任务,所以codis的迁移时间会比较长。一定要在扩容前留有足够的时间和空间。
七、参考资料
1、redis-port官网:https://github.com/CodisLabs/redis-port
2、codis-proxy不支持及部分支持的命令集
参见:https://github.com/CodisLabs/codis/blob/release3.2/doc/unsupported_cmds.md
从Redis到Codis移植实践的更多相关文章
- 豌豆夹Redis解决方案Codis安装使用
豌豆夹Redis解决方案Codis安装使用 1.安装 1.1 Golang环境 Golang的安装非常简单,因为官网被墙,可以从国内镜像如studygolang.com下载. [root@vm roo ...
- 基于nginx+lua+redis高性能api应用实践
基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...
- Redis-port安装使用实现redis迁移codis,以及简单redis pipe实现将mysql迁移redis
(0)Redis-port原理: 首先是看到下面这篇文档开始研究的redis-port http://www.itnpc.com/news/web/146085373656602.html 简要截图 ...
- 豌豆夹Redis解决方案Codis源码剖析:Dashboard
豌豆夹Redis解决方案Codis源码剖析:Dashboard 1.不只是Dashboard 虽然名字叫Dashboard,但它在Codis中的作用却不可小觑.它不仅仅是Dashboard管理页面,更 ...
- 豌豆夹Redis解决方案Codis源码剖析:Proxy代理
豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...
- 转 -Filebeat + Redis 管理 LOG日志实践
Filebeat + Redis 管理 LOG日志实践 小赵营 关注 2019.01.06 17:52* 字数 1648 阅读 24评论 0喜欢 2 引用 转载 请注明出处 某早上,领导怒吼声远远传来 ...
- 分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型
分布式缓存集群方案特性使用场景(Memcache/Redis(Twemproxy/Codis/Redis-cluster))优缺点对比及选型 分布式缓存特性: 1) 高性能:当传统数据库面临大规模 ...
- 新书介绍 -- 《Redis核心原理与实践》
大家好,今天给大家介绍一下我的新书 -- <Redis核心原理与实践>. 后端开发的同学应该对Redis都不陌生,Redis由于性能极高.功能强大,已成为业界非常流行的内存数据库. < ...
- Redis核心原理与实践--字符串实现原理
Redis是一个键值对数据库(key-value DB),下面是一个简单的Redis的命令: > SET msg "hello wolrd" 该命令将键"msg&q ...
随机推荐
- 如果往错误的NEO地址转账会发生什么
昨天聊天有人用NEO往错误地址转账丢钱了 我的第一反应是这不可能 Neo使用的地址带有验证功能 最下面ARPP-.G6ce这一串是个base58编码 把他解开就是17-.151f7b5f这一串 红 ...
- Python3面向对象—点和矩形类
Python类练习 定义一个类 class Point: '''二维坐标系中代表一个点''' pass print('打印Point:{}'.format(Point)) p1 = Point() p ...
- css 定位布局
文档流: 文档流,是指盒子按照html标签编写的顺序依次从上到下,从左到右排列.块元素占一行,行内元素在一行之内从左到在排列,先写的先排列,后写的排在后面,每个盒子都占据自己的位置. 关于定位: 可以 ...
- .NET 文件格式相关开源项目
在过去的2年里,我已确定把文件格式作为我的主要研究课题之一,NPOI就是在这样的研究课题下的产物.尽管从严格意义上讲NPOI只是POI的.NET版本,并不是我创造的,但是在开发过程中,我对OLE2有了 ...
- 关于eclipse的Progress一直跳转的解决方案
下载eclipse编程,发现了一个问题:执行main方法第二次console打印不出数据,后发现Progress一直跳转,而且非常多进度条在运行,关闭后第一次执行没问题,第二次问题重复出现. 有幸看到 ...
- 小程序上拉加载更多数据(onReachBottom)
<!--pages/test/test.wxml--> <block wx:for="{{list}}" wx:key="item.id"&g ...
- AS中jar包和aar包区别及导入导出
发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 导出 导入 区别 包和 aar jar 发表文章 摘要:jar包和aar包区别*.jar:只包含class文件与清单文件,不包含资源 ...
- java课程设计团队博客《基于学院的搜索引擎》
JAVA课程设计 基于学院网站的搜索引擎 对学院网站用爬虫进行抓取.建索(需要中文分词).排序(可选).搜索.数据摘要高亮.分页显示.Web界面. 一.团队介绍 学号 班级 姓名 简介 2016211 ...
- ublox TMOD2
Survey_in模式就是为了当满足下面的条件的时候,自动跳转到fixmod
- lambada表达式
在Java 8中stream().map(),您可以将对象映射为其他对象. List<String> collect = alpha.stream().map(String::toUppe ...