再不了解PostgreSQL,你就晚了之PostgreSQL主從流復制部署


 
        

前言

在MySQL被收購之后,雖然有其替代品為: MariaDB,但是總感覺心里有點膈應。大家發現了另一款開源的數據庫: PostgreSQL。

雖然centos自帶版本9.2也可以用,但是最近的幾次升級支持了更多更新的內容,比如,PostgreSQL有一個MySQL無法比擬的優勢,那就是PostGIS,PostGIS可以完美支持空間數據存儲和空間分析;從PostgreSQL9.3起就內置了JSON數據類型,而9.4又開始支持JSONB,這標志着PostgreSQL實際上已經是一個關系型數據庫和NoSQL數據庫的結合體了。

雖然postgresql是一個關系型數據庫,但是近幾次更新PostgreSQL的NoSQL性能有益到甚至超過了MongoDB。我們可以從下圖數據庫Rank榜上觀察到PostgreSQL排在第四位,和MongoDB的位置不相上下。可見PostgreSQL在開發人員的喜愛度上,可信賴度上和社區文檔的查詢上都是不錯的。

 

 

 

Centos7 安裝最新版postgresql10

 

更新源

雲服務器系統: CentOS 7.2 x86_64架構

地址: https://www.postgresql.org/download/linux/redhat/

 

 

這里我選擇PostgreSQL10,CentOS 7平台, x86_64架構,就會出現相應的yum源了。

在centos系統中執行以下命令:

yum install https://download.postgresql.org/pub/repos/yum/10/redhat/rhel-7-x86_64/pgdg-centos10-10-2.noarch.rpm

 

安裝PostgreSQL

先查看PostgreSQL源

我們需要安裝的是這三個個。postgresql10-devel.x86_64, postgresql10-contrib.x86_64,postgresql10-server.x86_64

 yum install postgresql10-client postgresql10-server postgresql10-contrib postgresql10-devel

 

初始化數據庫

PostgreSQL安裝目錄是/usr/pgsql-10,而PostgreSQL的數據目錄是/var/lib/pgsql/版本號(這里為10)

在這里,如果在裝系統開始分配var空間足夠大則可以繼續,如果分配var空間不夠,我們需要更改數據目錄,在這里,我們假設var空間足夠大。直接開始初始化。

/usr/pgsql-10/bin/postgresql-10-setup initdb

顯示這個代表初始化成功

 

啟功數據庫並設置開機啟動

sudo systemctl start postgresql-10
sudo systemctl enable postgresql-10.service

 

登錄PostgreSQL並設置密碼

postgresql在安裝時默認添加用戶postgres

輸入

su - postgres
psql

進入數據庫

命令界面長這樣

我們來設置密碼:

退出: \q

列出所有庫 \l

列出所有用戶 \du

列出庫下所有表 \d

 

支持密碼和遠程登陸

修改密碼驗證

默認情況下postgresql是不用密碼不支持遠程登錄的。我們需要修改配置文件

vi /var/lib/pgsql/10/data/pg_hba.conf

原本長成這樣

 

我們需要改成

保存退出


關於退出vim的問題,這里還有一個小趣聞:

StackOverflow驕傲的宣布: 已經幫助187萬不知如何從VIM退出的程序員

在這里我引用上面的高贊回答,幫助大家脫離這個187萬群體。

修改遠程訪問

vi /var/lib/pgsql/10/data/postgresql.conf

往下拉我們會看到

需要改成

在vim中搜索想要查找的文字,可以用 /***, n 表示下翻頁,N表示上翻頁

重啟postgresql

systemctl restart postgresql-10

 

登錄postgresql

postgresql在安裝時默認添加用戶postgres

輸入

su - postgres
psql

進入數據庫

此時已經可以進行驗證密碼

 

遠程連接數據庫

我們使用Navicat Premium 12來驗證連接

此時我們可以看到相關數據了

 

PostgreSQL主從流復制部署

簡介

postgres在9.0之后引入了主從的流復制機制,所謂流復制,就是從服務器通過tcp流從主服務器中同步相應的數據。這樣當主服務器數據丟失時從服務器中仍有備份。

與基於文件日志傳送相比,流復制允許保持從服務器更新。 從服務器連接主服務器,其產生的流WAL記錄到從服務器, 而不需要等待主服務器寫完WAL文件。

PostgreSQL流復制默認是異步的。在主服務器上提交事務和從服務器上變化可見之間有一個小的延遲,這個延遲遠小於基於文件日志傳送,通常1秒能完成。如果主服務器突然崩潰,可能會有少量數據丟失。

同步復制必須等主服務器和從服務器都寫完WAL后才能提交事務。這樣在一定程度上會增加事務的響應時間。

配置同步復制僅需要一個額外的配置步驟: synchronous_standby_names必須設置為一個非空值。synchronous_commit也必須設置為on。

這里部署的是異步的流復制。

主從服務器所在節點的系統、環境等最好一致。PostgreSQL版本也最好一致,否則可能會有問題。

 

安裝部署

先假定在192.168.20.93和192.168.20.94均安裝PostgreSQL,具體情況按照實際IP地址。

具體安裝部署步驟見:上述步驟

2.1 主服務器

主服務器為192.168.20.93

1.首先需要創建一個數據庫用戶進行主從同步。創建用戶replica,並賦予登錄和復制的權限。

postgres# CREATE ROLE replica login replication encrypted password 'replica';

2.修改pg_hba.conf,允許replica用戶來同步。

在pg_hba.conf里增加兩行:

host     all             all          192.168.20.94/32          trust   #允許94連接到主服務器
host   replication      replica       192.168.20.94/32          md5   #允許94使用replica用戶來復制

這樣,就設置了replica這個用戶可以從192.168.20.93進行流復制請求。

注: 第二個字段必須要填replication

4.修改postgresql.conf

listen_addresses = '*'   # 監聽所有IP
archive_mode = on  # 允許歸檔
archive_command = 'cp %p /opt/pgsql/pg_archive/%f'  # 用該命令來歸檔logfile segment
wal_level = hot_standby 
max_wal_senders = 32 # 這個設置了可以最多有幾個流復制連接,差不多有幾個從,就設置幾個wal_keep_segments = 256 # 設置流復制保留的最多的xlog數目
wal_sender_timeout = 60s # 設置流復制主機發送數據的超時時間
max_connections = 100 # 這個設置要注意下,從庫的max_connections必須要大於主庫的

配置完兩個文件后重啟服務器。

systemctl restart postgresql-10

3.測試94能否連接93數據庫。在94上運行如下命令:

psql -h 192.168.20.93 -U postgres

看看是否能進入數據庫。若可以,則正常。

2.2 從服務器

1.從主節點拷貝數據到從節點

su - postgres
rm -rf /var/lib/pgsql/10/data/*   #先將data目錄下的數據都清空
pg_basebackup -h 192.168.20.93 -U replica  -X stream -P  # 從93拷貝數據到94(基礎備份)

2.配置recovery.conf

復制/usr/pgsql-9.4/share/recovery.conf.sample 到 /opt/pgsql/data/recovery.conf

cp /usr/pgsql-10/share/recovery.conf.sample /usr/pgsql-10/share/recovery.conf

修改recovery.conf

standby_mode = on    # 說明該節點是從服務器
primary_conninfo = 'host=192.168.20.93 port=5432 user=replica password=replica'  # 主服務器的信息以及連接的用戶
recovery_target_timeline = 'latest'

3.配置postgresql.conf

wal_level = hot_standby
max_connections = 1000 # 一般查多於寫的應用從庫的最大連接數要比較大
hot_standby = on # 說明這台機器不僅僅是用於數據歸檔,也用於數據查詢
max_standby_streaming_delay = 30s # 數據流備份的最大延遲時間
wal_receiver_status_interval = 10s # 多久向主報告一次從的狀態,當然從每次數據復制都會向主報告狀態,這里只是設置最長的間隔時間
hot_standby_feedback = on # 如果有錯誤的數據復制,是否向主進行反饋

配置完后重啟從服務器

systemctl restart postgresql-10

3. 驗證是否部署成功

在主節點上執行:

select client_addr,sync_state from pg_stat_replication;

結果如下:

postgres=# select client_addr,sync_state from pg_stat_replication;
  client_addr  | sync_state
---------------+------------
 192.168.20.94 | async
(1 行記錄)

說明94是從服務器,在接收流,而且是異步流復制。

此外,還可以分別在主、從節點上運行 ps aux | grep postgres 來查看進程:

主服務器(93)上:

postgres 262270  0.0  0.0 337844  2832 ?        Ss   10:14   0:00 postgres: wal sender process replica 192.168.20.94(13059) streaming 0/A002A88

可以看到有一個 wal sender 進程。

從服務器(94)上:

postgres 569868  0.0  0.0 384604  2960 ?        Ss   10:14   0:02 postgres: wal receiver process   streaming 0/A002B60

可以看到有一個 wal receiver 進程。

至此,PostgreSQL主從流復制安裝部署完成。

在主服務器上插入數據或刪除數據,在從服務器上能看到相應的變化。從服務器上只能查詢,不能插入或刪除。

版權聲明: 作者:穆書偉

github出處:https://github.com/sanshengshui    

個人博客出處:https://www.mushuwei.cn/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM