Slony-Iのレプリケーション方式
PostgreSQLの代表的な非同期レプリケータSlony-Iが実際にどうやってレプリケーションしているのか、SQLログと拙いソース読みで調査したときのメモ。
拡大図
図のようにクラスタセットの設定は完了しており、また購読(subscribe)の設定も完了し、masterからslaveの方向にレプリケーションが行われる環境になっている。
また、masterに接続するslonプロセスとslaveに接続するslonプロセスも起動している。
この状態でユーザテーブルに1行レコードが挿入されるケースを考える。
まだまだ解析すべき箇所が残っているが今日はここまで。
概要
- レプリケーション設定はslonikコマンドで行う。
- slonikコマンドでは、Slony-Iの動作を管理する情報を管理テーブルに設定する。
- 管理テーブルはレプリケーション対象のDB内にSlony-I用のスキーマを構築し、その中に構築する。
- 実際にレプリケーション動作を行うのはslonコマンド。
- slonコマンド内で管理テーブルを参照し、変更内容に該当するクエリを作成してレプリケーションしている(はず)
調査環境
- Slony-Iのバージョンは1.2.1
- レプリケーション対象となるPostgreSQLのバージョンは8.1.5
レプリケーションの例
例えば、以下のような簡単な例、1つのDBクラスタ内でmasterからslaveにレプリケーションするケースを想定する。拡大図
図のようにクラスタセットの設定は完了しており、また購読(subscribe)の設定も完了し、masterからslaveの方向にレプリケーションが行われる環境になっている。
また、masterに接続するslonプロセスとslaveに接続するslonプロセスも起動している。
この状態でユーザテーブルに1行レコードが挿入されるケースを考える。
レプリケーションの動き
- slave側のslonはslave側のsl_eventを参照してイベントが生成されてないかチェックする。
- イベントが生成されてなければrollbackする。
- この動作をslonプロセスの監視スレッド内で繰り返し行う。(たぶん)
- slave側のsl_action_seqを参照して(たぶん)シーケンス更新があったかチェックする。
- slaveからlistenステートメント発行。これはまだ不明。
- slave側でcon_timestampを参照。この目的は解析要。たぶんmaster(con_origin)とslave(con_recieve)の最新の更新状況を比較するためだと思うが・・・。
- masterがforwardConfirm()を発行。転送が確定したタイムスタンプ?を取得するのか。
- masterがcreateEvent()を発行。この中でおそらくイベントを生成し、sl_eventテーブルに書き込んでいるのであろう。
- masterがsl_eventを検索。ここで先に生成したイベントを検知すると思われる。見つからなかったらたぶん何もしないと思われる。
- masterでcon_timestampを参照。最新の更新状況の比較か?
- 以降、masterでは監視スレッドがsl_eventを再度監視し始める。
- slaveがsl_setsyncを参照。
- slaveがsl_tableを参照。
- slaveがsl_log_statusを参照。last_valueを取得しているので最新のステータス情報を得ているのか?
- slaveがレプリケーション用のinsert文を発行。これで一つのレプリケーションが完了する。
まだまだ解析すべき箇所が残っているが今日はここまで。
2007年02月18日(日) 17:47:51 Modified by harada_toshi
添付ファイル一覧(全1件)
5cd514ed1e253527.jpg (71.93KB)
Uploaded by harada_toshi 2007年02月18日(日) 16:50:57
Uploaded by harada_toshi 2007年02月18日(日) 16:50:57