PostgreSQL-非同期レプリケーション+プーリング+フェールオーバー

Postgresql 9.1ベースの非同期マスタースレーブレプリケーションオプション




初めて、タスクは本格的なレプリケーションのみを実装することであり、初めてミニマニュアルが作成されました。これについては、ここで紹介します。



マスタースレーブレプリケーションシステムでは、組み合わせが使用されました。





ブカルド


Perl5で記述された非同期Postgresレプリケーションシステム。



postgresへの埋め込みや、データベースに反映された簡単なチューニングに便利です。



独自のデータベースを作成します。このデータベースには、複製されたサーバー、データベース、テーブルが含まれ、シート(リスト)で囲まれています。

通信タイプはPushdelta(Trigger。一方向のマスタースレーブ)です。

構造の変更はサポートされていません。 それは両方の方法で動作します、すなわち マスターが一時的にシャットダウンした場合、マスターが復元されると、自動的にスレーブに「追いつきます」。



ウィザードにbucardoをインストールするおおよその計画:



sudo aptitude install bucardo # + install Perl mods (DBI, DBD::Pg, DBIx::Safe) sudo bucardo_ctl install # connection settings
      
      







次に、制御データベースbucardoを手動で作成し、bucardo.schemaから入力します(デフォルトでは、8.4に接続され、古いバージョンでは、制御データベースの自動作成で失火します)



  sudo bucardo_ctl add db bucardo_dbname name=master_dbname #  - # +      bucardo.db (   ) sudo bucardo_ctl add db bucardo_dbname name=slave_dbname #  - sudo bucardo_ctl add table tbl_name db=bucardo_dbname herd=source_name #     (herd) sudo bucardo_ctl add sync sync_name type=pushdelta source=herd_name targetdb=slave_dbname #     sudo bucardo_ctl start #  
      
      







スレーブにインストールしましたが、記入しませんでした(スレーブが1つしかなく、そこから移動する場所がないため)



PgPool-II


十分な機会があり、マニュアルが不足している。 並列クエリ、ロードバランシング、プールによるデータベース接続の分散をサポートします。また、FailOver、つまり 接続に問題が発生した場合のマスターからスレーブへの自動切り替え。



リポジトリからdebianにインストールされます。postgresのバージョンに依存しません。

  sudo aptitude install pgpool2
      
      







/ etc / pgpool2 /に保存されている構成





PgPoolをプラー、ロードバランサー、そして最も重要なファイラーとして使用しました。



設定例/etc/pgpool2/pgpool.conf(一部)ウィザードの場合:

  listen_addresses = '*' port = 9999 socket_dir = '/var/run/postgresql' pcp_port = 9898 pcp_socket_dir = '/var/run/postgresql' backend_hostname0 = master_server backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/master_data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = slave_server backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/slave_data' backend_flag1 = 'ALLOW_TO_FAILOVER' connection_cache = on replication_mode = off load_balance_mode = on master_slave_mode = on master_slave_sub_mode = 'stream' parallel_mode = on pgpool2_hostname = '' system_db_hostname = master_server system_db_port = 5432 system_db_dbname = 'pgpool' system_db_schema = 'pgpool_catalog' system_db_user = 'pgpool' system_db_password = '' failover_command = '/etc/pgpool2/failover.sh %d %P %H %R' recovery_user = 'postgres' recovery_password = '' recovery_1st_stage_command = '/etc/pgpool2/recovery_1st_stage.sh' recovery_2nd_stage_command = '' recovery_timeout = 90 client_idle_limit_in_recovery = 0
      
      







また、/ etc / pgpool2 /スクリプトには、構成で指定された次の内容で作成されます。



`` failover.sh ''-実際にはクラッシュした場合に実行されるスクリプト

  #!/bin/bash -x FALLING_NODE=$1 # %d OLDPRIMARY_NODE=$2 # %P NEW_PRIMARY=$3 # %H PGDATA=$4 # %R if [ $FALLING_NODE = $OLDPRIMARY_NODE ]; then if [ $UID -eq 0 ] then su postgres -c "ssh -T postgres@$NEW_PRIMARY touch $PGDATA/trigger" else ssh -T postgres@$NEW_PRIMARY touch $PGDATA/trigger fi exit 0; fi; exit 0;
      
      





'' recovery_1st_stage.sh ''-話す名前のスクリプト

  #!/bin/bash -x PGDATA=$1 REMOTE_HOST=$2 REMOTE_PGDATA=$3 PORT=5432 PGHOME=/home/yugo-n/pgsql-9.2.1 ARCH=$PGHOME/data/arch rm -rf $ARCH/* ssh -T postgres@$REMOTE_HOST " LD_LIBRARY_PATH=$PGHOME/lib:LD_LIBRARH_PATH; rm -rf $REMOTE_PGDATA $PGHOME/bin/pg_basebackup -h $HOSTNAME -U r_user -D $REMOTE_PGDATA -x -c fast rm $REMOTE_PGDATA/trigger" ssh -T postgres@$REMOTE_HOST "rm -rf $ARCH/*" ssh -T postgres@$REMOTE_HOST "mkdir -p $REMOTE_PGDATA/pg_xlog/archive_status" ssh -T postgres@$REMOTE_HOST " cd $REMOTE_PGDATA; cp postgresql.conf postgresql.conf.bak; sed -e 's/#*hot_standby = off/hot_standby = on/' postgresql.conf.bak > postgresql.conf; rm -f postgresql.conf.bak; cat > recovery.conf << EOT standby_mode = 'on' primary_conninfo = 'host="$HOSTNAME" port=$PORT user=r_user' restore_command = 'scp $HOSTNAME:$ARCH/%f %p' trigger_file = '$PGDATA/trigger' EOT "
      
      







重要なポイント! pgpoolが使用するすべてのファイル/フォルダーは所有者postgres :: postgresである必要があります



master_slave_mode = offおよびfailover_command = ''でのみ、スレーブのすべてがほぼ同じです。



PgPoolは最も単純なコンソールによって起動されます

 sudo pgpool
      
      







したがって、負荷分散とファイラーを備えたマスターmonoSlaveレプリケーションを取得します。



接続は常にpgPool'aポート(ここでは-9999)を介したマスターへのみです。

通常の操作中、マスターにレコードがあり、バックエンドがスレーブに複製され、両方から読み取りが行われます。

スレーブがオフになっている場合、動作を再開すると、すべてのダウンタイムデータが自動的に複製されます。

ユーザー接続を切断せずにウィザードを切断する場合、pgpoolは読み取りと書き込みをレプリカに完全にリダイレクトし、一時的に「ウィザード」にします。 ウィザードを起動すると、スレーブからのすべてのデータに追いつき、再びユーザー接続を切断せずに切り替えます。



何らかの方法で権利管理を作成することができないという特定の問題があります。そのため、ライブマスターでは、ROのみがスレーブに許可され、それが落ちたときにRWに切り替わり(その後、元に戻す)、外部アクセスはマスターのアドレス、危険は開発者の遊び心のあるペンにのみ残っています。



この記事が初心者DBAに適用されることを願っています。

ご清聴ありがとうございました!



All Articles