中大期货都城配资

HUANYINGGUANGLINSHANGHAIZAIXIAN!

上海在线
当前所在位置:主页 > 上海在线 > 科技 >

如何开发一个高性能的redis cluster proxy

2020年04月21日 13:24:11 作者: 来源:未知

背景

redis cluster简介

Redis cluster是redis官方提供集群方案,设计上采用非中心化的架构,节点之间通过gossip协议交换互相的状态,redis cluster使用数据分片的方式来构建集群,集群内置了16384个哈希槽,每个key都属于这16384这个哈希槽中的一个,通过crc16算法计算哈希值,再取余可得每个key归属的哈希槽;redis cluster支持动态加入新节点,动态迁移slot,自动的故障转移等。

Redis cluster的架构要求客户端需要直接与redis集群中的每个节点建立连接,并且当出现新增节点加入、节点宕机failover、slot迁移等事件时,客户端需要能够通过redis cluster协议去更新本地的slot映射表,并且能处理ASK/MOVE语义,因此,我们一般称实现了redis cluster协议的客户端为smart redis client。

中大期货都城配资 Redis clusterZUIDUOKEYIGOUJIANCHAOGUO100GEZHUJIEDIANDEJIQUN(CHAOGUOZHIHOUgossipXIEYIKAIXIAOGUODA,QIEKENENGYINQIJIQUNBUWENDING),ANZHAODANJIEDIAN10GRONGLIANG(DANSHILINEICUNGUODAKENENGDAOZHIXINGNENGXIAJIANG),DANJIQUNZUIDUOKEYIZHICHENG1TZUOYOUDERONGLIANG。

问题

redis cluster有很多优点(比如可以构建大容量集群,性能好,扩缩容灵活),但是当一些项目工程期望从redis迁移到redis cluster时,客户端却面临着大量的改造工作,与此同时带来的是需要大量的测试工作以及引入的新风险,这对于一些稳定运行的线上工程代价无疑是巨大的。

需求

WEILEGENGFANGBIANDEJIANGYEWUQIANYIDAOredis cluster,ZUIQIWANGDESHIKEHUDUANSDKDEAPIWANQUANJIANRONGredis/redis-cluster,springTIGONGDERedisTemplateSHIYIGEHENHAOSHIXIAN,DANSHIDUIYUMEIYOUSHIYONGSpringRedisTemplateDEXIANGMU,HENDUOKEHUDUANSHIXIANDEredisHEredis-clusterFANGWENAPISHIBUYIZHIDE(BIRUJavaZHONGLIUXINGDEJedis),ZHEIWUXINGZHONGTIGAOLEQIANYIGONGZUODEGONGZUOLIANGHEFUZAXING,CISHIredis cluster proxySHIBUCUODEXUANZE,YOULEproxy,JIUKEYIXIANGCAOZUODANSHILIredisYIYANGCAOZUOredis cluster,KEHUDUANCHENGXUJIUBUXUYAOZUORENHEDEXIUGAI。 

当然,增加一层proxy,必然会导致性能有一定程度的下降,但是proxy作为无状态的服务,理论上可以水平扩展,并且由于proxy层的存在减少了后端redis server的连接数,在某些极端场景下甚至能提高redis集群整体的吞吐量。此外,基于proxy,我们还可以做很多额外的事情:

BIRUKEYIZAIproxyCENGZUOFENPIANLUOJI,ZHEIYANGDANGDANJIQUNDEredis clusterBUMANZUXUQIU(NEICUN/QPS)SHI,JIUKEYITONGGUOproxyCENGSHIXIANTOUMINGDETONGSHIFANGWENDUOGEredis clusterJIQUN。

  • 再比如可以在proxy层做双写逻辑,这样在迁移或者拆分缓存类型的redis时,就不需要使用redis-migrate-tool之类的工具进行全量迁移,而只需要按需双写,即可完成迁移。
  • 此外因为proxy实现了redis协议,因此可以在proxy层利用其它存储介质实现redis相关命令,从而可以模拟成redis对外服务。一个典型的场景就是冷热分离存储。

功能

介于上述各种原因和需求,我们基于netty开发了camellia-redis-proxy这样一个中间件,支持如下特性:

  • 支持设置密码
  • 支持代理到普通redis,也支持代理到redis cluster
  • 支持配置自定义的分片逻辑(可以代理到多个redis/redis-cluster集群)
  • 支持配置自定义的双写逻辑(服务器会识别命令的读写属性,配置双写之后写命令会同时发往多个后端)
  • 支持外部插件,从而可以复用协议解析模块(当前提供了camellia-redis-proxy-hbase插件,实现了zset命令的冷热分离存储)
  • 支持在线变更配置(需引入camellia-dashboard)
  • 支持多个业务逻辑共享一套proxy集群,如:A业务配置转发规则1,B业务配置转发规则2(需要在建立redis连接时通过client命令设置业务类型)
  • 对外提供了一个spring-boot-starter,3行代码即可快速搭建一个proxy集群


如何提升性能

中大期货都城配资 KEHUDUANXIANGcamellia-redis-proxyFAQIYITIAOQINGQIU,DAOSHOUDAOQINGQIUHUIBAODEGUOCHENGZHONG,YICIJINGLILERUXIAGUOCHENG

  • 上行协议解析(IO读写)
  • 协议转发规则匹配(内存计算)
  • 请求转发(IO读写)
  • 后端redis回包解包(IO读写)
  • 后端redis回包下发到客户端(IO读写)

KEYIKANDAOZUOWEIYIGEproxy,DALIANGDEGONGZUOSHIZAIJINXINGWANGLUOIODECAOZUO,WEILETISHENGproxyDEXINGNENG,ZUOLEYIXIAGONGZUO:

多线程

中大期货都城配资 WOMENZHIDAOredisBENSHENSHIDANXIANCHENGDE,DANSHIZUOWEIYIGEproxy,WANQUANKEYISHIYONGDUOXIANCHENGLAICHONGFENLIYONGDUOHECPUDEXINGNENG,DANSHIGUODUODEXIANCHENGYINQIBUBIYAODESHANGXIAWENQIEHUANYOUHUIYINQIXINGNENGDEXIAJIANG。camellia-redis-proxySHIYONGLEnettyDEDUOXIANCHENGreactorMOXINGLAIQUEBAOFUWUQIDECHULIXINGNENG,MORENHUIKAIQIcpuHEXINSHUDEworkXIANCHENG。 CIWAI,RUGUOFUWUQIZHICHIWANGKADUODUILIE,KAIQITA,NENGBIMIANCPUBUTONGHEXINZHIJIANDEloadBUJUNHENG;RUGUOBUZHICHI,NEIMEJIANGYEWUJINCHENGBANGHEDAOFEICPU0DEQITAHEXIN,CONGERRANGCPU0ZHUANXINCHULIWANGKAZHONGDUANERBUBEIYEWUJINCHENGGUODUODEYINGXIANG。

异步非阻塞

YIBUFEIZUSAIDEIOMOXINGYIBANQINGKUANGXIAXINGNENGDOUSHIYOUYUTONGBUZUSAIDEIOMOXING,DUIYUproxyCHANGJINGYOUQIRUCI,SHANGSHU5GEGUOCHENGZHONG,CHULEXIEYIZHUANFAGUIZEPIPEIZHEIYANGDENEICUNJISUAN,ZHENGGEZHUANFALIUCHENGDOUSHIYIBUFEIZUSAIDE,QUEBAOBUHUIYINWEIGEBIELIUCHENGDEGUZHANGYINGXIANGZHENGGEFUWU。

流水线

中大期货都城配资 WOMENZHIDAOredisXIEYIZHICHILIUSHUIXIAN(pipeline),pipelineDESHIYONG,KEYIYOUXIAOJIANSHAOWANGLUOKAIXIAO。camellia-redis-proxyYECHONGFENLIYONGLEZHEIYANGDETEXING,ZHUYAOBAOKUOLIANGFANGMIAN:

  • 上行协议解析时尽可能的一次性解析多个命令,从而进行规则转发时可以批量进行
  • 往后端redis节点进行转发时尽可能的批量提交,这里除了对来自同一个客户端连接的命令进行聚合,还可以对来自不同客户端连接,但转发目标redis相同时,也可以进行命令聚合

DANGRAN,SUOYOUZHEIXIEPILIANGHEJUHEDECAOZUODOUXUYAOBAOZHENGQINGQIUHEXIANGYINGDEYIYIDUIYING。

TCP分包和大包处理

中大期货都城配资 BUGUANSHISHANGXINGXIEYIJIEXI,HAISHILAIZIHOUDUANredisDEHUIBAO,TEBIESHIDABAODECHANGJING,ZAIPENGDAOTCPFENBAOSHI,LIYONGHESHIDEcheckpointDEJIZHIKEYIYOUXIAOJIANSHAOZHONGFUJIEBAODECISHU,TISHENGXINGNENG。

异常处理和异常日志合并

中大期货都城配资 RUGUOMEIYOUYOUXIAODECHULIGEZHONGYICHANG,ZAIYICHANGFASHENGSHIYEHUIDAOZHIFUWUQIXINGNENGXUNSUXIAJIANG。XIANGXIANGYIGECHANGJING,WOMENPEIZHILE90%DELIULIANGZHUANFAJIAJIQUN,10%DELIULIANGZHUANFADAOBJIQUN,RUGUOBJIQUNFASHENGLEDANGJI,WOMENQIWANGDESHILAIZIKEHUDUANDE90%DEQINGQIUZHENGCHANGZHIXING,10%DEQINGQIUSHIBAI,DANSHISHIJISHANGQUEKENENGYUANYUANCHAOGUO10%DEQINGQIUDOUSHIBAILE,YUANYINSHIDUOFANGMIANDE:

  • 后端操作系统层面的突然宕机proxy层可能无法立即感知(没有收到TCP fin包),导致大量请求在等待回包,虽然proxy层没有阻塞,但是客户端表现为请求超时
  • proxy在尝试转发请求到B集群时,针对B集群的重新连接请求可能拖慢整个流程
  • 宕机导致的大量异常日志可能会引起服务器性能下降(这是一个容易忽视的地方)
  • pipeline提交上来的请求,99个请求指向A集群,1个请求指向B集群,但是由于B集群的不可用,导致指向B集群的请求迟迟不回包或者异常响应过慢,客户端的最终表现是100个请求全部失败了

中大期货都城配资 camellia-redis-proxyZAICHULISHANGSHUWENTISHI,CAIQULERUXIACELVE:

  • 设置对异常后端节点的快速失败降级策略,避免拖慢整个服务
  • 异常日志统一管理,合并输出,在不丢失异常信息的情况下,减少异常日志对服务器性能的影响
  • 增加对后端redis的定时探活探测,避免宕机无法立即感知导致业务长时间异常

部署架构

中大期货都城配资 proxyZUOWEIWUZHUANGTAIDEFUWU,KEYIZUODAOSHUIPINGKUOZHAN,WEILEFUWUDEGAOKEYONG,YEZHISHAOYAOBUSHULIANGGEYISHANGDEproxyJIEDIAN,DUIYUKEHUDUANLAISHUO,XIANGYAOXIANGSHIYONGDANJIEDIANredisYIYANGFANGWENproxy,KEYIZAIproxyCENGZHIQIANSHEZHIYIGELVSDAILIFUWU,CISHI,BUSHUJIAGOUTURUXIA:

中大期货都城配资 DANGRAN,HAIYOULINGWAIYIGEFANGAN,KEYIJIANGproxyJIEDIANZHUCEDAOzk/Eureka/ConsulDENGZHUCEZHONGXIN,KEHUDUANTONGGUOLAQUHEJIANTINGproxyDELIEBIAO,RANHOUZAIXIANGFANGWENDANJIEDIANredisYIYANGFANGWENMEIGEproxyJIKE。YIJedisWEILI,JINXUJIANGJedisPoolTIHUANWEIFENGZHUANGLEZHUCEFAXIANLUOJIDERedisProxyJedisPool,JIKEXIANGFANGWENPUTONGredisYIYANGSHIYONGproxyLE,CISHI,BUSHUJIAGOUTURUXIA:

应用场景

  • 需要从redis迁移到redis-cluster,但是客户端代码不方便修改
  • 客户端直连redis-cluster,导致cluster服务器连接过多,导致服务器性能下降
  • 单个redis/redis-cluster集群容量/QPS不满足业务需求,使用camellia-redis-proxy的分片功能
  • 缓存类redis/redis-cluster集群拆分迁移,使用camellia-redis-proxy的双写功能
  • 使用双写功能进行redis/redis-cluster的灾备
  • 混合使用分片和双写功能的一些业务场景
  • 基于camellia-redis-proxy的插件功能,开发自定义插件

结语

Redis clusterZUOWEIGUANFANGTUIJIANDEJIQUNFANGAN,YUELAIYUEDUODEXIANGMUYIJINGHUOZHENGZAIQIANYIDAOredis cluster,camellia-redis-proxyZHENGSHIZAIZHEIYANGDEBEIJINGXIADANSHENGDE;TEBIEDE,RUGUONISHIYIGEJavaKAIFAZHE,camelliaHAITIGONGLECamelliaRedisTemplateZHEIYANGDEFANGAN,CamelliaRedisTemplateYONGYOUHEPUTONGJedisYIZHIDEAPI,TIGONGLEmget/mset/pipelineDENGYUANSHENGJedisClusterBUZHICHIDETEXING,QIETIGONGLEHEcamellia-redis-proxyGONGNENGYIZHIDEFENPIAN/SHUANGXIEDENGTEXING。

为了回馈社区,camellia已经正式开源了,想详细了解camellia项目的请移步github,地址如下:

RUGUONIYOUSHENMEHAODEXIANGFAHUOZHETIAN,HUOZHEYOUSHENMEWENTI,HUANYINGTIJIAOissueYUWOMENJIAOLIU!

配资公司 作者

曹佳俊。网易智慧企业资深服务端开发工程师。中科院研究生毕业后加入网易,一直在网易云信负责IM服务器相关的开发工作。


中大期货都城配资 GENGDUOJISHUGANHUO,HUANYINGGUANZHUvxGONGZHONGHAO“WANGYIZHIHUIQIYEJISHU+”。TINGWANGYICTOJIANGSHUQIANYANGUANCHA,KANZUIYOUJIAZHIJISHUGANHUO,XUEWANGYIZUIXINSHIJIANJINGYAN。WANGYIZHIHUIQIYEJISHU+,PEINICONGSIKAOZHECHENGZHANGWEIJISHUZHUANJIA。

网友评论