PostgreSQL 主從流複製部署

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

PostgreSQL 安裝

# 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.confpost

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 哦

相關文章
相關標籤/搜索