本文共 10022 字,大约阅读时间需要 33 分钟。
目录
PostgreSQL是一个功能非常强大的、源代码开放的客户/服务器关系型数据库管理系统(RDBMS)。支持丰富的数据类型(如JSON和JSONB类型,数组类型)和自定义类型。PostgreSQL内存页面的默认大小是8kB。
在一个数据库实例中,有些配置会影响到整个实例,这些我们称为全局配置;有些配置只对一个数据库实例中的单个Database 生效,或只对当前会话或者某个数据库用户生效,这一类的配置我们称为非全局配置。
PostgreSQL 有两个重要的全局配置文件: postgresql.conf 和pg_hba.conf。它们提供了很多可配置的参数,这些参数从不同层面影响着数据库系统的行为, postgres ql. conf 配置文件主要负责配置文件位置、资源限制、集群复制等, pg hba . conf 文件则负责客户端的连接和认证。这两个文件都位于初始化数据目录中。
PostgreSQL的配置文件都特别人性化,有#就是默认值。改完参数一定要去掉#。
#------------------------------------------------------------------------------
# RESOURCE USAGE (except WAL)
#------------------------------------------------------------------------------
上面大项目分段。
# - Memory – 单#-是小项目配置
主要有七种方式
TYPE DATABASE USER ADDRESS METHOD
local database user auth-method [auth-options]
host database user address auth-method [auth-options]
hostssl database user address auth-method [auth-options]
hostnossl database user address auth-method [auth-options]
host database user IP-address IP-mask auth-method [auth-options]
hostssl database user IP-address IP-mask auth-method [auth-options]
hostnossl database user IP-address IP-mask auth-method [auth-options]
TYPE列标识允许的连接方式,可用的值有: local、host、hostssl、 hostnossl,说明如下:
口local 匹配使用Unix域套接字的连接。如果没有TYPE为1ocal的条目则不允许通过
Unix域套接字连接。
口host匹配使用TCP/IP建立的连接,同时匹配SSL和非SSL连接。默认安装只监听
本地环回地址localhost的连接,不允许使用TCP/IP远程连接,启用远程连接需要修
改postgresql.conf中的listen_ addresses 参数。
口hostssl 匹配必须是使用SSL的TCP/IP连接。配置hostssl 有三个前提条件:
1.客户端和服务端都安装OpenSSL;
2.编译PostgreSQL的时候指定configure 参数--with- openssl打开SSL支持;
3.在postgresql.conf中配置ssl = on。
口hostnossl 和hostssI 相反,它只匹配使用非SSL的TCP/IP连接。
DATABASE列标识该行设置对哪个数据库生效;
指定此记录匹配的数据库名称。值 all 指定它匹配所有数据库。
USER列标识该行设置对哪个数据库用户生效;
ADDRESS列标识该行设置对哪个IP地址或IP地址段生效;
以这种方式指定的IPv4地址范围的典型示例对于单个主机为 172.20.143.89/32 ,对于小型网络为 172.20.143.0/24 ,对于较大的网络为 10.6.0.0/16 。 0.0.0.0/0 表示所有IPv4地址, ::0/0 表示所有IPv6地址。要指定单个主机,请使用掩码长度32(对于IPv4)或128(对于IPv6)。
METHOD列标识客户端的认证方法,常见的认证方法有trust、reject、 md5和password等。
trust无条件地允许连接。此方法允许任何可以连接到PostgreSQL数据库服务器的人以他们希望的任何PostgreSQL用户身份登录,而无需密码或任何其他身份验证。流复制最好用trust。
reject无条件拒绝连接。这对于从组中“过滤掉”某些主机非常有用,例如 reject 行可能阻止特定主机连接,而后续行允许特定网络中的其余主机进行连接。
scram-sha-256执行SCRAM-SHA-256身份验证以验证用户的密码。
md5执行SCRAM-SHA-256或MD5身份验证以验证用户的密码。网络传输不是明文的密码。
password要求客户端提供未加密的密码以进行身份验证。由于密码是通过网络以明文形式发送的,因此不应在不受信任的网络上使用。
# IPv4 local connections:
host all all 127.0.0.1/32 trust
host all all all trust
postgresql.conf 配置文件的文件结构很简单,由多个configparameter = value 形式的行组成,“#”开头的行为注释。value 支持的数据类型有布尔、整数、浮点数、字符串、枚举,value 的值还支持各种单位,例如MB 、GB 和ms 、min 、d 等。postgresql.conf 文件还支持include 和include if exists 指令,并且允许嵌套。
在配置项末尾标记了“# (change requires restart) ” 的配置项是需要重启数据库实例才可以生效的,其他没有标记的配置项只需要reload 即可生效。
口修改postgresql.conf配置文件。
口通过ALTER SYSTEM命令修改全局配置,例如:
[root@Redhat7 ~]# vim /pgdb/postgresql.conf
listen_addresses = '*' # what IP address(es) to listen on;
# comma-separated list of addresses;
postgres-# alter system set listen addresses '*';
通过ALTER SYSTEM SQL 命令修改的全局配置参数,会自动编辑postgresql.auto.conf文件,在数据库启动时会加载postgresql.auto .conf 文件,并用它的配置覆盖postgresql.conf中已有的配置。这个文件不要手动修改它。
设置和重置Database级别的配置,例如:
ALTER DATABASE name SET conf igparameter { TO | = } { value | DEFAULT }
ALTER DATABASE name RESET configuration
一定要加;否则无法查询,醉醉的,特别醉,特别醉,特别醉。
postgres=# show config_file;
config_file
-----------------------
/pgdb/postgresql.conf
postgres=# select name,setting from pg_settings;
postgres=# show all;
postgres=# show shared_buffers;
shared_buffers
----------------
128MB
(1 row)
决定数据库的最大并发连接数。根据实际情况+100
参考值:不超过物理内存(GB)*50。
Shared Buffer:-用于缓存表和索引|的数据块,相当于oracle的SGA是一组共享内存结构,shared_buffers合理的配置对性能影响很大。
shared_buffers 的合理起始值是系统内存的25%。有些工作负载甚至更大的 shared_buffers 设置都有效,但由于PostgreSQL还依赖于操作系统缓存,因此对于 shared_buffers 分配超过40%的RAM不太可能比较小的数据量更好。
shared_buffers 的较大设置通常需要相应增加 max_wal_size ,以便分散在较长时间内写入大量新数据或更改数据的过程。
最佳实践25-40%
postgres=# select name,setting from pg_settings where name like 'share%';
name | setting
--------------------------+---------
shared_buffers | 16384
(2 rows)
postgres=# show shared_buffers;
shared_buffers
128MB
(1 row)
postgres=# alter system set shared_buffers='256MB';
ALTER SYSTEM
[postgres@Redhat7 ~]$ pg_ctl restart -D /pgdb/
waiting for server to shut down.... done
postgres=# show shared_buffers;
shared_buffers
512MB
用来限制每个服务进程进行排序或hash 时的内存分配,排序、去重、归并需要排序,并不是每隔进程都需要排序,所以32M是可以的。
如果要使用语句中有较大的排序操作,可以在会话级别设置该参数,set work_men = ‘1GB’,提高执行速度。
参考值:# =0.25*可用内存/ 并发数(用到排序)
postgres=# show work_mem;
work_mem
4MB
alter system set work_mem ='32MB';
pg_ctl restart -D /pgdb/
postgres=# show work_mem;
work_mem
32MB
维护工作内存,主要是针对数据库的维护操作或者语句。尽量的将这些操作在内存中进行。主要针对VACUUM,CREATE INDEX,REINDEX等操作。在对整个数据库进行VACUUM或者较大的index进行重建时,适当的调整该参数非常必要。
当然不建议在 postgresql.conf中设置较大的 maintenance_work_mem,因为 autovacuum 进程消耗的内存受这个参数影响, 一般仅在创建索引的 session 设置 session 级 maintenance_work_mem 参数。
#maintenance_work_mem = 64MB 默认为64M
可以改成512M,或者1GB都可以。
/pgdb/pg_wal/ 日志文件在pg_wal
WRITE-AHEAD LOG
#wal_buffers = -1 # min 32kB, -1 sets based on shared_buffers
默认值 -1 选择等于shared_buffers的 1/32的尺寸(大约3%)
#checkpoint_timeout = 5min # range 30s-1d
自动 WAL 检查点之间的最长时间,以秒计。 有效值在30秒和1天之间。 默认是5 分钟(5min)。 增加这个参数的值会增加崩溃恢复所需的时间。 这个参数只能在postgresql.conf文件中或在服务器命令行上设置。
max_wal_size = 1GB 最大保留的wal日志大小。
在自动WAL检查点使得WAL增长到最大尺寸。这是软限制;特殊情况下WAL大小可以超过 max_wal_size,如重负载下,错误archive_command,或者 较大wal_keep_segments的服务器配置458设置。缺省是1GB。 增加这个参数会延长崩溃恢复所需要的时间。 这个参数只能在postgresql.conf文件或者服务器命令行上设置。
#checkpoint_completion_target = 0.5。 可以修改成0.8就是到了5分钟,或者0.8* max_wal_size做检查。
设置为on
archive_mode = on
PostgreSQL在写入频繁的场景中,会产生大量的WAL日志,而且WAL日志量会远远超过实际更新的数据量。 我们可以把这种现象起个名字,叫做“WAL写放大”,造成WAL写放大的主要原因有2点。
1. 在checkpoint之后第一次修改页面,需要在WAL中输出整个page,即全页写(full page writes)。全页写的目的是防止在意外宕机时出现的数据块部分写导致数据库无法恢复。
2. 更新记录时如果新记录位置(ctid)发生变更,索引记录也要相应变更,这个变更也要记入WAL。更严重的是索引记录的变更又有可能导致索引页的全页写,进一步加剧了WAL写放大。
提供可用于磁盘高速缓存的内存量的估计值 设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用,优化器假设一个查询可以用的最大内存,和shared_buffers无关。
建议将effective_ cache_ size的值设为系统总内存的一半或者更多。此设置的更改可动态生效,执行重新加载即可。
REPORTING AND LOGGING
#------------------------------------------------------------------------------
# REPORTING AND LOGGING
#------------------------------------------------------------------------------
#logging_collector = off 需要设置成on
logging_collector = on
默认错误报告的位置
#log_directory = 'log' # directory where log files are written,
#log_lock_waits = off 把锁等待记录下来
log_lock_waits = on
log_checkpoints = off 设置成on做性能分析
Pgbager 日志工具
listen_addresses = '*' # 监听哪个IP地址;以逗号分隔的地址列表.默认监听"localhost",(更改需要重新启动PG数据库),*表示监控全部IP
port = 5432 # PG服务监听端口号-默认端口5432.(更改需要重新启动PG数据库)
max_connections=4000 ## 最大连接数(更改需要重新启动PG数据库) 公式:物理内存(GB)*1000*(1/4)/5 =96*1000*0.25/5=4800
superuser_reserved_connections = 10 # 最大连接数已满,为超级用户保留多少个连接
shared_buffers = 96GB # shared_buffers 公式: IF use hugepage: 主机内存*(1/4) ELSE: min(32GB, 主机内存*(1/4))
temp_buffers = 64MB #temp_buffers是使用tempory table时用到的,默认8MB
work_mem = 512MB # hash join,排序,HASH都会用到work_mem 公式: max(物理内存/4096, 64MB)
max_worker_processes = 64 #数决定了整个数据库集群允许启动多少个work process,注意如果有standby,standby的参数必须大于等于主库的参数值。
wal_level = logical # minimal, replica, or logical 最小、副本或逻辑(更改需要重新启动PG数据库生效)
fsync = on # 将数据刷新到磁盘以确保崩溃安全(关闭此功能可能导致不可恢复的数据损坏)
synchronous_commit = on # 单实例当数据库提交事务时,wal先写入 wal buffer 再写入 wal 日志文件,设置成on表示提交事务时需等待本地wal写入wal日志后才向客户端返回成功。on 为默认设置,数据库非常安全,但性能有所损耗。 流复制环境,表示流复制主库提交事务时,需等待备库接收主库发送的wal日志流并写入wal文件,之后才向客户端返回成功,简单的说on表示本地wal已落盘,备库的wal也已落盘,有两份持久化的wal,但备库此时还没有完成重做。这个选项带来的事务响应时间较高。
full_page_writes = on #是否开启全页写入,此参数是为了防止块折断(块损坏)的一种策略。linux操作系统文件系统一个块一般是4k,而数据库则一般是一个块8k,当数据库的脏块刷新到磁盘上时,由于底层是两个块组成的。pg采用的机制,所以当每次checkpoint后如果数据有修改都会进行全页写入。
wal_log_hints = on #pg_rewind,时间线修复,脑裂修复,flashback - 从库开启读写后,回退为只读从库。异步主从发生角色切换后,主库rewind为新主库的从库。pg_rewind—使一个PostgreSQL数据目录与另一个数据目录(该目录从第一个PostgreSQL数据目录创建而来)一致。
min_wal_size = 256MB # min(shared_buffers/2 , 用户存储空间/10)
archive_mode = on #开启归档
archive_command = '/bin/gzip -c %p > /home/postgres/pg_archive/%f.gz' #归档命令
max_wal_senders = 10 # max number of walsender processes 它表示主库最多可以有多少个并发的standby数据库
wal_keep_segments=100 # 根据实际情况设置保留WAL的数量
hot_standby = on # 说明这台机器不仅仅是用于数据归档,也用于数据查询
effective_cache_size = 64GB #提供可用于磁盘高速缓存的内存量的估计值 设置规划器对一个单一查询可用的有效磁盘缓冲区尺寸的假设。这个参数会被考虑在使用一个索引的代价估计中,更高的数值会使得索引扫描更可能被使用,更低的数值会使得顺序扫描更可能被使用,优化器假设一个查询可以用的最大内存,和shared_buffers无关。
log_directory = 'log' # 写入日志文件的目录,可以是绝对的,也可以是相对于PGDATA的
log_filename = 'postgresql-%Y-%m-%d' # 日志文件名
log_destination = 'csvlog' #日志的格式
logging_collector = on #启用日志收集
log_truncate_on_rotation = on #如果ON,与新日志文件具有相同名称的现有日志文件将被截断而不是附加到
log_rotation_size = 10MB #单个日志文件最大多大时,被截断
log_min_duration_statement = 1s # 根据实际情况设定,例如业务上认为1秒以上是慢SQL,那么就设置为1秒。
log_checkpoints = on # 记录检查点的详细统计信息
log_connections = on #对服务器的连接被记录
log_disconnections = on #导致会话终止被记录
log_error_verbosity = verbose #每条日志信息的详细程度,有效值是TERSE、DEFAULT和VERBOSE,每一个都为显示的消息增加更多域。TERSE排除记录DETAIL、HINT、QUERY和CONTEXT错误信息。VERBOSE输出包括SQLSTATE错误码
log_lock_waits = on 控制当一个会话为获得一个锁等到超deadlock_timeout时,是否要产生一个日志消息。这有助于决定是否所等待造成了性能低下
log_statement = 'ddl' #控制哪些 SQL 语句被记录。有效值是 none (off)、ddl、mod和 all(所有语句)。ddl记录所有数据定义语句,例如CREATE、ALTER和 DROP语句。mod记录所有ddl语句,外加数据修改语句例如INSERT, UPDATE、DELETE、TRUNCATE, 和COPY FROM。 如果PREPARE、EXECUTE和 EXPLAINANALYZE包含合适类型的命令,它们也会被记录
shared_preload_libraries = 'pg_cron,repmgr,pg_stat_statements,passwordcheck,auth_delay'
passwordcheck.level='true' 服务器启动时预载入的共享库
auth_delay.milliseconds='600000'
1 Shared Buffer设置大内存以后,为什么不能设置大内存,max_wal_size设置多少,计算公式。
2 work_mem 设置了32M,并不是每次都使用32M,只是进程排序或hash 时使用的大小。
3 数据写入是不是,应该是先写道预写式日志(WAL)是保证数据完整性的一种标准方法。简单来说,WAL的中心概念是数据文件(存储着表和索引)的修改必须在这些动作被日志记录之后才被写入,即在描述这些改变的日志记录被刷到持久存储以后。如果我们遵循这种过程,我们不需要在每个事务提交时刷写数据页
面到磁盘,因为我们知道在发生崩溃时可以使用日志来恢复数据库:任何还没有被应用到数据页面的改变可以根据其日志记录重做(这是前滚恢复,也被称为REDO)。
转载地址:http://ptbai.baihongyu.com/