您提供的步驟描述了在 PostgreSQL 數據庫環境中配置服務器間的 SSH 無密碼登錄和數據庫用戶認證的過程。這些步驟主要用于設置一個高可用性、負載平衡的數據庫集群環境。讓我們逐一解釋這些步驟的目的和應用場景:
1. 啟動 PostgreSQL 服務
systemctl start postgresql-13
這個命令用于啟動 PostgreSQL 13 的服務。
2. 創建數據庫角色
CREATE ROLE pgpool WITH LOGIN;
CREATE ROLE repl WITH REPLICATION LOGIN;
這些命令在 PostgreSQL 中創建了兩個角色:pgpool
和 repl
。pgpool
用于連接池管理,而 repl
用于復制(replication)。
3. 設置 SSH 無密碼登錄
ssh-keygen -t rsa -f id_rsa_pgpool
ssh-copy-id -i id_rsa_pgpool.pub postgres@server1
ssh-copy-id -i id_rsa_pgpool.pub postgres@server2
ssh-copy-id -i id_rsa_pgpool.pub postgres@server3
這些命令生成了一個 SSH 密鑰對,并將公鑰復制到集群中的其他服務器上。這允許 postgres
用戶在不需要輸入密碼的情況下通過 SSH 訪問集群中的其他服務器,這對于管理和自動化任務非常重要。
4. 配置 .pgpass 文件
vi /var/lib/pgsql/.pgpass
.pgpass
文件用于存儲數據庫連接的憑據,使得腳本和程序能夠在不需交互輸入密碼的情況下連接到數據庫。
/var/lib/pgsql/.pgpass
文件用于存儲 PostgreSQL 數據庫的登錄憑據,以便在不需要交互式輸入密碼的情況下自動登錄。這個文件的每一行都包含一個數據庫連接的憑據,格式如下:
hostname:port:database:username:password
每個字段的含義如下:
- hostname: 數據庫服務器的主機名或IP地址。如果適用于所有主機,可以使用
*
代替。 - port: 數據庫服務器監聽的端口。如果適用于所有端口,可以使用
*
代替。 - database: 要連接的數據庫名稱。如果適用于所有數據庫,可以使用
*
代替。 - username: 連接數據庫的用戶名。
- password: 用戶名對應的密碼。
例如,如果您想為用戶 repl
在 server1
, server2
, 和 server3
上的 replication
數據庫配置自動登錄,并且為 postgres
用戶在這些服務器上的 postgres
數據庫配置自動登錄,您的 .pgpass
文件將如下所示:
server1:5432:replication:repl:repl_password
server2:5432:replication:repl:repl_password
server3:5432:replication:repl:repl_password
server1:5432:postgres:postgres:postgres_password
server2:5432:postgres:postgres:postgres_password
server3:5432:postgres:postgres:postgres_password
這里,repl_password
和 postgres_password
應該被替換為實際的密碼。
安全注意事項:
.pgpass
文件應該被設置為僅由文件擁有者可讀,使用命令chmod 600 /var/lib/pgsql/.pgpass
。- 由于這個文件包含敏感信息,確保它的安全性非常重要。只有必要的用戶和應用程序應該能夠訪問這個文件。
- 在配置文件時要小心,避免在不安全的環境中泄露憑據。
應用場景
假設您正在設置一個由三個服務器(server1、server2、server3)組成的 PostgreSQL 集群,您可能需要進行以下操作:
- 數據復制(Replication):使用
repl
角色在主服務器和備份服務器之間同步數據。 - 負載平衡(Load Balancing):使用
pgpool
或其他工具分配查詢負載,優化性能。 - 自動化任務:例如,數據庫備份、監控或其他維護任務,可以通過 SSH 無密碼登錄在服務器之間自動執行。
通過這些配置,您的數據庫環境將支持高可用性和易于管理的特性,使得在出現故障或需要擴展時,您可以更加靈活和迅速地應對。
測試
ssh postgres@server1 -i ~/.ssh/id_rsa_pgpool ls /home
這個命令是在使用 SSH 連接到名為 server1
的服務器,并執行 ls /home
命令來列出 /home
目錄的內容。讓我們分解這個命令的各個部分:
-
ssh postgres@server1
: 這是一個 SSH 命令,用于通過網絡從當前服務器(或計算機)連接到server1
。在這里,postgres
是你將要以其身份登錄到server1
的用戶名。 -
-i ~/.ssh/id_rsa_pgpool
: 這個選項指定了私鑰文件的位置,用于驗證身份。-i
參數告訴 SSH 使用~/.ssh/id_rsa_pgpool
私鑰文件進行身份驗證,而不是默認的私鑰文件。這個文件是之前生成的,用于設置無密碼 SSH 訪問的一部分。 -
ls /home
: 登錄到server1
之后,將執行的命令。ls
是一個列出目錄內容的命令,在這種情況下,它被用來列出server1
上/home
目錄的內容。
總的來說,這個命令允許用戶 postgres
使用指定的私鑰文件遠程登錄到 server1
,并在那里執行 ls /home
命令來查看 /home
目錄中的文件和目錄列表。這是遠程服務器管理和自動化任務中常見的操作。