十个常见的缓存使用误区及建议

本文总结了使用缓存时常见的十大误区,包括依赖默认序列化、单一缓存中存储大对象等,并给出了相应的建议。

Omar Al Zabir的《Ten Caching Mistakes that Break your App》这篇文章已经发表好多年了,但是它仍然指导着大家如何合理、高效的使用缓存。在日常工作中,开发者经常利用缓存来优化站点或应用程序,然而在实际应用中,大家使用缓存时,总会存在或多或少的误区,反而影响了站点或应用程序的正常运行。近日,highscalability上的一篇文章总结了十大使用缓存的误区和建议

  现就对这十大缓存误区以及使用建议进行一个全面的梳理:

  1、依赖默认的序列化方式

  使用默认的序列化处理方式可能会消耗大量的CPU资源,尤其是处理复杂类型数据时。所以建议大家一定要根据所使用语言和环境的情况,采用最合理、有效的序列化和反序列化方式。

  2、在单一缓存中存储大对象数据

  由于序列化和反序列化需要一定的资源开销,当处于高并发高负载的情况下,对大对象数据的频繁读取有可能会使得服务器的CPU崩溃,所以建议大家把大对象数据分成为较小的子对象,然后再各自进行缓存。

  3、在不同线程间使用缓存共享对象

  在竞态条件(Race conditions)条件下,当写线程对缓存进行写入操作时,如果这是读线程刚好也要访问同一缓冲对象,就有可能读取脏数据,所以在实际开发中要根据实际情况采取外部锁机制,以保证缓存数据的正确读写。

  4、认为存储数据操作后,数据即刻就能存储到缓存中

  刚进行写入缓存操作的数据并不一定能够马上写入缓存,这是因为当缓存空间不足时,刚写入的缓存有可能被刷新掉。所以在编写程序时,应该首先对获得缓存的值作空值检测。

  5、使用嵌套对象存储整个集合

  如果将整个集合对象数据进行嵌套缓存的话,获得其中某个具体元素的性能将会严重受到影响,这是因为整个集合存储意味着对整个嵌套对象进行序列化。有鉴于此,建议单独对每个元素进行缓存,这样就可以做到对每个对象分别更新和读取,以减少序列化的影响。

  6、对父子对象采取统一与单独混用的存储方式

  有时候一个对象可能拥有两个或更多的父对象,同一对象存储在不同地方,这样就会造成缓存的浪费。为了不让同一对象存储于不同地方,这就需要根据统一对象本身的键进行缓存,这样父对象就能够根据需要访问子对象。

  7、对配置信息进行缓存

  缓存数据的访问是有代价的,所以要尽可能把影响减到最低,所以建议使用本地静态变量代替缓存对配置数据进行存储。

  8、对实时对象进行缓存

  如果对实时对象(例如:流、文件、注册信息或者网络情况)的引用进行缓存的话,当缓存数据被删除后,之前缓存的实时对象不被删除,这样会造成系统资源泄漏,所以不要对实时对象进行存储。

  9、使用多个键存储同一对象

  尽管使用多个键存储同一对象就使得使用一个键和索引号来进行访问时带来便利,但是当缓存是基于远程缓存的话,任何关于对象改变都是不可见的,这样会导致缓存数据同步问题的发生,所以不建议使用多个键存储同一对象。

  10、在连续存储中进行更新或删除后不及时更新相应缓存对象

  由于在一个远程缓存中,数据以拷贝方式存储,所以当更新对象时,缓存不会被同步更新。所以更新对象时,缓存必须被明确地进行更新。然而在基于内存的缓存中,当删除一个对象时,在缓存中不会被同步删除,所以建议通过程序确保缓存对象被正确删除。

转自:http://www.admin10000.com/document/5136.html

<think>好的,我现在需要帮助用户了解如何在Ceph中创建RBD,并配置存储使用缓存层加存储层的方案。首先,我得回忆一下Ceph的基本概念和架构。Ceph是一个分布式存储系统,通过RADOS提供对象存储,RBD则是其块存储服务。存储池(pool)是Ceph中存储数据的逻辑分区,每个池可以有不同的副本数、CRUSH规则等配置。 用户提到的是缓存层加存储层的配置,这通常指的是分层存储(Cache Tiering),即使用快速存储设备(如SSD)作为缓存层,而较慢的存储设备(如HDD)作为存储层。这种架构可以提升热点数据的访问速度,同时降低成本。需要确认用户是否已经正确设置了两种存储设备,并创建了对应的存储池。 接下来,步骤可能包括:创建缓存池和存储池,设置缓存层模式,配置缓存层参数,最后创建RBD。需要确保缓存池和存储池的CRUSH规则正确指向不同的设备类型。例如,缓存池可能使用SSD的CRUSH规则,而存储使用HDD的规则。 可能的误区缓存层和存储池的关联设置是否正确,例如使用`ceph osd tier add`命令将缓存层附加到存储池,并设置缓存模式为writeback或readonly等。同时,需要调整缓存层的参数,比如目标大小、缓存水位线等,以避免缓存溢出或性能问题。 此外,创建RBD时需要指定存储池,用户可能想知道是在存储池还是缓存池中创建RBD。根据分层存储的工作原理,RBD应该创建在存储池(后端存储层),而缓存池会自动处理热点数据。但需要确认这一点是否正确,或者是否有其他最佳实践。 还需要考虑缓存层的数据刷新和淘汰策略,如何确保数据缓存层正确迁移到存储层。例如,使用`ceph osd tier cache-mode`设置缓存模式后,可能需要手动或自动触发数据刷写。 可能遗漏的步骤包括设置缓存池的参数,如hit_set_type、hit_set_count、hit_set_period等,用于跟踪访问频率,以及target_max_bytes和target_max_objects来控制缓存大小。 最后,验证步骤也很重要,比如通过写入和读取数据,观察是否先写入缓存层,再异步刷入存储层,或者读取时是否缓存热点数据。可以使用`rbd bench`进行性能测试,并通过`rados -p <cache_pool> ls`查看缓存池中的对象情况。 需要提醒用户注意,分层存储可能会增加系统复杂性,特别是在writeback模式下,存在数据丢失的风险,需确保缓存层的数据正确刷回存储层。此外,监控缓存命中率和性能表现,调整参数以优化效果。 总结步骤大致如下: 1. 创建存储池(如hdd-pool)和缓存池(如ssd-cache)。 2. 设置缓存池为存储池的缓存层。 3. 配置缓存模式和相关参数。 4. 创建RBD镜像,指定后端存储池。 5. 测试验证缓存效果和正确性。</think>以下是Ceph创建RBD并使用缓存层+存储层配置的详细步骤: $$ \text{架构示意图} $$ $$ \text{Client} \rightarrow \text{Cache Pool(SSD)} \leftrightarrow \text{Storage Pool(HDD)} $$ 一、基础环境准备 1. 确保集群已部署SSD和HDD两种OSD 2. 创建CRUSH规则: ```bash # 创建SSD规则 ceph osd crush rule create-replicated ssd-rule default osd-class ssd # 创建HDD规则 ceph osd crush rule create-replicated hdd-rule default osd-class hdd ``` 二、创建存储池(建议顺序) 1. 创建后端存储池(HDD) ```bash ceph osd pool create hdd-pool 128 128 replicated hdd-rule ``` 2. 创建缓存池(SSD) ```bash ceph osd pool create ssd-cache 128 128 replicated ssd-rule ``` 三、配置分层存储 1. 设置缓存层关联 ```bash ceph osd tier add hdd-pool ssd-cache ``` 2. 配置写回模式(最常用) ```bash ceph osd tier cache-mode ssd-cache writeback ``` 3. 设置缓存参数 ```bash ceph osd pool set ssd-cache hit_set_type bloom ceph osd pool set ssd-cache hit_set_count 4 ceph osd pool set ssd-cache hit_set_period 300 ceph osd pool set ssd-cache target_max_bytes 100000000000 # 100GB缓存容量 ``` 四、创建RBD镜像 ```bash rbd create hdd-pool/myimage --size 1024G ``` 五、验证配置 1. 查看分层状态 ```bash ceph osd tier dump ``` 2. 测试数据流动: ```bash # 写入测试 dd if=/dev/urandom of=/dev/rbd/hdd-pool/myimage bs=1M count=100 # 查看缓存池对象 rados -p ssd-cache ls | grep myimage ``` 六、注意事项 1. 水位线设置建议: ```bash ceph osd pool set ssd-cache cache_target_dirty_ratio 0.4 # 脏数据阈值40% ceph osd pool set ssd-cache cache_target_full_ratio 0.8 # 最大使用量80% ``` 2. 强制刷回命令: ```bash rados -p ssd-cache cache-flush-evict-all ``` 3. 监控指标建议: - 缓存命中率:`ceph osd pool stats ssd-cache` - 延迟对比:同时监控hdd-pool和ssd-cache的操作延迟 - 使用率:`ceph df`查看各池容量变化 $$ \text{性能提升效果预估} = \frac{\text{SSD IOPS}}{\text{HDD IOPS}} \times \text{热点数据命中率} $$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值