`
qiezi
  • 浏览: 497257 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

高可用性Cache池

    博客分类:
  • c++
阅读更多
前段时间开发上线了一个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是有状态服务,增加、删除服务器都要考虑数据一致性、对命中率的影响,这方面memcachedbdbcached都是使用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万/秒,完全满足业务需要。
13
2
分享到:
评论
4 楼 qiezi 2009-06-16  
iso1600 写道

文中讲了环境,但冗余是怎么样实现的,是双写还是服务自身去replication? 是用什么样的策略及算法,这个比较关注……另外文中提到“但把Cache持久化是否合适?”,但memcachedb不是memcache(虽然很多人误这样认为),mcdb是用来存储持久数据的。

目前冗余是双写完成的,这样开发比较简单,可能会造成部分数据不一致,以后可能会增加简单事务提交,不过双写应该不会改变,G(oogle)FS也是双写〜

memcached没有持久化,它的分布式也较为简陋,宕机后对db造成冲击的例子应该很多。

memcachedb主要提供持久化存储,并不是cache服务,这里拿它比较可能不合适。

cachedb使用集中的持久化存储来加强cache,需要额外的后端,数据量一旦变得很大(这很容易出现),性能问题就不可避免,很难应付宕机风险。还有一种容易忽视的风险是"not found",就是数据在cache中不存在,一旦有大量不存在的key访问,压力就会完全传递到qdbm上,当然也可以在应用层避开这个问题。
3 楼 iso1600 2009-06-16  
文中讲了环境,但冗余是怎么样实现的,是双写还是服务自身去replication? 是用什么样的策略及算法,这个比较关注……
另外文中提到“但把Cache持久化是否合适?”,但memcachedb不是memcache(虽然很多人误这样认为),mcdb是用来存储持久数据的。
2 楼 qiezi 2009-06-15  
软件上保证的〜
1 楼 老熊 2009-06-15  
cache冗余应该是类似硬盘raid 0+1吧,是利用程序来保证冗余的?还是硬件?

相关推荐

    Oracle数据库进阶 高可用性、性能优化和备份恢复

    ### Oracle数据库进阶:高可用性、性能优化和备份恢复 在现代企业的信息化建设中,数据库作为核心的数据存储与管理工具扮演着至关重要的角色。Oracle数据库因其强大的功能、灵活性及可靠性而被广泛应用于各行各业。...

    SpringCache+Redis实现高可用缓存解决方案.docx

    Spring Boot框架自带的`ConcurrentMapCacheManager`虽然简单易用,但对于分布式环境下的应用来说,其局限性较为明显,无法满足高可用性的需求。因此,本文将详细介绍如何利用Spring Cache与Redis结合,构建一套高效...

    Oracle MMA高可用架构及性能调优

    - **HACMP (High Availability Cluster Multi-Processing)**: IBM 的高可用性集群解决方案,旨在为 RS/6000 服务器提供高可用性支持。 - **ROSE HA**: 基于共享存储的高可用性软件,用于实现资源自动切换,解决单...

    开涛高可用高并发-亿级流量核心技术

    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 后台系统操作可反馈...

    IBM Websphere 集群配置参考文档(最全)

    Load Balancer负责请求的分发,Cache Proxy则提供缓存功能,它们位于客户端和应用服务器之间,提供负载均衡、扩展性和高可用性支持。它可以处理各种基于TCP或UDP的协议请求,并动态调整后端服务器的权重以优化请求...

    RedisCache-master.zip

    RedisCache 是一个基于 Redis 的缓存系统,用于提高应用程序的性能和响应速度。Redis 是一个高性能的键值数据库,常被用作数据...在实际应用中,需要结合具体业务场景进行优化和调整,确保缓存系统的稳定性和高可用性。

    ncache-2.3_release.tar.gz

    1. **分布式缓存**:ncache 2.3支持分布式缓存模式,这意味着多个服务器可以共享同一个缓存,从而实现高可用性和负载均衡。这种架构使得即使在服务器集群中,数据也能被快速检索,降低了单点故障的风险。 2. **高...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    本书适合所有希望构建和管理高性能、高可用性的mysql数据库系统的开发者和dba阅读。 目录 · · · · · · 前言 第一部分 mysql5.5 新特性篇 第1章 mysql5.5介绍 2 1.1 性能上的显著改变 2 1.1.1 mysql5.5默认...

    MemCached Cache Java Client封装优化历程

    3. **集中式Cache**:简化了分布式Cache的复杂性,但需要解决非单点故障问题,可通过集群实现高可用。 4. **分布式扩展**:Memcached支持横向扩展,多个实例组成虚拟服务端,对调用者透明。 5. **Socket通信**:基于...

    基于memcached client for java的cache封装

    1. **连接管理**:初始化Memcached客户端,设置服务器地址、端口和连接池大小等配置。这通常在应用启动时完成,确保服务可用。 2. **操作接口**:创建一套简洁易用的操作接口,如`get(key)`、`set(key, value, time...

    NetApp FAS存储系统教战手册.pdf

    本手册将为读者提供关于NetApp FAS存储系统的详细介绍,涵盖了存储系统概览、背景知识、统一存储架构、存储虚拟化、高可用性架构、控制器升级、满足不同需求的存储介质、Flash Cache智能缓存、NetApp RAID-DP双校验...

    ORACLE数据库体系结构、安全性策略浅析.pdf

    2. 高可用性:ORACLE 数据库支持高可用性,包括热备份、热备用和实时数据复制等。 3. 安全性:ORACLE 数据库提供了多种安全机制,确保数据的安全。 4. 可扩展性:ORACLE 数据库支持可扩展性,包括水平分区、垂直分区...

    asf-cache中文guide

    除了基础配置,还可以为高可用性设置集群配置。例如,可以创建多个`&lt;client&gt;`标签,每个标签对应不同的Socket连接池,实现主备或者负载均衡。在上面的示例中,`&lt;client name="mclient0-bck"&gt;`就是备用客户端,配置了...

    JDBC连接池使用工具 C3P0 连接池 and druid-1.0.9

    在Java开发中,数据库连接管理是一项重要的任务,它涉及到资源的有效利用和系统性能的优化。JDBC(Java Database Connectivity)是Java与...在实际开发中,理解并合理配置连接池参数对于提升系统性能和稳定性至关重要。

    MySQL性能优化配置参数之thread_cache和table_cache详解

    它会将不再使用的连接线程存储在连接池(Thread_Cache)中,而不是立即销毁。这样,在新的请求到来时,MySQL会优先在缓存中寻找可用的连接线程,如果找到就直接复用,若无则新建。thread_cache的主要参数包括: 1. ...

    Oracle-RAC原理浅谈.ppt

    Oracle RAC,全称为Real Application Clusters,是Oracle数据库系统的一种高级特性,旨在提供高性能、高可用性和高可扩展性的数据库解决方案。Oracle RAC允许多个数据库实例在同一物理数据库上同时运行,实现数据的...

    京东云架构介绍.pptx

    该缓存云采用分布式架构,通过缓存服务器的“数据复制”机制,实现了高可用性和数据的一致性。 Cache Cloud 还提供了多种 I/O 策略,满足不同的应用需求。此外,Cache Cloud 还支持扩容,能够根据需要预留内存和增加...

    SGA包含的组件:共享池

    SGA由多个组件构成,这些组件包括但不限于共享池(Shared Pool)、数据库缓冲区高速缓存(Database Buffer Cache)、日志缓冲区(Redo Buffer Cache)、大池(Large Pool)、Java池(JAVA Pool)以及流池(Streams Pool)等。...

Global site tag (gtag.js) - Google Analytics