GCacheについて、サービス開発・運用する人誰もが知っとくべき情報
https://www.percona.com/blog/2016/11/16/all-you-need-to-know-about-gcache-galera-cache/
gcacheは「キャッシュ」と名前だが、「メモリ」とは無関係のもの。 データ構造としてはリングバッファ。
クラスタ内のノードがダウンしてしまった場合、ノードが復旧しクラスタに再加入した際のデータの差分を埋めるための方法として、Galeraは以下の2つの方法がある。
3ノード構成のクラスタで、以下の状態を想定して説明
- ノードA, B: 稼働中のノード(プライマリ)
- ノードC: ダウンしたノード
2つの方法
-
IST (Incremental State Transfer) ダウン時のノードCのデータと、現在のノードA, B間のデータとの間の差分のみを埋める (増分バックアップのようなイメージ)
-
SST (State Snapshot Transfer) ノードA, Bから、現在のデータ全体を受け取り、ノードCのデータにインポートする (全体バックアップのようなイメージ)
上記の中で、「ノードA, B間のデータとの間の差分」を記録するための領域がgcache。
このキャッシュ領域は、メモリではなくディスク上のファイルとしてMariaDBのインスタンス起動時に作成される。
(gcache.size=10Gであれば、10GBのgalera.cacheファイルが作成される)
gcacheは、各ノードに1つずつ存在し、実行されたトランザクションが順番に記録される。
そして、ノードダウンが発生し、ノードが復旧した時に、このgcache内を確認し、ダウン時のトランザクションから、現在のトランザクションまでの全てgcache内に記録されている場合、ISTが選択・実行される。 それ以外の場合は、SSTが選択・実行される。
そのため、gcacheのサイズが大きければノード復旧時にIST(増分バックアップ)が適用される可能性が大きくなる。 gcacheの記録処理自体はそれ程負荷にはならないため、パフォーマンスへの影響は少ない。