在 Oracle Golden Gate 上按序列生成 ID

ID Generation by Sequence On Oracle Golden Gate

在我的 Oracle 19c Golden Gate 集群上,两个实例同时位于不同的地理位置 运行。 (主动-主动)

在我的应用程序代码中,我需要生成 ID,对此我更喜欢使用 Oracle Sequence(nextval 函数)。 Oracle golden gate 不保证在不同的站点上生成不同的值。由于存在在不同站点生成相同 nextval 的风险,我正在寻找替代方法。

现在我有两个选择,我都不喜欢其中任何一个:

除了这些选项,您还有其他建议吗?

一般做法,也是我认为最好的做法,是让序列处理独立于每个数据库

例如,对于具有两个数据库的双活复制,您可以让一侧的序列仅生成奇数,而另一侧的序列仅生成偶数。

对于多主复制,您可以使用不同的公式:

Sequence Number = n*d+m+offset. 

其中n是sequence序号,d是多主复制的维度,m的范围是0到n-1是复制中分配给每个节点的编号,offset是要偏移的编号序列号。

假设我有一个 4 向多主复制的设置,其中 m=4,y 在 (0, 1, 2, 3) 中,偏移量为 100。

Node #1 (m=0) :Sequence number = n*4+100
Node #2 (m=1): Sequence number = n*4+101
Node #3 (m=2): Sequence number = n*4+102
Node #4 (m=3): Sequence number = n*4+103

每个序列将有:

100, 104, 108,112, 116, 120,...
101, 105, 109, 113, 117, 121,...
102, 106, 110, 114, 118, 122...
103, 107, 111, 115, 119, 123,...

所以,我的序列是

SQL>create sequence member_seq_1 start with 100 increment by 4 cache 100;
Sequence created.

SQL>create sequence member_seq_2 start with 101 increment by 4 cache 100;
Sequence created.

SQL>create sequence member_seq_3 start with 102  increment by 4 cache 100;
Sequence created.

SQL>create sequence member_seq_4 start with 103 increment by 4 cache 100;
Sequence created.

SQL>select member_seq_1.nextval, member_seq_2.nextval, member_seq_3.nextval, 
member_seq_4.nextval from dual;

   NEXTVAL    NEXTVAL    NEXTVAL    NEXTVAL
---------- ---------- ---------- ----------
       100        101        102        103

SQL>select member_seq_1.nextval, member_seq_2.nextval, member_seq_3.nextval, 
member_seq_4.nextval from dual;

   NEXTVAL    NEXTVAL    NEXTVAL    NEXTVAL
---------- ---------- ---------- ----------
       104        105        106        107