在 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
在我的 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