まえがき
良い一日。 歴史的に、Postgresqlのボックスから8番目のブランチ(および安定版の9番目の明るい未来にはまだ到達していません)にはレプリケーションシステムがありませんでした。 したがって、これらの目的のために、外部ツールSlony1が作成されます。
仕組み
。
非常に簡単に動作します:slonデーモンはPostgresqlサーバーに接続し、トリガーにしがみつき、データベースの内容を変更するイベントが発生するのを待ちます。 slonikもあります-STDINの設定を使用する設定ユーティリティと、さまざまな目的のための他のいくつかの管理ユーティリティです。
レプリケーションの一部として、Postgresqlに関しては、次の用語が一般的に使用されます。
- ノード(ノード)-「サーバーベース」のペア。 つまり、たとえば、1つのサーバーでレプリケーションに参加している複数のデータベースがある場合、これは1つのノードではなく、複数のノードです。
- クラスター-ノードのグループ。 それは簡単だと思います:マスターとスレーブ。
- テーブルはまだシンプルです。 :)
- シーケンス-テーブルのカウンター。
- セット-テーブルとカウンターのセット。 ベースごとに個別のセットが作成されます。
構成が正常に完了すると、Slonyは複製されるデータベースに_clusterスキーム(「cluster」は構成で指定されたクラスターの名前)とそのテーブルのいくつかを作成します。 テーブルの目的は明らか
です。 ドキュメント 、まあ、またはpsqlを使用して。 したがって、セットアッププロセス中に突然問題が発生し、再起動後に「このノード/クラスター/テーブルが既にリストにあります」という形式のメッセージを受け取った場合、ドロップインスキームが役立ちます。
また、主キーを持つテーブルのみがレプリケーションの対象になることを知っておく必要があります。
私にとって象の主な不快な特徴は、データベース内のすべてのテーブルのレプリカを作成する方法がわからないことです。1つずつリストする必要があります。 データベースに50を超えるテーブルがある場合、設定の記述は非常に退屈なタスクになります。 これらの目的のために、以下に掲載するスクリプトを作成しました。
最も好奇心The盛な人は、おそらくそのようなマナを見て、この投稿は別のテイクだと信じているでしょう。 いいえ、そうではありません。 私が見たすべてのマナは、STDIN経由でslonikに設定を直接送ることを提案しました。 このアプローチでは、システムは動作しますが、(少なくともDebian / Ubuntuの場合)2つの問題があります:
- 初期化スクリプトは機能しません
- 補助象ユーティリティは機能しません。
正しいアプローチは、perlのような設定を/etc/slony1/slon_tools.confに保存することです(たとえば、ls /usr/share/doc/slony1-bin/examples/slon_tools.conf-sample.gzにあります)。 、および/ etc / default / slony1-このマシン上に存在し、initスクリプトによって起動されるノードの数。 私が言ったように-最初の設定はperlスクリプトであり、slon_startスクリプトに含まれています。 一般的に-この投稿では手動による設定は考慮されていません-例がどこにあるかを伝えるだけです。
準備。
すでにベースと設定済みのPostgresqlがあり、プライマリキーを持つテーブルがあり、セットアップを開始する準備ができていると仮定します。 Ubuntuの異なるバージョンですべてが行われることを事前に予約します。Debianでもほぼ同じですが、他のディストリビューションで何が起こるかわかりません。
したがって、postgresql-8.3-slony1およびslony1-binパッケージが必要です。 両方のパッケージに2番目のブランチがあることが望ましいです(より安定しています)。
サーバー構成
最初に、postgresql.confで、「listen_addresses」を含む行のコメントを解除し、localhostの代わりにlocalhostを、スレーブに向かっているインターフェイスのIPアドレスで設定する必要があります。 アドレスの代わりに「*」を入力することもできます-サーバーはすべてのインターフェイスで接続を待機します。
次に、pg_hba.conf(/ etc / postgresqlにもあります)に次の形式の行を追加する必要があります
host all all 192.168.1.0/24 md5
、192.168.0.0 / 24の代わりに、ネットワークまたはIPスレーブを指定する必要があります。 次に、スレーブで同じことを行い、ウィザードのIPを示します。
次に、マスターとスレーブでPostgresqlを再起動して、新しい設定を取得します。
また、両方のマシンでpgスーパーユーザーを作成する必要があります。
createuser -sP slony
スクリプト
投稿サイズを数回増加させないために、スクリプトを
ここに送信し
ました 。 私は事前に、コードの美しさに対する賞を請求しないと言います。それどころか、それは私の自由な時間に膝の上に書かれました。 別のことが重要です-それは動作します。 次に、彼が何をするかについてお話します。
通常の操作では、root`aまたはsudoから実行する必要があります(postgresユーザーでsuを使用し、/ etcへの書き込みとinitスクリプトが実行されるため) )スレーブがrootからsshへのアクセスを許可するようにします(パスワードはすぐに退屈するため、キーを使用する方が適切です)。 libdbd-pg-perlパッケージも必要です。
現在のバージョンはコマンドラインからのパラメータを食べません(そうすべきですが)ので、起動後にスクリプトとダイアログを入力します。 そのため、アルゴリズムは段階的に機能します。
1.クラスターの名前とマスター/スレーブの詳細をユーザーにポーリングします。
間違えた場合-データベースへの接続に問題がある場合、スクリプトはデータを再入力するように求めます。 クラスターの名前は任意です。
2.データベースを選択するためのダイアログ。
ここではすべてが簡単です。 このスクリプトは、使用可能なデータベースについてサーバーをポーリングし、複製する必要があるデータベースを選択するように提案します。 ベースを選択(または選択解除)するには、その番号を入力する必要があります。 アスタリスクですべてを選択できます。 最後にEnterキーを押す必要があります。
3.テーブル/シーケンスの追加。
選択したデータベースのリストがあるため、スクリプトはそれらからテーブルのリストを収集します。
選択したデータベースにあるすべてのテーブルとシーケンスがリストに追加されます。
4.マスターからスレーブへの基本構造の転送
順次実行されるリモートcreatedb、createlang。 次に、ローカルのpg_dump -sを実行した後、sshを介して構造がスレーブに転送されます。
5.構成の直接生成とその転送。
すべての必要なデータがそこにあり、構成が生成され、rootである場合、/ etc / slony1(スレーブを含む)に配置され、/ etc / default / slony1が編集されます(どのノードを開始する必要があるかを示します)。
6.デーモンの起動
まあ、それがすべてです。 実行されたままです。 :)
PS
質問がある場合、または何かうまくいかない場合は、誰かに役立つことを願っています-気軽にコメントしてください。