ツナワタリマイライフ

日常ネタから技術ネタ、音楽ネタまで何でも書きます。

Galera Clusterの同期の仕組みを公式ドキュメントから読み解く(1)

はじめに

仕事でMariaDBレプリケーションにGalera Clusterを使っています。使い方や、同期されてるかどうかの確認の方法はわかりますが、実際にどんな仕組みで差分を判定し、どんな仕組みで同期をしているかはわかっていません。

そこで公式ドキュメントを読んで理解してみましょう。

Technical Description — Galera Cluster Documentation

かなり物量が多いですね。いくつかピックアップして読んでみましょう。

DATABASE REPLICATION

Database Replication — Galera Cluster Documentation

Database replicationは、database serverである、あるノードから別のノードでデータを頻繁にコピーすることを意味します。すべてのノードが同じレベルの情報を共有する、分散データベースシステムとしてDatabase replicationを考えます。このシステムはよくdatabase clusterとして知られています。

webブラウザやcomputerアプリケーションのような、データベースクライアントはデータベースレプリケーションシステムが見えません。しかし、ネイティブのDBMSの振る舞いに近いことに恩恵を得ています。

MASTER AND SLAVE

多くのデーラベース管理システムはデータベースをレプリケーションします。

もっともよく使うレプリケーションは、オリジナルのデータセットとそのコピーの間の関係をmaster/slaveとして設定するものです。

このシステムでは、masterのデータベースサーバはデータが更新されたことと、ネットワークを通じてslaveにデータを増殖させたことをログに残します。slaveのデータベースサーバはmasterから更新の通知を受け取り、その変更を適用します。

別のレプリケーションは、すべてのノードにmasterの機能を持つmult-masterレプリケーションです。

multi-masterレプリケーションシステムでは、あなたはどのデータベースにも更新を書き込むことができます。これらの更新ははネットワークを通じてすべてのノードに伝搬されます。すべてのデータベースノードはマスターの機能を持つのです。これらには利用可能なログを残さず、システムは更新が成功したかどうかをあなたに示すこともありません。

ASYNCHRONOUS AND SYNCHRONOUS REPLICATION

他のノードへのデータ変更を行う方法に加えて、cluster間のデータ転送方法がいくつかあります。

  • 同期レプリケーション
    • "eager replication"というアプローチ。1つのトランザクション内で、すべてのノードの更新され、同期が完了する。言い換えると、transactionのコミットが発生した時、すべてのノードが同じ値を持つということです。
  • 非同期レプリケーション
    • "lazy replication"というアプローチ。masterのデータベースは非同期でslaveに更新を伝搬させます。masterノードがレプリカを伝搬させたあと、トランザクションはコミットされます。言い換えると、トランザクションがコミットされたとき、かなり短い時間でみると、いくつかのノードは違う値を持つということです。

Advantages of Synchronous Replication

同期レプリケーションのほうが、いくつか利点を持ちます。

  • 高可用性
    • 同期レプリケーションは24時間7日サービスの利用を保証し、高いクラスタ可用性を提供します。
      • ノードがクラッシュしてもデータロスなし
      • データの一貫性維持
      • 複雑で時間のかかるフェールオーバーがない
  • 性能改善
  • クラスタ間の因果関係
    • 同期レプリケーションクラスタ間の関係を(同一であることを)保証します。例えば、SELECTのクエリが他のノードで実行されたとしても、いつも同じ結果を返します。(?)

Disadvantages of Synchronous Replication

eager replication protocolはノードに対して1つの操作を同時に行います。これらは2段階のコミットか、ロックを生じます。n個のノードで構成され、oのプロセスがtのトランザクションを行うとき、mのメッセージを受け取ります。その式は

m = n × o × t

これが意味することは、トランザクションのレスポンス時間と競合とデッドとっくが発生する確率が、ノードの数の増加に伴い指数的に増加するということです。

この理由から、非同期レプリケーションが、データベースの性能、スケーラビリティ、可用性という面でもっとも有効なレプリケーションプロトコルとされています。MySQLPostgreSQLは非同期レプリケーションのみを採用していて、このようにオープンソースのdatabaseに広く適用されています。

SOLVING THE ISSUES IN SYNCHRONOUS REPLICATION

いくつか同期レプリケーションに対して問題を解決するアプローチがあります。ここ数年、研究者が同期レプリケーションに対する別の提案を行ってきました。

理論に加えて、いくつかのプロトタイプ実装が保証を示しました。これらの研究から重要な向上をいくつかもたらしました。

  • Group Communication
    • データベース間のコミュニケーションパターンを定義する高いレベルの抽象化です。レプリケーションの一貫性を保証します。
  • Write-sets
    • これは1つのwrite-setメッセージでデータベースの書き込みを束ねます。この実装は同時に1つのノード対する操作をする整合性を回避します。
  • Database State Machine
    • このプロセスはread-onlyのトランザクションをローカルのデータベースで行います。この実装は最初に実行されたトランザクションを更新し、shallow-copies上で行います。そして証明またはコミットのために、read-setとして他のデータベースに伝搬させます。
  • Tansaction Reordering
    • データベースがコミットし、伝搬させる前に、transactionを並べ替えます。この実装は証明テストをpassしたトランザクション数を増加させます。(?)

Galera Clusterが使っている証明ベースのレプリケーションシステムにはこれらのアプローチが組み込まれています。

おわりに

結構時間がかかってしまったのでこのへんで。データベースのレプリケーションに関する一般的な用語や方法を整理したドキュメントですね。同期レプリケーションの優れている点と劣っている点を記載し、mysql(mariadb)では非同期レプリケーションが使われていることがわかりました。また、劣っている点は後半であげた技術によってカバーされていることもわかりました。

全部はやらないと思いますが、あと数回続くと思います!