ADBMGR设置节点GUC参数
github 代码位置:https://github.com/ADBSQL/AntDBADBMGR设置节点GUC参数ADBMGR是开源分布式数据库ANTDB的集群管理工具,通过DEPLOY ALL将数据库安装包分发到HOST表中添加的各个服务器上,执行INIT ALL进行集群初始化,数据库节点AGTM、COORDINATOR、DATANODE上的GUC参数均为默认值,...
github 代码位置:https://github.com/ADBSQL/AntDB
ADBMGR设置节点GUC参数
ADBMGR是开源分布式数据库ANTDB的集群管理工具,通过DEPLOY ALL将数据库安装包分发到HOST表中添加的各个服务器上,执行INIT ALL进行集群初始化,数据库节点AGTM、COORDINATOR、DATANODE上的GUC参数均为默认值,通常数据库管理人员会根据机器配置及数据库服务要求进行相关GUC参数设置来提升数据库性能。GUC参数在各个节点数据目录下的postgresql.conf文件中进行配置,分布式数据库通常有多个COORDINATOR、DATANODE节点,为提升数据库节点GUC参数设置简洁性开发了在ADBMGR端进行GUC参数设置功能。具体流程如下图所示:
实现过程介绍
参数核对表
AntDB数据库节点GUC参数设置对应节点数据目录下postgresql.conf文件,该文件若包含不在参数列表中的参数或者参数值类型不对,节点无法正常启动,所以需要对参数及其值做有效性检验,在实现GUC参数设置功能时增加了GUC参数核对表。
下面对GUC参数进行简单介绍。
GUC参数内容见源码guc.c文件,类型主要包括下面几种:
enum config_type
{
PGC_BOOL,
PGC_INT,
PGC_REAL,
PGC_STRING,
PGC_ENUM
};
GUC参数作用上下文类型分为如下几种:
typedef enum
{
PGC_INTERNAL,
PGC_POSTMASTER,
PGC_SIGHUP,
PGC_SU_BACKEND,
PGC_BACKEND,
PGC_SUSET,
PGC_USERSET
} GucContext;
PGC_INTERNAL无法被用户修改,只能被内部进程设置,此类变量通常在编译时设置与改变;
PGC_POSTMASTER在postmaster启动时通过读取postgresql.conf文件或命令行来设置。这类变量的改变在PostgreSQL数据库重启时生效;
PGC_SIGHUP在postmaster启动或向postmaster或backend进程发sighup信号来读取postgresql.conf文件时设置;
PGC_BACKEND在新backend进程启动时读取postgresql.conf文件生效;
PGC_SUSET指超级用户修改生效,不需要重新读取postgresql.conf文件。
PGC_USERSET指普通用户修改生效,在当前会话下有效,无需读取postgresql.conf文件。
对于PGC_SIGHUP, PGC_SUSET, PGC_USERSET类型可以通过PG_CTL RELOAD通知节点主进程在共享内存中重新加载GUC参数并生效。
参数核对表是根据pg_settings视图相关内容进行设计,包含字段为:
type | 节点类型:gtm, coordinator, datanode |
---|---|
name | 参数名 |
value | 参数默认值 |
context | 参数作用上下文 |
vartype | 参数类型 |
unit | 参数值单位:s,ms, GB,kB… |
minval | 最小值 |
maxval | 最大值 |
enumval | 参数为枚举类型对应的可选值列表 |
在集群初始化过程中,将GTM, COORDINATOR, DATANODE中对应的参数及其相关信息加载到上面的参数核对表中,具体见adbmgr_init.sql文件。
参数设置过程
参数设置命令语法格式为:
SET GTM { ALL | nodetype nodename } ( { parameter = value } [, …] ) [ FORCE ];
SET COORDINATOR { ALL | nodename }( { parameter = value } [, …] ) [ FORCE ];
SET DATANODE { ALL | nodetye nodename } ( { parameter = value } [, …] ) [ FORCE ];
SET DATANODE { master | slave } ALL ( { parameter = value } [, …] ) [ FORCE ];
AntDB支持自定义插件,见源码文件contrib文件夹下内容。自定义插件包含的GUC参数若不在已有的参数核对表中,可以使用命令格式带”FORCE”,不会对参数名及参数值有效性进行检验。支持将未包含的GUC参数信息直接插入参数核对表中。参数信息获取, 在参数支持的数据库节点agtm或者coordiantor或者datanode上执行:
SELECT ‘*’, NAME, SETTING, CONTEXT, VARTYPE, UNIT, MIN_VAL, MAX_VAL, ENUMVALS FROM PG_SETTINGS WHERE NAME = ‘guc_name’ ;
上面SELECT查询第一列字符标示说明:
agtm, coordinator, datanode都支持,用’*’标示;
只在coordinator和datanode支持,用’#’标示;
只在agtm支持,用’G’标示;
只在coordinator上支持,用’C’标示;
只在datanode上支持,用’D’标示。
将获得的参数信息插入参数核对表:
INSERT INTO MGR_PARM VALUES(…);
其中Values(…)为上面select获取的结果。
ADBMGR支持在集群初始化前及初始化后进行参数设置。
上述SET命令通过函数 mgr_add_updateparm(MGRUpdateparm *node, ParamListInfo params, DestReceiver *dest)对参数设置进行处理:
- 参数名有效性验证
- 参数值有效性验证
- 参数作用上下文识别
- 将相应命令发送到AGENT端
AGENT调用函数cmd_node_refresh_pghba_parse(AgentCommand cmd_type, StringInfo msg)进行处理:
调用parse_hba_file(const char *filename)将postgresql.conf文件数据生成链表结构;
根据传入的参数及值进行相应修改链表数据;
根据链表数据重写postgresql.conf文件;
根据参数作用上下文类型判断是否执行PG_CTL RELOAD使共享内存重新加载GUC参数。
AGENT将执行结果返回ADBMGR端
datanode master 与 datanode slave 通过流复制实现数据同步,在hot standby模式 下,以下参数在备机上无法将参数值由大调小:
max_connections
max_worker_processes
max_prepared_transactions
max_locks_per_transaction
该参数设置生效后会保存在global/pg_control 文件中,再次设置在重启该备机节点时新值会与pg_config中已保存的值进行比较,具体见函数CheckRequiredParameterValues(void)。
执行结果返回
设置参数若正常返回则说明已经修改了对应数据库节点的postgresql.conf文件,GUC参数是否需要执行PG_CTL RELOAD即共享内存重加载GUC参数还需要根据参数作用上下文性质决定:
参数作用上下文为PGC_USERSET 或者 PGC_SUSET 或者 PGC_SIGHUP,执行结果正常返回输出”SET PARAM”;
参数作用上下文为PGC_POSTMASTER,执行结果正常返回并提示”parameter \”guc_name\” cannot be changed without restarting the server”;
参数作用上下文为PGC_INTERNAL,执行结果正常返回并提示”parameter \”guc_name\” cannot be changed”;
参数作用上下文为PGC_BACKEND,执行结果正常返回并提示”parameter \”guc_name\” cannot be set after connection start”。
从PostgrSQL 9.5开始,提供了pg_file_settings视图,可以查看对GUC参数文件postgresql.conf修改的参数;在视图pg_settings中新增字段pending_restart 用来标示该GUC参数是否需要重启生效。
参数当前值查看
在数据库节点上通过”SHOW GUC_NAME”命令可以查看当前参数值,在ADBMGR可以通过”SHOW nodetype nodename guc_name”命令格式查看指定节点当前参数值,内部过程为:ADBMGR将要查看的参数发送到对应的数据库节点所在机器的AGENT上,AGENT端通过连接该数据库节点执行”select name from pg_settings where name like ‘%guc_name%’ order by 1”获取结果并返回给ADBMGR。
示例如下:
查询的guc_name参数名支持模糊匹配,可给给定guc_name完整名称或者名称对应的子字符串。如果查看的数据库节点为DATANODE MASTER,则会一起显示其对应的所有备机上的同名参数值。
小结
ADBMGR是开源分布式数据库AntDB的管理工具,允许数据库管理员在数据库集群初始化前或者初始化后进行GUC参数设置,实现通过ADBMGR端与AGENT进行通信修改对应数据库节点GUC参数文件postgresql.conf,能够对参数名及参数值有效性进行判断,并根据GUC参数作用上下文特性选择执行PGC_CTL RELOAD使节点共享内存重载GUC参数。MGR_PARM表为参数核对表,当用户新增GUC参数时,可以通过将参数信息添加到adbmgr_init.sql文件中重新初始化ADBMGR或者不进行ADBMGR初始化直接手动插入MGR_PARM表中。MGR_UPDATEPARM表为记录通过在ADBMGR端set命令修改的参数记录表,通过”LIST PARAM”可以查看修改记录;通过ADBMGR端执行”SHOW nodename guc_name”查看对应节点参数当前值。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)