新闻

NEWS

VC君讲技术01 | 关于RGW的这些问题如何解决?

发布时间:2020-03-07 发布者:瑞驰信息技术

《VC君讲技术》
技术分享第1期

本期分享以下内容:
1、RGW追加写导致自动删除数据对象严重bug
2、创建或修改RGW用户时指定其placement功能
3、如果桶正在reshard时则防止桶再次reshard调度功能
4、mgr组件分析--插件式功能集成,为用户自定义功能提供接口
5、RGW cache功能分析
6、RGW 压缩/解压缩


RGW追加写导致自动删除数据对象严重bug
追加写对象简介
N版合入的新功能,可以使用AppendObject API上传一个appendable 对象,后面可以继续往这个对象里面追加写数据,主要用来提升应用数据部分写的效率,因为不需要将对象全部读出来修改后再次写入的动作。
自动误删除数据对象bug
通过AppendObject API操作上传一个应用对象,然后再次追加写这个应用对象后,RGW的gc机制会自动删除掉除这个应用对象的head对象的其他rados对象。tracker地址:https://tracker.ceph.com/issues/42670。 受影响的版本是14.2.0及以后的版本,使用了这些版本的用户需要关注该问题,针对这个问题修复的PR:https://github.com/ceph/ceph/pull/33511


创建或修改RGW用户时指定其placement功能
功能介绍
RGW用户有时候需要有自己一套存储策略,该策略包括但不限于:存储池、数据压缩算法等。假定我们已经预先创建好了对应的placement信息,此时需要先创建RGW用户,然后再导出用户元数据,修改后再导入,比较繁琐,特别是对于管理平台程序来说。
功能作用
社区已经提交了一个PR(https://github.com/ceph/ceph/pull/31185/files)来实现在创建RGW用户(或修改现有用户)的时候直接指定placement id,是在15.1.0版本合入的,这个属于管理层面的功能,还是很有用的。


如果桶正在reshard时则防止桶再次reshard调度功能
功能介绍
RGW的bucket的索引分片时,如果再次进行索引分片,可能导致意想不到的问题。
功能作用
这个的功能就是bucket在分片的过程中,阻止其再次进行分片。社区已经提交了一个PR(https://github.com/ceph/ceph/pull/31299/files)来实现该功能,是在M版本合入的。这个也属于管理层面的功能,防止误操作,影响集群稳定性。


mgr组件分析--插件式功能集成,为用户自定义功能提供接口
mgr的实现与用途
该组件的主要作用是分担和扩展monitor的部分功能,减轻monitor的负担,让更好地管理ceph存储系统。 ceph-mgr是由C/C++、python以及Cpython等共同编写完成的,mgr的实现使用了大量的Extending Python with C or C++的语法。 ceph-mgr内部实现将ceph的部分C/C++实现的接口python化(即以前只能通过调用c/c++接口发送msg获取比如osdmap、monmap等集群状态,现通过mgr可以很方便地拿到。同时,ceph-mgr支持用户自定义的plugin(插件纯python开发,特别方便),用以实现特殊功能。
ceph-mgr的官方plugins包括:
•Dashboard(WEB界面的管理)
•Restful API(API方式获取ceph信息,应该与之前的ceph-rest-api功能一致)
•Zabbix
•Prometheus
•Influx(这三个实现了ceph的数据收集、监控等功能)
•devicehealth
•diskprecition_cloud
•diskprecition_local(实现磁盘健康监测、故障预测)等功能插件。
mgr功能插件自定义开发
mgr提供了常用的几种函数接口,只要重载这些接口,就能开发plugin实现特定功能。以下是官方的介绍,即实现服务器、消息通知、自定义命令等功能:
serve: member function for server-type modules. This function should block forever.
notify: member function if your module needs to take action when new cluster data is available.
handle_command: member function if your module exposes CLI commands.
根据plugin实现框架,可自行参考源码中的ceph plugin,学习模仿编写自定义plugin


RGW cache功能分析
ceph RGW在RGW客户端实现了缓存机制,内部采用LRU淘汰算法缓存数据,多个RGW实例有同步缓存数据机制-watch/notify ceph 中涉及RGW Cache 的配置参数:
•rgwcacheenabled: RGW cache 开关,默认为true,即开启。
•rgwcacheexpiry_interval: 缓存数据的过期时间,默认900秒。
•rgwcachelru_size: RGW 缓存entries的最大数量,当缓存满后会根据LRU算法做缓存entries替换,entries size默认为10000。读请求较多的场景,适当大的参数配置可以带来更好的性能。
RGW Cache 组织架构
一般的cache 系统会有以下四个重要的概念:
•CachingProvider:定义了创建、配置、获取、管理和控制一个或多个CacheManager。一个应用可以访问多个CachingProvider。
•CacheManager:定义了创建、配置、获取、管理和控制一个或多个唯一命名的Cache,这些Cache 存在于CacheManager的上下文中。一个CacheManager仅被一个CachingProvider拥有。
•Cache:是一个类似于Map 的数据结构并临时存储以key 为索引的值。一个Cache 仅被一个CacheManager 拥有。
•Entry:是一个存储在Cache 中的key-value 对。
RGW cache 主要在以下源文件中实现:
•rgw_cache.h
•rgw_cache.cc
•svcsysobj_cache.h
•svcsysobj_cache.cc 各实现类起到的作用,其中
•ObjectCache 就是CacheManager 的角色,管理一个Cache(Map)(即std::unorderedmap<string, ObjectCacheEntry> cachemap)。
•RGWSISysObjCache 相当于CachingProvider,管理一个CacheManager(即ObjectCache cache)。
•ObjectCacheEntry 相当于Entry,是一个存储在cache 中的key-value对。


RGW 压缩/解压缩
ceph目前从K版本开始支持compression,目前L版支持zlib、snappy、zstd、lz4,注意从ceph version 12.0.0开始才加入了zstd插件,lz4需要需要在编译前定义HAVE_LZ4宏才会被支持。compression还可以设置成random,这时会随机选择一个算法。random是用于测试的,不建议使用。 zlib、snappy、zstd算法对文本压缩效果显著,对视频和图片收效甚微。
ceph RGW:compression实现
RGW的comoression是基于placement targets的,是其中的一个配置项。
在默认情况下,bucket index、bi log是存储在.rgw.buckets.index pool中的,object data是存储在.rgw.buckets.data pool中的,这其实是由配置在zone上的default-placement决定的。
placement targets可以让radosgw同时拥有多组不同的数据pool。用户上传数据时,可以选择不同Placement Targets,将数据存储到不同的pool中。不仅如此,还可以在Placement Targets上配置压缩算法等属性。使使用该规则上传的数据被压缩存储。
使用时,我们需要先创建一组pool,然后在zone的配置中增加placement pools配置,然后在zonegroup中用placement targets项,为zone中的placement pools指定tags。最后在用户的placement tags中加入对应的tags为用户授权。

下一篇: