iT邦幫忙

0

Mariadb Galera cluster 的 auto increment 問題

各位大大好,小弟最近在研究 Mariadb 使用 Galera cluster 同步備份的功能。
我在 VM (centos7) 開了3台 安裝 Mariadb ,也成功建立了 cluster,SST 使用 rsync,資料都有同步,但專案在跑 seeder 時,有些表的 id (auto increment) 是正常的 1、2、3 ~,但有些表的的id則是 6、9、12、15~,專案在單一 DB 架構下 id 都是正常的。
想請問各位前輩,這樣是正常的嗎?另外也好奇原理是什麼?

/etc/my.conf.d/serve.conf 的設定如下:
db1:

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='dbs'
wsrep_cluster_address="gcomm://192.168.99.31,192.168.99.32,192.168.99.33"
binlog_format=row
wsrep_sst_method=rsync
wsrep_node_name='db1'
wsrep_node_address=192.168.99.31

db2:

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='dbs'
wsrep_cluster_address="gcomm://192.168.99.31,192.168.99.32,192.168.99.33"
binlog_format=row
wsrep_sst_method=rsync
wsrep_node_name='db2'
wsrep_node_address=192.168.99.32

db3:

wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_name='dbs'
wsrep_cluster_address="gcomm://192.168.99.31,192.168.99.32,192.168.99.33"
binlog_format=row
wsrep_sst_method=rsync
wsrep_node_name='db3'
wsrep_node_address=192.168.99.33
0
raytracy
iT邦大神 1 級 ‧ 2019-01-13 22:51:34
最佳解答

KB 講得很清楚:
不要在 Galera Cluster 裡面使用 Auto-increment:

MariaDB Galera Cluster - Known Limitations

Do not rely on auto-increment values to be sequential. Galera uses a mechanism based on autoincrement increment to produce unique non-conflicting sequences, so on every single node the sequence will have gaps. See http://codership.blogspot.com/2009/02/managing-auto-increments-with-multi.html

前輩說的是真心話

了解,抱歉,Limitations這篇我沒有看,我來好好看完它。

根據 隨風奶爸 大大的說明,我想應該把ID 改為用UUID的方式指定寫入,感謝~~

0
隨風奶爸
iT邦好手 1 級 ‧ 2019-01-14 10:11:25

或許,您可以考慮將讀寫分流,三台的同步主機,透過附載平衡或是程式DB連接的語法設定,將寫的動作指定於一部主機,讀的動作分攤到另外兩台,再搭配互為備援指定。
不然,raytracy前輩的話非常中肯,就不要用自動序號的功能,要自行在新增時判斷資料狀態產生唯一的ID值填入。

0
bizpro
iT邦大師 1 級 ‧ 2019-01-14 22:42:46

但專案在跑 seeder 時,有些表的 id (auto increment) 是正常的 1、2、3 ~,但有些表的的id則是 6、9、12、15~,專案在單一 DB 架構下 id 都是正常的

這是正確的結果. 本來就應該是如此. 有間隔(gap)是設計的結果.

由於三台都是Master, 三台由auto increment產生的ID由 @@auto_increment_increment 和 @@auto_increment_offset控制, 當然會有間隔(gaps).
(1) 當有些表是1,2,3,...表示三個master都對此表以auto increment產生了ID:
db1: 1,4,7,10,...
db2: 2,5,8,11,...
db3: 3,6,9,12,....
同步後, 大家都是1,2,3,4,5,6,7,8,....
(2)當有些表是6,9,12,15,...表示都是db3產生的ID被同步到db1和db2.或者db1和db2產生的ID都被刪除了.

本來就該用auto increment. 而這段話:
"Do not rely on auto-increment values to be sequential.... "
的真正意思是說在Galera不能保證所有的auto-increment的值是沒有gap的序列, 但使用auto increment可以保證ID不會衝突. 假設有第四台db4加入, Galera會自動調整@@auto_increment_increment來保證ID不會衝突.

我要發表回答

立即登入回答