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个节点

实现过程

  1. CN节点获取序列定义
  2. 发送至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')
  1. 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()
}
  1. 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);
  1. GetLocalGroupID
    LocalGroupID的值即是当前节点中,系统表pg_dist_local_group的值。
    pg_dist_local_group讲解
文章浏览总量 846 次

要发表评论,您必须先登录