第一:是什么?
是基于内存,可持久化的日志型,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 .设计
由于复述,是单点,项目中需要使用,必须自己实现分布式。基本架构图如下所示