ブカルド:マルチマスターレプリケーション

苦しみの過程で、彼は大量の記事をシャベルで掘り、マニュアルに詳細な解説を書くことにしました。 さらに、ロシア語でマルチマスターを構成することに関する情報はほとんどなく、それはどういうわけか断片的です。



少し紹介します。 ブカルドが機能するには、次のことを行う必要があります。



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を実行し、同期をアクティブモードに戻します(マルチマスターの場合、最初にダンプが開始された後に新しい要求が送信されたモードで)。



All Articles