日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pgpool-II + postgressql 集群高可用搭建(保姆级文档)

發布時間:2023/12/31 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pgpool-II + postgressql 集群高可用搭建(保姆级文档) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文檔背景:用公司集群實際搭建過程,用心整理文檔.

文檔目的:讓更多的開發者避開坑點快速將集群搭建成功!

正文:

我們使用 CentOS 7.4 的 3 臺服務器。讓這些服務器為server1、 server2、server3。我們在每臺服務器上 安裝PostgreSQL和Pgpool-II 。

表 8-2。主機名和 IP 地址

表 8-3。PostgreSQL 版本和配置

表 8-4。Pgpool-II 版本及配置

注:由于在服務器上9000端口被clickhouse使用,這里我們看門狗的端口改成90001

8.3.3. 安裝
在這個例子中,我們使用 YUM 安裝Pgpool-II和PostgreSQL RPM 包。

使用PostgreSQL YUM 存儲庫 安裝PostgreSQL 。

[所有服務器]# yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm [所有服務器]# yum install -y postgresql11-server

由于Pgpool-II相關軟件包也包含在PostgreSQL YUM 存儲庫中,因此將“排除”設置添加到/etc/yum.repos.d/pgdg-redhat-all.repo 以便不會從PostgreSQL YUM 存儲庫 安裝Pgpool-II 。

[所有服務器]# vi /etc/yum.repos.d/pgdg-redhat-all.repo

以下是/etc/yum.repos.d/pgdg-redhat-all.repo的設置示例。

[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 。

[所有服務器]# yum install -y http://www.pgpool.net/yum/rpms/4.1/redhat/rhel-7-x86_64/pgpool-II-release-4.1-2.noarch.rpm [所有服務器]# yum install -y pgpool-II-pg11-*

8.3.4. 在開始之前
在開始配置過程之前,請檢查以下先決條件。

在主服務器上 設置PostgreSQL流式復制。在這個例子中,我們使用 WAL 歸檔。

首先,我們創建目錄/var/lib/pgsql/archivedir來存儲 所有服務器上的WAL段。在這個例子中,只有 Primary 節點 在本地 歸檔WAL 。

[所有服務器]# su - postgres [所有服務器]$ mkdir /var/lib/pgsql/archivedir

在主服務器上 初始化PostgreSQL 。

[server1]# su - postgres [server1]$ /usr/pgsql-11/bin/initdb -D $PGDATA

然后我們編輯server1 (primary) 上的配置文件$PGDATA/postgresql.conf如下。啟用wal_log_hints 以使用pg_rewind。由于 Primary 可能稍后會成為 Standby,因此我們設置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的在線恢復功能在主服務器啟動后設置備用服務器。

由于安全原因,我們創建了一個用戶repl僅用于復制目的,以及一個用戶pgpool用于Pgpool-II的流復制延遲檢查和健康檢查。

表 8-5。用戶

[server1]# psql -U postgres -p 5432 postgres=# SET password_encryption = 'md5'; postgres=# CREATE ROLE pgpool WITH LOGIN; postgres=# CREATE ROLE repl WITH REPLICATION LOGIN; postgres=# \password root postgres=# \password root postgres=# \password root

如果要在 SHOW POOL NODES命令結果中顯示“replication_state”和“replication_sync_state”列,角色pgpool 需要是 PostgreSQL 超級用戶或pg_monitor組( Pgpool -II 4.1 或更高版本)。將pg_monitor 授予pgpool:

GRANT pg_monitor TO pgpool;

假設所有Pgpool-II服務器和 PostgreSQL服務器在同一個子網中,編輯pg_hba.conf以啟用MD5身份驗證方法。(關鍵)

直接將替換如下:

# 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 的自動故障轉移和在線恢復,允許Pgpool-II執行用戶(默認 root 用戶)和postgres用戶之間以及postgres用戶和postgres用戶之間的所有后端服務器的無密碼SSH 設置是必要的。在所有服務器上執行以下命令以設置無密碼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

設置好后,使用ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool命令確保不輸入密碼也能登錄。如果執行ssh-copy-id失敗,請為postgres用戶設置密碼并暫時允許密碼驗證。

為了允許repl用戶在不指定密碼的情況下進行流復制和在線恢復,并 使用postgres執行pg_rewind,我們在postgres用戶的主目錄中創建.pgpass文件,并將每個PostgreSQL服務器 上的權限更改為 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服務器時,必須通過啟用防火墻管理軟件來訪問目標端口。以下是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 --reload

8.3.5。Pgpool-II配置
8.3.5.1。常用設置
以下是server1、server2和server3上的常用設置。

從 RPM 安裝Pgpool-II時,所有Pgpool-II配置文件都在/etc/pgpool-II中。在此示例中,我們復制流復制模式的示例配置文件。

# cp -p /etc/pgpool-II/pgpool.conf.sample-stream /etc/pgpool-II/pgpool.conf

為了允許 Pgpool-II 接受所有傳入的連接,我們設置了listen_addresses = ‘*’。

listen_addresses = '*'

配置服務器node節點信息

[all servers]vi /etc/pgpool-II/pgpool_node_id

根據設備順序,填入數字,0,1,2…

指定復制延遲檢查用戶和密碼。在此示例中,我們將 sr_check_user留空,并在pool_passwd中創建條目。從Pgpool-II 4.0 開始,如果這些參數留空, Pgpool-II將首先嘗試從sr_check_password文件中獲取該特定用戶的密碼,然后再使用空密碼。

sr_check_user = 'pgpool' sr_check_password = ''

啟用健康檢查,以便Pgpool-II執行故障轉移。此外,如果網絡不穩定,即使后端運行正常,健康檢查也會失敗,可能會出現故障轉移或退化操作。為了防止這種健康檢查的錯誤檢測,我們設置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后端信息。可以通過在參數名稱末尾添加一個數字來指定多個后端。

- 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。故障轉移配置
在failover_command 參數 中指定故障轉移后要執行的 failover.sh 腳本。如果我們使用 3 個 PostgreSQL 服務器,我們需要指定 follow_master_command 在主節點故障轉移后運行。如果有兩個 PostgreSQL 服務器,follow_master_command 設置不是必需的。

Pgpool-II在執行腳本時將以下特殊字符替換為后端特定信息。有關每個字符的更多詳細信息,請參見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/中。使用這些示例文件創建故障轉移腳本。

[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}

基本上,如果您根據 PostgreSQL 安裝目錄 更改PGHOME ,它應該可以工作。

[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用戶創建加密密碼條目,如下所示:

[all servers]# echo 'pgpool:'`pg_md5 passowrd` >> /etc/pgpool-II/pcp.conf

由于follow_master.sh腳本必須在不輸入密碼的情況下執行PCP命令,所以我們需要在每臺服務器的Pgpool -II啟動用戶(postgres用戶) 的主目錄下 創建.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 在線恢復配置
接下來,為了使用Pgpool-II執行在線恢復,我們指定PostgreSQL用戶名和在線恢復命令 recovery_1st_stage。因為 執行在線恢復需要PostgreSQL中的超級用戶權限,所以我們在recovery_user中指定postgres用戶。然后,我們在PostgreSQL主服務器(server1) 的數據庫集群目錄下創建recovery_1st_stage和pgpool_remote_start,并添加執行權限。

recovery_user = 'postgres' recovery_password = '' recovery_1st_stage_command = 'recovery_1st_stage'

在線恢復示例腳本recovery_1st_stage 和pgpool_remote_start 安裝在/etc/pgpool-II/中。將這些文件復制到主服務器 (server1) 的數據目錄。

[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}

基本上,如果您根據 PostgreSQL 安裝目錄 更改PGHOME ,它應該可以工作。

[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 ...

為了使用在線恢復功能,pgpool_recovery所以我們需要安裝 在PostgreSQL服務器 server1的 template1 上。

[server1]# su - postgres [server1]$ psql template1 -c "CREATE EXTENSION pgpool_recovery"

注意: recovery_1st_stage腳本不支持表空間。如果您正在使用表空間,則需要修改腳本以支持表空間。

8.3.5.4。客戶端認證配置
因為在開始前一節中,我們已經將PostgreSQL認證方式設置為 scram-sha-256,所以需要通過 Pgpool-II設置客戶端認證來連接后端節點。使用 RPM 安裝時, Pgpool -II配置文件 pool_hba.conf位于/etc/pgpool-II中。默認情況下,pool_hba 身份驗證被禁用,設置enable_pool_hba = on 以啟用它。

enable_pool_hba = on

pool_hba.conf文件 的格式非常接近 PostgreSQL 的 pg_hba.conf格式。將pgpool和postgres用戶的身份驗證方法設置為scram-sha-256。(關鍵)

直接替換如下:

# 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文件,它將被創建在與 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_passwd

postgres:md52a29a4f7eb0a98abca0992ca3fb555b6
pgpool:md5bc458983af9a98798fefe59c1a81b8bd

8.3.5.5。看門狗配置
在server1、server2、server3 上啟用看門狗功能。

use_watchdog = on

指定接受來自 server1、server2、server3上的客戶端連接的虛擬 IP 地址。確保尚未使用設置為虛擬 IP 的 IP 地址。

delegate_IP = '172.16.1.252'

為了啟動/關閉虛擬 IP 并發送 ARP 請求,我們設置了 if_up_cmd、if_down_cmd和arping_cmd。此示例中使用的網絡接口是“enp0s8”。由于執行if_up/down_cmd或 arping_cmd命令需要 root 權限,因此在這些命令上使用 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

這里我們配置以下參數以使用 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 根據實際網卡填寫 ifconfig命令查看

根據命令路徑 設置if_cmd_path和arping_path 。如果if_up/down_cmd或arping_cmd以“/”開頭,這些參數將被忽略。

if_cmd_path = '/sbin' arping_path = '/usr/sbin'

指定每個Pgpool-II服務器 的主機名和端口號。

server1

wd_hostname = 'server1' wd_port = 9001

server2

wd_hostname = 'server2' wd_port = 9001

server3

wd_hostname = 'server3' wd_port = 9001

指定每個Pgpool- II 服務器上受監控的 Pgpool-II服務器的主機名、 Pgpool-II端口號和看門狗端口號。

server1

- 其他 pgpool 連接設置 -

other_pgpool_hostname0 = 'server2' other_pgpool_port0 = 9999 other_wd_port0 = 9001 other_pgpool_hostname1 = 'server3' other_pgpool_port1 = 9999 other_wd_port1 = 9001

服務器2

- 其他 pgpool 連接設置 -

other_pgpool_hostname0 = 'server1' other_pgpool_port0 = 9999 other_wd_port0 = 9001 other_pgpool_hostname1 = 'server3' other_pgpool_port1 = 9999 other_wd_port1 = 9001

服務器3

- 其他 pgpool 連接設置 -

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 上指定發送心跳信號的目標主機名和端口號。

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” 。

[all servers]# vi /etc/sysconfig/pgpool ... OPTS=" -D -n"

8.3.5.7。日志記錄
在示例中,我們將Pgpool-II的日志輸出到syslog。

log_destination = 'syslog' syslog_facility = 'LOCAL1'

創建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

設置 logrotate 與/var/log/messages相同。

[all servers]# vi /etc/logrotate.d/syslog ... /var/log/messages /var/log/pgpool-II/pgpool.log /var/log/secure

重新啟動 rsyslog 服務。

[all servers]# systemctl restart rsyslog

Pgpool-II 的設置完成。

8.3.6. 啟動/停止 Pgpool-II
接下來我們啟動Pgpool-II。在啟動 Pgpool-II之前,請先啟動 PostgreSQL服務器。另外,停止PostgreSQL時,需要先停止 Pgpool-II。

啟動Pgpool-II

在開始之前的 部分,我們已經設置了Pgpool-II的自動啟動。要啟動 Pgpool-II,請重新啟動整個系統或執行以下命令。

# systemctl start pgpool.service

停止Pgpool-II

# systemctl stop pgpool.service

8.3.7.1。設置 PostgreSQL 備用服務器
首先,我們應該使用Pgpool-II在線恢復功能 設置PostgreSQL備用服務器。確保pcp_recovery_node命令使用的recovery_1st_stage和pgpool_remote_start 腳本位于PostgreSQL主服務器 ( server1 ) 的數據庫集群目錄中。

# pcp_recovery_node -h 172.16.1.221 -p 9898 -U pgpool -n 1

密碼:
pcp_recovery_node – Command Successful

# pcp_recovery_node -h 172.16.1.221 -p 9898 -U pgpool -n 2

密碼:
pcp_recovery_node – Command Successful

數據庫數據地址:
/var/lib/pgsql/11/data/
pgpool數據地址:
/etc/pgpool_II

相關命令:

初始化數據庫:

/usr/pgsql-11/bin/initdb -D /var/lib/pgsql/11/data

查看數據庫集群狀態:

psql -h 172.16.1.252 -p 9999 -U pgpool postgres -c "show pool_nodes"

查看pool集群狀態:

pcp_watchdog_info -h 172.16.1.252 -p 9898 -U pgpool

啟動數據庫服務:

/usr/pgsql-11/bin/pg_ctl start -D /var/lib/pgsql/11/data

啟動停止pgpool:

systemctl stop pgpool.service systemctl start pgpool.service

手動在線恢復恢復數據庫:

pcp_recovery_node -h 172.16.1.252 -p 9898 -U pgpool -n 1

查看pgpool日志:

tail -n 500 /var/log/pgpool-II/pgpool.log

查看數據庫日志:

tail -n 500 /var/lib/pgsql/11/data/log/postgresql-Mon.log

手動將節點添加到集群:

pcp_attach_node -d -U postgres -h 172.16.1.252 -p 9898 -n 1

快速停掉數據庫:

/usr/pgsql-11/bin/pg_ctl -D /var/lib/pgsql/11/data -m immediate stop

總結

以上是生活随笔為你收集整理的pgpool-II + postgressql 集群高可用搭建(保姆级文档)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。