1

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

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

现在我有两个我不喜欢的选项:

  • 每个站点都可以有自己不同的种子值并以 2 递增。
  • 每个站点都可以保留一个范围并在自己的范围内产生价值。

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

4

1 回答 1

0

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

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

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

Sequence Number = n*d+m+offset. 

其中n是序号,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
于 2020-07-21T13:04:54.147 回答