Citus序列源码讲解
Citus序列源码讲解
Citus支持序列的所有类型,但是在不同使用方法中,支持的情况不一样。
序列存储位置
序列的定义存储在协调器和MX节点中。Work节点不存储这些内容。
序列使用
序列值在CN/MX中产生,并转换成SQL传送给Work节点。
create sequence aa_seq;
create table aa(id int default nextval('aa_seq'), info char(8))
使用:
insert into aa(info) values('aa')
转换后:
insert into aa(id, info) values(1, 'aa')
标准模式
标准模式下所有序列类型都可以使用
CitusMX
MX模式只支持bigserial * create table aa(bigid bigserial, info char(8)) *
实现方法
MX模式下,会将bigserial进行拆分,给每个MX节点分配281万亿(281474976710657)的序列值(48个bit位)。
bigint 是64字节,每个MX分配48字节的数据,因此还有16个字节用于节点标记。
所以MX模式下,Citus集群最多支持65536个节点
。
实现过程
- CN节点获取序列定义
- 发送至work节点
SELECT worker_apply_sequence_command
('CREATE SEQUENCE IF NOT EXISTS ff_id_seq INCREMENT BY 1 MINVALUE 1 MAXVALUE 9223372036854775807 START WITH 1 NO CYCLE')
- worker_apply_sequence_command
提取主要代码:
Datum
worker_apply_sequence_command(PG_FUNCTION_ARGS)
{
** 先将序列定义在work节点上执行 **
CitusProcessUtility(commandNode, commandString, PROCESS_UTILITY_TOPLEVEL, NULL,
None_Receiver, NULL);
** 修改序列的范围 **
AlterSequenceMinMax(sequenceRelationId, sequenceSchema, sequenceName);
PG_RETURN_VOID()
}
- AlterSequenceMinMax
提前主要代码:
static void
AlterSequenceMinMax(Oid sequenceId, char *schemaName, char *sequenceName)
{
int64 startValue = 0;
int64 maxValue = 0;
** GetLocalGroupId参考第5小节 **
startValue = (((int64) GetLocalGroupId()) << 48) + 1;
maxValue = startValue + ((int64) 1 << 48);
SetDefElemArg(alterSequenceStatement, "minvalue", startFloatArg);
SetDefElemArg(alterSequenceStatement, "maxvalue", maxFloatArg);
CitusProcessUtility((Node *) alterSequenceStatement, dummyString,
PROCESS_UTILITY_TOPLEVEL, NULL, None_Receiver, NULL);
- GetLocalGroupID
LocalGroupID的值即是当前节点中,系统表pg_dist_local_group的值。
pg_dist_local_group讲解
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好