您提供的步骤描述了在 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
目录中的文件和目录列表。这是远程服务器管理和自动化任务中常见的操作。