postgresql——原理
一、数据库认证
认证配置文件pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
local all all trust
#type 字段规定了客户端连接数据库的方式,主要有以下几种类型:
local:代表通过 Unix 域套接字进行本地连接
host:表示使用 TCP/IP 网络连接
hostssl:同样是通过 TCP/IP 网络连接,但要求连接必须使用 SSL 加密。
hostnossl:通过 TCP/IP 网络连接,不过明确禁止使用 SSL 加密。
localsslinet:在 PostgreSQL 14 及更高版本中引入,它允许本地连接使用基于 TCP/IP 的 Unix 域套接字替代传统的 Unix 域套接字,并且要求连接使用 SSL 加密。
二、数据库可靠性
PostgreSQL(简称 PG)数据库的持久化是保障数据可靠性和一致性的关键特性,它能确保数据在数据库崩溃、服务器重启等异常情况下不丢失。
1.持久化原理
1.1. 预写式日志(Write-Ahead Logging,WAL)
原理:WAL 是 PostgreSQL 持久化的基础机制。在对数据文件进行实际修改之前,所有的数据变更都会先记录到 WAL 日志文件中。这样,即使在数据文件还未更新时数据库崩溃,也可以通过重放 WAL 日志来恢复数据到一致状态。
过程:
1.当执行一个事务时,数据库会将事务中的所有变更操作记录到 WAL 缓冲区。
2.WAL 缓冲区达到一定大小或者满足特定条件时,会将其中的内容写入磁盘上的 WAL 日志文件(通常位于 pg_wal 目录)。
3.之后,数据库会在合适的时机将数据变更应用到实际的数据文件中。
1.2. 检查点(Checkpoint)
原理:检查点是数据库在特定时间点将内存中的脏页(已修改但未写入磁盘的数据页)强制刷新到磁盘的操作。通过定期执行检查点,可以减少崩溃恢复时需要重放的 WAL 日志数量,从而加快恢复速度。
过程:
当触发检查点时,数据库会暂停所有的事务处理,将所有脏页写入磁盘。
在完成脏页写入后,数据库会在 WAL 日志中记录一个检查点记录,标记检查点的完成时间和状态。
2.持久化原理
如果大量数据在 WAL(Write - Ahead Logging,预写式日志)缓冲区,还未写入到 WAL 文件时机器宕机,数据库可能会丢失部分数据。
数据丢失情况分析
在 PostgreSQL 中,事务产生的变更首先会记录到 WAL 缓冲区。当 WAL 缓冲区达到一定大小、满足特定时间间隔或者遇到检查点等情况时,WAL 缓冲区中的内容才会被写入到磁盘上的 WAL 文件。如果在数据还存于 WAL 缓冲区且未写入 WAL 文件时机器宕机,那么这部分尚未持久化的数据就可能丢失。
3.避免和预防措施
- 调整 WAL 缓冲区刷新策略
参数 wal_writer_delay
作用:该参数用于控制 WAL 写入器将 WAL 缓冲区中的数据刷新到磁盘的时间间隔,单位是毫秒。默认值通常为 200 毫秒。
调整建议:适当缩短这个时间间隔,可以让 WAL 缓冲区中的数据更频繁地写入到 WAL 文件。例如,将其设置为 50 毫秒,这样即使机器突然宕机,WAL 缓冲区中未写入的数据量也会相对较少。
参数 wal_sync_method
作用:此参数决定了将 WAL 数据同步到磁盘的方法。不同的操作系统支持不同的同步方法,如 fsync、fdatasync 等。
调整建议:fsync 是最安全的同步方法,它会确保数据不仅写入磁盘缓存,还会真正写入磁盘介质。在大多数情况下,建议使用 fsync。
- 合理设置检查点
参数 checkpoint_timeout
作用:设置检查点的最大时间间隔,单位可以是秒(s)、分钟(min)等。默认值通常为 5 分钟。
调整建议:适当缩短检查点的时间间隔,能让数据库更频繁地将内存中的脏页(包括 WAL 缓冲区的数据)刷新到磁盘。例如,将其设置为 2 分钟。
参数 checkpoint_completion_target
作用:该参数表示检查点操作应该在多长时间内完成,取值范围是 0.0 到 1.0 之间的小数。默认值通常为 0.5,表示检查点操作应该在 checkpoint_timeout 的一半时间内完成。
调整建议:适当增大该值,如设置为 0.9,可以让检查点操作更加平缓地进行,减少对数据库性能的影响,同时也有助于将 WAL 缓冲区的数据及时写入磁盘。
三、时间点恢复
时间点恢复(Point-in-Time Recovery,PITR)是 PostgreSQL 中一项强大的功能,它允许你将数据库恢复到过去某个特定的时间点。这在处理误操作、数据损坏或其他需要回溯到特定时刻的场景中非常有用。
原理
PostgreSQL 的时间点恢复基于预写式日志(WAL)和全量备份。全量备份提供了数据库在某个时间点的完整快照,而 WAL 日志则记录了从备份时间点之后的所有数据库变更。通过结合全量备份和相应的 WAL 日志,就可以将数据库恢复到备份时间点之后的任意时间点。
前提条件
启用 WAL 归档:需要在 postgresql.conf 中配置 wal_level 为 replica 或 logical,并设置 archive_mode 为 on,同时配置 archive_command 用于将 WAL 日志归档到安全的存储位置。
定期全量备份:使用 pg_basebackup 或其他工具定期进行全量备份。
恢复步骤
1. 停止数据库服务
在进行恢复操作之前,需要停止正在运行的 PostgreSQL 数据库服务。
浙公网安备 33010602011771号