開頭還是介紹一下群,如果感興趣Polardb ,mongodb ,MySQL?,Postgresql ,redis ,SQL SERVER ,ORACLE,Oceanbase 等有問題,有需求都可以加群群內有各大數據庫行業大咖,CTO,可以解決你的問題。加群請加 liuaustin3微信號 ,在新加的朋友會分到3群(共1160人左右 1 + 2 + 3)
最近加群的人太多了,可能是因為這篇 Peace and love,從今天開始我們群正式加入 ORACLE ,因為群里的ORACLE 大佬也很多,所以基本上市面上能見到的常見的數據庫產品,群里都有大佬和各種廠商,和工作者,我們準備把 Peace and love 發揚光大,都是數據庫,大家一起學。
正題的開始說,基于POSTGRESQL 安裝中,很多同學提出一個問題,就是安裝中,希望能進行自動啟動POSTGRESQL 數據庫,不通過pg_ctl 命令來進行相關的工作。所以本期咱們來說說,自動化啟動部分怎么搞。
實際上如果您在使用POSTGRESQL 的 yum 安裝后,您可以直接通過安裝后的 sudo systemctl start postgresql-15 來啟動PostgreSQL ,所以如何設置這個部分,成為通過源碼安裝同學提出的問題。
[Unit]
Description=PostgreSQL 15 database server
Documentation=https://www.postgresql.org/docs/15/static/
After=syslog.target
After=network-online.target[Service]
Type=notifyUser=postgres
Group=postgres# Note: avoid inserting whitespace in these Environment= lines, or you may
# break postgresql-setup.# Location of database directory
Environment=PGDATA=/var/lib/pgsql/15/data/# Where to send early-startup messages from the server (before the logging
# options of postgresql.conf take effect)
# This is normally controlled by the global default set by systemd
# StandardOutput=syslog# Disable OOM kill on the postmaster
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA}
ExecStart=/usr/pgsql-15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT# Do not set any timeout value, so that systemd will not kill postmaster
# during crash recovery.
TimeoutSec=0# 0 is the same as infinity, but "infinity" needs systemd 229
TimeoutStartSec=0TimeoutStopSec=1h[Install]
WantedBy=multi-user.target
下面我們逐一對于一些關鍵的部分進行解析
根據撰寫的規范首先我們以?【unit】作為開頭,unit本身說明我們本身服務和他相依賴的服務并注明關系。其中會有 Description 部分,描述信息以及關于這部分的可以查詢的網站信息等。
其中這里有 after , before, requires, wants conflicts , ?分別注明相關服務與本服務之間的啟動順序,和關閉的順序,After 主要表明此服務之前需要啟動的服務,和關閉時需要在這些服務前進行關閉的意思,Before正好相反,wants 為啟動此服務中還有連帶的非強制需要啟動那些服務,conflicts 說明啟動這個服務,不應該啟動的其他服務。
After=syslog.target
After=network-online.target
這兩個部分說明在關機前,在這兩個部分關閉前,我們的POSTGRESQL 應該是已經關閉了。其中這兩個部分在實際的工作中并未有什么關系系統安全和穩定的意義,After=syslog.target 這里可以忽略基本沒有意義。
但是官方的程序會有相關的注明,所以我們還是這里寫這個部分。下面的是關于postgresql服務中啟動的方式是什么。同時這里我們使用什么用戶和用戶組來作為啟動POSTGRESQL 或控制POSTGRESQL 的LINUX 賬號。
[Service]
Type=notify
User=postgres
Group=postgres
下面的部分為標記PGDATA變量指定的數據庫目錄的部分,具體需要根據你自己的數據庫目錄進行設定
Environment=PGDATA=/var/lib/pgsql/15/data/
下面的三行是對于服務器如果缺少內存,則對于POSTGRESQL POSTMASTER 進行設置阻止系統在OOM 的時候,來kill postmaster 主進程
OOMScoreAdjust=-1000
Environment=PG_OOM_ADJUST_FILE=/proc/self/oom_score_adj
Environment=PG_OOM_ADJUST_VALUE=0
在下面部分與我們的POSTGRESQL 的應用
這里主要是幾個部分
1? PG 數據庫的主數據目錄
ExecStartPre=/usr/pgsql-15/bin/postgresql-15-check-db-dir ${PGDATA}
2??PG 的執行文件目錄
ExecStart=/usr/pgsql-15/bin/postmaster -D ${PGDATA}
ExecReload=/bin/kill -HUP $MAINPID
在systemd unit文件中的ExecReload行。它指定了在重新加載服務時要執行的命
令。在這種情況下,命令是通過發送SIGHUP信號給$MAINPID來重新加載服務。
SIGHUP信號是一種常用的信號,用于通知進程重新加載其配置文件或重新初始化。通過執行上述命令,systemd將向$MAINPID指定的主進程發送SIGHUP信號,從而觸發服務的重新加載操作。
請注意,$MAINPID將在運行該unit文件時被實際的主進程PID替換。因此,實際執行的命令可能類似于:/bin/kill -HUP 1234,其中1234是實際的主進程PID。這將確保正確地發送信號以重新加載服務
。
KillMode=mixed
KillSignal=SIGINT
設置KillMode=mixed時,systemd會同時使用兩種終止模式:ControlGroup和Process。
ControlGroup模式:systemd發送SIGTERM信號給進程組中的所有進程,等待一段時間,讓它們正常終止。如果進程在超時時間內仍未終止,systemd會發送SIGKILL信號給進程組中的所有進程,強制終止它們。
Process模式:systemd只發送SIGTERM信號給主進程,等待一段時間,讓其正常終止。如果主進程在超時時間內未終止,systemd會發送SIGKILL信號給主進程,強制終止它。與服務相關的其他進程將不受影響。
通過設置KillMode=mixed,可以在終止服務時先嘗試優雅地終止與服務相關的所有進程,然后再強制終止仍未終止的進程。這有助于確保服務的完全終止。
KillSignal=SIGINT 是 systemd unit 文件中的一個選項,用于指定在終止服務時使用的信號。
SIGINT 是 POSIX 標準中定義的一個信號,用于通知進程中斷的信號。當進程接收到 SIGINT 信號時,它會收到一個中斷請求,通常用于請求進程優雅地退出。通過設置 KillSignal=SIGINT,systemd 會在終止服務時向進程發送 SIGINT 信號。進程可以響應該信號并做出相應的處理,例如釋放資源、保存數據等。如果進程在一定時間內沒有對 SIGINT 信號做出響應,則 system 會嘗試使用其他信號終止該進程。
需要注意的是,默認情況下,systemd 會使用 SIGTERM 信號終止服務進程。但是,如果你想要使用 SIGINT 信號作為終止信號,可以通過設置 KillSignal=SIGINT 來覆蓋默認設置。
總之,通過設置 KillSignal=SIGINT,可以讓 systemd 在終止服務時使用 SIGINT 信號,使進程有機會優雅地處理退出操作。這可以幫助確保服務的正確終止
剩下的這個部分
在 systemd unit 文件中,TimeoutSec=0 是一個選項,用于指定服務的運行超時時間。將 TimeoutSec 設置為 0 表示禁用超時限制,即服務可以無限期地運行。
在 systemd unit 文件中,TimeoutStartSec=0 是一個選項,用于指定服務的啟動超時時間。將 TimeoutStartSec 設置為 0 表示禁用啟動超時限制,即系統將不會對服務的啟動操作設置時間限制。
在 systemd unit 文件中,TimeoutStopSec=1h 是一個選項,用于指定服務的停止超時時間。將 TimeoutStopSec 設置為 1h 表示服務的停止操作限時 1 小時。
在 systemd unit 文件中,WantedBy=multi-user.target 是一個選項,用于指定服務所屬的 target。
systemd 的 target 是一組相關的單元的集合,可以作為系統的一個運行級別來理解。multi-user.target 是一個默認的 systemd target,代表了多用戶模式的運行級別。其中/usr/lib/systemd/system/ 目錄是存放系統服務單元文件的位置. ?剩下的就是將服務的文件放到對應的目錄,這里以CENTOS 為例,后續有機會我們在那 unbantu 為例一次。注意權限的設定。
sudo systemctl enable postgresql-15
最后我們在將postgresql服務項,設置為自啟動即可,此時你的系統可以通過如下的命令來控制POSTGRESQL
[root@pg15b system]# sudo systemctl start postgresql-15
[root@pg15b system]# sudo systemctl stop postgresql-15
[root@pg15b system]# sudo systemctl restart postgresql-15