概要
MariaDB Galera Cluster (2 nodes) でテーブルが同期されているのですが 2500 件のデータに対して AUTO_INCREMENT で設定しているカラムが 4999 という番号になっていた。
2500 件に対して 4999 なのでシーケンシャルに見えず番号がとびとびになる。3ノードなら 3,6,9,12 … のようになる。ノード数が増えると AUTO_INCREMENT の採番がとぶという事象について調べた。
MariaDB [worochi]> select * from tb_amazon_bs_ranking;
~(省略)~
| 4989 | B00YBZSN4K | 1 | 25 | 75 | 2015-12-16 00:15:48 | NULL |
| 4991 | B00MQKX90K | 1 | 25 | 76 | 2015-12-16 00:15:48 | NULL |
| 4993 | B00GLMTUAW | 1 | 25 | 77 | 2015-12-16 00:15:49 | NULL |
| 4995 | B01934UIWS | 1 | 25 | 78 | 2015-12-16 00:15:49 | NULL |
| 4997 | B00UL6BW5K | 1 | 25 | 79 | 2015-12-16 00:15:49 | NULL |
| 4999 | B00SY6FBR4 | 1 | 25 | 80 | 2015-12-16 00:15:49 | NULL |
+---------+------------+-------------+-----------------+------+---------------------+----------+
2500 rows in set (0.00 sec)
対策
マルチマスタ構成の場合、ノード数分採番が飛ぶ。各ノード毎に採番されるためこのような動作になり、これは各ノード上でのシーケンス処理が衝突しないようにするための挙動。
不具合ではないが、AUTO_INCREMENT を利用するカラムのデータ型は通常の INT型だとすぐに枯渇する可能性があるため、MariaDB Galera Cluster でデータ件数が多い場合でかつ AUTO_INCERMENT を利用するカラムの INT 型は大きめの桁数にしておいたほうが良さそうです。
stackoverflow の記事で alter table uid AUTO_INCREMENT=1 にしたけど駄目だったという報告がある。
以下のようなクエリで設定状況を確認するとよい。wsrep_auto_increment_control なる項目があるのでとびとびにしない方法もあるのかもしれませんが、理由が分かったので私はとりあえずそのままとしています。
MariaDB [worochi]> show variables like '%auto_inc%';
+------------------------------+-------+
| Variable_name | Value |
+------------------------------+-------+
| auto_increment_increment | 2 |
| auto_increment_offset | 1 |
| wsrep_auto_increment_control | ON |
+------------------------------+-------+
3 rows in set (0.00 sec)