RGW Bucket Shard设计与优化-中
时间:2022-04-25
本文章向大家介绍RGW Bucket Shard设计与优化-中,主要内容包括调整OSD的几个op超时参数、压缩OSD的OMAP目录、对bucket做reshard操作、关闭pool的scrub和deep-scrub、抢修因omap过大导致的OSD无法启动问题、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
如何缓解 index shard 过大造成的影响
下面这些都是属于应急操作,属于快速止血止痛,部分操作属高危,一定要谨慎使用。
1
调整OSD的几个op超时参数
下面的几个参数只是用例,具体根据各位线上情况进行调整,但是不宜过大。
osd_op_thread_timeout = 90 #default is 15
osd_op_thread_suicide_timeout = 300 #default is 150
filestore_op_thread_timeout = 180 #default is 60
filestore_op_thread_suicide_timeout = 300 #default is 180
osd_scrub_thread_suicide_timeout = 300 #如果出现scrub导致的op超时可以适当增加这个
2
压缩OSD的OMAP目录
在可以停OSD的情况下,可以对OSD进行compact操作,推荐在ceph 0.94.6以上版本,低于这个版本有bug。 https://github.com/ceph/ceph/pull/7645/files
1. 开启noout操作
ceph osd set noout
2. 停OSD服务
systemctl stop ceph-osd@<osd-id> 或者
/etc/init.d/ceph stop osd.<osd-id>
3. 检查osd进程
ps -ef| grep "id <osd_id>"
4. 在ceph.conf中对应的[osd.id]加上下面配置
leveldb_compact_on_mount = true
5. 启动osd服务
systemctl start ceph-osd@<osd-id> 或
/etc/init.d/ceph start osd.<osd-id>
6. 确认进程运行中
ps -ef| grep "id <osd-id>"
7. 使用ceph -s命令观察结果,最好同时使用tailf命令去观察对应的OSD日志.
等所有pg处于active+clean之后再继续下面的操作
8. 确认compact完成以后的omap大小:
du -sh /var/lib/ceph/osd/ceph-$id/current/omap
9. 删除osd中临时添加的leveldb_compact_on_mount配置
10. 取消noout操作(视情况而定,建议线上还是保留noout):
ceph osd unset noout
3
对bucket做reshard操作
对bucket做reshard操作,可以实现调整bucket的shard数量,实现index数据的重新分布。 仅支持ceph 0.94.10以上版本,需要停bucket读写,有数据丢失风险,慎重使用,出了问题本人概不负责。
注意下面的操作一定要确保对应的bucket相关的操作都已经全部停止,之后使用下面命令备份bucket的index
radosgw-admin bi list --bucket=<bucket_name> > <bucket_name>.list.backup
通过下面的命令恢复数据
radosgw-admin bi put --bucket=<bucket_name> < <bucket_name>.list.backup
查看bucket的index id
root@demo:/home/user# radosgw-admin bucket stats --bucket=bucket-maillist
{
"bucket": "bucket-maillist",
"pool": "default.rgw.buckets.data",
"index_pool": "default.rgw.buckets.index",
"id": "0a6967a5-2c76-427a-99c6-8a788ca25034.54133.1", #注意这个id
"marker": "0a6967a5-2c76-427a-99c6-8a788ca25034.54133.1",
"owner": "user",
"ver": "0#1,1#1",
"master_ver": "0#0,1#0",
"mtime": "2017-08-23 13:42:59.007081",
"max_marker": "0#,1#",
"usage": {},
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
}
}
Reshard对应bucket的index操作如下:
使用命令将"bucket-maillist"的shard调整为4,注意命令会输出osd和new两个bucket的instance id
root@demo:/home/user# radosgw-admin bucket reshard --bucket="bucket-maillist" --num-shards=4
*** NOTICE: operation will not remove old bucket index objects ***
*** these will need to be removed manually ***
old bucket instance id: 0a6967a5-2c76-427a-99c6-8a788ca25034.54133.1
new bucket instance id: 0a6967a5-2c76-427a-99c6-8a788ca25034.54147.1
total entries: 3
之后使用下面的命令删除旧的instance id
root@demo:/home/user# radosgw-admin bi purge --bucket="bucket-maillist" --bucket-id=0a6967a5-2c76-427a-99c6-8a788ca25034.54133.1
查看最终结果
root@demo:/home/user# radosgw-admin bucket stats --bucket=bucket-maillist
{
"bucket": "bucket-maillist",
"pool": "default.rgw.buckets.data",
"index_pool": "default.rgw.buckets.index",
"id": "0a6967a5-2c76-427a-99c6-8a788ca25034.54147.1", #id已经变更
"marker": "0a6967a5-2c76-427a-99c6-8a788ca25034.54133.1",
"owner": "user",
"ver": "0#2,1#1,2#1,3#2",
"master_ver": "0#0,1#0,2#0,3#0",
"mtime": "2017-08-23 14:02:19.961205",
"max_marker": "0#,1#,2#,3#",
"usage": {
"rgw.main": {
"size_kb": 50,
"size_kb_actual": 60,
"num_objects": 3
}
},
"bucket_quota": {
"enabled": false,
"max_size_kb": -1,
"max_objects": -1
}
}
4
关闭pool的scrub和deep-scrub
Jewel以上版本可用
使用下面的命令开启pool的noscrub和deep-scrub
# ceph osd pool set <pool-name> noscrub 1
# ceph osd pool set <pool-name> nodeep-scrub 1
使用下面命令确认配置
# ceph osd dump | grep <pool-name>
pool 11 'pool-name' replicated size 3 min_size 2 crush_ruleset 0 object_hash rjenkins pg_num 8 pgp_num 8 last_change 800 flags hashpspool,noscrub,nodeep-scrub stripe_width 0
取消pool的noscrub和deep-scrub设置
# ceph osd pool set <pool-name> noscrub 0
# ceph osd pool set <pool-name> nodeep-scrub 0
5
抢修因omap过大导致的OSD无法启动问题
- RecyclerView点击事件处理
- Python 实现一个火车票查询的工具
- HTTPS迎来春天:Chrome计划将所有HTTP标记为不安全
- View绘制流程
- Linux Rootkit系列一:LKM的基础编写及隐藏
- Swift基础语法(常量变量、数据类型、元组、可选、断言)
- 【实战】Python 读写 Excel 实例应用
- 10万WordPress网站沦陷:恶意软件SoakSoak来了
- 自己动手实现一个Android Studio插件
- Oracle数据库漏洞分析:无需用户名和密码进入你的数据库
- Android动态加载入坑指南
- ModSecurity技巧:使用ssdeep检测Webshell
- 装饰者模式
- 经典算法学习之分治法(以排列、组合程序为例)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Vim实用技巧——Vim分屏技巧总结
- Activity onStop,onDestroy延迟10s执行
- 内存优化实战
- Nali:一个离线查询 IP 地理信息和 CDN 提供商的终端利器
- MySQL8.0的几个新特性
- read_only和super_read_only参数的区别
- AWS 命名提示需要指定 region
- AWS CodeArtifact 如何设置用户的 TOKEN
- GORM V2 自动迁移和迁移接口的方法
- Vue Nginx反向代理配置 解决生产环境跨域
- react的事件处理为什么要bind this 改变this的指向?
- 没有用到React,为什么我需要import引入React?
- JSON对象和JavaScript对象直接量的区别--不同之处
- (Demo分享)利用原生JavaScript-随机数-实现做一个烟花案例
- 关于DOM的理解