OceanBase的配置子系统由配置管理器类ObConfigManager和配置信息类ObServerConfig组成。配置管理器类对外提供针对配置项的各种管理操作,例如获取某个配置项(get_config方法)、重载配置文件(reload_config方法),配置管理器体现为ObServer实例的config_mgr_属性。配置信息类用于表达OBServer中所有的配置项,它体现为ObServer实例的config_属性。
config_属性中的配置项来自OceanBase的配置文件,在启动时或者运行过程中也可能会通过SQL命令或者其他途径被修改。OceanBase的各个配置项都被定义为ObServerConfig类的属性,配置项的定义被写在src/share/parameter/ob_parameter_seed.ipp中,然后通过include方法引入到ObServerConfig类的定义中。在该文件中,每个配置项都用一个DEF_*这样的宏来定义,其中*表示数据类型的缩写,例如DBL表示Double类型。配置项的定义包括以下几项:
1)配置项名称。
2)适用范围:范围有两类,CLUSTER(集群范围)和TENANT(租户范围)。
3)配置项值:值的字符串表达。
4)取值范围:不同的数据类型有不同的表示方式,例如整数会给出取值范围的上下界。
5)注释:用于解释配置项作用的字符串。
6)配置项属性:配置项有多个子属性。
①所属小节:按照功能,配置项被分成不同的小节,例如OBSERVER和ROOT_SERVICE等。
②值的来源:这个属性表明配置项的值来自何种渠道,例如DEFAULT(默认值)、FILE(配置文件)和CMDLINE(命令行)等。
③生效方式:指定配置项的生效时机,分为READONLY(不可修改)、DYNAMIC_EFFECTIVE(立即生效)和STATIC_EFFECTIVE (重启生效)三种。
config_属性由ObServer的init_config方法负责初始化,但其主要工作是由配置管理器(ObConfigManager实例)的load_config方法完成,在该方法中会打开配置文件(默认是etc/observer.config.bin),将其内容读出为一个字符串,然后用反序列化方法(ObServerCon-fig::deserialize_with_compat方法)还原到config_中。在完成从配置文件中读取默认配置项后,init_config方法还会从ObServer的opts_属性中读取RPC端口等项的值用于覆盖相应配置项的值,然后会设置并启动一些定时器,最后还会初始化配置管理器和租户配置管理器。
配置管理器启动的定时器会定时执行配置项更新动作,该动作会把内存中的配置项转储到配置文件中,同时将旧版本的配置文件增加“.history”后缀后放在同一目录下。