复述分布式缓存实现

  

  第一:是什么?   

  

  是基于内存,可持久化的日志型,Key-Value 高性能存储系统,并提供多种语言的API。   

  

  第二:出现背景   

  
      <李>   数据结构(数据结构)需求越来越多,但memcache中没有,影响开发效率   李   <李>   性能需求,随着读操作的量的上升需要解决,经历的过程有:,
      数据库读写分离(M/S)→数据库使用多个奴隶→增加缓存(memcache)→转到复述   李   <李>   解决写的问题:
      水平拆分,对表的拆分,将有的用户放在这个表,有的用户放在另外一个表;   李   <李>   

      可靠性需求,
      缓存的”雪崩”问题让人纠结,
      缓存面临着快速恢复的挑战   

      李   <李>   

      开发成本需求,
      缓存和数据库的一致性维护成本越来越高(先清理DB,再清理缓存,不行啊,太慢了!),
      开发需要跟上不断涌入的产品需求,
      硬件成本最贵的就是层面的机器,基本上比前端的机器要贵几倍,主要是IO密集型,很耗硬件;   

      李   <李>   

      维护性复杂,
      一致性维护成本越来越高,,
      BerkeleyDB使用B树,会一直写新的,内部不会有文件重新组织,这样会导致文件越来越大;大的时候需要进行文件归档,归档的操作要定期做,,
      这样,就需要有一定的停机时间;   

      李   
  

  基于以上考虑,选择了复述   

  

  第三:复述,在新浪微博中的应用   

  

  复述,简介   

  

  1. 支持5种   

  

  支持字符串、哈希表、列表、集合排序sets 
  字符串是很好的存储方式,用来做计数存储这里用于建立索引库非常棒;   

  

  2. 离子束进行存储vs离子束进行缓存   

  

  新浪微博目前使用的98%都是持久化的应用,2%的是缓存,用到了600 +服务器,
  复述中持久化的应用和非持久化的方式不会差别很大:,
  非持久化的为8 - 9 tps万,那么持久化在7 - 8万tps左右,,
  当使用持久化时,需要考虑到持久化和写性能的配比,也就是要考虑复述,使用的内存大小和硬盘写的速率的比例计算;   

  

  3.社区活跃   

  

  复述,目前有3万多行代码,代码写的精简,有很多巧妙的实现,作者有技术洁癖,
  复述的社区活跃度很高,这是衡量开源软件质量的重要指标,开源软件的初期一般都没有商业技术服务支持,如果没有活跃社区做支撑,一旦发生问题都无处求救;   

  

  复述,基本原理   

  

  复述,持久化(aof)附加在线文件:,
  写日志(aof),到一定程度再和内存合并。追加再追加,顺序写磁盘,对性能影响非常小   

  

  1. 单实例单进程   

  

  复述,使用的是单进程,所以在配置时,一个实例只会用到一个CPU;,
  在配置时,如果需要让CPU使用率最大化,可以配置复述,实例数对应的CPU数,复述,实例数对应端口数(8核CPU、8个实例,8个端口),以提高并发:,
  单机时,单条数据在200字节,,的结果为8 ~ 9万tps;   

  

  2. 复制   

  

  过程:数据写到主→主存储到奴隶的rdb中→奴隶加载rdb到内存只
  存储点(保存点):当网络中断了,连上之后,继续传只
  主从下第一次同步是全传,后面是增量同步,,   

  

  3.数据一致性   

  

  长期运行后多个结点之间存在不一致的可能性;,
  开发两个工具程序:,
  1 .对于数据量大的数据,会周期性的全量检查,,
  2 .实时的检查增量数据,是否具有一致性;   

  

  对于主库未及时同步从库导致的不一致,称之为延时问题,,
  对于一致性要求不是那么严格的场景,我们只需要要保证最终一致性即可,,
  对于延时问题,需要根据业务场景特点分析,从应用层面增加策略来解决这个问题,,
  例如:
  1 .新注册的用户,必须先查询主库,,
  2 .注册成功之后,需要等待3 s之后跳,转后台此时就是在做数据同步。   

  

  第四:分布式缓存的设计   

  

  1 .设计   

  

  由于复述,是单点,项目中需要使用,必须自己实现分布式。基本架构图如下所示   

复述分布式缓存实现