PostgreSQL技术问答32 - Configuration配置本文讨论了如何对Postgres数据库系统的启动和运
本文是《PostgreSQL技术问答》系列文章中的一篇。关于这个系列的由来,可以参阅开篇文章:
文章的编号只是一个标识,在系列中没有明确的逻辑顺序和意义。读者进行阅读时,不用太关注这个方面。
本文主要讨论的内容是在Postgres中,如何对服务器进行相关的配置。
Postgres中如何进行系统的配置
从系统配置的角度而言,Postgres主要使用配置文件,来对系统进行个性化的配置和设置。在Linux系统上,Postgres的主配置信息目录在 /etc/postgresql 中,并且按照当前安装的版本和实例名称来进行规划,如下:
postgres@ndb11-pgmain:/etc/postgresql/15/main$ ls -l
total 60
drwxr-xr-x 2 postgres postgres 4096 Jul 19 2023 conf.d
-rw-r--r-- 1 postgres postgres 315 Jul 19 2023 environment
-rw-r--r-- 1 postgres postgres 143 Jul 19 2023 pg_ctl.conf
-rw-r----- 1 postgres postgres 5084 Jul 19 2023 pg_hba.conf
-rw-r----- 1 postgres postgres 1636 Jul 19 2023 pg_ident.conf
-rw-r--r-- 1 postgres postgres 29697 Jul 21 2023 postgresql.conf
-rw-r--r-- 1 postgres postgres 317 Jul 19 2023 start.conf
本文中,笔者安装的系统是Postgresql 15,操作系统为 Debain 11。这个配置文件夹中,包括以下一些比较关键的配置文件:
- postgresql.conf 主配置文件
- pg_hba.conf 主机相关认证信息(Host-Based Authentication)
- pg_ctl.conf 系统控制信息,配合pg_ctl命令使用,但通常没有实际内容
- pg_ident.conf 系统和数据库用户标识映射配置
其实,在绝大多情况下,就只有前面两个文件是我们需要关注的。
除此之外,在Postgres启动的时候,可以选择执行时的命令行参数,和启动当前的环境变量,也可以作为配置参数使用。我们在后面也会简单讨论。
Postgres中有那些主要配置项目
在PostgreSQL中,虽然有很多可配置的项目,但其实在大多数情况下,只有少数几个配置信息,需要我们进行关注,因为它们可能和当前的应用环境有很大的相关性,它们的配置方式,可能会显著的影响系统的性能、安全性和可用性等等。如果没有特别说明,这些配置信息都在postgresql.conf文件中。在原始的配置文件中,有详细的注释信息来描述相关的配置项目来帮助我们进行参考和决策。
下面我们就只选择其中一些重点项目例举说明:
- listen_addresses
指定PostgreSQL服务程序监听的IP地址,默认只监听本地地址。客户端只能从这些指定的IP地址或者网络来连接数据库系统,从而能够提高网络连接的安全性和性能。可选项目包括"localhost"(本地),或者 "*" (监听所有网络地址)等等。
如果希望Postgres数据库系统,只为本地主机、特定的本地网络或者完全公开的网络提供服务,就可以为这些应用场景进行不同的配置。配置为"*"表示所有端口和地址,在安全方面,不是一个很好的做法,一般只用于开发和测试环境。
- port
指定PostgreSQL监听的端口,默认是5432。更改监听端口可以避免端口冲突或增强安全性(提高扫描或者直接攻击端口的成本)。
- max_connections
定义可以同时连接到PostgreSQL服务器的最大连接数。设置合理的最大连接数,防止资源耗尽,但也要确保服务器有足够的资源处理所有连接。显然,这个配置的选择,需要综合考虑系统的软硬件配置和应用服务的需求。现代化的Web应用程序,通常都使用连接池,来保持对数据库连接的有效利用和性能,所以一般情况下,这个配置不会有太大的影响和问题。只有在系统经常爆出连接数量不足的错误情况下,才应该考虑适当增加最大连接数的限制。
这个设置的默认值是100,在典型的单一专用数据库服务器上,是一个比较合适的设置。
- shared_buffers
定义PostgreSQL可以使用的共享内存缓冲区的大小,设置的是某个绝对的数值,如1GB。这是最重要的内存配置参数之一。通常设置为系统内存的25%-40%。但笔者认为,如果当前服务器主要用于数据库服务,可以将这个值设置成为系统内存的50%。
如果硬件条件允许,这是一个优先升级和设置的项目,通常默认情况下这个配置的设置是非常保守的,应该调整到比较合适的数值。
- work_mem
定义PostgreSQL在执行排序操作(如ORDER BY、GROUP BY等)时为每个操作分配的内存,默认情况下为16MB。增大work_mem可以提高复杂查询的性能,但每个查询操作都会独立使用该内存,因此需要谨慎调整。
- maintenance_work_mem
这个设置是维护操作(如VACUUM、CREATE INDEX等)期间可以使用的内存大小。适当提高,可以加速维护任务如索引创建或数据库清理等的执行。默认值为256MB。
- effective_cache_size
设置操作系统可用于PostgreSQL的磁盘缓存大小估计值。通常设置为系统内存的50%-75%。 但这不是一个硬性限制,而是PostgreSQL优化器用来决定是否应该使用索引的依据之一。
- log_min_duration_statement
定义记录到日志文件中的SQL语句的最小执行时间(毫秒)。设置为0会记录所有语句,-1则关闭此日志记录。 这个设置有助于识别和优化慢查询。
- checkpoint_timeout
定义在日志检查点之间的时间间隔(单位为分钟)。更频繁的检查点会增加写操作的开销,但减少崩溃恢复时间。需要根据系统负载、容量和系统性能综合考虑。
- wal_level
设置Write-Ahead Logging (WAL)记录操作的类型和级别,可能的值包括minimal, replica, logical。这个设置在启用复制或归档时非常重要,它可以确保必要的日志信息被写入。
- archive_mode 和 archive_command
用于启用WAL归档,以便进行备份和恢复。
- autovacuum
控制自动清理数据表的操作,以防止表膨胀,维护表的健康状态。可选择开启或者关闭,没有特殊情况下,应保持开启。
- synchronous_commit
控制提交操作是等待WAL日志同步到磁盘,还是在后台异步处理,默认为开启(强化数据安全)。这个配置信息会影响事务提交的性能和数据安全性。需要进行选择和平衡。
- hot_standby
这是一个Postgres中提高可用性的配置项目,它用于控制数据库在主实例故障后,备用实例(standby server)何时可以开始接受连接和执行只读查询。
- password_encryption
这个项目用于控制用户密码的加密方式和算法。在比较新的Postgres版本中,这个配置的默认值已经修改成为了scram-sha-256,它比原来使用的md5更安全。虽然有这个配置项目,但笔者觉得好像并没有对Web应用的连接和使用造成太大的影响,几乎不需要关心这个问题(也可能是配套的客户端软件都同时升级的原因)。
上面主要列举的是系统运行相关的配置信息(postgresql.conf),下面我们列举pg_hba.conf相关重要的配置信息,它们主要是和数据库访问控制相关的内容。这里的配置格式和前面不同,使用的是一个访问控制表格,每行是一个配置项目。例如:
# Database administrative login by Unix domain socket
local all postgres peer
# TYPE DATABASE USER ADDRESS METHOD
# "local" is for Unix domain socket connections only
local all all peer
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 192.168.9.0/24 scram-sha-256
# IPv6 local connections:
host all all ::1/128 scram-sha-256
# Allow replication connections from localhost, by a user with the
# replication privilege.
local replication all peer
host replication all 127.0.0.1/32 scram-sha-256
host replication all ::1/128 scram-sha-256
这里有一些要点:
- 前面没有#的都是有效的配置项目
- local项目,指本地客户端,可能使用Unix Socket来进行连接
- host项目, 指网络客户端连接
- 第一个 all, 指可以连接的数据库,如all表示所有数据库都可用
- 第二个 all,指连接使用的用户
- 网络地址, 可以使用特定主机,或者网络地址段
- Method, 认证方式,peer指本地直接连接,其他是认证算法,现在都是scram-sha-256
- 如果使用了数据库复制,需要一些特别的设置(配置文件最后的部分)
这个文件中的安全性配置非常重要,它可以确保只有经过验证的用户和网络可以访问数据库。通常在日常工作中,无法正常访问数据库系统的情况,都和没有正确配置访问相关,如网络地址、认证方式、账号控制等等。一般情况下,我们在数据库安装完成之后,需要将本地局域网段的相关配置打开并且设置正确的内容。
启动参数
还是以Linux系统作为标准来讨论。以在一般正常的安装情况下,Postgres是作为一个系统服务安装并启动的。但实际上,和所有的可执行文件一样,Postgres的服务其实只是一个启动的脚本,它本质上还是一个带有参数的可执行文件的启动过程。所以,逻辑上,我们可以直接运行Postgres来启动数据库程序,并且配合相关的启动参数,来指定这个服务程序的相关配置和行为。
如果直接运行程序(postgres),一些常见可选的参数包括(和配置文件类似):
- -D datadir 指定数据文件夹位置
- -h hostname 指定侦听地址
- -p port 指定侦听端口
- -i 允许网络连接,否则默认情况下只能本地连接
- -B nbuffers 指定共享缓冲区(shared buffer)大小
- -S work-mem 指定工作内存(work memory)大小
- -N max-connections 设置最大连接数
- -c name=value 使用键值对的方式,设置运行时参数
- -d debug-level 设置调试日志级别
- -F 关闭fsync调用,可以增强运行性能,但在系统崩溃时,有一定的数据丢失的风险
- --single 单用户模式
这里由于篇幅限制,加上这种配置方式不太常用,就不再展开叙述,读者有兴趣可以自行查阅技术文档获取详情。
环境变量
在Postgres运行的时候,可以设置一些系统的环境变量,同样可以来控制数据库服务程序的行为。这些环境变量的名称是特定的,包括:
- PGCLIENTENCODING
默认客户端使用的字符编码方式。当客户端连接的时候,在默认情况下,使用这个设置,当然客户端也可以强制单独指定字符编码方式。
- PGDATA
默认数据库数据文件夹的位置
- PGDATESTYLE
默认使用的日期风格。
- PGPORT
默认侦听端口号。建议最好在配置文件中指定
小结
本文讨论了如何对Postgres数据库系统的启动和运行进行相关的设置,这些项目涵盖了PostgreSQL的核心性能、安全性、日志记录和维护等方面。在配置PostgreSQL时,根据实际应用需求调整这些参数,可以更好的适应运行的环境,提升数据库性能和安全性。
转载自:https://juejin.cn/post/7403390069783199756