前段时间开发上线了一个Cache池,使用双层Cache池冗余,宕掉一台机器的Cache失效从1/N降到1/N^2。如果2层Cache池分开机器部署,失效率将会降到0。上线不久刚好碰上一次宕机事故,效果很好。该应用有16台Cache服务器,高峰时每秒访问约20万次,平时的命中率约为99.95%,宕掉一台会给8台db造成1.25万次/秒访问(因为命中率很高所以只计算宕机造成的Cache失效率),基本上不可能承受,以往遇到此类问题时,只能干等着高峰慢慢过去、压力降下来、同时Cache命中率缓慢提高,影响时间至少4 小时以上。使用双层冗余Cache池以后,单台Cache宕机给DB造成的压力是1/256,约780次/秒,分摊到8台db上就没多少压力了,对业务没有造成任何影响。
Cache是有状态服务,增加、删除服务器都要考虑数据一致性、对命中率的影响,这方面
memcachedb、
dbcached都是使用bdb/qdbm来做持久化存储,但把Cache持久化是否合适?后端数据量太大以后,也会因为io太大而性能低下,bdb性能会从几十万/秒降到几百/秒,更新操作很可能会丢弃或延迟,意味着牺牲了一致性,虽然有异步更新但也无法解决性能问题。运营中发现cache容量从每台30GB(bdb)降到2-4GB,cache命中率下降其实很少,性能却提高了不少,可以完全放在内存中。
原打算在memcached的基础上开发(或者是使用它的协议),经考查有几个问题,就放弃掉了:
- memcached的slab划分方式,不利于大小数据混合,考虑一种极端情况:开始时写的数据全都是100字节的,把内存全部用完;此时再想分配 200字节,就没有内存可用,由于我们的数据量非常大,随着用户数据的增长很容易出现这种情况。它没有一种有效的内存碎片回收机制。
- memcached的文本协议没有流水号,只能同步阻塞方式调用。udp协议要自己实现许多功能,比如流量控制、丢失重传等。
- 双层冗余Cache池还设计了一套类似于分布式存储系统的快速迁移机制,一旦一台Cache挂掉后就直接放弃里面的所有数据,重启后直接从其它节点迁移过来填充,迁移效率取决于网络带宽,极短的时间就可以把命中率提高到正常水平,减少系统风险。由于有双层cache冗余,在扩容时cache失效率也接近0,比consistent hashing还要高,当然每层cache还是使用consistent hashing来减少扩容时的cache失效率。在memcached的代码上增加这些功能,得到的好处太少。
cache 是自己开发的,基于内存整理的回收方式。内存硬件的效率非常高,一般服务器内存带宽都可以达到几GB/s,因此没有太担心效率问题。一个page上的小块数据可以一起回收,多个逻辑连续的page分组进行空间整理,可以保证每个操作至多处理N个page(N<10)。内存整理的开销完全分摊,实际测试一次cache操作最快只要几微秒,最慢几百微秒,压力测试可以达到80万/秒,完全满足业务需要。
分享到:
相关推荐
1.2 高可用原则 10 1.2.1 降级 10 1.2.2 限流 11 1.2.3 切流量 12 1.2.4 可回滚 12 1.3 业务设计原则 12 1.3.1 防重设计 13 1.3.2 幂等设计 13 1.3.3 流程可定义 13 1.3.4 状态与状态机 13 1.3.5 后台系统操作可反馈...
本书适合所有希望构建和管理高性能、高可用性的mysql数据库系统的开发者和dba阅读。 目录 · · · · · · 前言 第一部分 mysql5.5 新特性篇 第1章 mysql5.5介绍 2 1.1 性能上的显著改变 2 1.1.1 mysql5.5默认...
万无一失:网站的高可用性 高可性的度量与考核 度量 考核 高可用的网站架构 高可用的应用 高可用的服务 高可用的数据 CAP原理 数据备份 失效转移 高可用网站的软件质量保证 网站发布 自动化测试...
第7课 Mycat高可用方案 读写分离机制 集群机制 高可靠性的几种生产方案 第8课 Mycat项目实施方案 Mycat较佳实践 Mycat项目改造路线 Mycat数据扩容与迁移 第9课 Mycat案例分析 Mycat线上案例分析 第10课...
第7课 Mycat高可用方案 读写分离机制 集群机制 高可靠性的几种生产方案 第8课 Mycat项目实施方案 Mycat较佳实践 Mycat项目改造路线 Mycat数据扩容与迁移 第9课 Mycat案例分析 Mycat线上案例分析 第10课 MySQL 优化 ...
可用性设计 可靠性设计 一致性设计 负载均衡设计 过载保护设计 协议设计 二进制协议 文本协议 接入层架构设计 DNS轮询 动静态分离 静态化 反向代理 LVS F5 CDN 逻辑层架构设计 连接池 串行化技术...
" "集群与可用性要"必须支持通过Apache、IIS实现集群、负载均衡和系统 " "求 "扩展。 " " "支持多服务器群集部署、负载均衡、组件级的失效即时" " "恢复(Fail Over)。支持Web层的集群和EJB集群。应 " " "提供较...
dcache / check_dcache_movers.pl 检查dCache中是否存在“未找到移动者”错误dcache / check_dcache_cells.pl 检查d-Cache单元的可用性。 pbs / check_maui_diagnose_j.pl 检查MAUI的“诊断-j”输出。 pbs / check_...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...