分布式redis服务:codis

codis介绍

codis是豌豆荚基础架构团队开发并开源的分布式redis服务,可以看作是一个无限内存的redis服务,有动态扩容/缩容的能力。

codis使redis获得动态扩容/缩容的能力,增减redis实例对client完全透明,并不需要重启服务,不需要业务方面担心redis内存爆掉的问题。

codis架构

单codis-proxy架构

多codis-proxy架构

在codis的设计中,codis-proxy被设计成无状态的,客户端连接任何一个codis-proxy都是一样的,所以可以比较容易单间多个codis-proxy来实现高可用并横向扩容。建议使用多codis-proxy的高可用架构。

codis的特点

codis分片

codis采用pre-sharding的技术来实现数据的分片,默认分成1024个slot(0-1023)。对于每个key来说,通过哈希算法crc32(key)%1024来 确定slot id。

slot是虚拟概念。每一个slot都会有一个且必须有一个特定的server group id来表示这个slot的数据由哪个server group来提供。数据的迁移也是以slot为最小单位的。

codis数据迁移

codis支持通过codis-server进行数据迁移,迁移数据时是一个个key来进行的。每次以一个key为最小单位进行迁移,不会把主线程block住。redis的操作是内存的,批量的一次性写入和分多次set几乎没有区别,再者这个模型还避免了迁移过程中的数据更新同步的问题,因为迁移一个key的操作是原子性的,对于这个redis-server来说,在完成这次迁移指令前,是不会响应其它请求的,所以保证了数据的安全。

redis迁移到codis

redis-port工具

codis提供了redis-port的命令行工具,能够实现从数据上T的redis集群迁移到codis分布式redis集群。redis-port具有如下功能:

  1、静态分析RDB文件,包括解析以及恢复RDB数据到redis

2、从redis上dump RDB文件以及在redis和codis之间动态同步数据

实现步骤

实现redis集群迁移到codis集群,需要进行如下操作

1、搭建好codis集群,并且codis-proxy能正确运行起来

2、对每一个redis实例运行一个redis-port来向你codis导入数据。如:

nohup redis-port sync --ncpu=4--from=redis-server:6379 \

--target=codis-proxy:19000 >${port}.log 2>&1 &

注:

每个redis-port负责将对应的redis数据导入到codis

多个redis-port之间互不干扰,除非多个redis上的key出现冲突

单个redis-port可以将负责的数据并行迁移一提高速度,通过—nohup指定并行数

导入速度受带宽以及codis-proxy处理速度限制

3、完成数据迁移,在适当的时候将服务指向codis集群,并将redis集群下线

注:

原redis集群下线时,会导致redis-port连接断开,于是自动退出

高可用

codis-proxy高可用

因为codis-proxy是无状态的,所以比较容易实现高可用性并横向扩容、

对于JAVA用户来说,可以使用设计者修改过的jedis(https://github.com/CodisLabs/jodis),来实现codis-proxy的高可用。它会通过监控zk上的注册信息来实时获得当前可用的proxy列表,既可以保证高可用性,也可以通过轮流请求所有的proxy实现负载均衡。如果需要异步请求,可以使用我们基于Netty开发的Nedis

redis实例高可用

对于codis-group的redis实例来说,当一个group的master故障后,应该让管理员清楚的知道,并手动将slave升级为master,因为这涉及到数据一致性等问题。当group中的master故障,其中一个slave升级为master后,该组内的其它slave实例是不会自动改变状态的,这些slave仍试图从旧的master上同步数据,因而导致组内新的master和slave之间数据不一致。因为redis的slaveof命令切换master时会丢弃slave上的全部数据,从新master完整同步,会消耗新master资源,因此建议在知情的情况下手动操作,是用codis-configserver add <group_id> <redis_addr> slave。

codis通过开放的api实现自动切换主从的工具-codis-ha,会检测到master故障后,会自动将其下线,并将期中一个salve提升为master,但是不会自动刷新其它slave的状态。

codis-ha用法

go getgithub.com/ngaut/codis-ha

cd codis-ha

codis-ha--codis-config=localhost:18087 --productName=test

参考文档:

codis使用指南:https://github.com/CodisLabs/codis/blob/master/doc/tutorial_zh.md

codis设计与实现2:http://0xffff.me/blog/2014/11/11/codis-de-she-ji-yu-shi-xian-part-2/

时间: 2024-08-04 00:57:02

分布式redis服务:codis的相关文章

Codis——分布式Redis服务的解决方案

Codis——分布式Redis服务的解决方案 之前介绍过的 Twemproxy 是一种Redis代理,但它不支持集群的动态伸缩,而codis则支持动态的增减Redis节点:另外,官方的redis 3.0开始支持cluster. codis和twemproxy最大的区别有两个: codis支持动态水平扩展,对client完全透明不影响服务的情况下可以完成增减redis实例的操作: codis是用go语言写的并支持多线程,twemproxy用C并只用单线程. 后者又意味着:codis在多核机器上的性

分布式Redis服务类实现

1.applicationContext-redis.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="

Spark生态系统解析及基于Redis的开源分布式服务Codis

摘要:在第九期"七牛开发者最佳实践日"上,陈超就Spark整个生态圈进行了讲解,而刘奇则分享豌豆荚在Redis上的摸索和实践. 1月24日,一场基于Spark和Redis组成的分布式系统实践分享由Spark资深布道者陈超和豌豆荚资深系统架构师刘奇联手打造. 陈超:Spark Ecosystem & Internals 陈超(@CrazyJvm),Spark布道者 在分享中,陈超首先简短的介绍了Spark社区在2014年的发展:目前Spark的发布版本是1.2,整个2014年Sp

基于Redis的开源分布式服务Codis

Redis在豌豆荚的使用历程--单实例==>多实例,业务代码中做sharding==>单个Twemproxy==>多个Twemproxy==>Codis,豌豆荚自己开发的分布式Redis服务.在大规模的Redis使用过程中,他们发现Redis受限于多个方面:单机内存有限.带宽压力.单点问题.不能动态扩容以及磁盘损坏时的数据抢救. Redis通常有3个使用途径:客户端静态分片,一致性哈希:通过Proxy分片,即Twemproxy:还有就是官方的Redis Cluster,但至今无一个

redis的分布式解决方式--codis (转)

codis是豌豆荚开源的分布式server.眼下处于稳定阶段. 原文地址:https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md Codis 是一个分布式 Redis 解决方式, 对于上层的应用来说, 连接到 Codis Proxy 和连接原生的 Redis Server 没有明显的差别 (不支持的命令列表), 上层应用能够像使用单机的 Redis 一样使用, Codis 底层会处理请求的转发, 不停机的数据迁移等工作

[转载] Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=208733458&idx=1&sn=691bfde670fb2dd649685723f7358fea&scene=1&key=c76941211a49ab58cb17c68ecaeeda0f1c083d9508a0f6629461fff9025fd87de4706bd9c1730e0ddbab70568b34b16a&ascene=0&

Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

本次分享的内容主要包括五个大部分: Redis.RedisCluster和Codis; 我们更爱一致性; Codis在生产环境中的使用的经验和坑们; 对于分布式数据库和分布式架构的一些看法; Q & A环节. ??Codis是一个分布式Redis解决方案,与官方的纯P2P的模式不同,Codis采用的是Proxy-based的方案.今天我们介绍一下Codis及下一个大版本RebornDB的设计,同时会介绍一些Codis在实际应用场景中的tips.最后抛砖引玉,会介绍一下我对分布式存储的一些观点和看

Codis 是一个分布式 Redis 解决方案

Codis源码地址:https://github.com/wandoulabs/codis 关于Codis组件可以参考:https://github.com/wandoulabs/codis/blob/master/doc/tutorial_zh.md 今天分享的这篇文章纯属个人的一些理解和使用的一些心得体会,如果错误也请朋友指出. 更重要的是为了认识一些正在使用或将要使用Codis的朋友有或多或少的帮助. 关于Codis的整体架构和功能介绍官方文档给的在详细不过了,所以我也不想在画蛇添足. 由

如何用分布式缓存服务实现Redis内存优化

Redis是一种支持Key-Value等多种数据结构的存储系统,其数据特性是"ALL IN MEMORY",因此优化内存十分重要.在对Redis进行内存优化时,先要掌握Redis内存存储的特性比如字符串,压缩编码,整数集合等,再根据数据规模和所用命令需求去调整,从而达到空间和效率的最佳平衡. 但随着数据大幅增长,开发人员需要面对重新优化内存所带来开发和数据迁移的双重成本也越来越高.Redis所有的数据都在内存中,那么,我们是否可以通过简便高效的方式去实现Redis内存优化呢? 答案当然