![设置自定义数据目录后无法应用 Postgres 配置更新](https://linux22.com/image/1061915/%E8%AE%BE%E7%BD%AE%E8%87%AA%E5%AE%9A%E4%B9%89%E6%95%B0%E6%8D%AE%E7%9B%AE%E5%BD%95%E5%90%8E%E6%97%A0%E6%B3%95%E5%BA%94%E7%94%A8%20Postgres%20%E9%85%8D%E7%BD%AE%E6%9B%B4%E6%96%B0.png)
我正在配置一个基于 Canonical 官方 AMI 映像、使用 Ubuntu 16.04 在 AWS EC2 实例上运行的数据库服务器。在此实例上,我从存储库安装了 Postgres 9.6 xenial-pgdg
,然后将数据目录的位置从默认位置更改,因为我想为数据库集群使用与根卷分开的更大容量卷。更改数据集群位置后,我似乎无法成功重新加载/重新启动 postgres 服务,以使任何后续配置更改生效。至少我需要配置目录中的 postgresql.conf
和文件,以允许一个特定的其他服务器连接到此数据库服务器。pg_hba.conf
/etc/postgresql/9.6/main/
以下是有关服务器设置的相关背景信息。
操作系统版本:
ubuntu@ip-10-144-96-189:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04.2 LTS
Release: 16.04
Codename: xenial
我创建了一个postgres
Linux 用户和组。为数据库集群安装了新驱动器,并使其成为postgres
数据目录的所有者。添加了xenial-pgdg
存储库并安装了以下软件包:
postgresql-9.6
postgresql-contrib-9.6
python-psycopg2
postgresql-9.6-postgis-2.3
libgeos-dev
postgresql-common
s3cmd
基于这篇文章我删除了默认数据库集群并在新的数据目录中创建了一个新的数据库集群(以用户身份执行的命令postgres
):
pg_dropcluster --stop 9.6 main
pg_createcluster -d /mnt/pg_data/pg --start 9.6 main
我编辑了该/etc/postgresql/9.6/main/postgresql.conf
文件以在端口 5432 上监听localhost
来自 TCP 的连接和 IP 地址:
listen_addresses = 'localhost, 10.112.190.57' # what IP address(es) to listen on;
port = 5432 # (change requires restart)
然后重新启动 postgresql 服务后,在配置的 IP 地址上没有打开任何 TCP 连接进行监听,只有在默认的情况下localhost
:
ubuntu@ip-10-144-96-189:~$ sudo systemctl restart postgresql
ubuntu@ip-10-144-96-189:~$ netstat -nlp
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
udp 0 0 0.0.0.0:68 0.0.0.0:* -
udp 0 0 10.144.96.189:123 0.0.0.0:* -
udp 0 0 127.0.0.1:123 0.0.0.0:* -
udp 0 0 0.0.0.0:123 0.0.0.0:* -
udp6 0 0 fe80::2000:bff:fed5:123 :::* -
udp6 0 0 ::1:123 :::* -
udp6 0 0 :::123 :::* -
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 166227 23611/systemd /run/user/1000/systemd/private
unix 2 [ ACC ] SEQPACKET LISTENING 8758 - /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 8754 - /run/systemd/private
unix 2 [ ACC ] STREAM LISTENING 8760 - /run/lvm/lvmpolld.socket
unix 2 [ ACC ] STREAM LISTENING 8765 - /run/systemd/journal/stdout
unix 2 [ ACC ] STREAM LISTENING 8891 - /run/lvm/lvmetad.socket
unix 2 [ ACC ] STREAM LISTENING 13009 - /run/snapd-snap.socket
unix 2 [ ACC ] STREAM LISTENING 13005 - /var/lib/lxd/unix.socket
unix 2 [ ACC ] STREAM LISTENING 13008 - /run/snapd.socket
unix 2 [ ACC ] STREAM LISTENING 13010 - /run/acpid.socket
unix 2 [ ACC ] STREAM LISTENING 13011 - /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 13012 - /run/uuidd/request
unix 2 [ ACC ] STREAM LISTENING 13169 - @ISCSIADM_ABSTRACT_NAMESPACE
unix 2 [ ACC ] STREAM LISTENING 148848 - /var/run/postgresql/.s.PGSQL.5432
上一个输出中的最后一行还显示了用于本地 Postgres 连接的打开的 Unix 套接字。我还需要10.112.190.57
在文件中从 IP 地址配置客户端身份验证pg_hba.conf
。
postgres.conf
问题:我需要采取哪些步骤才能将和文件中的新配置应用pg_hba.conf
到 postgres 服务?
我考虑过自定义 systemd 服务文件,并在PostgreSQL 网站:
When using systemd, you can use the following service unit file (e.g., at /etc/systemd/system/postgresql.service):
[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)
[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0
[Install]
WantedBy=multi-user.target
不幸的是,该ExecStart=/usr/local/pgsql/bin/postgres -D ...
条目指向我的服务器上不存在的命令。
问题:适用于带有 PostgreSQL 9.6 的 Ubuntu 16.04 的等效 systemd 设置是什么?
最后,这是 postgres 服务和集群服务状态:
ubuntu@ip-10-144-96-189:~$ systemctl status postgresql
● postgresql.service - PostgreSQL RDBMS
Loaded: loaded (/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: active (exited) since Wed 2017-12-06 18:44:43 UTC; 1 day 2h ago
Process: 18307 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
Main PID: 18307 (code=exited, status=0/SUCCESS)
Tasks: 0
Memory: 0B
CPU: 0
CGroup: /system.slice/postgresql.service
Dec 06 18:44:43 ip-10-144-96-189 systemd[1]: Starting PostgreSQL RDBMS...
Dec 06 18:44:43 ip-10-144-96-189 systemd[1]: Started PostgreSQL RDBMS.
ubuntu@ip-10-144-96-189:~$ systemctl status [email protected]
● [email protected] - PostgreSQL Cluster 9.6-main
Loaded: loaded (/lib/systemd/system/[email protected]; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-12-06 18:44:43 UTC; 1 day 2h ago
Process: 18274 ExecStop=/usr/bin/pg_ctlcluster --skip-systemctl-redirect -m fast %i stop (code=exited, status=1/FAILURE)
Process: 18281 ExecStart=postgresql@%i --skip-systemctl-redirect %i start (code=exited, status=0/SUCCESS)
Main PID: 18290 (postgres)
CGroup: /system.slice/system-postgresql.slice/[email protected]
├─18290 /usr/lib/postgresql/9.6/bin/postgres -D /mnt/pg_data/pg -c config_file=/etc/postgresql/9.6/main/postgresql.conf
├─18292 postgres: 9.6/main: checkpointer process
├─18293 postgres: 9.6/main: writer process
├─18294 postgres: 9.6/main: wal writer process
├─18295 postgres: 9.6/main: autovacuum launcher process
└─18296 postgres: 9.6/main: stats collector process
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: Stopped PostgreSQL Cluster 9.6-main.
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: [email protected]: Unit entered failed state.
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: [email protected]: Failed with result 'exit-code'.
Dec 06 18:44:40 ip-10-144-96-189 systemd[1]: Starting PostgreSQL Cluster 9.6-main...
Dec 06 18:44:43 ip-10-144-96-189 systemd[1]: Started PostgreSQL Cluster 9.6-main.
我看到了失败[电子邮件保护]进程状态,但我不知道它们是什么意思以及如何解决这种情况。
答案1
经过一番研究,我找到了一种解决方案,使用 PostgreSQL 9.6 配置 Ubuntu 16.04 数据库服务器,该服务器使用自定义集群位置并允许应用后续配置更改。
在我的例子中,配置了一个 AWS EC2 实例,但对于任何 Ubuntu 16.04 主机,该过程应该相同。我还最终使用 Ansible (v2.3.1) 来自动化配置过程,但与 Ansible 执行的相同操作顺序应该会导致相同的结果。以下是主要步骤:
在 Ubuntu 服务器上安装 Python 2.7(这仅 Ansible 需要)。
使用geerlingguy.postgresqlAnsible 角色,它提供了在系统上安装 PostgreSQL 9.5 的默认步骤,并在默认位置初始化数据库集群(/var/lib/postgresql/9.5/main目录)。此角色完全参数化,易于定制。我对其进行了修改,以安装带有 postgis v2.3 的 PostgreSQL 9.6。
- 更改
__postgresql_version
为“9.6”vars/Ubuntu-16.yml。 - 更改
__postgresql_packages
列表以根据需要包含 v9.6 包名称vars/Ubuntu-16.yml. 将必要的扩展包(例如postgis)添加到列表中。 - 在安装列表之前,修改 _tasks/setup_Debian.yml_ 以添加
xenial-pgdg
存储库,包括其存储库密钥postgres_packages
。请参阅https://www.postgresql.org/download/linux/ubuntu了解具体情况。 - 更新默认值/main.yml文件中包含您的数据库、扩展和数据库用户信息。您可以修改
postgresql_global_config_options
以自定义listen_addresses
值,也可以postgresql_hba_entries
使用自定义连接值修改 。 - 在任务/数据库.yml创建数据库后,将任何扩展添加到数据库。
- 更改
执行包含上述两个步骤的 Ansible 播放列表后,PostgreSQL 服务器将启动并运行,允许本地postgres
用户连接到您的数据库。您可以进行配置更改,例如/etc/postgresql/9.6/main/postgres.conf文件并使用systemctl
命令重新启动postgresql
服务以应用更改。
Ansible角色geerlingguy.postgresql
确实允许配置 PostgreSQL 数据目录,但我还没有尝试过。相反,我按照上述过程成功更改了数据目录,方法是按照https://www.tutorialspoint.com/articles/how-to-change-postgresql-data-folder-location-on-ubuntu-16-04文章。
我希望这对那些在 Ubuntu 16.04 上熟悉 PostgreSQL 的人有帮助。