Mysql

MariaDB 主到主複製自動增量不是順序的

  • September 18, 2020

我有兩個主控 MariaDB 伺服器複製,設置如下:

server A with 192.168.1.100:
------------------------------
bind-address            = 0.0.0.0
server-id       = 1
log-bin         = "mysql-bin"
binlog-do-db        = wordpress
replicate-do-db     = wordpress
relay-log="mysql-relay-log"
auto-increment-increment = 2
auto-increment-offset = 1

和:

Server B with 192.168.1.200:
---------------------------------
bind-address            = 0.0.0.0
server-id               = 2
log-bin                 = "mysql-bin"
binlog-do-db            = wordpress
replicate-do-db         = wordpress
relay-log="mysql-relay-log"
auto-increment-increment = 2
auto-increment-offset = 2

複製效果很好,但我對自動增量有疑問。如您所見,它們不是連續的。例如:

伺服器 A 遞增:1、3、5、7、9 和 …

伺服器 B 增量:2、4、6、8 和 …

當我在伺服器 A 中插入 2 條記錄並在伺服器 B 中插入 1 條記錄時,會出現問題,表的總主鍵將如下所示: ID : 1, 3, 4

如您所見,第二個失去了,因為我在伺服器 A 中插入了兩條記錄。但是我需要自動遞增來生成序列號,因為我們將它們用作發票編號。 差距會讓我們在我們國家的稅法上遇到麻煩。

我知道這是 MariaDB 和 MySQL 數據庫的內部機制,以避免重複鍵。但我只是想知道是否有用於順序索引複製的替代 HA 解決方案。

謝謝

AUTO_INCREMENT不能信任以避免數字上的差距。看來你必須避免它們。

方案 A:切換到 MariaDB 並使用一張SEQUENCE表。

B計劃:模擬這樣的。

有一個在一行中有 2 列的表格。(第二個序列可以使用第二行等)類似:

CREATE TABLE sequences (
   key CHAR(1) NOT NULL DEFAULT 'a',  -- the name of the sequence
   invoice_num INT UNSIGNED NOT NULL,
   PRIMARY KEY(key)
) ENGINE=InnoDB;

key需要唯一標識行並將其鎖定(如下)。

要獲取下一個發票編號:

INSERT INTO sequences (key, invoice_num)
       ('a', 1)            -- inserts once; updates the rest of the time
   ON DUPLICATE KEY
   UPDATE invoice_num = LAST_INSERT_ID(VALUES(invoice_num) + 1)
check for errors: that IODKU should retry in Galera, but there still could be an error
SELECT LAST_INSERT_ID();   -- to get the new value (local to connection)

請對此進行徹底測試。

即使請求發票號碼“同時”觸及所有 Galera 節點,這也應該有效。 autocommit足夠了。該送出隱含在 IODKU 中。如果送出失敗(由於來自另一個節點的“同時”命中),它將重試。

引用自:https://dba.stackexchange.com/questions/275681