PostgreSQL 在 9.0 之後引入了流複製(Streaming Replication)。流複製提供了將 WAL 記錄連續發送並應用到從服務器以使其保持最新狀態的功能。經過流複製,從服務器不斷從主服務器同步相應的數據,同時,從服務器做爲主服務器的一個備份。sql
本文主要記錄 PostgreSQL 主從流複製的部署。數據庫
服務器規劃vim
角色 | 地址 | 版本 |
---|---|---|
主服務器 | 172.31.5.1 | Ubuntu 18.04,PostgreSQL 10 |
從服務器 | 172.31.5.2 | Ubuntu 18.04,PostgreSQL 10 |
# Add PostgresSQL Repository to Ubuntu
sudo sh -c "echo 'deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -c -s`-pgdg main' >> /etc/apt/sources.list.d/pgdg.list"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update and Install PostgreSQL
sudo apt-get update
sudo apt-get install -y postgresql-10
複製代碼
進入數據庫bash
sudo -u postgres psql
複製代碼
建立 replicator
用戶用於登陸和複製服務器
create role replicator login replication encrypted password 'password';
複製代碼
配置 pg_hba.conf
微信
sudo vim /etc/postgresql/10/main/pg_hba.conf
複製代碼
添加如下內容async
host all all 172.31.0.0/16 trust # 容許鏈接
host replication replicator 172.31.0.0/16 trust # 容許replicator用戶複製本機數據
複製代碼
配置 postgrsql.conf
post
sudo vim /etc/postgresql/10/main/postgresql.conf
複製代碼
按照如下內容配置測試
listen_addresses = '*' #監聽全部ip
archive_mode = on #開啓歸檔模式
archive_command = 'cp %p /var/lib/postgresql/10/main/%f' #歸檔命令
wal_level = replica # 決定多少信息寫入WAL,此處爲replica模式
max_wal_senders = 10 #最大流複製鏈接,通常和從服務相等
wal_sender_timeout = 60s #流複製超時時間
max_connections = 100 #最大鏈接數,必須不大於從庫的配置
複製代碼
重啓數據庫ui
sudo service postgresql restart
複製代碼
先測試一下可否鏈接主服務器
psql -h 172.31.5.1 -U postgres
複製代碼
配置 postgresql.conf
wal_level = replica #決定多少信息寫入WAL,此處爲replica模式
max_connections = 300 #最大鏈接數,必須不小於主庫的配置
hot_standby = on #說明這臺機器不只用於數據歸檔,還能夠用於數據查詢
max_standby_streaming_delay = 30s #流備份的最大延遲時間
wal_receiver_status_interval = 10s #向主服務器彙報本機狀態的間隔時間
hot_standby_feedback = on #是否向主服務器反饋錯誤的數據複製
複製代碼
首先清空 PostgreSQL 數據
sudo su - postgres # 切換到postgresl用戶
rm -rf 10/main/* # 清空data目錄數據
複製代碼
而後備份主服務器數據
pg_basebackup -D 10/main/ -h 172.31.5.1 -U replicator -X stream -P
複製代碼
配置 recovery.conf
vim 10/main/recovery.conf
複製代碼
standby_mode = on # 說明該節點是從服務器
primary_conninfo = 'host=172.31.5.1 port=5432 user=replicator password=password' # 主服務器的鏈接信息
recovery_target_timeline = 'latest'
複製代碼
退出用戶,而後重啓數據庫
sudo service postgresql restart
複製代碼
在主服務上執行,結果以下:
postgres=# select client_addr,sync_state from pg_stat_replication;
client_addr | sync_state
--------------+------------
172.31.5.2 | async
(1 row)
複製代碼
咱們也能夠在兩臺服務器上執行 ps aux | grep postgres
來驗證部署成功,能夠看到
主服務器上有一個 wal sender process
從服務器上有一個 wal receiver process
主服務器建立數據庫:
postgres=# create database test;
CREATE DATABASE
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
(4 rows)
複製代碼
此時從服務器能夠同步看到
postgres=# \l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+----------+----------+---------+---------+-----------------------
postgres | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
template0 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
template1 | postgres | UTF8 | C.UTF-8 | C.UTF-8 | =c/postgres +
| | | | | postgres=CTc/postgres
test | postgres | UTF8 | C.UTF-8 | C.UTF-8 |
(4 rows)
複製代碼
若是咱們在從服務器上執行:
postgres=# drop database test;
ERROR: cannot execute DROP DATABASE in a read-only transaction
複製代碼
能夠看到沒法在從服務器上執行寫操做,由於從服務器是隻讀的。
這樣咱們就完成了主從流複製的部署和驗證測試。
若是你對 Python 開發以及全棧工程師感興趣,歡迎關注微信公衆號,這裏不止 Python 哦