天天看點

PostreSQL在Linux上的systemd服務詳解

作者:Inspiration

簡介

PostgreSQL(通常縮寫為“Postgres”)是一個強大的開源關系型資料庫管理系統(RDBMS),廣泛用于企業應用和基于Web的軟體。它最初是于1989年作為加州大學伯克利分校的一個研究項目釋出的,随着時間的推移已經成長為最受歡迎和受尊敬的資料庫之一。

PostgreSQL以其先進的特性而著稱,包括支援複雜查詢、存儲過程、觸發器和事務。它還提供全文搜尋、強大的索引功能和支援多種程式設計語言,使其成為廣泛應用于各種應用程式的多用途選擇。此外,PostgreSQL高度可定制和可擴充,具有大型和活躍的開發者社群,為其不斷發展和改進做出貢獻。

PostreSQL Systemd Service詳解

下面我們來解析一下PostgreSQL在Linux上是怎麼通過systemd服務啟動的。

本次用的Linux發行版本是Ubuntu,系統資訊可以用hostnamectl檢視:

PostreSQL在Linux上的systemd服務詳解

hostnamectl 輸出

首先通過以下指令安裝Postgresql最新版

#建立檔案倉庫配置:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list' 
# 導入倉庫簽名密鑰:
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add - 
#更新軟體包清單:
sudo apt-get update
# I安裝最新版本的 PostgreSQL。如果想要安裝特定版本,可以使用 'postgresql-12' 或類似的名稱,而不是 'postgresql':
sudo apt-get -y install postgresql           

安裝好之後,會在/lib/systemd/system/下生成兩個檔案:

  1. /lib/systemd/system/postgresql.service
  2. /lib/systemd/system/[email protected]

如圖:

PostreSQL在Linux上的systemd服務詳解

/lib/systemd/system/postgresql*

postgresql.service是控制整個PostgreSQL服務的主要單元。

可以用 systemctl cat postgresql.service檢視内容:

PostreSQL在Linux上的systemd服務詳解

postgresql.service

可以看到該服務沒做什麼,隻是起到一個控制作用。當我們使用指令systemctl restart postgresql的時候,所有服務裡面有PartOf=postgresql.service也會執行restart指令。

[email protected]是一個模闆單元,允許在同一台機器上運作多個PostgreSQL執行個體。%i是單元名稱中的占位符,允許您将多個PostgreSQL執行個體作為單獨的服務啟動和管理。此模闆單元用于建立各個PostgreSQL執行個體,執行個體名稱實際上替換了%i占位符。

可以用 systemctl cat [email protected]檢視内容:

PostreSQL在Linux上的systemd服務詳解

systemctl cat [email protected]

可以看到PartOf=postgresql.service。每個執行個體都有自己獨特的配置和資料目錄。但是,這些執行個體仍将由同一個postgresql.service單元管理。

安裝postgresql時,會執行如下指令:

/usr/lib/postgresql/15/bin/initdb -D /var/lib/postgresql/15/main --auth-local peer --auth-host scram-sha-256 --no-instructions           

入土

PostreSQL在Linux上的systemd服務詳解

sudo apt-get -y install postgresql 輸出

該指令在/var/lib/postgresql/初始化一個資料庫,該指令是指令pg_createcluster -u postgres --no-status $VERSION main的一部分, 該指令還會在/etc/postgresql/建立預設的資料庫配置。

下面是[email protected]的詳解

[Unit] 
Description=PostgreSQL Cluster %i 
#描述:PostgreSQL 叢集 %i 該字段是該 unit 檔案的描述資訊。%i

AssertPathExists=/etc/postgresql/%I/postgresql.conf 
# 指定要求指定路徑必須存在,否則無法啟動服務。

RequiresMountsFor=/etc/postgresql/%I /var/lib/postgresql/%I 
# 要求這些目錄必須挂載。如果沒有挂載,服務就不能啟動。

PartOf=postgresql.service
# 指定這個 unit 檔案是 PostgreSQL 服務的一部分。

ReloadPropagatedFrom=postgresql.service
#重新加載配置檔案時要等待 postgresql.service 檔案。

Before=postgresql.service
# 指定在 postgresql.service 之前啟動。

After=network.target
#指定在 network.target 啟動後再啟動。

[Service] Type=forking
#指定服務的類型為 forking,表示服務會建立一個子程序并在父程序退出時退出。

ExecStart=-/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i start
#指定服務啟動時需要運作的指令。

TimeoutStartSec=0
# 指定服務啟動逾時時間,設定為 0 表示沒有逾時時間限制。

ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop
# 指定服務停止時需要運作的指令。

TimeoutStopSec=1h
# 指定服務停止逾時時間,設定為 1 小時。

ExecReload=/usr/bin/pg_ctlcluster --skip-systemctl-redirect %i reload
# 指定服務重新加載配置檔案時需要運作的指令。

PIDFile=/run/postgresql/%i.pid
# 指定服務程序的 PID 檔案路徑。

SyslogIdentifier=postgresql@%i
# 指定服務在日志中的辨別。

OOMScoreAdjust=-900
# 調整核心的程序殺死優先級。

[Install]
WantedBy=multi-user.target
#指定服務所在的 target(這裡是 multi-user.target),表示在啟動 multi-user.target 時會啟動這個服務。           

%i 和 %I 是占位符,在運作時将被替換為實際的值。

%i 代表執行個體辨別符,是一個字元串,用于辨別特定服務或套接字的執行個體。當在同一系統上運作多個具有唯一配置的相同服務或套接字時,這是非常有用的。

例如,如果在同一系統上運作兩個名為 main 和 replica 的 PostgreSQL 叢集,則可以使用 %i 占位符定義兩個 unit 檔案:

/etc/systemd/system/[email protected]
/etc/systemd/system/[email protected]           

啟動或停止服務時,需要将執行個體辨別符作為參數指定:

systemctl start [email protected]
systemctl stop [email protected]           

%I 代表執行個體名稱,類似于執行個體辨別符,但已進行了清理,以成為有效的檔案名。通常在檔案路徑名中使用,以辨別特定執行個體的配置檔案或資料目錄。

例如,如果您有一個名為 main 的 PostgreSQL 叢集,則配置檔案可能位于 /etc/postgresql/main/postgresql.conf,資料目錄可能位于 /var/lib/postgresql/main/。

通過在 unit 檔案中使用 %I,systemd 将自動用執行個體名稱替換占位符。這可以簡化管理同一服務的多個執行個體,因為您可以使用帶有不同 %I 值的相同 unit 檔案來管理每個執行個體。

繼續閱讀