搭建PostgreSQL主從架構(gòu)
PostgreSQL是一個開源數(shù)據(jù)庫,以其強(qiáng)大的功能、標(biāo)準(zhǔn)合規(guī)性、可靠性和擴(kuò)展性受到廣泛認(rèn)可和采用。PostgreSQL遵循SQL標(biāo)準(zhǔn),支持NoSQL數(shù)據(jù)類型(JSON/XML/hstore)遞歸查詢、全文搜索、GIS地理信息處理等,能夠應(yīng)對各種復(fù)雜數(shù)據(jù)分析需求。廣泛應(yīng)用于互聯(lián)網(wǎng)網(wǎng)站、企業(yè)級應(yīng)用后端、數(shù)據(jù)倉庫與分析平臺、位置應(yīng)用系統(tǒng)、復(fù)雜數(shù)據(jù)對象處理等應(yīng)用場景。本文檔介紹如何在CentOS 7.x操作系統(tǒng)的ECS實(shí)例上搭建PostgreSQL主從架構(gòu)。
準(zhǔn)備工作
本教程適用于熟悉云服務(wù)器ECS、Linux系統(tǒng)、PostgreSQL的阿里云用戶。
搭建PostgreSQL主從復(fù)制架構(gòu),需要創(chuàng)建2臺專有網(wǎng)絡(luò)類型的ECS實(shí)例,一臺ECS實(shí)例作為主節(jié)點(diǎn),另一臺ECS實(shí)例作為從節(jié)點(diǎn)。創(chuàng)建的ECS實(shí)例需要滿足以下條件,更多參數(shù)說明,請參見自定義購買實(shí)例。
操作系統(tǒng):PostgreSQL支持多種操作系統(tǒng),本文以CentOS 7.x為例。
Alibaba Cloud Linux 3/2不支持本文使用的YUM源安裝方式,建議您使用源碼安裝。更多其他操作系統(tǒng)安裝方式,請參見PostgreSQL官網(wǎng)。
實(shí)例規(guī)格:PostgreSQL主從架構(gòu)并沒有嚴(yán)格的規(guī)格限制,具體的規(guī)格選擇應(yīng)基于詳細(xì)的容量規(guī)劃、性能測試和業(yè)務(wù)增長預(yù)測。
公網(wǎng)IP:建議您不為ECS實(shí)例分配公網(wǎng)IP,按需購買彈性公網(wǎng)IP綁定至ECS實(shí)例,后續(xù)您可以根據(jù)實(shí)際情況考慮升級配置或調(diào)優(yōu)架構(gòu)。詳情請參見申請彈性公網(wǎng)IP。
安全組:已在安全組內(nèi)添加入方向規(guī)則放行80、22、5432端口。具體操作,請參見添加安全組規(guī)則。
步驟一:配置PostgreSQL主節(jié)點(diǎn)
遠(yuǎn)程連接PostgreSQL主節(jié)點(diǎn)。
具體操作,請參見通過密碼或密鑰認(rèn)證登錄Linux實(shí)例。
安裝PostgreSQL。
運(yùn)行以下命令,添加PostgreSQL官方Y(jié)UM倉庫。
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
安裝PostgreSQL 15。
sudo yum install -y postgresql15-server
說明本教程以PostgreSQL 15版本為例。您可以根據(jù)業(yè)務(wù)需求選擇合適的版本。
初始化PostgreSQL數(shù)據(jù)庫。
sudo /usr/pgsql-15/bin/postgresql-15-setup initdb
回顯如下所示時,說明PostgreSQL數(shù)據(jù)庫已初始化完成。
依次運(yùn)行以下命令,啟動服務(wù)并設(shè)置服務(wù)開機(jī)自啟動。
sudo systemctl enable postgresql-15 sudo systemctl start postgresql-15
在主節(jié)點(diǎn)上創(chuàng)建數(shù)據(jù)庫賬號replica(用于主從復(fù)制),并設(shè)置密碼及登錄權(quán)限和備份權(quán)限。
運(yùn)行以下命令,登錄postgres用戶。
sudo su - postgres
回顯結(jié)果出現(xiàn)
-bash-4.2$
時表示成功登錄。輸入以下命令,進(jìn)入PostgreSQL交互終端。
psql
回顯結(jié)果出現(xiàn)
postgres=#
時表示成功進(jìn)入交互終端。運(yùn)行以下命令,為用戶
postgres
設(shè)置密碼,增強(qiáng)安全性。ALTER USER postgres WITH PASSWORD 'YourPassWord';
輸入以下SQL語句創(chuàng)建數(shù)據(jù)庫賬號,并設(shè)置密碼、登錄權(quán)限和備份權(quán)限。
CREATE ROLE user login replication encrypted password 'YourPassWord';
本示例中創(chuàng)建數(shù)據(jù)庫賬號replica,并將密碼設(shè)置為
replica
。CREATE ROLE replica login replication encrypted password 'replica';
查詢賬號是否創(chuàng)建成功。
SELECT usename from pg_user;
返回結(jié)果如下,表示已創(chuàng)建成功。
查詢權(quán)限是否創(chuàng)建成功。
SELECT rolname from pg_roles;
返回結(jié)果如下,表示已創(chuàng)建成功。
輸入以下命令,按
Enter
鍵退出SQL終端。\q
輸入以下命令,按
Enter
鍵退出PostgreSQL。exit
設(shè)置replica用戶白名單。
運(yùn)行以下命令,打開pg_hba.conf文件。
sudo vim /var/lib/pgsql/15/data/pg_hba.conf
按
i
鍵進(jìn)入編輯模式,在IPv4 local connections
段添加下面兩行內(nèi)容。host all all <從節(jié)點(diǎn)的VPC IPv4網(wǎng)段> md5 #允許VPC網(wǎng)段中md5密碼認(rèn)證連接 host replication replica <從節(jié)點(diǎn)的VPC IPv4網(wǎng)段> md5 #允許用戶從replication數(shù)據(jù)庫進(jìn)行數(shù)據(jù)同步
按
Esc
鍵,輸入:wq
,按下Enter
鍵,保存并退出pg_hba.conf文件。
配置postgresql.conf文件。
運(yùn)行以下命令,打開postgresql.conf文件。
sudo vim /var/lib/pgsql/15/data/postgresql.conf
分別找到以下參數(shù),并將參數(shù)修改為以下內(nèi)容:
listen_addresses = '*' #監(jiān)聽的IP地址 max_connections = 100 #最大連接數(shù),從庫的max_connections必須要大于主庫的 wal_level = replica #記錄足夠的信息以支持常見的備庫用途,包括流復(fù)制和熱備。 synchronous_commit = on #開啟同步復(fù)制 max_wal_senders = 32 #同步最大的進(jìn)程數(shù)量 wal_sender_timeout = 60s #流復(fù)制主機(jī)發(fā)送數(shù)據(jù)的超時時間
按
Esc
鍵,輸入:wq
,按下Enter
鍵,保存并退出postgresql.conf文件。
運(yùn)行以下命令,重啟PostgreSQL服務(wù)。
sudo systemctl restart postgresql-15
步驟二:配置PostgreSQL從節(jié)點(diǎn)
遠(yuǎn)程連接PostgreSQL從節(jié)點(diǎn)。
具體操作,請參見通過密碼或密鑰認(rèn)證登錄Linux實(shí)例。
安裝PostgreSQL。
運(yùn)行以下命令,添加PostgreSQL官方Y(jié)UM倉庫。
sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
安裝PostgreSQL 15。
sudo yum install -y postgresql15-server
說明本教程以PostgreSQL 15版本為例。您可以根據(jù)業(yè)務(wù)需求選擇合適的版本。
運(yùn)行以下命令,使用pg_basebackup基礎(chǔ)備份工具從主庫創(chuàng)建從庫的基礎(chǔ)備份。
pg_basebackup -D /var/lib/pgsql/15/data -h <主節(jié)點(diǎn)公網(wǎng)IP> -p 5432 -U replica -X stream -P
出現(xiàn)Password時,輸入主庫的密碼。出現(xiàn)如下所示時,表示已同步成功。
配置從庫的postgresql.conf文件。
運(yùn)行以下命令,打開postgresql.conf文件。
sudo vim /var/lib/pgsql/15/data/postgresql.conf
分別找到以下參數(shù),并將參數(shù)修改為以下內(nèi)容。
primary_conninfo = 'host=<主節(jié)點(diǎn)IP> port=5432 user=replica password=replica' #對應(yīng)主庫的連接信息 recovery_target_timeline = 'latest' #流復(fù)制同步到最新的數(shù)據(jù) max_connections = 1000 # 最大連接數(shù),從節(jié)點(diǎn)需設(shè)置比主節(jié)點(diǎn)大 hot_standby = on # 開啟熱備 max_standby_streaming_delay = 30s # 數(shù)據(jù)流備份的最大延遲時間 wal_receiver_status_interval = 1s # 從節(jié)點(diǎn)向主節(jié)點(diǎn)報告自身狀態(tài)的最長間隔時間 hot_standby_feedback = on # 如果有錯誤的數(shù)據(jù)復(fù)制向主進(jìn)行反饋
按
Esc
鍵,輸入:wq
,按下Enter
鍵,保存并退出postgresql.conf文件。
運(yùn)行以下命令,修改數(shù)據(jù)目錄的屬組和屬主。
sudo chown -R postgres.postgres /var/lib/pgsql/15/data
依次運(yùn)行以下命令,啟動服務(wù)并設(shè)置服務(wù)開機(jī)自啟動。
sudo systemctl enable postgresql-15 sudo systemctl start postgresql-15
步驟三:檢測驗(yàn)證
檢測驗(yàn)證需要主從節(jié)點(diǎn)之間存在數(shù)據(jù)交互,例如,從節(jié)點(diǎn)備份目錄時,進(jìn)行檢測能夠得到預(yù)期的結(jié)果。
sudo pg_basebackup -D /var/lib/pgsql/15/data -h <主節(jié)點(diǎn)IP> -p 5432 -U replica -X stream -P
在主節(jié)點(diǎn)中運(yùn)行以下命令,查看sender進(jìn)程。
ps aux |grep sender
返回結(jié)果如下,表示可以成功查看到sender進(jìn)程。
postgres 2916 0.0 0.3 340388 3220 ? Ss 15:38 0:00 postgres: walsender replica 192.168.**.**(49640) streaming 0/F01C1A8
在從節(jié)點(diǎn)中運(yùn)行以下命令,查看receiver進(jìn)程。
ps aux |grep receiver
返回結(jié)果類似如下,表示可以成功查看到receiver進(jìn)程。
postgres 23284 0.0 0.3 387100 3444 ? Ss 16:04 0:00 postgres: walreceiver streaming 0/F01C1A8
在主節(jié)點(diǎn)中進(jìn)入PostgreSQL交互終端,輸入以下SQL語句,在主庫中查看從庫狀態(tài)。
運(yùn)行以下命令,登錄postgres用戶。
sudo su - postgres
回顯結(jié)果出現(xiàn)
-bash-4.2$
時表示成功登錄。輸入以下命令,進(jìn)入PostgreSQL交互終端。
psql
回顯結(jié)果出現(xiàn)
postgres=#
時表示成功進(jìn)入交互終端。運(yùn)行以下命令,在主庫中查看從庫狀態(tài)。
select * from pg_stat_replication;
返回結(jié)果類似如下,表示可成功查看到從庫狀態(tài)。
pid | usesysid | usename | application_name | client_addr | client_hostname | client_port | backend_start | backend_xmin | state | sent_location | write_locati on | flush_location | replay_location | sync_priority | sync_state ------+----------+---------+------------------+---------------+-----------------+------------- +-------------------------------+--------------+-----------+---------------+------------- ---+----------------+-----------------+---------------+------------ 2916 | 16393 | replica | walreceiver | 192.168.**.** | | 49640 | 2017-05-02 15:38:06.188988+08 | 1836 | streaming | 0/F01C0C8 | 0/F01C0C8 | 0/F01C0C8 | 0/F01C0C8 | 0 | async (1 rows)
輸入以下命令,并按
Enter
退出SQL終端。\q
輸入以下命令,并按
Enter
退出PostgreSQL。exit