Ceph配置项动态变更机制浅析
转自:https://www.ustack.com/blog/ceph%e9%85%8d%e7%bd%ae%e9%a1%b9%e5%8a%a8%e6%80%81%e5%8f%98%e6%9b%b4%e6%9c%ba%e5%88%b6%e6%b5%85%e6%9e%90/
OpenStack做一个log级别的变更就得重启,很耗费时间。本篇主要是向大家介绍一下ceph tell是如何便捷地实现log级别的变更的,并展开来介绍Ceph是如何动态管理配置项的。Ceph tell命令tell命令能够让你在一台主机上操作所有的osd,会对运维工作带来很大的便利,首先来看一下ceph tell都能做哪些事情呢?
我们再来看看tell是怎么做到的,这里我们将主要精力放在osd的injectargs上面(因为能够动态改变配置),其它的都可以,以此类推。简单的说在osd启动的时候会初始化一些工作队列,也就是wq,而其中一个就是command_wq,该队列的处理函数主要是调用do_command函数,在该函数中对injectargs的处理是调用md_confit_t 的apply_changes,最终是调用注册的观察者,来对改变的配置做出响应。可以从以下三个方面展开来分析:
1、配置存放在哪里?
在osd启动的时候会初始化两个全局的指针g_ceph_context和g_conf。g_ceph_context是CephContext *的类型,g_conf是md_config_t*的类型。它们的关系是g_conf = g_ceph_context->_conf 。在初始化osd之前就会将g_ceph_context和g_conf给准备好,g_conf会从配置文件,环境变量,和命令行参数三个地方来初始化全局配置。这样为后续的操作做好准备。比如data目录,journal目录,osd的网络都需要从g_conf里读取。所以在osd init之前必须得把g_conf给准备好。
g_conf里配置项的内容是从配置文件解析得到的,首先会检查有没有设置环境变量$CEPH_CONF,然后再依次从$data_dir/config, /etc/ceph/$cluster.conf, ~/.ceph/$cluster.conf, $cluster.conf”;来读取配置,如果在前一个位置有配置,就会读取并解析,不会再去后面读取。所以不会出现前面的覆盖后面的情况。
2、配置的更新是如何做到的?
首先每一个osd都继承了md_config_obs_t类,md_config_obs_t 就是md_config_t的一个观察者,其关注的对象可以通过get_tracked_conf_keys()这个虚函数来获取到。OSD在pre_init的时候,将自己注册到md_confit_t的观察者map中,当md_confit_t apply_change的时候,会找到哪些观察者对要更新的参数感兴趣,然后就调用这些观察者的handle_conf_change()。从而实现obs状态的更新。具体到每一个obs,会根据不同的配置项调用相应的set方法,来完成配置项的更新。这里看一点代码应该就更清楚了。
从上面可以看到如果inject的参数没有观察者对其感兴趣,则你是没有办法改变的,而且会给你提示。但是conf确实发生了变化,只不过这个变化没有生效而已。
这里总结tell的流程如下:
3、关于配置项
从conf_opts.h文件来看,配置项主要有两类:一类是SUBSYSTEM的,一类是OPTION。
SUBSYSTEM主要定义了日志子系统写日志的级别。OPTION则主要定义了特定配置项的类型和初始的值。当injectargs的时候可以通过–debug_${system}=int/int 来改变子系统日志的级别。
总结
本篇从tell 命令出发,详解介绍了和osd相关的tell命令,然后深入到osd的配置管理中,讲述了Ceph是如何通过injectargs来实现动态改变配置的。
Ceph配置项动态变更机制浅析的更多相关文章
- 理解 QEMU/KVM 和 Ceph(1):QEMU-KVM 和 Ceph RBD 的 缓存机制总结
本系列文章会总结 QEMU/KVM 和 Ceph 之间的整合: (1)QEMU-KVM 和 Ceph RBD 的 缓存机制总结 (2)QEMU 的 RBD 块驱动(block driver) (3)存 ...
- InnoDB的锁机制浅析(三)—幻读
文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/插入意向锁) Inno ...
- InnoDB的锁机制浅析(All in One)
目录 InnoDB的锁机制浅析 1. 前言 2. 锁基本概念 2.1 共享锁和排它锁 2.2 意向锁-Intention Locks 2.3 锁的兼容性 3. InnoDB中的锁 3.1 准备工作 3 ...
- Libco Hook 机制浅析
Libco Hook 机制浅析 之前的文章里我们提到过 Libco 有一套 Hook 机制,可以通过协程的让出(yield)原语将系统的阻塞系统调用改造为非阻塞的,这篇文章我们将深入解析 Hook 机 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Linux模块机制浅析
Linux模块机制浅析 Linux允许用户通过插入模块,实现干预内核的目的.一直以来,对linux的模块机制都不够清晰,因此本文对内核模块的加载机制进行简单地分析. 模块的Hello World! ...
- typecho流程原理和插件机制浅析(第二弹)
typecho流程原理和插件机制浅析(第二弹) 兜兜 393 2014年04月02日 发布 推荐 1 推荐 收藏 14 收藏,3.7k 浏览 上一次说了 Typecho 大致的流程,今天简单说一下插件 ...
- typecho流程原理和插件机制浅析(第一弹)
typecho流程原理和插件机制浅析(第一弹) 兜兜 393 2014年03月28日 发布 推荐 5 推荐 收藏 24 收藏,3.5k 浏览 虽然新版本0.9在多次跳票后终于发布了,在漫长的等待里始终 ...
随机推荐
- Django-admin列表展示上传图片
1.在models.py文件中创建表ImageField类型字段 class user(models.Model): img = models.ImageField(upload_to='static ...
- python并发编程知识点总结
1.到底什么是线程?什么是进程? Python自己没有这玩意,Python中调用的操作系统的线程和进程. 2.Python多线程情况下: 计算密集型操作:效率低,Python内置的一个全局解释器锁,锁 ...
- 【我的Android进阶之旅】解决 Error:CreateProcess error=216, 该版本的 %1 与您运行的 Windows 版本不兼容。请查看计算机的系统信息,了解是否需要 x86
一.错误描述 刚刚打开Android Studio新建一个项目,然后就编译不了,报了如下所示的错误: 错误描述为: Error:CreateProcess error=216, 该版本的 %1 与您运 ...
- 【我的Android进阶之旅】解决SVN Cleanup错误: Failed to run the WC DB work queue associated with
错误描述 在Android Studio中点击VCS向下箭头使用SVN Update功能更新代码的时候,报错如下所示: 错误描述信息: Error:svn: E155037: Previous ope ...
- 前端基础-css(3)
一.文本属性和字体属性(常用的) 1.文本属性 text-align:left|right|center|justify(两端对齐,只适用于英文); /*对齐方式*/ color:色值; /* ...
- python 各种魔法方法
目录 自定义序列 反射
- MySQL之存储引擎(Day39)
一 什么是存储引擎 mysql中建立的库=====>文件夹 库中建立的表=====>文件 现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图 ...
- 练Focus T25必看!T25课表 视频与成功案例汇总
练Focus T25必看!T25课表 视频与成功案例汇总! [复制链接] http://jianfei.39.net/thread-3645799-1.html 小西i减肥 ...
- ASP.NET4 与 VS2010 Web 开发页面服务改进
转:http://blog.163.com/kele_lipeng/blog/static/81345278201132754729336/ 作者:朱先忠 本文将接着上一篇 ASP.NET4与VS20 ...
- Java面向对象—多态
概述:同一个事物,在不同的时刻表现出不同的状态. 代码中如何体现: 要有继承, 要有方法重写, 父类引用指向子类对象 多态的成员访问特点 成员变量:编译看左边(父类), 运行看左边 成员方法:编译看左 ...