天天看点

ADBMGR设置节点GUC参数ADBMGR设置节点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参数设置功能。具体流程如下图所示:

ADBMGR设置节点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)对参数设置进行处理:

  1. 参数名有效性验证
  2. 参数值有效性验证
  3. 参数作用上下文识别
  4. 将相应命令发送到AGENT端
  5. 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参数。

  6. 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。

示例如下:

ADBMGR设置节点GUC参数ADBMGR设置节点GUC参数实现过程介绍小结

​ 查询的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”查看对应节点参数当前值。