Mysql
MariaDB 主到主複製自動增量不是順序的
我有兩個主控 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 中。如果送出失敗(由於來自另一個節點的“同時”命中),它將重試。