Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Ceph 自动化四大天王

Ceph 自动化四大天王

作者头像
用户1260683
发布于 2021-12-04 06:13:32
发布于 2021-12-04 06:13:32
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

每一个Ceph新手,都或多或少被文中提到的四大天(坑)王吊打过,或钢筋铁骨成为大神,或删库跑路沦为亡魂。因此有必要给大家早早普及一下这四大天王的手段,帮各位早脱苦海。本文建立在你已经基本了解Ceph的构架和基本原理,如果不熟悉的同学可以看下面内容

https://docs.ceph.com/en/pacific/architecture/

1.OSD自动化加入crush

很多新手,上来也不看基本的Crush算法原理,照着其他人的ceph.conf就是抄作业,其中抄得最不走心的就是下面这条配置。

osd crush update on start = false

重启以后或者加入新的OSD,发现自己的集群pg异常了,一个个OSD成了没妈的孩子,到处都是小蝌蚪找妈妈。殊不知,默认Crushmap中会按host为单位,自动化将启动的osd加入到所在的host中,如果你开启了这个osd crush update on start = false的配置,则会关掉自动化分配,只能按用户自定义的Crushmap分布规则进行配置,而新手往往都没有自定义的Crushmap规则,于是就遇上了一大堆的孤儿osd。所以抄作业之前,一定要搞清楚自己的环境和对方环境的差异性,盲抄作业是要吃大亏的。

每一个新手,一定要去学习的就是crush算法的基本原理,并认真按照下面的文档,进行crush-map编辑操作的学习与模拟。

https://docs.ceph.com/en/pacific/rados/operations/crush-map-edits/

类似的设置还有osd class update on start = false

2.pg自动化平衡 balancer

掌握基本的Crush算法和基本概念,会你发现crush的伪随机算法并不能100%确保你的每一个OSD都能均衡的实现数据分布,随着你写入的数据增加,很多情况下会发现OSD磁盘的利用率非常的不均匀。于是你会遇上如何平衡OSD数据分布这一难题,好在官方也一直在努力做好这件事情,并推出了一系列自动化工具。

The balancer can optimize the placement of PGs across OSDs in order to achieve a balanced distribution, either automatically or in a supervised fashion.

最早的时候是通过扩展mgr模块,实现了一个名为balancer的模块,通过手工方式来调度这个模块,实现OSD上面的PG分布调优。你可以通过下面的命令查看你的ceph是否支持这个特性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@host:/home/demo# ceph mgr module ls
{
    "always_on_modules": [
        "balancer",
        "crash",
        "devicehealth",
        "orchestrator_cli",
        "progress",
        "rbd_support",
        "status",
        "volumes"
    ],
    "enabled_modules": [
        "iostat",
        "restful"
    ],

新版本已经不支持手动关闭。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@host:/home/demo# ceph mgr module disable balancer
Error EINVAL: module 'balancer' cannot be disabled (always-on)

你可以通过下面的命令查看当前该模块的开启状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@host:/home/demo# ceph balancer status
{
    "last_optimize_duration": "0:00:22.402340",
    "plans": [],
    "mode": "crush-compat",
    "active": false,
    "optimize_result": "Unable to find further optimization, change balancer mode and retry might help",
    "last_optimize_started": "Tue Nov 16 18:29:38 2021"
}

一旦balancer的active=true,那么这里的坑就挖好了,之后随着你集群的用量变化,一旦满足自动balancer调节条件,集群就会自动化实现OSD上的PG调整。PG自动化平衡功能是很多新手看起来很美好的事情,但是真正用起来你会发现,集群压力大的时候自动化平衡一下,或者频繁的触发了自动化平衡,你的集群性能会持续抖动,最终造成业务延迟增加或者卡顿,要命的是一旦触发平衡还不能中途停止,因此只能等待平衡完成,但是平衡这种事情,很多时候是没办法预期什么时候开始、什么时候结束,因此集群的性能也是处于间歇性抽风。所以生产上,这种策略能关闭最好,看起来的美好,更多的是给你带来无尽烦恼。具体可以参考下面

https://docs.ceph.com/en/latest/rados/operations/balancer/#balancer

3.资源池自动伸缩 autoscale

作为新手,你是不是还在幻想着集群扩容,只需要简单的加机器加磁盘,然后调整一下PG数一顿操作猛如虎就行了。残酷的现实就是,一旦你做了这件事情,集群性能就会因为数据平衡而抽风,如何平衡扩容带来的性能影响已经是一门Ceph维护的艺术。然鹅,官方贴心的给各位开发了一个自动化pg扩容模块,根据集群的当前规模,实现自动化的pg数设定,不再让新手烦恼。好在默认是开启的warn模式,只是在特定情况下会告警,但是不做执行。如果你线上经常性的扩容/缩容,那么你打开这个pg_autoscale_mode=on,会体会到无与伦比的酸爽,类似女人生孩子的那种阵痛,会在你心里印象深刻。如果你想让自己睡个好觉,就老老实实off掉这个模块吧,不要瞎折腾才是上上策,自动化的东西没你看起来那么美好。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#默认策略是warn
root@host:/home/demo# ceph daemon /home/ceph/var/run/ceph-osd.10.asok config show|grep scale
    "osd_pool_default_pg_autoscale_mode": "warn",
    "rgw_rados_pool_autoscale_bias": "4.000000",

#通过pool set命令设置对应策略
root@host:/home/demo# ceph osd pool set
Invalid command: missing required parameter pool(<poolname>)
osd pool set <poolname> size|min_size|pg_num|pgp_num|pgp_num_actual|crush_rule|hashpspool|nodelete|nopgchange|nosizechange|write_fadvise_dontneed|noscrub|nodeep-scrub|hit_set_type|hit_set_period|hit_set_count|hit_set_fpp|use_gmt_hitset|target_max_bytes|target_max_objects|cache_target_dirty_ratio|cache_target_dirty_high_ratio|cache_target_full_ratio|cache_min_flush_age|cache_min_evict_age|min_read_recency_for_promote|min_write_recency_for_promote|fast_read|hit_set_grade_decay_rate|hit_set_search_last_n|scrub_min_interval|scrub_max_interval|deep_scrub_interval|recovery_priority|recovery_op_priority|scrub_priority|compression_mode|compression_algorithm|compression_required_ratio|compression_max_blob_size|compression_min_blob_size|csum_type|csum_min_block|csum_max_block|allow_ec_overwrites|fingerprint_algorithm|pg_autoscale_mode|pg_autoscale_bias|pg_num_min|target_size_bytes|target_size_ratio <val> {--yes-i-really-mean-it} :  set pool parameter <var> to <val>
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
root@host:/home/demo# ceph osd pool get .rgw.root pg_autoscale_mode
pg_autoscale_mode: warn

具体的设置参考这里

https://docs.ceph.com/en/latest/rados/operations/placement-groups/#autoscaling-placement-groups

4.RGW自动化Shard重分配

最后一个可能只有部分RGW用户会遇到,当单个Bucket内的文件数量不断增长,其底层的数据库分片会不断的进行ReShard,整个reshard过程不可控,文件数越多时间越长,reshard过程中因为要加锁,因此会导致业务卡IO,直接造成服务不可用。所以这个特性在官方推出的时候,我第一时间就是进行了rgw_dynamic_resharding = false关闭,前面也有很多文章介绍过shard的基本原理和机制,这里就不再赘述了,感兴趣的同学去看之前的文章内容吧。

https://docs.ceph.com/en/latest/radosgw/dynamicresharding/

总结

无论新手还是老司机,凡是Ceph分布式系统里面的自动化机制,都要尽可能了解其背后逻辑与机制,谨慎开启。很多时候自动化/傻瓜化的设定,只是开发人员的一厢情愿,他们不会了解运维、生产环境的复杂度,很难做到100%适配你的业务场景,因此要想不被带进沟里,先得开启对这些基础知识的深入探索和学习,在实践中去验证这些功能的有效性,而不是一开始就把一切都寄托在官方的默认设定上。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Ceph对象存储方案 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入浅出JavaScript之闭包(Closure)
阅读目录 闭包-无处不在 闭包的概念 闭包的用途 闭包-封装 常见错误之循环闭包 思考题 闭包(closure)是掌握Javascript从人门到深入一个非常重要的门槛,它是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。下面写下我的学习笔记~ 闭包-无处不在 在前端编程中,使用闭包是非常常见的,我们经常有意无意,直接或间接用到了闭包。闭包可以使传递数据更加灵活(比如处理一些点击事件) !function() { var localData = "lo
逸鹏
2018/04/11
5030
深入浅出JavaScript之闭包(Closure)
什么是JavaScript 的闭包???
Javascript的闭包是指一个函数与周围状态(词法环境)的引用捆绑在一起(封闭)的组合,在JavaScript中,每次创建函数时,都会同时创建闭包。闭包是一种保护私有变量的机制,在函数执行时形成私有的作用域,保护里面的私有变量不受外界干扰,即形成一个不销毁的栈环境。
AlbertYang
2020/09/08
1.2K0
javascript 闭包详解
一、什么是匿名函数 创建一个函数并将它赋值给变量functionName,这种情况下创建的函数,即匿名函数。(函数表达式就是匿名函数) 二、闭包 1.什么是闭包? 闭包就是能够读取其他函数内部变量的函数。 只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。 我们只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗! function f1 () { var num = 1; function f2() { console.
柴小智
2018/04/10
5600
JavaScript闭包
IMWeb前端团队
2017/12/29
7500
一篇文章带你了解JavaScript中的函数表达式,递归,闭包,变量,this对象,模块作用域
它的一个重要特点就是:函数声明提升,就是在执行代码前先读取函数声明,可以把函数声明放在调用它的语句后。
达达前端
2020/01/02
6190
学习Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。 下面就是我的学习笔记,对于Javascript初学者应该是很有用的。 一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。   var n=999;   function f1(){     alert(n);   }   f1(); // 99
ruanyf
2018/04/12
5570
Javascript 闭包与变量
JavaScript中的作用域链的机制引出了一个副作用,即闭包只能取得包含函数中任何变量的最后一个值。闭包所保存的是整个变量对象,而不是某个特殊的值。
大道七哥
2019/09/10
4830
闭包与高阶函数
闭包(closure)指有权访问另一个函数作用域中变量的函数。简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
梨涡浅笑
2020/10/27
3610
前端day20-JS高级(递归和闭包)学习笔记
01-递归 1.1-递归函数介绍 1.递归函数:一个函数自己调用自己 2.递归函数特点 a.一定要有结束条件,否则会导致死循环 b.能用递归函数实现的需求,就一定可以用循环调用函数来解决,只是代码简洁与性能不同而已 递归会影响性能,每一次递归都会进栈容易造成栈溢出,而循环不会 1.2-递归应用场景1(累加和,阶乘) <script> //1.求1-n之间的累加和 function getSum(n){ //递归 : 自己调用自己
帅的一麻皮
2020/05/10
1.3K0
JavaScript经典面试题之for循环click
经典重现 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript"> function onMyLoad(){ var arr = document.getElementsByTagName("p"); for(var i = 0; i < arr.length; i++){ arr[i].onclick = function()
司想君
2018/03/01
8220
js 闭包
闭包 目录 闭包的概念 闭包的用途 代码实例 注意点 两个代码片段的对比 闭包的概念 简单来说,闭包就是定义在一个函数内部的函数 闭包的用途 可以读取函数内部的变量 让这些变量的值始终保持在内存中 代码实例 function f1(){ var n = 999 // 匿名函数 fnAdd = function(){n += 1} // 一个闭包 function f2(){ console.log(n) }
星辉
2019/01/15
2.4K0
JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
一、闭包(Closure) 1.1、闭包相关的问题 请在页面中放10个div,每个div中放入字母a-j,当点击每一个div时显示索引号,如第1个div显示0,第10个显示9;方法:找到所有的div,
张果
2018/01/04
1.6K0
JavaScript学习总结(三)——闭包、IIFE、原型、函数与对象
JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
在JS中变量可以分为局部变量和全局变量,对于变量不熟悉的可以看一下我这篇文章:搞懂JavaScript全局变量与局部变量,看这篇文章就够了 作用域就是变量的使用范围,分为局部作用域和全局作用域,局部变量的使用范围为局部作用域,全局变量的使用范围是全局作用域。在 ECMAScript 2015 引入let 关键字之前,js中没有块级作用域---即在JS中一对花括号({})中定义的变量,依然可以在花括号外面使用。
AlbertYang
2020/09/16
3310
JavaScript进阶教程(5)-一文让你搞懂作用域链和闭包
JavaScript权威指南 - 函数
函数本身就是一段JavaScript代码,定义一次但可能被调用任意次。如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法。用于初始化一个新创建的对象的函数被称作构造函数。
Esofar
2018/09/05
3K0
高阶函数和闭包
函数也是一种数据类型,同样可以作为参数,传递给另外一个参数使用。最典型的就是作为回调函数。
星辰_大海
2020/10/26
6590
高阶函数和闭包
「JS高级」函数进阶
请注意,本文编写于 2060 天前,最后修改于 2060 天前,其中某些信息可能已经过时。
曼亚灿
2023/05/17
8950
「JS高级」函数进阶
JS闭包
闭包定义 闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。就是在另一个作用域中保存了一份它从上一级函数或者作用域得到的变量,而这些变量是不会随上一级函数的执行完成而销毁。 前提条件 计算机中的内存变量如果有被引用着的话,则系统是不会将之回收的。只要我们能够一直持有这个引用,则就可以令局部变量避免被回收——这是闭包概念成立的前提 闭包用途 可以读取到函数内部的变量 可以让函数内部变量保持在内存中 避免全局变量的污染 私有成员的存在 注
苦咖啡
2018/04/28
2.7K0
闭包
闭包(closure)指有权访问另一个函数作用域中变量的函数。简单理解就是 ,一个作用域可以访问另外一个函数内部的局部变量。
清出于兰
2022/01/05
4960
闭包
javascript深入理解js闭包
一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两种:全局变量和局部变量。 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 Js代码 var n=999;   function f1(){     alert(n);   }   f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量。 Js代码 function f1(){     var n=999;   }   alert(n); // error
用户1257215
2018/01/30
1K0
javascript深入理解js闭包
深入理解JavaScript闭包之什么是闭包
在看本篇文章之前,可以先看一下之前的文章 深入理解JavaScript 执行上下文 和 深入理解JavaScript作用域,理解执行上下文和作用域对理解闭包有很大的帮助。
木子星兮
2020/07/27
8670
相关推荐
深入浅出JavaScript之闭包(Closure)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验