分布式缓存复述,集群在华泰证券的探索与实践

  本文选自《交易技术前沿》总第三十期文章(2018年3月)
  樊建陈营葛宝磊/华泰证券股份有限公司
  
     

  <>强摘要:复述,集群作为最热门的开源分布式缓存,在券商领域会有怎样的应用场景?本文从华泰证券的应用现状出发,介绍了复述,集群在华泰证券的大规模实践经验。
  
  <强>一、引言
  <强>   

        

  复述是一个开源(BSD许可)的内存键-值存储系统,它可以用作数据库,缓存和消息中间件。它支持多种类型的数据结构,如:字符串,散列),列表,集合,有序集合与范围查询等。复述,内置了复制,LRU驱动事件,事务,磁盘持久化等特性,并通过复述,哨兵(主从模式)和自动分区(复述,集群模式)提供高可用性。
  
  官方的复述,集群推出前,常见的复述,集群开源方案主要是Codis和所用Twemproxy,两者均采用代理的方式实现分布式。通过引入代理层来屏蔽底层数据的分布,可以简化客户端的实现,但使得集群架构变得复杂,维护成本上升.Redis从3.0开始支持自动分区,采用无中心节点方式实现集群模式。访问复述,集群时,无需代理代理,具备智能特性的客户端直接与复述,集群中的每个节点连接。
  
  集群复述,引入模式带来的优势在于:
  
  1.可靠性:具有分区机制,副本机制和自动容错机制;
  2.高性能,保证了复述,高吞吐的前提下,可线性扩展到上千个节点;
  3.可扩展性:基于分区的自动扩容,缩容,客户端透明的数据迁移。
  
  目前,复述,在互联网、金融,传统行业内的应用已十分广泛。随着金融业接入互联网的业务增加,活动,促销,节假日,热门事件等可能带来突发数倍甚至几十倍的访问峰值的情况时有发生,复述,集群是抵御突发海量访问的有效手段。
  
  <强> <强> 2。基本原理及概念   

        

  复述,集群整体设计是比较简单的,集群架构采用无中心节点的方式实现,集群中的节点通过八卦协议相互交换集群状态。客户端无需代理直接访问服务端,客户端通过哈希算法计算出关键对应的哈希槽,然后直接访问哈希槽对应的服务端节点。
  复述,集群的拓扑结构如下图所示:
  

     分布式缓存复述,集群在华泰证券的探索与实践”>
  
  <p>
  <br/>
  </p>
  
  
  <p>
  图1复述,集群架构图
  </p>
  
  
  <p>
  <强>集群构建:<br/>
  </强> <br/>
  复述,集群提供了一组集群搭建和管理命令,如:集群信息,集群,集群节点满足等。实际使用过程中可以借助命令行工具redis-trib。rb,可以方便的搭建一个集群,平衡集群哈希槽分布,删除添加节点等。<br/>
  <br/>
  搭建一个复述,集群仅需两步:1。节点准备,将编译好的复述,发布到至少三台服务器上,修改配置文件并启动复述,节点;2。节点握的手,使用redis-tribcreate host1:端口1…hostN: portN命令完成节点握手并确认槽位分配。服务器上有多个复述,实例时,注意修改服务的端口,工作目录,AOF和RDB文件名等配置。创建集群时可以指定副本数,也可以在集群创建完成后,将从节点逐个添加到集群中去。<br/>
  <br/>
  <强>数据分布:<br/>
  </强> <br/>
  复述,集群基于哈希槽(分片)的方式将数据分布到16384个槽中,每个主节点负责一部分哈希槽的数据存储.Redis中的每个键都会被映射到这些哈希槽的其中一个,集群使用散列公式CRC16(关键)% 16384来计算键键属于哪个槽。<br/>
  <br/>
  复述的智能客户端在访问集群时,先获取并缓存哈希槽和节点的映射关系,然后通过计算关键对应的哈希槽编号查找应该访问的节点。为了配合集群扩缩容,数据迁移等哈希槽映射需要改变的操作,复述,服务端添加了感动,问两种响应策略,前者通知客户端所访问的哈希槽所在的新节点,后者则通知客户端哈希槽正在迁移到哪个节点。<br/>
  <br/>
  <强>主从复制:<br/>
  </强> <br/>
  复述,集群节点间使用异步冗余备份(异步复制),不能保证数据的强一致性。可能出现数据丢失的场景:修改操作完成主节点上更新,当主节点回复客户端成功后,增量改动未能同步到从节点,此时主节点异常(宕机,故障转移等),从节点成为主节点;客户端路由表更新窗口期间,集群内或许会有主从角色快速出现两次切换,此时数据仍有可能写错节点,最终造成数据丢失。<h2 class=分布式缓存复述,集群在华泰证券的探索与实践