我有两个主服务器可以使用以下设置来掌握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解决方案。
谢谢
发布于 2020-09-18 17:48:02
不能信任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中隐含了该提交。如果提交失败(由于来自另一个节点的“同时”命中),它将重试。
发布于 2020-09-17 23:49:35
所有(?) INSERTs,包括IODKU和REPLACE都可以烧毁ids,从而导致空白。在回滚语句时会发生这种情况。对于INSERT IGNORE,当某些UNIQUE触发“忽略”时。
即使没有多个主模块,您也可以得到无序的AUTO_INCREMENT值。这是因为auto_inc在需要时被抓取,但直到COMMITted才被复制。副本将看到ids出现故障。
底线:AUTO_INCREMENT保证唯一性,没有其他保证。
(还有戈丹说的话。)
发布于 2020-09-17 20:35:46
如果你需要良好的性能-不,你不能有顺序的ID。您将对Galera有相同的副作用,与MySQL集群有不同的差距。
https://dba.stackexchange.com/questions/275681
复制相似问题