1、背景说明

参考说明:

https://access.redhat.com/documentation/en-us/red_hat_ceph_storage/2/html/object_gateway_guide_for_ubuntu/administration_cli#configuring-bucket-index-sharding

https://ceph.com/community/new-luminous-rgw-dynamic-bucket-sharding/

1.1、问题描述

性能测试中出现性能暴跌(间歇性性能波动),出现一段时间无法写入情况(时延一百多秒)

1.2、问题排查

查看rgw日志,发现单桶对象数写入太多,触发自动分片resharding操作

[root@node113 ~]# cat /var/log/ceph/ceph-client.rgw.node113.7480.log | grep reshard
2020-09-16 04:51:50.239505 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000009 ret=-16
2020-09-16 06:11:56.304955 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000013 ret=-16
2020-09-16 06:41:58.919390 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000004 ret=-16
2020-09-16 08:02:00.619906 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000002 ret=-16
2020-09-16 08:22:01.038502 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000012 ret=-16
2020-09-16 08:31:58.229956 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000000 ret=-16
2020-09-16 08:52:06.020018 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000006 ret=-16
2020-09-16 09:22:12.882771 7fe71d0a7700 0 RGWReshardLock::lock failed to acquire lock on reshard.0000000000 ret=-16

查看rgw相关配置,集群每个分片最大存放10w个对象,当前设置每个桶分片数为8,当写入对象数超过80w时,则会触发自动分片操作reshard

[root@node111 ~]# ceph --show-config | grep rgw_dynamic_resharding
rgw_dynamic_resharding = true
[root@node111 ~]# ceph --show-config | grep rgw_max_objs_per_shard
rgw_max_objs_per_shard = 100000
[root@node111 ~]# ceph --show-config | grep rgw_override_bucket_index_max_shards
rgw_override_bucket_index_max_shards = 8 [root@node111 ~]# radosgw-admin bucket limit check
"user_id": "lifecycle01",
"buckets": [
{
"bucket": "cosbench-test-pool11",
"tenant": "",
"num_objects": 31389791,
"num_shards": 370,
"objects_per_shard": 84837,
"fill_status": "OK"
},
{
"bucket": "cycle-1",
"tenant": "",
"num_objects": 999,
"num_shards": 8,
"objects_per_shard": 124,
"fill_status": "OK"
},

参数说明

  • rgw_dynamic_resharding

    [L版官方引入新的参数](https://ceph.com/community/new-luminous-rgw-dynamic-bucket-sharding/,该参数默认开启,当单个bucketfill_status达到OVER 100.000000%时(objects_per_shard > rgw_max_objs_per_shard),动态进行resharding(裂变新的分片,重新均衡数据)

    这个参数有个致命的缺陷,resharding过程中bucket无法进行读写,因为元数据对象正在重新分散索引,需要保证一致性,同时,数据量越大时间会越来越长

  • rgw_override_bucket_index_max_shards

    单个bucket创建分片数,默认参数值为0,最大参数值为7877(即单bucket最大写入对象数为7877x100000)

    分片数参数计算方式为number of objects expected in a bucket / 100,000,若预估单桶对象数为300w,则分片数设置为30(300w/10w)

    示例集群分片数为8,即创建bucket时默认创建8个分片,当每个分片对象数超过10w时,继续resharding创建新的分片,同时重新均衡索引到所有的分片内
  • rgw_max_objs_per_shard

    单个分片最大存放对象数,默认参数值为10w
  • rgw_reshard_thread_interval

    自动分片线程扫描的间隔,默认为十分钟

1.3、分片说明

  • 索引对象

RGW为每个bucket维护一份索引,里边存放了bucket中全部对象的元数据。RGW本身没有足够有效遍历对象的能力,bucket索引影响到对象写入、修改、遍历功能(不影响读)。

bucket索引还有其他用处,比如为版本控制的对象维护日志、bucket配额元数据和跨区同步的日志。

默认情况下,每个bucket只有一个索引对象,索引对象过大会导致以下问题,所以每个bucket所能存储的对象数量有限

--会造成可靠性问题,极端情况下,可能会因为缓慢的数据恢复,导致osd进程挂掉

--会造成性能问题,所有对同一bucket的写操作,都会对一个索引对象进行修改和序列化操作

  • bucket分片

Hammer版本以后,新增bucket分片功能用以解决单桶存储大量数据的问题,bucket的索引数据可以分布到多个RADOS对象上,bucket存储对象数量随着索引数据的分片数量增加而增加。

但这只对新增的bucket有效,需要提前根据bucket最终存放数据量规划分片数。当存储桶写入对象超过分片所能承载的最大数时,写入性能暴跌,此时需要手动修改分片数量,以此去承载更多的对象写入。

  • 动态bucket分片

Luminous版本以后,新增动态 bucket分片功能,随着存储对象的增加,RADOSGW 进程会自动发现需要进行分片的 bucket,并安排进行自动分片。

2、解决措施

主要分为以下两种情况

2.1、确定单bucket最终写入对象数

关闭动态分片功能(避免调整过程中出现性能暴跌问题),根据最终单bucket写入对象数设置分片数

示例最终单bucket写入对象数为300w,设置分片数为30
追加参数配置在/etc/ceph/ceph.conf配置文件[global]字段内
[root@node45 ~]# cat /etc/ceph/ceph.conf
[global]
rgw_dynamic_resharding = false
rgw_max_objs_per_shard = 30 重启RGW服务进程
[root@node45 ~]# systemctl restart ceph-radosgw.target

2.2、不确定单bucket最终写入对象数

不关闭动态分片功能,大概设置一个分片数

追加参数配置在/etc/ceph/ceph.conf配置文件[global]字段内
[root@node45 ~]# cat /etc/ceph/ceph.conf
[global]
rgw_max_objs_per_shard = 8 重启RGW服务进程
[root@node45 ~]# systemctl restart ceph-radosgw.target

ceph踩坑日记之rgw_dynamic_resharding的更多相关文章

  1. AI相关 TensorFlow -卷积神经网络 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  2. 人工智能(AI)库TensorFlow 踩坑日记之一

    上次写完粗浅的BP算法 介绍 本来应该继续把 卷积神经网络算法写一下的 但是最近一直在踩 TensorFlow的坑.所以就先跳过算法介绍直接来应用场景,原谅我吧. TensorFlow 介绍 TF是g ...

  3. hexo博客谷歌百度收录踩坑日记

    title: hexo博客谷歌百度收录踩坑日记 toc: false date: 2018-04-17 00:09:38 百度收录文件验证 无论怎么把渲染关掉或者render_skip都说我的格式错误 ...

  4. Hexo搭建静态博客踩坑日记(二)

    前言 Hexo搭建静态博客踩坑日记(一), 我们说到利用Hexo快速搭建静态博客. 这节我们就来说一下主题的问题与主题的基本修改操作. 起步 chrome github hexo git node.j ...

  5. Hexo搭建静态博客踩坑日记(一)

    前言 博客折腾一次就好, 找一个适合自己的博客平台, 专注于内容进行提升. 方式一: 自己买服务器, 域名, 写前端, 后端(前后分离最折腾, 不分离还好一点)... 方式二: 利用Hexo, Hug ...

  6. JavaScript 新手的踩坑日记

    引语 在1995年5月,Eich 大神在10天内就写出了第一个脚本语言的版本,JavaScript 的第一个代号是 Mocha,Marc Andreesen 起的这个名字.由于商标问题以及很多产品已经 ...

  7. React Native Android配置部署踩坑日记

    万事开头难 作为一只进入ECMAScript世界不久的菜鸟,已经被React Native的名气惊到了,开源一周数万星勾起了我浓烈的兴趣.新年新气象,来个HellWorld压压惊吧^_^(故意少打个' ...

  8. 人工智能(AI)库TensorFlow 踩坑日记之二

    上次 踩坑日志之一 遗留的问题终于解决了,所以作者(也就是我)终于有脸出来写第二篇了. 首先还是贴上 卷积算法的示例代码地址 :https://github.com/tensorflow/models ...

  9. 微信小程序开发踩坑日记

    2017.12.29  踩坑记录 引用图片名称不要使用中文,尽量使用中文命名,IDE中图片显示无异样,手机上图片可能出现不显示的情况. 2018.1.5  踩坑记录 微信小程序设置元素满屏,横向直接w ...

随机推荐

  1. 阿里云恶意软件检测比赛-第三周-TextCNN

    LSTM初试遇到障碍,使用较熟悉的TextCNN. 1.基础知识: Embedding:将词的十进制表示做向量化 起到降维增维的作用 嵌入维度数量(New Embedding维度)的一般经验法则: e ...

  2. linux 重启服务器命令

    Linux有如下的关机和重启命令:shutdown, reboot,poweroff, halt shutdown shutdown命令是大家都推荐的一个安全的命令,通过参数-h或-r的配合来完成关机 ...

  3. RabbitMQ小记(三)

    1.RabbitMQ中mandatory和immediate以及备份交换机 (1)mandatory为true时,若交换机无法根据自身类型和路由键找到符合条件的对列,那么RabbitMQ会回调Basi ...

  4. SQL实战——04. 查找所有已经分配部门的员工的last_name和first_name以及dept_no (一个逗号引发的血案)

    查找所有已经分配部门的员工的last_name和first_name以及dept_noCREATE TABLE `dept_emp` (`emp_no` int(11) NOT NULL,`dept_ ...

  5. 应用启动失败,报错:The server experienced an unexpected error when processing the request

    前言 在腾讯云TKE集群中部署服务的时候,预警服务,warn一直重启,经过查询日志发现了如下的错误 The server experienced an unexpected error when pr ...

  6. Oracle 数据库下赋予用户的执行存储过程和创建表权限

    grant create any table to username; grant create any procedure to username; grant execute any proced ...

  7. Docker笔记4:在 CentOS 上安装 Docker

    Docker 是一个开源的应用容器引擎,主要有两个分支,一个是社区免费版(Docker CE),一个是企业版(Docker EE). 第1步:系统环境要求 Docker 支持的 CentOS 版本: ...

  8. TP5发送邮件

    1,前提去qq邮箱开启smtp 2,生成授权码 2,发送短信给 3,附上代码 贴上代码如下 <?phpnamespace app\mails\controller;use \think\Cont ...

  9. ISCSI共享

    共享存储 ISCSI共享 服务端 软件安装 Install epel-release: # yum install epel-release Install scsi-target-utils rpm ...

  10. GC调优-XX:PrintGCDetails深度解析

    查看程序运行GC的运行情况 资源充足的GC情况 新生代 老年代 元空间 因为现在资源充足没有发生GC *案例:将JVM初始化内存与最大内存(防止内存抖动,反复GC)调至10m,new一个50m的数组对 ...