您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 电气安装工程 > ASBJ2014-刘奇-豌豆荚分布式redis的设计与实现 终稿
CodisDesign&Implementation姓名:刘奇微博:@goroutineStorage-基础架构部-豌豆荚典型业务image-service(单个value较大)好友关系(set,keycount4亿+)applist(720G,32instances)…...业务特点持久存储:MySQL或者HBase缓存:memcached+Redis豌豆荚的Redis历程●单实例●多实例,业务代码中做Sharding●单个Twemproxy●多个Twemproxy●Codis豌豆荚自己开发的分布式Redis服务使用Redis的一些痛点1.单机内存有限2.带宽压力3.单点问题4.不能动态扩容5.磁盘损坏时数据抢救HowtoscaleRedis?●客户端静态分片(ConsistentHash)●通过Proxy分片○Twemproxy●官方的RedisClusterWhynotTwemproxy●最大痛点:无法平滑的扩/缩容(Scale!!!!)○甚至修改个配置都需要重启服务。。。●不可运维,甚至没有DashboardWhynotRedisCluster(official)●无中心的设计,难把程序写对●代码有点吓人,clusterProcessPacket函数有426行,大脑难处理到所有的状态切换●迟迟没有正式版本,等了4年之久●目前还缺乏BestPractice,还没有人写一个RedisCluster若干条注意事项●整个系统高度耦合,升级比较困难为什么一定要redis关于Tair,Couchbase…良好的数据结构支持What’sCodis?●DistributedRedisProxy●RedisCluster又一个解决方案●HA●DesignforScalability●NoSPOF●PoweredbyandCCodis解决了哪些问题?●自动扩容,缩容●单点故障●单点带宽不足●高可用●轻松将数据从Twemproxy迁移到Codis●轻松运维,监控Codis整体设计●Pre-sharding○Slot=[0,1023]●Zookeeper●Proxy无状态●平滑扩容/缩容●扩容对用户透明设计考量●分布式系统是复杂的●开发人员不足●尽量拆分,简化每个模块,同时易于升级●每个组件只负责自己的事情●Redis只作为存储引擎●Proxy状态设计考量●Redis是否挂掉的判定放到外部,因为分布式系统存活的判定是复杂的●提供API让外部调用,当Redismaster挂掉的时候,提升slave为master设计考量●grapheverything○slotstatus○proxystatus○groupstatus○lock○actionproxyvssmartclientproxy:更好的监控,控制后端信息不暴露,易于升级smartclient:更好的性能更低的延迟,升级比较麻烦CodisArchitectureZookeeper●DistributedLockservice●RouterTable○Pre-sharding:1024slots●ServerGroups○ServerGroups○groupX:[master,slave]Read/WriteFlow(Normal)Read/WriteFlow(Migrating)Migration1.将slot_X状态标记为‘pre_migrate’2.等待所有的proxy确认3.将slot_X状态标记为‘migrating’4.不断发送SLOTSMGRT命令给sourceredisinstance直到slot_X所有的key迁移完成5.将slot_X状态标记为‘online’Howitworks?●makesureallproxiesupdateditsroutingtable○2-phasecommit○Zookeeper●Atomicmigration○Redisissinglethreaded○littleCpatch…Howitworks(domigrate)Howitworks(codis-redis)RedisCodisRediskey=valuekey1=value1key2=value2key3=value3key4=value4key5=value5…keyN=valueNkey=valuekey1=value1key2=value2key3=value3key4=value4key5=value5slot1...slot2slotXRouterTableZooKeeperZNode:/codis/db_{xx}{xx}means产品名,如:/codis/db_sync,/codis/db_applist/codis/db_{xx}/servers/group_{N}/{serveraddr(e.g.127.0.0.1:6379)}存储真实的redis组(主master、从slave),N为一个自定义的整数编号,inJSON,内容包括服务器地址,角色(masterorslave)等信息RouterTable//存储keyslot的分布信息,N为hash(key)/codis/db_{xx}/slots/slot_{N}(0N1024)={‘group’:‘group_znode_name’,‘state’:{‘status’:‘ONLINE|OFFLINE|MIGRATING|PRE_MIGRATE’,‘op_ts’:‘123123123123’,}}Codis’Redis●Slotsupport●Atomicmigration○每个操作迁移一个keyCodisConfigTool(cconfig)●Rebalance●ManageServerGroups●Dashboard(HTTP)●RESTfulAPIs可是我的数据已经在Twemproxy上了,太大了,还没法重建,我还懒得写迁移脚本,没法迁移!!!肿么办!!!CodisPort●通过replication的方式将twemproxy/redis的数据迁移到codis●Sync协议●FakeSlaveCodisPortTwemproxyRedisRedisRedisCodisPortCodisPortCodisPortCodisProxy1112使用注意事项1.单key的value别太大了(1MB)○list别太大...TODO●Persistentstoragesupport○LevelDB,Rocksdb…...●RedisHAmodule有些公司是单独运行codis的,没有和运维系统结合,也不想自己调用codisAPIPerformanceCodis会比Twemproxy慢20%左右open-sourcegithub.com/wandoulabs/codisThanksQA
本文标题:ASBJ2014-刘奇-豌豆荚分布式redis的设计与实现 终稿
链接地址:https://www.777doc.com/doc-3362649 .html