Pgpool-II4.1.0に基づいてPostgreSQL11クラスターを構築する
この記事では、主にpgpool4.1とPostgreSQLに基づくストリーミングレプリケーションを紹介し、PostgreSQLの読み取りと書き込みの分離と高可用性を実現しています。構成については、公式のPgpool-IIドキュメントを参照してください。使用されているバージョンはPgpool4.1、PostgreSQL11.6です。
記事は少し長くなっています。。。。。。。。。。。したくないけど
Pgpoolの概要
pgpoolの紹介はこの記事にはありませんが、必要な方は私の別の記事を参照してください。ポータル:pgpoolの紹介
環境の準備
今回は、3つのCentOS7.3サーバーを使用してクラスターを構築します。まず、PostgreSQL11.6バージョンのデータベースを3つのサーバーにデプロイします。デプロイメントのチュートリアルはオンラインで見つけることができます。具体的な計画は次のとおりです。
ホスト名 | IPアドレス |
---|---|
仮想IP | 192.168.111.6 |
server1 | 192.168.111.1 |
server2 | 192.168.111.2 |
server3 | 192.168.111.3 |
アーキテクチャ図については、公式Webサイトを参照してください。
ビルド構成
サーバー構成
フェイルオーバーとオンライン回復の場合、コマンドを実行するには他のサーバーにsshする必要があるため、サーバー間でパスワードなしのsshログインを構成する必要があります(たとえば、サーバー間にsshがすでに構成されている場合は、このセクションをスキップできますが、failover.shなどのスクリプトを変更する必要があります)。
[all servers]# cd ~/.ssh
[all servers]# ssh-keygen -t rsa -f id_rsa_pgpool
[all servers]# ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
[all servers]# ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
[all servers]# ssh-copy-id -i id_rsa_pgpool.pub postgres@server3
[all servers]# su postgres
[all servers]$ cd ~/.ssh
[all servers]$ ssh-keygen -t rsa -f id_rsa_pgpool
[all servers]$ ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
[all servers]$ ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
[all servers]$ ssh-copy-id -i id_rsa_pgpool.pub postgres@server3
pgpoolのインストール
この記事ではpgpoolのインストールについては触れていませんが、必要な方は別の記事を参照してください。ポータル:pgpoolのインストール。
PostgreSQLデータベース構成
- WALアーカイブで
は、WALアーカイブを自己構成可能にする必要があります。この例では、現在WALアーカイブを使用していません。
[all servers]# su - postgres
[all servers]$ mkdir /var/lib/pgsql/archivedir
## postgres.conf 配置
archive_mode = on
archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"'
アーカイブされたスクリプトがあり、このスクリプトを使用して、アーカイブを保持する日数を変更できますpg_archive.sh
- postgres.conf構成
この構成はマスターノードでのみ構成され、スレーブノードはpgpoolオンラインリカバリ機能構成を使用します
listen_addresses = '*'
port = 5432
max_wal_senders = 10
max_replication_slots = 10
wal_level = replica
hot_standby = on
wal_log_hints = on
- データベースのユーザーとパスワードの構成
ユーザー名 | パスワード | 用途 |
---|---|---|
repl | repl | PostgreSQLストリーミングレプリケーションに使用 |
pgpool | pgpool | pgpool-IIハートビート検出と複製遅延検出に使用されます |
postgres | postgres | オンライン回復に使用 |
[server1]# psql -U postgres -p 5432
postgres=# CREATE ROLE pgpool WITH LOGIN PASSWORD 'pgpool';
postgres=# CREATE ROLE repl WITH REPLICATION LOGIN PASSWORD 'repl';
## 用于SHOW POOL_NODES 展示 "replication_state" and "replication_sync_state"
postgres=# GRANT pg_monitor TO pgpool;
- pg_hba.con構成
ユーザー認証構成を追加し、repl copyユーザーをpg_hbaに追加します。このドキュメントのすべてのパスワードは、md5を使用して検証されます。
host all all 0.0.0.0/0 md5
host replication repl 0.0.0.0/0 md5
- パスワードなしの操作用に.pgpassファイルを構成する
スクリプトはフェイルオーバーおよびオンラインリカバリ中の操作に使用されるため、pg_basebakupやpg_rewindなどのコマンドがスクリプトで使用されるため、パスワードなしの操作を設定する必要があります
postgresユーザーのhome
ディレクトリ.pgpass
にファイルを作成します600
。ファイルの権限はです。
[all servers]# su - postgres
[all servers]$ vi ~/.pgpass
## 格式为:hostname:port:database:username:password
server1:5432:replication:repl:<repl user password>
server2:5432:replication:repl:<repl user passowrd>
server3:5432:replication:repl:<repl user passowrd>
server1:5432:postgres:postgres:<postgres user passowrd>
server2:5432:postgres:postgres:<postgres user passowrd>
server3:5432:postgres:postgres:<postgres user passowrd>
[all servers]$ chmod 600 ~/.pgpass
pgpool設定
# cp -p /usr/local/pgpool/etc/pgpool.conf.sample-stream /usr/local/pgpool/etc/pgpool.conf
- PostgreSQLデータベース情報を構成する
# - Backend Connection Settings -
# 有几台PostgreSQL数据库,配置几个后端信息,使用后缀名0、1、2……
backend_hostname0 = 'server1' # Host name or IP address to connect to for backend 0
backend_port0 = 5432 # Port number for backend 0
backend_weight0 = 1 # Weight for backend 0 (only in load balancing mode)
backend_data_directory0 = '/data/pgsql/sport/' # Data directory for backend 0
# Controls various backend behavior
# ALLOW_TO_FAILOVER or DISALLOW_TO_FAILOVER
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'server2'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/var/lib/pgsql/11/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_hostname2 = 'server3'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/var/lib/pgsql/11/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
- 基本構成
listen_addresses = '*'
pid_file_name = '/var/run/pgpool/pgpool.pid'
# PID file name
# Can be specified as relative to the"
# location of pgpool.conf file or
# as an absolute path
# (change requires restart)
logdir = '/var/run/pgpool'
# Directory of pgPool status file
# (change requires restart)
pgpool操作用のディレクトリを作成しますmkdir -p /var/run/pgpool
- レプリケーション遅延チェックを構成する
sr_check_user = 'pgpool'
## 自从4.0版本后,如果密码设置为的话,pgpool会首先从`pool_passwd`文件中获取密码,然后在使用空密码
sr_check_password = 'pgpool'
- ヘルスチェックを構成する
# Health check period
# Disabled (0) by default
health_check_period = 5
# Health check timeout
# 0 means no timeout
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = 'pgpool'
health_check_max_retries = 3
- フェイルオーバーを構成する
failover_command = '/usr/locla/pgpool/etc/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
follow_master_command = '/usr/locla/pgpool/etc/follow_master.sh %d %h %p %D %m %H %M %P %r %R'
スクリプトについては、ダウンロードアドレスとスクリプトの使用方法については後で説明します
# 给脚本设置执行权限,注意:该脚本需要在三台pgpool服务器中都需要创建
chmod +x /usr/local/pgpoll/etc/{failover.sh,follow_master.sh}
- オンラインリカバリの構成
Pgpool-IIを使用してオンラインリカバリを実行するには、PostgreSQLのユーザー名とオンラインリカバリコマンドを構成する必要がありますrecovery_1st_stage
。オンラインリカバリを実行するにはPostgreSQLのスーパーユーザー権限が必要であるため、recovery_userでpostgresユーザーを指定します。次に、PostgreSQLマスターサーバー(server1)のデータベースディレクトリにrecovery_1st_stageとpgpool_remote_startを作成し、実行権限を追加します。
recovery_user = 'postgres'
# Online recovery user
recovery_password = 'postgres'
# Online recovery password
recovery_1st_stage_command = 'recovery_1st_stage'
## 该脚本只需要在数据库主节点创建,后续使用在线恢复时会复制过去
[server1]# su - postgres
[server1]$ vi /data/pgsql/sport/recovery_1st_stage
[server1]$ vi /data/pgsql/sport/pgpool_remote_start
[server1]$ chmod +x /data/pgsql/sport/{recovery_1st_stage,pgpool_remote_start}
データベースが拡張機能を作成します。拡張機能はオンライン回復を実行できるようになります(拡張機能がインストール中に作成された場合は、この手順をスキップできます)
[server1]# su - postgres
[server1]$ psql template1 -c "CREATE EXTENSION pgpool_recovery"
- クライアント認証を構成する
## pgpool.conf中
enable_pool_hba = on
認証ファイルは/usr/local/pgpool/etc/pool_hba.conf
基本的にPostgreSQLと同じです。(scram-sha-256方式については、pgpool公式サイトを参照してください)
host all pgpool 0.0.0.0/0 md5
host all postgres 0.0.0.0/0 md5
cd /usr/local/pgpool/etc
../bin/pg_md5 -p -m -u postgres pool_passwd
../bin/pg_md5 -p -m -u pgpool pool_passwd
cat /etc/pgpool-II/pool_passwd
# pgpool:AESheq2ZMZjynddMWk5sKP/Rw==
# postgres:AESHs/pWL5rtXy2IwuzroHfqg==
- ウォッチドッグ構成
use_watchdog = on
delegate_IP = '192.168.111.6' ##vip配置
## 网卡名字需要正确配置
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev enp0s8 label enp0s8:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev enp0s8'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I enp0s8'
配置其它pgpool信息,注意:该配置在三台服务器不一样,只需要配置另外几台即可
[server1配置如下]
# - Other pgpool Connection Settings -
other_pgpool_hostname0 = 'server2'
other_pgpool_port0 = 9999
other_wd_port0 = 9000
other_pgpool_hostname1 = 'server3'
other_pgpool_port1 = 9999
other_wd_port1 = 9000
heartbeat_destination0 = 'server2'
heartbeat_destination_port0 = 9694
heartbeat_device0 = ''
heartbeat_destination1 = 'server3'
heartbeat_destination_port1 = 9694
heartbeat_device1 = ''
[server2配置如下]
# - Other pgpool Connection Settings -
other_pgpool_hostname0 = 'server1'
other_pgpool_port0 = 9999
other_wd_port0 = 9000
other_pgpool_hostname1 = 'server3'
other_pgpool_port1 = 9999
other_wd_port1 = 9000
heartbeat_destination0 = 'server1'
heartbeat_destination_port0 = 9694
heartbeat_device0 = ''
heartbeat_destination1 = 'server3'
heartbeat_destination_port1 = 9694
heartbeat_device1 = ''
[server3配置如下]
# - Other pgpool Connection Settings -
other_pgpool_hostname0 = 'server1'
other_pgpool_port0 = 9999
other_wd_port0 = 9000
other_pgpool_hostname1 = 'server2'
other_pgpool_port1 = 9999
other_wd_port1 = 9000
heartbeat_destination0 = 'server1'
heartbeat_destination_port0 = 9694
heartbeat_device0 = ''
heartbeat_destination1 = 'server2'
heartbeat_destination_port1 = 9694
heartbeat_device1 = ''
- pcpコマンドの構成
cd /usr/local/pgpool/bin
echo 'pgpool:'`pg_md5 pgpool` >> /usr/local/pgpool/etc/pcp.conf
設定上記はpgpoolが設定されている、最終的に生成されますpgpool.conf
、、 、、pool_hba.conf
あなたは他のサーバーコピーに設定ファイルの後に設定されている場合があります。注:pgpool.confのウォッチドッグ構成は、他のサーバーで変更する必要があります。pool_passwd
pcp.conf
関連スクリプト
ここでは合計4つのスクリプトが必要です。
- failover.shディレクトリ:
/usr/local/pgpool/etc/
下 - follow_master.shディレクトリ:
/usr/local/pgpool/etc/
下 - recovery_1st_stageディレクトリは、PostgreSQLデータベースのデータディレクトリの下です。
- pgpool_remote_startディレクトリは次のとおりです:PostgreSQLデータベースデータディレクトリ
スクリプトアドレス:https : //github.com/MrSmallLiu/pgpool
スクリプトは公式Webサイトで参照されていますが、少し変更されています。
- レプリケーションスロットを作成および削除するときに、IPアドレスを使用すると、名前が許可されないためエラーが発生します
.
。変更します。${FAILED_NODE_HOST//./_}
- follow_master.shスクリプトのバグ
# drop replication slot
ssh -T -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null postgres@${NEW_MASTER_NODE_HOST} -i ~/.ssh/id_rsa_pgpool "
${PGHOME}/bin/psql -p ${NEW_MASTER_NODE_PORT} -c \"SELECT pg_drop_replication_slot('${FAILED_NODE_HOST//./_}')\"
"
注:
- なお、すべてのスクリプト
PGHOME
変数PostgreSQLのインストールパス - すべてのスクリプトで
ARCHIVEDIR
、使用されていない場合はコメント化する必要があり、対応する使用場所を変更する必要があることに注意してください - すべてのスクリプトの
PGPOOL_PATH
変数pgpool
ビンパスに注意してください - recovery_1st_stageスクリプトであることに注意してください
PRIMARY_NODE_HOST
とる変数hostname
値を、あなたは自分自身のテストサーバでの期待にどうか、コマンドラインで見ることができます。非適合者の使用hostnamectl set-hostname server1
スタート
- バックグラウンドで実行
/usr/local/pgpool/bin/pgpool
- デバッグ実行
/usr/local/pgpool/bin/pgpool -n -d
/usr/local/pgpool/bin/pgpool -n
- スタンバイデータベースが起動します
-n 表示在pgpool.conf配置文件中PostgreSQL配置的后面的序号
/usr/local/pgpool/bin/pcp_recovery_node -h 192.168.111.6 -p 9898 -U pgpool -n 1
Password:
pcp_recovery_node -- Command Successful
/usr/local/pgpool/bin/pcp_recovery_node -h 192.168.111.6 -p 9898 -U pgpool -n 2
Password:
pcp_recovery_node -- Command Successful
やめて
/ usr / local / pgpool / bin / pgpool -m高速停止
テスト中
- クライアント接続を使用(navicat、pgAdminなど)
psql -h 192.168.111.6 -p 9999 -U passwd:postgres - 実行する
show pool_nodes
負荷分散テスト
SQLステートメントを出力するようにPostgreSQLログを設定し、VIPアドレスを使用してテスト出力に接続し、クエリが3つのサーバーにロードされることを確認できます(デフォルトでは、接続に応じて負荷分散が使用され、テストにはいくつかの新しいクエリが必要です)
自動フェイルオーバーテスト
PostgreSQLコマンドを使用してマスターノードデータベースを停止し、フェイルオーバーをテストできます
最後に書く
- 上記の構成は、展開テストの後に正常に実行できますが、この記事は、その後の完了後に作成されたため、一部が省略されている可能性があります。構成プロセス中に質問がある場合、構成後に正常に開始できない場合、またはドキュメントのコメントがある場合は、私に連絡できます。お気軽にお知らせください。ドキュメントを変更して、より多くの人に役立つようにします。
- みんながデプロイメントプロセスを理解できるように、後でpgpoolデプロイメントフローチャートを整理する時間を取ります。
- 構成ファイルの具体的な説明と最適化については、関連するドキュメントの後半で説明します。引き続きご注意ください。
この記事に関して、あなたは批判し、修正することを歓迎します
著者について
GISer
Xiao Liu Xiansen
QQ:1016817543
Eメール:[email protected]
github:https : //github.com/MrSmallLiu(ようこそスター)
関連リンク
以下は、私が開発に参加したいくつかのライブラリです。スター、イシュー、PRへようこそ