少し紹介します。 ブカルドが機能するには、次のことを行う必要があります。
1)どのサーバーにどの参加データベースが存在するかを彼に伝えます。
2)レプリケーションに関係するテーブルを彼に伝えます。
注意:開発者がアプリケーションに新しいテーブルを追加する場合、これについてbucardoに通知する必要があります。 既存のテーブルのスキーマを変更する場合も同様です。
3)テーブルのどのグループが存在し、どのテーブルがどのグループに該当するかを彼に伝えます。 異なるサーバー間で異なるテーブルを複製する必要がある場合、グループが必要です。 グループを個別に指定するよりも、グループで作業する方が便利です(Nagiosのグループに非常に似ています)。
4)どのデータベースグループが存在するかを彼に伝えます。 目標は表の場合と同じです。
インストールに移りましょう。 Debian 7のオプション。パッケージpostgresql-9.1およびpostgresql-client-9.1が既にインストールされていることが理解されます。
事前準備
サーバーはnode1およびnode2と呼ばれます 。 また、参加しているすべてのPostreSQLサーバーが外部インターフェイスでリッスンしていることを確認する必要があります。
# netstat -plnt4 | grep 5432 tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN 12345/postgres
各サーバーにBucardoパッケージとPostgreSQLのPL / Perlサポートをインストールします。
# apt install bucardo postgresql-plperl-9.1
各サーバーでアクティブ化します。
# sed -i 's/ENABLED=0/ENABLED=1/' /etc/default/bucardo
パッケージメンテナは、何らかの理由でPIDの下にディレクトリを作成することを推測しなかったため、各サーバー上に自分で作成します。
# mkdir /var/run/bucardo
TCPソケットを介して各サーバーのDBMSに接続できることを確認します。
# psql -U postgres -h 127.0.0.1
パスワードを覚えていない場合、最も簡単な手順はこちらです。
PGが特定のユーザーアドレスからのリクエストを受け入れたくない場合、/ etc / postgresql / 9.1 / main / pg_hba.confを設定します
次は、データベースの初期化です。 postgresによって作成されますが、bucardoによって埋められるため、接続の問題が発生する可能性があります。
それを避けるために、事前に/etc/postgresql/9.1/main/pg_hba.confにその行を追加します。 また、すでに作業中のBucardoは、クラスターノードだけでなく、ペアノードも参照します。 したがって、私たちもそれを忘れません。 クラスタ内にさらにサーバーがある場合は、それらについて忘れないでください。 各サーバーで:
host all bucardo 127.0.0.1/32 trust host all bucardo SECOND.NODE.IP.ADDRESS/32 password
その後、DBMSを再起動します。
# pg_ctlcluster 9.1 main restart
ブカルドをインストールする
Debianの最近のバージョンではbucardo_ctlユーティリティはbucardoに置き換えられているため、使用します。
データベースを初期化します。
# bucardo install
ダイアログは次のようになります。
# bucardo install This will install the bucardo database into an existing Postgres cluster. Postgres must have been compiled with Perl support, and you must connect as a superuser Current connection settings: 1. Host: localhost 2. Port: 5432 3. User: postgres 4. Database: postgres 5. PID directory: /var/run/bucardo Enter a number to change it, P to proceed, or Q to quit: P Password for user postgres: Postgres version is: 9.1 Password for user postgres: Creating superuser 'bucardo' Password for user postgres: Attempting to create and populate the bucardo database and schema Password for user postgres: Database creation is complete Updated configuration setting "piddir" Installation is now complete. If you see errors or need help, please email bucardo-general@bucardo.org You may want to check over the configuration variables next, by running: bucardo show all Change any setting by using: bucardo set foo=bar
初期化プロセスで、データベースはファイル/usr/share/bucardo/bucardo.schemaから作成されたため、以前のバージョンのマニュアルで説明されているように、データベースを手で埋める必要はありません。
Bucardoがインストールされ、実行できます:
# bucardo start
レプリケーション構成
複製を設定する前に、複製するテストベースを作成します。
各サーバーで:
# psql -U postgres -c "CREATE DATABASE mydb;" # psql -U postgres mydb -c "CREATE TABLE mytable ( num123 integer PRIMARY KEY, abc varchar(10) );"
セキュリティに関する別の重要なポイント 。 複製されたデータベースを構成に追加した後、Bucardoはユーザーパスワードをデータベースに入力します。 また、インストール中に要求しなかったため、postgresユーザーとまったく同じになりました。 言い換えれば、スーパーユーザーからのパスワードはbucardoデータベースに平文で保存されますが、これはやや危険です。
したがって、私たちは彼に別のパスワードを作成します。 各サーバーで:
# psql -U postgres -c "ALTER USER bucardo WITH PASSWORD 'eiP4uSash5';"
次に、複製するデータベースへの接続方法に関する情報をBucardoに提供します。 私は高負荷状態のUnixソケット(会話の別のトピック)のファンではないため、ローカルの場合でも、TCPソケットを示します。
注意:node1サーバーでこれを行います。 一般に、さらに、両方で何を行う必要があるかが明確になるまで、node1のみを使用します。
node2サーバーからローカル(mydb_node1)とそのリモートコピー(mydb_node2)を追加します。
# bucardo add database mydb_node1 dbname=mydb dbhost=127.0.0.1 dbuser=bucardo dbpass=eiP4uSash5 Added database "mydb_node1"
# bucardo add database mydb_node2 dbname=mydb dbhost=node2.example.com dbuser=bucardo dbpass=eiP4uSash5 Added database "mydb_node2"
ここに:
mydb_nodeX-ベースの内部指定。 この名前は、ブカルドがベースとの内部作業で使用します。
dbname = mydbは、mydb_nodeXによって参照されるPostgreSQLの実際のデータベース名です。
dbuser = bucardo-このデータベースを操作するためにBucardoがDBMSに接続するユーザー。
次のような結果が表示されます。
# bucardo list database Database: mydb_node1 Status: active Conn: psql -p -U bucardo -d mydb -h 127.0.0.1 Database: mydb_node2 Status: active Conn: psql -p -U bucardo -d mydb -h node2.example.com
これらの設定は、上記のパスワードが置かれているbucardoデータベースのdbテーブルから取得されます。
# psql -U postgres bucardo -c "SELECT name,dbname,dbhost,dbuser,dbpass,status FROM db;" name | dbname | dbhost | dbuser | dbpass | status ------------+--------+-------------------+---------+------------+-------- mydb_node1 | mydb | 127.0.0.1 | bucardo | eiP4uSash5 | active mydb_node2 | mydb | node2b.forbet.net | bucardo | eiP4uSash5 | active (2 rows)
次に、それらの間で複製するテーブルを追加する必要があります。 ほとんどの場合、ユーザーはデータベース全体を複製するため、すべてを一度に追加します(テーブルのグループ(群)が自動的に作成されます)。 開発者が新しいテーブルを思いついたら、後でそれをグループに追加するだけで、すべての設定はグループ全体に関係するため、すべてうまくいきます。
# bucardo add table all --db=mydb_node1 --herd=mydb_herd Creating herd: mydb_herd Added table public.mytable to herd mydb_herd New tables added: 1
ここに:
--herd = mydb_herd-テーブルのグループの名前。これにより、後で個別にではなく全体に対して同期を設定できます。
そしてすぐにそれを見ることができます:
# bucardo list tables 1. Table: public.mytable DB: mydb_node1 PK: num123 (int4) PK. Bucardo, , . .
また、グループも表示されます。
# bucardo list herd Herd: mydb_herd DB: mydb_node1 Members: public.mytable
シーケンスについても同じことが言えます。 この例ではそうではありませんが、突然誰かが使用します。 複雑にならないように、彼らのために独自のグループを作成しません。 テーブルが一方向に複製され、シーケンスが別の方向に複製される可能性は非常に小さいです。 したがって、テーブルとシーケンス用に1つのグループがあります。
# bucardo add sequence all --db=mydb_node1 --herd=mydb_herd Sorry, no sequences were found New sequences added: 0
次のタスクは、レプリケーショングループを作成することです。 このグループでは、どのベースがソースになり、どのベースがデータの受信者になるかを説明します。 最初に、空の状態でグループ自体を作成します。
# bucardo add dbgoup other_mydb_servers Created database group "mydb_servers_group"
両方のサーバーをグループに追加し、誰がどの役割を果たすかを示します。 これが、マスター/スレーブ構成がmaster-masterと異なる唯一のポイントです。
最初は、ソースがソースであり、ターゲットが受信者であると考えるかもしれません。 実際、これは完全に真実ではありません。 ソースはソースと受信者の両方として機能する人であり、ターゲットは受信者のみです。
つまり、マスタースレーブがある場合は、1つのソースと2番目のターゲットを指定します。 そして、master-masterがある場合、両方がソースになり、target'ovはまったくありません。
MASTER-> SLAVEのオプション:
# bucardo add dbgroup mydb_servers_group mydb_node1:source Added database "mydb_node1" to group "mydb_servers_group" as source # bucardo add dbgroup mydb_servers_group mydb_node2:target Added database "mydb_node2" to group "mydb_servers_group" as target
MASTER <-> MASTERのオプション:
# bucardo add dbgroup mydb_servers_group mydb_node1:source Added database "mydb_node1" to group "mydb_servers_group" as source # bucardo add dbgroup mydb_servers_group mydb_node2:source Added database "mydb_node2" to group "mydb_servers_group" as source
以上です! 基礎となるものを書きました。 どのテーブルがあるかが書かれています。 どのグループの誰が書かれています。 最後の仕上げを言うことは残っています-テーブルのどのグループがどのグループのベース間で「実行」されるかを言うことです。 つまり、「同期」を作成します。
# bucardo add sync mydb_sync herd=mydb_herd dbs=mydb_servers_group Added sync "mydb_sync"
取得したものを確認できます。
# bucardo list sync Sync: mydb_sync Herd: mydb_herd [Active] DB group mydb_servers_group: mydb_node1 (source) mydb_node2 (source target - )
設定を変更したら、必ずBucardoを再起動してください。
# bucardo restart
=========
チェック:最初のノードでnode1を実行:
# psql -U postgres mydb -c "INSERT INTO mytable VALUES (1, 'a');"
そして、2番目のnode2で次を確認します。
# psql -U postgres mydb -c "SELECT * FROM mytable;"
マルチマスターを作成した人は、反対方向でチェックする必要があります。 node2で作成し、node1でテストします。
=========
ほとんどの人が持っている質問:
1)Bucardoがオフになっている間、またはネットワークが利用できないときにソースベースのテーブルが変更された場合、ターゲットベースのテーブルはどうなりますか?
回答:すべてOK。 起動時またはネットワークが表示されると、Bucardoはデータをターゲットサーバーに転送します。 そのため、ターゲットサーバーは必要に応じて破損する可能性があります。 唯一の要件は、最初のものと同じデータスキーマ(テーブル構造)を持つ必要があることです。
__
2)ベースが大きい場合(数十から数百ギガバイト)、ブカルドは「途切れ」、最後まで同期しません。 になる方法
回答:同期を非アクティブにします。 ただし、Bucardoは、要求を記録するためのソースデータベースに対して有効にする必要があります。
bucardo update sync mydb_sync status = inactive(すべてのノードのマルチマスター用)
次に、手でpg_dump / pg_restoreを実行し、同期をアクティブモードに戻します(マルチマスターの場合、最初にダンプが開始された後に新しい要求が送信されたモードで)。