pgpool-II + postgressql 集群高可用搭建(保姆级文档)
文檔背景:用公司集群實際搭建過程,用心整理文檔.
文檔目的:讓更多的開發(fā)者避開坑點快速將集群搭建成功!
正文:
我們使用 CentOS 7.4 的 3 臺服務(wù)器。讓這些服務(wù)器為server1、 server2、server3。我們在每臺服務(wù)器上 安裝PostgreSQL和Pgpool-II 。
表 8-2。主機名和 IP 地址
表 8-3。PostgreSQL 版本和配置
表 8-4。Pgpool-II 版本及配置
注:由于在服務(wù)器上9000端口被clickhouse使用,這里我們看門狗的端口改成90001
8.3.3. 安裝
在這個例子中,我們使用 YUM 安裝Pgpool-II和PostgreSQL RPM 包。
使用PostgreSQL YUM 存儲庫 安裝PostgreSQL 。
[所有服務(wù)器]# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm [所有服務(wù)器]# yum install -y postgresql11-server由于Pgpool-II相關(guān)軟件包也包含在PostgreSQL YUM 存儲庫中,因此將“排除”設(shè)置添加到/etc/yum.repos.d/pgdg-redhat-all.repo 以便不會從PostgreSQL YUM 存儲庫 安裝Pgpool-II 。
[所有服務(wù)器]# vi /etc/yum.repos.d/pgdg-redhat-all.repo以下是/etc/yum.repos.d/pgdg-redhat-all.repo的設(shè)置示例。
[pgdg-common] ... exclude=pgpool*[pgdg14] ... exclude=pgpool*[pgdg13] ... exclude=pgpool*[pgdg12] ... exclude=pgpool*[pgdg11] ... exclude=pgpool*[pgdg10] ... exclude=pgpool*[pgdg96] ... exclude=pgpool*從 Pgpool-II YUM 存儲庫 安裝Pgpool-II 。
[所有服務(wù)器]# yum install -y http://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-release-4.1-2.noarch.rpm [所有服務(wù)器]# yum install -y pgpool-II-pg11-*8.3.4. 在開始之前
在開始配置過程之前,請檢查以下先決條件。
在主服務(wù)器上 設(shè)置PostgreSQL流式復(fù)制。在這個例子中,我們使用 WAL 歸檔。
首先,我們創(chuàng)建目錄/var/lib/pgsql/archivedir來存儲 所有服務(wù)器上的WAL段。在這個例子中,只有 Primary 節(jié)點 在本地 歸檔WAL 。
[所有服務(wù)器]# su - postgres [所有服務(wù)器]$ mkdir /var/lib/pgsql/archivedir在主服務(wù)器上 初始化PostgreSQL 。
[server1]# su - postgres [server1]$ /usr/pgsql-11/bin/initdb -D $PGDATA然后我們編輯server1 (primary) 上的配置文件$PGDATA/postgresql.conf如下。啟用wal_log_hints 以使用pg_rewind。由于 Primary 可能稍后會成為 Standby,因此我們設(shè)置hot_standby = on。
listen_addresses = '*' archive_mode = on archive_command = 'cp "%p" "/var/lib/pgsql/archivedir/%f"' max_wal_senders = 10 max_replication_slots = 10 wal_level = replica hot_standby = on wal_log_hints = on我們使用Pgpool-II的在線恢復(fù)功能在主服務(wù)器啟動后設(shè)置備用服務(wù)器。
由于安全原因,我們創(chuàng)建了一個用戶repl僅用于復(fù)制目的,以及一個用戶pgpool用于Pgpool-II的流復(fù)制延遲檢查和健康檢查。
表 8-5。用戶
如果要在 SHOW POOL NODES命令結(jié)果中顯示“replication_state”和“replication_sync_state”列,角色pgpool 需要是 PostgreSQL 超級用戶或pg_monitor組( Pgpool -II 4.1 或更高版本)。將pg_monitor 授予pgpool:
GRANT pg_monitor TO pgpool;假設(shè)所有Pgpool-II服務(wù)器和 PostgreSQL服務(wù)器在同一個子網(wǎng)中,編輯pg_hba.conf以啟用MD5身份驗證方法。(關(guān)鍵)
直接將替換如下:
# TYPE DATABASE USER ADDRESS METHOD# "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust host all all 0.0.0.0/0 trust host replication repl samenet trust要使用Pgpool-II 的自動故障轉(zhuǎn)移和在線恢復(fù),允許Pgpool-II執(zhí)行用戶(默認 root 用戶)和postgres用戶之間以及postgres用戶和postgres用戶之間的所有后端服務(wù)器的無密碼SSH 設(shè)置是必要的。在所有服務(wù)器上執(zhí)行以下命令以設(shè)置無密碼SSH。生成的密鑰文件名為id_rsa_pgpool。
[all servers]# mkdir ~/.ssh [all servers]# chmod 700 ~/.ssh [all servers]# cd ~/.ssh [all servers]$ ssh-keygen -t rsa -f id_rsa_pgpool [all servers]# ssh-copy-id postgres@server1 [all servers]# ssh-copy-id postgres@server2 [all servers]# ssh-copy-id postgres@server3[all servers]# su - postgres [all servers]$ mkdir ~/.ssh [all servers]$ chmod 700 ~/.ssh [all servers]$ cd ~/.ssh [all servers]$ ssh-keygen -t rsa -f id_rsa_pgpool [all servers]$ ssh-copy-id postgres@server1 [all servers]$ ssh-copy-id postgres@server2 [all servers]$ ssh-copy-id postgres@server3最新版本沒有ssh-copy-id命令 用如下命令替代
cat ~/.ssh/id_*.pub|ssh postgres@172.16.1.185 'cat>> ~/.ssh/authorized_keys' cat ~/.ssh/id_*.pub|ssh postgres@172.16.1.193 'cat>> ~/.ssh/authorized_keys' cat ~/.ssh/id_*.pub|ssh postgres@172.16.1.198 'cat>> ~/.ssh/authorized_keys' vi /etc/ssh/ssh.config添加一行 配置讀取秘鑰文件
IdentityFile ~/.ssh/id_rsa_pgpool設(shè)置好后,使用ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool命令確保不輸入密碼也能登錄。如果執(zhí)行ssh-copy-id失敗,請為postgres用戶設(shè)置密碼并暫時允許密碼驗證。
為了允許repl用戶在不指定密碼的情況下進行流復(fù)制和在線恢復(fù),并 使用postgres執(zhí)行pg_rewind,我們在postgres用戶的主目錄中創(chuàng)建.pgpass文件,并將每個PostgreSQL服務(wù)器 上的權(quán)限更改為 600 。
[all servers]# su - postgres [all servers]$ vi /var/lib/pgsql/.pgpass server1:5432:replication:repl:<repl user password> server2:5432:replication:repl:<repl user password> server3:5432:replication:repl:<repl user password> server1:5432:postgres:postgres:<postgres user password> server2:5432:postgres:postgres:<postgres user password> server3:5432:postgres:postgres:<postgres user password> [all servers]$ chmod 600 /var/lib/pgsql/.pgpass連接Pgpool-II和PostgreSQL服務(wù)器時,必須通過啟用防火墻管理軟件來訪問目標端口。以下是CentOS/RHEL7的示例。
[all servers]# firewall-cmd --permanent --zone=public --add-service=postgresql [all servers]# firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9001/tcp --add-port=9694/udp [all servers]# firewall-cmd --reload8.3.5。Pgpool-II配置
8.3.5.1。常用設(shè)置
以下是server1、server2和server3上的常用設(shè)置。
從 RPM 安裝Pgpool-II時,所有Pgpool-II配置文件都在/etc/pgpool-II中。在此示例中,我們復(fù)制流復(fù)制模式的示例配置文件。
# cp -p /etc/pgpool-II/pgpool.conf.sample-stream /etc/pgpool-II/pgpool.conf為了允許 Pgpool-II 接受所有傳入的連接,我們設(shè)置了listen_addresses = ‘*’。
listen_addresses = '*'配置服務(wù)器node節(jié)點信息
[all servers]vi /etc/pgpool-II/pgpool_node_id根據(jù)設(shè)備順序,填入數(shù)字,0,1,2…
指定復(fù)制延遲檢查用戶和密碼。在此示例中,我們將 sr_check_user留空,并在pool_passwd中創(chuàng)建條目。從Pgpool-II 4.0 開始,如果這些參數(shù)留空, Pgpool-II將首先嘗試從sr_check_password文件中獲取該特定用戶的密碼,然后再使用空密碼。
sr_check_user = 'pgpool' sr_check_password = ''啟用健康檢查,以便Pgpool-II執(zhí)行故障轉(zhuǎn)移。此外,如果網(wǎng)絡(luò)不穩(wěn)定,即使后端運行正常,健康檢查也會失敗,可能會出現(xiàn)故障轉(zhuǎn)移或退化操作。為了防止這種健康檢查的錯誤檢測,我們設(shè)置health_check_max_retries = 3。以與sr_check_user和sr_check_password相同的方式指定health_check_user和health_check_password。
health_check_period = 5 health_check_timeout = 30 health_check_user = 'pgpool' health_check_password = '' health_check_max_retries = 3指定PostgreSQL后端信息。可以通過在參數(shù)名稱末尾添加一個數(shù)字來指定多個后端。
- Backend Connection Settings -
backend_hostname0 = 'server1' backend_port0 = 5432 backend_weight0 = 1 backend_data_directory0 = '/var/lib/pgsql/11/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_application_name0 = 'server1' backend_hostname1 = 'server2' backend_port1 = 5432 backend_weight1 = 1 backend_data_directory1 = '/var/lib/pgsql/11/data' backend_flag1 = 'ALLOW_TO_FAILOVER' backend_application_name1 = 'server2'backend_hostname2 = 'server3' backend_port2 = 5432 backend_weight2 = 1 backend_data_directory2 = '/var/lib/pgsql/11/data' backend_flag2 = 'ALLOW_TO_FAILOVER' backend_application_name2 = 'server3'8.3.5.2。故障轉(zhuǎn)移配置
在failover_command 參數(shù) 中指定故障轉(zhuǎn)移后要執(zhí)行的 failover.sh 腳本。如果我們使用 3 個 PostgreSQL 服務(wù)器,我們需要指定 follow_master_command 在主節(jié)點故障轉(zhuǎn)移后運行。如果有兩個 PostgreSQL 服務(wù)器,follow_master_command 設(shè)置不是必需的。
Pgpool-II在執(zhí)行腳本時將以下特殊字符替換為后端特定信息。有關(guān)每個字符的更多詳細信息,請參見failover_command。
failover_command = '/etc/pgpool-II/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S' follow_master_command = '/etc/pgpool-II/follow_master.sh %d %h %p %D %m %H %M %P %r %R'注意: %N和%S是在Pgpool-II 4.1 中添加的。請注意,如果使用 Pgpool-II 4.0 或更早版本,則無法指定這些字符。
示例腳本failover.sh 和follow_master.sh 安裝在/etc/pgpool-II/中。使用這些示例文件創(chuàng)建故障轉(zhuǎn)移腳本。
[all servers]# cp -p /etc/pgpool-II/failover.sh{.sample,} [all servers]# cp -p /etc/pgpool-II/follow_master.sh{.sample,} [all servers]# chown postgres:postgres /etc/pgpool-II/{failover.sh,follow_master.sh}基本上,如果您根據(jù) PostgreSQL 安裝目錄 更改PGHOME ,它應(yīng)該可以工作。
[server1]# vi /etc/pgpool-II/failover.sh ... PGHOME=/usr/pgsql-11 ...[server1]# vi /etc/pgpool-II/follow_master.sh ... PGHOME=/usr/pgsql-11 ...將ssh腳本文件改成 默認名稱
由于使用follow_master_command腳本中的PCP命令 需要用戶認證,我們需要在pcp.conf中以“用戶名:加密密碼” 的格式指定用戶名和md5加密密碼。
如果在follow_master.sh的PCP_USER中指定了pgpool用戶,
# cat /etc/pgpool-II/follow_master.sh ... PCP_USER=pgpool ...將ssh腳本文件改成 默認名稱
然后我們使用pg_md5為pgpool用戶創(chuàng)建加密密碼條目,如下所示:
由于follow_master.sh腳本必須在不輸入密碼的情況下執(zhí)行PCP命令,所以我們需要在每臺服務(wù)器的Pgpool -II啟動用戶(postgres用戶) 的主目錄下 創(chuàng)建.pcppass 。
[all servers]# su - postgres [all servers]$ echo 'localhost:9898:pgpool:<pgpool user password>' > ~/.pcppass [all servers]$ chmod 600 ~/.pcppass注意:follow_master.sh 腳本不支持表空間。如果您正在使用表空間,則需要修改腳本以支持表空間。
8.3.5.3。Pgpool-II 在線恢復(fù)配置
接下來,為了使用Pgpool-II執(zhí)行在線恢復(fù),我們指定PostgreSQL用戶名和在線恢復(fù)命令 recovery_1st_stage。因為 執(zhí)行在線恢復(fù)需要PostgreSQL中的超級用戶權(quán)限,所以我們在recovery_user中指定postgres用戶。然后,我們在PostgreSQL主服務(wù)器(server1) 的數(shù)據(jù)庫集群目錄下創(chuàng)建recovery_1st_stage和pgpool_remote_start,并添加執(zhí)行權(quán)限。
在線恢復(fù)示例腳本recovery_1st_stage 和pgpool_remote_start 安裝在/etc/pgpool-II/中。將這些文件復(fù)制到主服務(wù)器 (server1) 的數(shù)據(jù)目錄。
[server1]# cp -p /etc/pgpool-II/recovery_1st_stage.sample /var/lib/pgsql/11/data/recovery_1st_stage [server1]# cp -p /etc/pgpool-II/pgpool_remote_start.sample /var/lib/pgsql/13/data/pgpool_remote_start [server1]# chown postgres:postgres /var/lib/pgsql/11/data/{recovery_1st_stage,pgpool_remote_start}基本上,如果您根據(jù) PostgreSQL 安裝目錄 更改PGHOME ,它應(yīng)該可以工作。
[server1]# vi /var/lib/pgsql/11/data/recovery_1st_stage ... PGHOME=/usr/pgsql-11 ... [server1]# vi /var/lib/pgsql/11/data/pgpool_remote_start ... PGHOME=/usr/pgsql-11 ...為了使用在線恢復(fù)功能,pgpool_recovery所以我們需要安裝 在PostgreSQL服務(wù)器 server1的 template1 上。
[server1]# su - postgres [server1]$ psql template1 -c "CREATE EXTENSION pgpool_recovery"注意: recovery_1st_stage腳本不支持表空間。如果您正在使用表空間,則需要修改腳本以支持表空間。
8.3.5.4。客戶端認證配置
因為在開始前一節(jié)中,我們已經(jīng)將PostgreSQL認證方式設(shè)置為 scram-sha-256,所以需要通過 Pgpool-II設(shè)置客戶端認證來連接后端節(jié)點。使用 RPM 安裝時, Pgpool -II配置文件 pool_hba.conf位于/etc/pgpool-II中。默認情況下,pool_hba 身份驗證被禁用,設(shè)置enable_pool_hba = on 以啟用它。
pool_hba.conf文件 的格式非常接近 PostgreSQL 的 pg_hba.conf格式。將pgpool和postgres用戶的身份驗證方法設(shè)置為scram-sha-256。(關(guān)鍵)
直接替換如下:
# TYPE DATABASE USER CIDR-ADDRESS METHOD# "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust host all all ::1/128 trust host all pgpool 0.0.0.0/0 trust host all postgres 0.0.0.0/0 trust host all all 0.0.0.0/0 trust host replication repl 0.0.0.0/0 trust生成pool_passwd文件,它將被創(chuàng)建在與 pgpool.conf相同的目錄中。
[all servers]# su - postgres [all servers]$ pg_md5 -p -m -u postgres pool_passwd password: [pgpool user's password] [all servers]$ pg_md5 -p -m -u pgpool pool_passwd password: [postgres user's passowrd] # cat /etc/pgpool-II/pool_passwdpostgres:md52a29a4f7eb0a98abca0992ca3fb555b6
pgpool:md5bc458983af9a98798fefe59c1a81b8bd
8.3.5.5。看門狗配置
在server1、server2、server3 上啟用看門狗功能。
指定接受來自 server1、server2、server3上的客戶端連接的虛擬 IP 地址。確保尚未使用設(shè)置為虛擬 IP 的 IP 地址。
delegate_IP = '172.16.1.252'為了啟動/關(guān)閉虛擬 IP 并發(fā)送 ARP 請求,我們設(shè)置了 if_up_cmd、if_down_cmd和arping_cmd。此示例中使用的網(wǎng)絡(luò)接口是“enp0s8”。由于執(zhí)行if_up/down_cmd或 arping_cmd命令需要 root 權(quán)限,因此在這些命令上使用 setuid 或允許 Pgpool-II啟動用戶、postgres用戶(Pgpool-II 4.1 或更高版本)在沒有密碼的情況下 運行sudo命令。
注意: 如果使用 RPM 安裝Pgpool-II,則postgres 用戶已配置為通過sudo運行ip/arping ,無需密碼。
postgres ALL=NOPASSWD: /sbin/ip postgres ALL=NOPASSWD: /usr/sbin/arping這里我們配置以下參數(shù)以使用 sudo 運行if_up/down_cmd或arping_cmd。
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev em1 label em1:0' if_down_cmd = '/usr/bin/sudo /sbin/$_IP_$/24 dev em1 的 IP 地址' arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I em1'注:em1 根據(jù)實際網(wǎng)卡填寫 ifconfig命令查看
根據(jù)命令路徑 設(shè)置if_cmd_path和arping_path 。如果if_up/down_cmd或arping_cmd以“/”開頭,這些參數(shù)將被忽略。
if_cmd_path = '/sbin' arping_path = '/usr/sbin'指定每個Pgpool-II服務(wù)器 的主機名和端口號。
server1
wd_hostname = 'server1' wd_port = 9001server2
wd_hostname = 'server2' wd_port = 9001server3
wd_hostname = 'server3' wd_port = 9001指定每個Pgpool- II 服務(wù)器上受監(jiān)控的 Pgpool-II服務(wù)器的主機名、 Pgpool-II端口號和看門狗端口號。
server1
- 其他 pgpool 連接設(shè)置 -
other_pgpool_hostname0 = 'server2' other_pgpool_port0 = 9999 other_wd_port0 = 9001 other_pgpool_hostname1 = 'server3' other_pgpool_port1 = 9999 other_wd_port1 = 9001服務(wù)器2
- 其他 pgpool 連接設(shè)置 -
other_pgpool_hostname0 = 'server1' other_pgpool_port0 = 9999 other_wd_port0 = 9001 other_pgpool_hostname1 = 'server3' other_pgpool_port1 = 9999 other_wd_port1 = 9001服務(wù)器3
- 其他 pgpool 連接設(shè)置 -
other_pgpool_hostname0 = 'server1' other_pgpool_port0 = 9999 other_wd_port0 = 9001 other_pgpool_hostname1 = 'server2' other_pgpool_port1 = 9999 other_wd_port1 = 9001在server1、server2、server3 上指定發(fā)送心跳信號的目標主機名和端口號。
server1
heartbeat_destination0 = 'server2' heartbeat_destination_port0 = 9694 heartbeat_device0 = '' heartbeat_destination1 = 'server3' heartbeat_destination_port1 = 9694 heartbeat_device1 = ''server2
heartbeat_destination0 = 'server1' heartbeat_destination_port0 = 9694 heartbeat_device0 = '' heartbeat_destination1 = 'server3' heartbeat_destination_port1 = 9694 heartbeat_device1 = ''server3
heartbeat_destination0 = 'server1' heartbeat_destination_port0 = 9694 heartbeat_device0 = '' heartbeat_destination1 = 'server2' heartbeat_destination_port1 = 9694 heartbeat_device1 = ''8.3.5.6。/etc/sysconfig/pgpool 配置
如果您想在Pgpool -II啟動時忽略pgpool_status文件, 請在/etc/sysconfig/pgpool的啟動選項 OPTS 中添加“-D” 。
8.3.5.7。日志記錄
在示例中,我們將Pgpool-II的日志輸出到syslog。
創(chuàng)建Pgpool-II日志文件。
[all servers]# mkdir /var/log/pgpool-II [all servers]# touch /var/log/pgpool-II/pgpool.log編輯 syslog /etc/rsyslog.conf的配置文件。
[all servers]# vi /etc/rsyslog.conf…
*.info;mail.none;authpriv.none;cron.none;LOCAL1.none /var/log/messages LOCAL1.* /var/log/pgpool-II/pgpool.log設(shè)置 logrotate 與/var/log/messages相同。
[all servers]# vi /etc/logrotate.d/syslog ... /var/log/messages /var/log/pgpool-II/pgpool.log /var/log/secure重新啟動 rsyslog 服務(wù)。
[all servers]# systemctl restart rsyslogPgpool-II 的設(shè)置完成。
8.3.6. 啟動/停止 Pgpool-II
接下來我們啟動Pgpool-II。在啟動 Pgpool-II之前,請先啟動 PostgreSQL服務(wù)器。另外,停止PostgreSQL時,需要先停止 Pgpool-II。
啟動Pgpool-II
在開始之前的 部分,我們已經(jīng)設(shè)置了Pgpool-II的自動啟動。要啟動 Pgpool-II,請重新啟動整個系統(tǒng)或執(zhí)行以下命令。
# systemctl start pgpool.service停止Pgpool-II
# systemctl stop pgpool.service8.3.7.1。設(shè)置 PostgreSQL 備用服務(wù)器
首先,我們應(yīng)該使用Pgpool-II在線恢復(fù)功能 設(shè)置PostgreSQL備用服務(wù)器。確保pcp_recovery_node命令使用的recovery_1st_stage和pgpool_remote_start 腳本位于PostgreSQL主服務(wù)器 ( server1 ) 的數(shù)據(jù)庫集群目錄中。
密碼:
pcp_recovery_node – Command Successful
密碼:
pcp_recovery_node – Command Successful
數(shù)據(jù)庫數(shù)據(jù)地址:
/var/lib/pgsql/11/data/pgpool數(shù)據(jù)地址:
/etc/pgpool_II相關(guān)命令:
初始化數(shù)據(jù)庫:
/usr/pgsql-11/bin/initdb -D /var/lib/pgsql/11/data查看數(shù)據(jù)庫集群狀態(tài):
psql -h 172.16.1.252 -p 9999 -U pgpool postgres -c "show pool_nodes"查看pool集群狀態(tài):
pcp_watchdog_info -h 172.16.1.252 -p 9898 -U pgpool啟動數(shù)據(jù)庫服務(wù):
/usr/pgsql-11/bin/pg_ctl start -D /var/lib/pgsql/11/data啟動停止pgpool:
systemctl stop pgpool.service systemctl start pgpool.service手動在線恢復(fù)恢復(fù)數(shù)據(jù)庫:
pcp_recovery_node -h 172.16.1.252 -p 9898 -U pgpool -n 1查看pgpool日志:
tail -n 500 /var/log/pgpool-II/pgpool.log查看數(shù)據(jù)庫日志:
tail -n 500 /var/lib/pgsql/11/data/log/postgresql-Mon.log手動將節(jié)點添加到集群:
pcp_attach_node -d -U postgres -h 172.16.1.252 -p 9898 -n 1快速停掉數(shù)據(jù)庫:
/usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data -m immediate stop總結(jié)
以上是生活随笔為你收集整理的pgpool-II + postgressql 集群高可用搭建(保姆级文档)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac安装破解软件提示已损坏
- 下一篇: 【事项】ROV设计过程