文章目录
- 使用数据库前需要创建default group以及sharding表
- 实际操作:创建组报错
- 分析
- 修复
使用数据库前需要创建default group以及sharding表
https://github.com/Tencent/TBase/wiki/1.-TBase_Quick_Start
TBase使用datanode group来增加节点的管理灵活度,要求有一个default group才能使用,因此需要预先创建;一般情况下,会将节点的所有datanode节点加入到default group里 另外一方面,TBase的数据分布为了增加灵活度,加了中间逻辑层来维护数据记录到物理节点的映射,我们叫sharding,所以需要预先创建sharding,命令如下:
postgres=# create default node group default_group with (dn001,dn002);
CREATE NODE GROUP
postgres=# create sharding group to group default_group;
CREATE SHARDING GROUP
实际操作:创建组报错
规划1gtm,2cn,2dn,名称为:gtm,cn001,cn002,dn001,dn002。
create default node group default_group with (dn001,dn002);
-- > ERROR: PGXC Node dn001: object not defined
分析
cn001查看节点视图,发现只有gtm和cn001。
cn002查看节点视图,发现只有gtm和cn002。
select * from pgxc_node;
cn001
gtm
回想起艰难的安装过程,好像知道了是怎么回事,因为不是一次性就安装成功,反复修改一些配置后才成功,导致一开始初始化的时候集群是不全的,也就导致了部分节点压根没有创建。
相关代码可参考:\contrib\pgxc_ctl\coord_cmd.c#prepare_configureNode函数中的两个for循环,分别遍历cn和dn然后去创建node,之后重新加载配置。
cmd_t *prepare_configureNode(char *nodeName)
{cmd_t *cmd;int ii;int idx;FILE *f;if ((idx = coordIdx(nodeName)) < 0){elog(ERROR, "ERROR: %s is not a coordinator.\n", nodeName);return NULL;}if (is_none(aval(VAR_coordMasterServers)[idx]))return NULL;cmd = initCmd(NULL);snprintf(newCommand(cmd), MAXLINE,"psql -p %d -h %s -a %s %s",atoi(aval(VAR_coordPorts)[idx]),aval(VAR_coordMasterServers)[idx],sval(VAR_defaultDatabase),sval(VAR_pgxcOwner));if ((f = prepareLocalStdin(newFilename(cmd->localStdin), MAXPATH, NULL)) == NULL){cleanCmd(cmd);Free(cmd);return NULL;}/* Setup coordinators */for (ii = 0; aval(VAR_coordNames)[ii]; ii++){int targetIdx;if (is_none(aval(VAR_coordNames)[ii]))continue;if ((targetIdx = coordIdx(aval(VAR_coordNames)[ii])) < 0)continue;if (!is_none(aval(VAR_coordMasterServers)[ii])){if (idx != targetIdx)// 2024年12月18日 node不在pgxc_node里面,手动创建参考这个/* Register outside coordinator */fprintf(f, "CREATE NODE %s WITH (TYPE='coordinator', HOST='%s', PORT=%d);\n",aval(VAR_coordNames)[ii], aval(VAR_coordMasterServers)[ii],atoi(aval(VAR_coordPorts)[ii]));else/* Update myself */fprintf(f, "ALTER NODE %s WITH (HOST='%s', PORT=%d);\n",aval(VAR_coordNames)[ii],aval(VAR_coordMasterServers)[ii],atoi(aval(VAR_coordPorts)[ii]));}}/* Setup datanodes */for (ii = 0; aval(VAR_datanodeNames)[ii]; ii++){int dnIdx;if (is_none(aval(VAR_datanodeNames)[ii]))continue;if ((dnIdx = datanodeIdx(aval(VAR_datanodeNames)[ii])) < 0){fclose(f);cleanCmd(cmd);return NULL;}if (is_none(aval(VAR_datanodeMasterServers)[dnIdx]))continue;if (sval(VAR_primaryDatanode) && (strcmp(sval(VAR_primaryDatanode), aval(VAR_datanodeNames)[dnIdx]) == 0)){/* Primary Node */if (strcmp(aval(VAR_coordMasterServers)[idx], aval(VAR_datanodeMasterServers)[dnIdx]) == 0)/* Primay and preferred node */fprintf(f, "CREATE NODE %s WITH (TYPE='datanode', HOST='%s', PORT=%d, PRIMARY, PREFERRED);\n",aval(VAR_datanodeNames)[dnIdx], aval(VAR_datanodeMasterServers)[dnIdx],atoi(aval(VAR_datanodePorts)[dnIdx]));else/* Primary but not prefereed node */fprintf(f, "CREATE NODE %s WITH (TYPE='datanode', HOST='%s', PORT=%d, PRIMARY);\n",aval(VAR_datanodeNames)[dnIdx], aval(VAR_datanodeMasterServers)[dnIdx],atoi(aval(VAR_datanodePorts)[dnIdx]));}else{/* Non-primary node */if (strcmp(aval(VAR_coordMasterServers)[idx], aval(VAR_datanodeMasterServers)[dnIdx]) == 0)/* Preferred node */fprintf(f, "CREATE NODE %s WITH (TYPE='datanode', HOST='%s', PORT=%d, PREFERRED);\n",aval(VAR_datanodeNames)[dnIdx], aval(VAR_datanodeMasterServers)[dnIdx],atoi(aval(VAR_datanodePorts)[dnIdx]));else/* non-Preferred node */fprintf(f, "CREATE NODE %s WITH (TYPE='datanode', HOST='%s', PORT=%d);\n",aval(VAR_datanodeNames)[dnIdx], aval(VAR_datanodeMasterServers)[dnIdx],atoi(aval(VAR_datanodePorts)[dnIdx]));}}fprintf(f, "SELECT pgxc_pool_reload();\n");fclose(f);return(cmd);
}
修复
每个节点(cn,dn都需要!)都去执行创建node,然后重新加载配置。
以下仅供参考,具体ip和端口请按照实际配置进行修改。
-- 新建cn002
CREATE NODE cn002 WITH (TYPE='coordinator', HOST='106.1.1.1', PORT=30004);
-- 修改cn001,如果部分列数据错误的话
alter node cn001 WITH (TYPE='coordinator', HOST='106.1.1.1', PORT=30004);
-- 在dn上执行
EXECUTE DIRECT ON (dn001) 'CREATE NODE cn002 WITH (TYPE=''coordinator'', HOST=''106.1.1.2'', PORT=30004)';-- 重新加载配置
SELECT pgxc_pool_reload();
EXECUTE DIRECT ON (dn001) 'SELECT pgxc_pool_reload();';
效果,每个节点都需要是同样的数据才是对的。
select * from pgxc_node ORDER BY node_name;
node_name node_type node_port
cn001 C 30004
cn002 C 30004
dn001 D 40004
dn002 D 40004
gtm G 50001
然后创建节点就正常了。