MariaDB Galera Clusterで、MariaDB10.3から導入されたsequenceを使うときは、2つの注意点がある。
1.wsrep_auto_increment_controlの設定
wsrep_auto_increment_control=1(default)にしておく必要がある。
これにより、auto_incrementの際、各ノードで飛び番でauto_incrementの値が払い出される。
sequenceについても、これを設定しておかないと、ノード間で値が重複してしまう。
2.create sequence時の設定
wsrep_auto_increment_control=1にした状態で、
以下のようにsequenceをcreateする。
[MariaDB]> CREATE SEQUENCE {シーケンス名} INCREMENT BY 0;
「increment by 0」が重要。
これを行わないと、nextvalの値が各ノードで重複してしまう。
実際にGalera3ノードで、wsrep_auto_increment_control=1の状態でnextvalしてみた。
・ノード1
[MariaDB]> CREATE SEQUENCE seq01; [MariaDB]> CREATE SEQUENCE seq02 INCREMENT BY 0; [MariaDB]> select nextval(seq01); +----------------+ | nextval(seq01) | +----------------+ | 1 | +----------------+ [MariaDB]> select nextval(seq01); +----------------+ | nextval(seq01) | +----------------+ | 2 | +----------------+ [MariaDB]> select nextval(seq02); +----------------+ | nextval(seq02) | +----------------+ | 1 | +----------------+ [MariaDB]> select nextval(seq02); +----------------+ | nextval(seq02) | +----------------+ | 4 | +----------------+
・ノード2
[MariaDB]> select nextval(seq01); +----------------+ | nextval(seq01) | +----------------+ | 1 | +----------------+ [MariaDB]> select nextval(seq01); +----------------+ | nextval(seq01) | +----------------+ | 2 | +----------------+ [MariaDB]> select nextval(seq02); +----------------+ | nextval(seq02) | +----------------+ | 2 | +----------------+ [MariaDB]> select nextval(seq02); +----------------+ | nextval(seq02) | +----------------+ | 5 | +----------------+
・ノード3
[MariaDB]> select nextval(seq01); +----------------+ | nextval(seq01) | +----------------+ | 1 | +----------------+ [MariaDB]> select nextval(seq01); +----------------+ | nextval(seq01) | +----------------+ | 2 | +----------------+ [MariaDB]> select nextval(seq02); +----------------+ | nextval(seq02) | +----------------+ | 3 | +----------------+ [MariaDB]> select nextval(seq02); +----------------+ | nextval(seq02) | +----------------+ | 6 | +----------------+
という結果である。
sequenceはauto_incrementより便利な機能であるが、
galeraで使う場合は注意が必要。
一応、公式に書いてあるが、ちょっと理解するのに手間取った。
https://mariadb.com/kb/en/library/sequence-overview/#replication
なお、通常のmaster-slaveレプリケーションでsequenceを利用する場合は、
「auto_increment_increment」「auto_increment_offset」の値によらず、
sequenceのnext_not_cached_valueの値によって、飛び番で発番されるようです。
つまり、slaveの昇格をした場合などは、sequenceの番号が大きく飛ぶ可能性がある。
以上
コメントがあればどうぞ