前面有一篇文章我介绍了 PostgreSQL 的配置文件包括 pg_hba.conf 和 postgresql.conf。并给出了一个模板。但是并没有对这些参数的具体作用做解释,这篇文章我对需要注意的一些参数做一下简单的介绍。
listen_addresses = '*' 监控 IP 地址,如果你的服务器是多网卡多 IP 地址的,但是你只想让服务器通过其中一个 IP 地址进行访问的时候,你可以在这里设置为具体的 IP 地址,如果你不想指定那么可以设置为 * 表示所有的 IP 都可以。
port = 5432 数据库访问端口 5432。默认也是这个端口,如果是自建的可以考虑修改一下这个端口,在三级等保这些需求中会起到一些作用。
max_connections = 10000 数据库最大连接数,一般正常情况下这么多是足够的。我目前遇到最大的在 8000 个连接。
superuser_reserved_connections = 3 这个参数其实和上面这个参数有一些关系,当你连接已满的时候,数据库为超管用户保留的连接数,在一定的程度上可以这么理解。
authentication_timeout = 1min 密码验证超时时间。
password_encryption = scram-sha-256 密码加密方式,目前用的比较多的是 md5 和 scram-sha-256。在一些老的版本比如 12 用的就是 MD5。
shared_buffers 共享内存,该参数我一般设置为服务器物理内存的 50%-70% 之间。
huge_pages = try 这个参数在 Linux 上我一般是开启的。
temp_buffers = 8MB 会话级别的临时缓冲区的最大内存。
work_mem 在写入临时磁盘文件之前查询操作可使用的最大内存容量特别是排序。对于一个比较复杂的查询,可能会并行运行好几个排序或者哈希操作,每个操作都会被允许使用这个参数指定的内存量,然后才会开始写数据到临时文件。因此被使用的总内存可能是 work_mem
值的好几倍。
maintenance_work_mem 在执行维护性操作比如 VACUUM
、CREATE INDEX
和 ALTER TABLE ADD FOREIGN KEY
中使用的最大的内存量。
autovacuum_work_mem = -1 表示默认使用上面这个参数的值。
effective_io_concurrency = 8 这个参数建议设置为系统的线程数
max_worker_processes = 8 这个参数我一般也是设置为系统的线程数
max_parallel_workers_per_gather = 2 根据操作系统的总线程数适当的做下扩大
max_parallel_maintenance_workers = 2 和上面的参数类似
max_parallel_workers = 8 这个参数我一般也是设置为系统的线程数
wal_level 这个参数是 WAL 日志的级别,为了可以进行逻辑解析以及使用发布订阅一般都要求至少是 logical 级别的。
fsync 调用操作系统的刷盘操作。
synchronous_commit 同步提交策略,我一般都是改成异步的,根据具体的业务场景和 WAL 的提交进行修改。
full_page_writes 是否全页刷新。这个需要开启。
wal_log_hints 该参数也需要开启,WAL 日志的写日志记录。
checkpoint_timeout 检查点,默认是 5 分钟执行一次。
max_wal_size 其实这个参数并不启作用,真实的 WAL 日志的大小是在编译的时候指定的,这里去设置一个 WAL 文件的大小没有作用。
archive_mode 是否开启 WAL 归档,一般都是开启的,可以进行基于时间点的数据恢复等操作。但是需要注意的是归档路径下文件的磁盘控制,建议定期删除,我一般是基于时间的,在拷贝文件的时候保留归档文件的所以属性,然后再按照时间进行删除。
max_wal_senders max_replication_slots 这两个参数是在进行基于发布订阅模式下会用到这个。
wal_keep_size 这个参数是保留 WAL 文件的多少,之前的参数是 keep 文件个数,现在是换成了文件的大小,你可以按照一个 WAL 16MB 的大小进行换算。
hot_standby_feedback 这个参数建议在从库上开启,一般主从模式中,查询如果非常耗时,就会对 WAL 的重放和查询产生冲突,虽然不能从根本上解决问题,但是可以缓解。
effective_cache_size 这个参数一般是针对单个查询的最大换成的,可以根据服务器的具体情况做限制,这个参数并不影响 shared_buffer 参数的设置。我举个例子假设你的服务器总内存 8GB 你给 shared_buffer 配置 4GB 这里配置 64GB 数据库照样可以启动。
logging_collector 日志的收集,一般都是开启的。
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log' 日志文件的名称,一般在三级等保项目中要求日志的保存天数在 180 天以上,他可以满足,如果你将日志设置为按礼拜几循环,则需要替换按天循环的格式。
log_min_duration_statement 表示多长时间的 SQL 会被记录。单位是毫秒。
log_duration 这个参数我一般都是开启的。在日志中会记录 SQL 的运行时间。
log_line_prefix = '%m [%p] %x %d %r %a %u ' 日志每一行的格式。
log_lock_waits 锁信息是否需要记录在日志中,这个需要开启。
log_statement = 'mod' log 的模式。有好几个选项,mod 一般是满足场景需求的。
autovacuum 开启自动回收。
idle_in_transaction_session_timeout 超时设置,这个参数建议做一下设置,控制空闲事务超时的。
max_locks_per_transaction 这个参数默认 64 其实是满足绝大部分场景的,我曾经遇到过提示需要增大这个参数的提示,说共享内存用尽建议你增大这个参数,其实根本不是这回事,在后面有专门介绍这个错误信息提示的一篇文章。