OpenEuler22.03安裝PostgreSQL15.5並配置一主二從

来源:https://www.cnblogs.com/boyliupan/archive/2023/12/29/17935733.html
-Advertisement-
Play Games

環境準備 序號 IP 標識(hostname) CPU/記憶體配置 系統盤 數據盤 1 192.168.8.190 pg01 8C+16G 80G 500G 2 192.168.8.191 pg02 8C+16G 80G 500G 3 192.168.8.192 pg03 8C+16G 80G 500 ...


環境準備

序號 IP 標識(hostname) CPU/記憶體配置 系統盤 數據盤
1 192.168.8.190 pg01 8C+16G 80G 500G
2 192.168.8.191 pg02 8C+16G 80G 500G
3 192.168.8.192 pg03 8C+16G 80G 500G

規劃的文件夾目錄(所有主機):

## 以下目錄為本文規劃的目錄,可以提前創建,也可以跟著說明一步步創建。
## 可以根據各自情況自行規劃,註意更改後替換後文裡面對應的路徑。
# app目錄為數據盤掛載目錄,將所有程式和數據保存在該目錄下
/app
# postgresql應用的安裝目錄
/app/pg15
# 保存解壓後的應用源代碼
/app/source
# 存儲臨時文件(如下載的應用壓縮包)
/app/temp-files
#保存應用數據
/app/appdata
# postgresql15的數據目錄 即是環境變數$PGDATA (建議用postgres用戶創建或創建後給postgres授權)
/app/appdata/pg15/data
# postgresql15的日誌 即是環境變數$PGLOG(建議用postgres用戶創建或創建後給postgres授權)
/app/appdata/pg15/logs

系統和組件版本(所有主機):

# 操作系統:
OpenEuler:22.03 (LTS-SP2)
# 資料庫:
postgresql:15.5

系統環境狀態(所有主機):

# SeLinux(cat /etc/selinux/config)變更需重啟系統
SELINUX=permissive

# Firewalld 防火牆保持開啟狀態(systemctl status/start/stop/restart firewalld)
active

更新系統並安裝必備組件

*(如無特殊說明代表所有主機

# 查看系統版本
[root@pg01 ~]$ cat /etc/os-release
NAME="openEuler"
VERSION="22.03 (LTS-SP2)"
ID="openEuler"
VERSION_ID="22.03"
PRETTY_NAME="openEuler 22.03 (LTS-SP2)"
ANSI_COLOR="0;31"
# 更新系統
[root@pg01 ~]$ dnf upgrade -y

關於“dnf update” 和“dnf upgrade”的說明:

update:更新源里的軟體列表。一般指量的變化,側重更新的意思,主要是為原有的東西增加新功能,或者對已有的部分做出更改等。更新數據源。

upgrade:升級你系統里的軟體。一般指質的變化,側重升級的意思,是指從較低級版本升級到高級的版本,這種升級往往伴有新功能的增加,因此也有update的意思。

  1. 更新資源

    sudo dnf update

  2. 軟體更新升級,包括升級語言包等

    sudo dnf upgrade

#安裝缺失組件,OpenEuler預設最小化安裝
#不同系統安裝鏡像預設安裝的基礎組件可能不一樣,根據情況安裝(gcc、make有的鏡像安裝時預設安裝,有的鏡像則沒有預設安裝)
[root@pg01 ~]$ dnf install gcc make tar readline-devel zlib-devel

掛載數據盤

#查看磁碟情況
[root@pg01 ~]$ fdisk -l

#給“/dev/vdb分區”
[root@pg01 ~]$ fdisk /dev/vdb

輸入指令如下:

# 再次查看分區情況
[root@pg01 ~]$ fdisk -l
# 顯示結果已創建vdb1分區
Device           Boot Start  End          Sectors     Size Id Type
/dev/vdb1        2048        1048575999   1048573952  500G 83 Linux

# 格式化分區
[root@pg01 ~]$ mkfs.ext4 /dev/vdb1
# 根目錄下創建data掛載目錄
[root@pg01 ~]$ mkdir /app
# 掛載/vdb1分區到/app
[root@pg01 ~]$ mount /dev/vdb1 /app
# 查看掛載情況
[root@pg01 ~]$ df -lh

# 將掛載添加到啟動項,否則掛載在重啟後失效
[root@pg01 ~]$ vi /etc/fstab
# 末尾添加一行
/dev/vdb1               /app                      ext4    defaults        0 0

保存關閉fstab文件,數據盤掛載完畢。

PostgreSQL安裝

下載PostgreSQL 15.5

PostgreSQL官方下載地址:PostgreSQL: File Browser

#下載PostgreSQL15.5版本
[root@pg01 ~]$ cd /app/temp-files/
[root@pg01 temp-files]$ wget https://ftp.postgresql.org/pub/source/v15.5/postgresql-15.5.tar.gz

編譯安裝

#解壓源碼包
[root@pg01 temp-files]$ tar -xzvf postgresql-15.5.tar.gz
# 將解壓後的文件夾(postgresql-15.5)移動到規劃的source目錄
[root@pg01 temp-files]$ mv postgresql-15.5 ../source/
# 切換到postgresql-14.10文件夾(系統當前在root用戶根目錄下)
[root@pg01 temp-files]$ cd ../source/postgresql-15.5
# 配置安裝目錄:
[root@pg01 postgresql-15.5]$ ./configure --prefix=/app/pg15
# 編譯(耗時較長,耐心等待)
[root@pg01 postgresql-15.5]$ make                             
# 安裝
[root@pg01 postgresql-15.5]$ make install
# 創建PostgreSQL數據存放目錄(可根據實際情況自行配置數據存儲路徑)
[root@pg01 postgresql-15.5]$ mkdir -p /app/appdata/pg15/data
# 創建PostgreSQL日誌存放目錄(可根據實際情況自行配置日誌存儲路徑)
[root@pg01 postgresql-15.5]$ mkdir -p /app/appdata/pg15/logs
# 創建postgres用戶
[root@pg01 postgresql-15.5]$ adduser postgres
# 給postgres用戶授權訪問data和logs目錄
[root@pg01 postgresql-15.5]$ chown postgres /app/appdata/pg15/data
[root@pg01 postgresql-15.5]$ chown postgres /app/appdata/pg15/logs
# 切換到postgres用戶(資料庫操作不允許使用root用戶)
[root@pg01 postgresql-15.5]$ su - postgres
# 創建日誌文件【postgres用戶】
[postgres@pg01 ~]$ touch /app/appdata/pg15/logs/server.log
# 初始化資料庫【postgres用戶】
[postgres@pg01 ~]$ /app/pg15/bin/initdb -D /app/appdata/pg15/data
# 啟動資料庫【postgres用戶】
[postgres@pg01 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log start
# 創建test資料庫【postgres用戶】
[postgres@pg01 ~]$ /app/pg15/bin/createdb test  ##創建test資料庫
# 連接test資料庫【postgres用戶】
[postgres@pg01 ~]$ /app/pg15/bin/psql test      ##連接test資料庫

配置PostgreSQL

以下操作如無特殊說明,均採用postgres用戶(指操作系統普通用戶)操作命令。

修改資料庫密碼

# 我們從外部採用工具連接該資料庫,需要知道資料庫用戶和對應的密碼
# 連接預設postgres資料庫;
[postgres@pg01 ~]$ /app/pg15/bin/psql      
# 修改資料庫用戶postgres的密碼為postgres;
postgres=# ALTER USER postgres WITH PASSWORD 'postgres'; 

修改配置文件以支持遠程連接

需要修改的文件存放於postgresql的數據存儲目錄(/app/appdata/pg15/data)。

# pg_hba.conf 文件
# 待修改的行:
host    all             all             127.0.0.1/32            trust
# 修改為
host    all             all             0.0.0.0/0               md5
# postgresql.conf文件
# 待修改的行
#listen_addresses = 'localhost' 
#移除前方的“#”,並將localhost修改為*
listen_addresses = '*' 

重啟postgresql

#重啟postgresql
[postgres@pg01 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log restart

操作系統配置

防火牆放行5432埠

root用戶操作。

# 配置防火牆放行5432埠
sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent  
#防火牆重新載入配置文件
sudo firewall-cmd --reload       

環境變數配置

我們想在安裝postgresql的伺服器使用psql或其他提供的工具連接資料庫,就必須輸入psql的全路徑“/app/pg15/bin/psql",環境變數配置完畢後,我們可以以postgres用戶在任意位置輸入psql來使用psql工具。

postgres用戶操作。

# 切換用戶目錄
[postgres@pg01 ~]$ cd ~
# 編輯用戶環境變數文件
[postgres@pg01 ~]$ vi .bash_profile
# 將下麵兩行代碼添加文件末尾後保存退出
PATH=/app/pg15/bin:$PATH
export PATH
# 使配置文件生效
[postgres@pg01 ~]$ source .bash_profile

# 此時postgres用戶就可以直接輸入psql調用了

開機啟動配置

root用戶操作。

PostgreSQL的開機自啟動配置模板在源碼目錄的“contrib/start-scripts”目錄下,其中linux文件為linux環境下的開機自啟動腳本模板,將其拷貝到“/etc/init.d”目錄下,並改名為postgresql:

# 切換至源碼開機腳本模版目錄
cd postgresql-15.5/contrib/start-scripts/
# 拷貝linux腳本拷貝至啟動目錄修改名稱為pgsql
cp linux /etc/init.d/pgsql
# 編輯啟動腳本
vi /etc/init.d/pgsql

# 在Selinux開啟Enforcing的情況,開啟仍然無法啟動,我們需要修複pgsql文件的安全上下文
# restorecon [選項】 文件或目錄
# -R:遞歸.當前目錄和目錄下所有的子文件同時恢復;
# -V:把恢復過程顯示到屏幕上;
# 執行如下命令即可 (本文環境將selinux修改為寬容模式,不需要進行修複)
# restorecon /etc/init.d/pgsql 

# 給啟動腳本增加文件執行許可權
chmod a+x /etc/init.d/pgsql 

#添加至開機啟動
chkconfig --add /etc/init.d/pgsql 

“/etc/init.d/pgsql”需要編輯的內容如下:

# 安裝位置,根據實際情況修改
prefix=/app/pg15

# Postgresql數據目錄,根據實際情況修改
PGDATA="/app/appdata/pg15/data"

# Who to run the postmaster as, usually "postgres".  (NOT "root")
# 將啟動用戶修改為實際用戶,這裡使用postgres,所以不變。
PGUSER=postgres

# Postgresql日誌文件位置,根據實際情況修改
PGLOG="/app/appdata/pg15/logs/server.log"

重啟驗證即可。

創建一主二從

主庫配置:

# 創建同步賬號 psql下執行:
postgres=# CREATE ROLE replica login replication encrypted password 'replica';
CREATE ROLE

# 修改postgresql.conf文件,添加同步參數
wal_level = replica 
max_wal_senders = 8 
wal_keep_size = 500 
wal_sender_timeout = 60s
max_connections = 100


# pg_hba.conf 文件增加備庫訪問控制
# 文件末尾增加允許複製的從機
host    replication     replica         192.168.8.191/32            md5
host    replication     replica         192.168.8.192/32            md5

# 重啟主庫服務
[postgres@pg01 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log restart

# 從庫驗證是否可以連接主庫
# 返回輸入密碼即表示可訪問
[postgres@pg02 ~]$  psql -h 192.168.8.190 -U postgres
Password for user postgres:

從庫配置[pg02/03主機配置相同]

# 停掉從庫
[postgres@pg02 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log  stop

# 清空從庫數據文件
[postgres@pg02 ~]$ rm -rf /app/appdata/pg15/data/*
[postgres@pg02 ~]$ ll /app/appdata/pg15/data
total 0

# 拉取主庫文件
[postgres@pg02 ~]$ pg_basebackup -h 192.168.8.80 -D /app/appdata/pg15/data -p 5432 -U replica -Fp -Xs -Pv -R --checkpoint=fast
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: 0/D000028 on timeline 1
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_17064"
50729/50729 kB (100%), 1/1 tablespace
pg_basebackup: write-ahead log end point: 0/D000100
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: syncing data to disk ...
pg_basebackup: base backup completed
[postgres@dj data]$ ll /app/appdata/pg15/data
total 128
-rw-------. 1 postgres postgres   224 Jul 12 03:43 backup_label
drwx------. 7 postgres postgres  4096 Jul 12 03:43 base
drwx------. 2 postgres postgres  4096 Jul 12 03:43 global
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_commit_ts
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_dynshmem
-rw-------. 1 postgres postgres  4886 Jul 12 03:43 pg_hba.conf
-rw-------. 1 postgres postgres  1636 Jul 12 03:43 pg_ident.conf
drwx------. 4 postgres postgres  4096 Jul 12 03:43 pg_logical
drwx------. 4 postgres postgres  4096 Jul 12 03:43 pg_multixact
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_notify
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_replslot
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_serial
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_snapshots
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_stat
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_stat_tmp
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_subtrans
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_tblspc
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_twophase
-rw-------. 1 postgres postgres     3 Jul 12 03:43 PG_VERSION
drwx------. 3 postgres postgres  4096 Jul 12 03:43 pg_wal
drwx------. 5 postgres postgres  4096 Jul 12 03:43 pg_walminer
drwx------. 2 postgres postgres  4096 Jul 12 03:43 pg_xact
-rw-------. 1 postgres postgres   267 Jul 12 03:43 postgresql.auto.conf
-rw-------. 1 postgres postgres 27115 Jul 12 03:43 postgresql.conf
-rw-------. 1 postgres postgres    30 Jul 12 03:43 postmaster.opts.bak
-rw-------. 1 postgres postgres     0 Jul 12 03:43 standby.signal

修改postgresql.conf配置:

# 從庫postgresql.conf修改
[postgres@pg02 ~]$ vi /app/appdata/pg15/data/postgresql.conf

# 1.註釋一下參數,即是在前面加# 
#wal_level = replica 
#max_wal_senders = 8 
#wal_keep_size = 500 
#wal_sender_timeout = 60s
# 2.添加和修改一下參數
primary_conninfo = 'host=192.168.8.80 port=5432 user=replica password=replica'
recovery_target_timeline = latest 
hot_standby = on
max_standby_streaming_delay = 30s
wal_receiver_status_interval = 10s
hot_standby_feedback = on
max_connections = 200  #大於主節點
max_worker_processes = 20

# 3.保存退出

重新啟動從庫:

# 啟動從庫
[postgres@pg02 ~]$ /app/pg15/bin/pg_ctl -D /app/appdata/pg15/data -l /app/appdata/pg15/logs/server.log start

主從同步驗證

將Pg02、Pg03主機都配置完成並啟動postgresql後,在主庫pg01上用postgres用戶進入psql,輸入如下查詢sql驗證同步狀態:

# 主庫PSQL查詢
postgres=# select client_addr,usename,backend_start,application_name,sync_state,sync_priority FROM pg_stat_replication;
   client_addr   | usename |         backend_start         | application_name | sync_state | sync_priority
-----------------+---------+-------------------------------+------------------+------------+---------------
 192.168.8.191 | replica | 2023-12-22 18:52:32.45571+08 | walreceiver      | async      |             0
 192.168.8.192 | replica | 2023-12-22 19:04:32.92774+08 | walreceiver      | async      |             0
 
# 測試創建刪除資料庫觀察從庫是否同步
postgres=# create database test;
postgres=# drop database test;
# 在主庫上創建、刪除後可到從庫上查看是否一致。psql 輸入‘\l’可查看所有的資料庫。
postgres=# \l

至此,Postgresql 15.5的安裝和一主兩從配置結束。

開啟歸檔模式

主機pg01操作修改postgresql.conf文件

#調整如下兩個參數
archive_mode='on'
archive_command='test ! -f /app/appdata/pg15/archive/%f && cp %p /app/appdata/pg15/archive/%f'

同步在主庫(pg01)以及其他從他從庫(pg02/pg03)創建歸檔目錄:

# 創建歸檔目錄
mkdir -p /app/appdata/pg15/archive

# 給postgres用戶授權
chown -R postgres /app/appdata/pg15/archive

然後重啟主庫pg服務即可。

其他參考命令:

# 查詢歸檔參數SQL
select * from pg_settings where name in ('wal_level','archive_mode','archive_command');
# 查詢歸檔文件狀態
select * from pg_stat_get_archiver();

本文作者: Mr Liu
本文鏈接: https://it-liupp.gitee.io/2023/12/23/openeuler-install-pgsql14/
博客園鏈接:https://www.cnblogs.com/boyliupan/p/17935733.html
版權聲明: 本博客所有文章除特別聲明外,均採用 BY-NC-SA 許可協議。轉載請註明出處!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Cookie 1.HTTP無連接無狀態,Cookie和Session就是解決此問題。 2.客戶端向伺服器端發送一個請求的時,服務端向客戶端發送一個Cookie 然後瀏覽器將Cookie保存,之後每次HTTP請求瀏覽器都會將Cookie發送給伺服器端,需要衡量把什麼數據放到cookie中,很多數據並不 ...
  • 目錄✨ 1、前言 2、效果 3、具體實現 ​ 頁面設計 ​ 全部代碼 ​ FileSystemWatcher的介紹 ​ FileSystemWatcher的構造函數 ​ FileSystemWatcher的屬性 ​ FileSystemWatcher的事件 4、總結 前言✨ 有時候我們會有監控電腦上 ...
  • 在Form里顯示模態Dialog 問題 如何在WinForm的一個Form裡面彈出一個模態Dialog? 背景 程式的框架是Winform,只有一個視窗MainForm。MainForm裡面是一個TabControl,每個TabPage是一個Form,每個TabPage的Form相互獨立,互不幹擾, ...
  • 一:背景 1. 講故事 在dump分析的旅程中也會碰到一些讓我無法解釋的靈異現象,追過這個系列的朋友應該知道,上一篇我聊過 宇宙射線 導致的程式崩潰,後來我又發現了一例,而這一例恰恰是高鐵的 列控連鎖一體化 程式,所以更加讓我確定這是由於 電離輻射 干擾了電腦的 數字信號 導致程式的bit翻轉,而 ...
  • 概述:在.NET Core中,通過JsonSerializerOptions的JsonConverter參數,我們能夠定製化JSON序列化和反序列化過程。通過自定義JsonConverter,如DateTimeConverter和IntConverter,我們能夠靈活處理特定類型的轉換邏輯,提供更多 ...
  • 一、環境說明 操作系統版本:OpenEuler22.03 SP2 LTS Nginx版本:1.24.0 安裝位置:/app/nginx Selinux配置:關閉或設置為permissive 二、Nginx安裝 # 安裝必要依賴 dnf -y install tar gcc make pcre pcr ...
  • 摘要:MacOS下免密登錄的一些註意事項。 系統環境 操作系統:macOS Sonoma 14.2.1 SSH免密登錄 ssh免密登錄的原理是在本機生成本機的ssh公鑰和私鑰,將公鑰上傳至待連接的主機,本機通過私鑰進行ssh連接實現免密登錄。 # ssh密鑰生成命令 ssh-keygen # ssh ...
  • Linux中常用的分區類型包括:ESP(EFI System Partition)分區,它是引導分區,用於存儲系統文件。Swap分區,是一種文件系統,主要作用是作為Linux的虛擬記憶體。主目錄,它是用戶文件夾存儲的位置,即使在系統未啟動的情況下,也可以使用Live CD命令獲取文件。Home目錄,它 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...