PostgreSQL(十二)全页写-full_page_writes

本文探讨了PostgreSQL中全页写全页写(WAL)日志记录方式,分析其优点如保护数据完整性和解决块分离问题,同时也指出可能导致的WAL日志膨胀和性能影响。讨论了全页写模式的控制策略以及何时考虑禁用全页写以优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、全页写的概述与特点

在PostgreSQL(十一)WAL日志管理中曾提到过,PG默认记录WAL日志的方式,是将原始SQL转换为特定格式后记录在文件中。

但实际上,pg还支持另一种记录WLA日志的方式,那就是全页写-full-page Writes。

全页写模式下,会将一整个数据块的内容写入 WAL文件中,而非只记录日志条目。

1、优点:解决块分离问题,保护数据完整性;

2、缺点:全页写会导致WAL日志膨胀,增加额外I/O,影响数据库整体性能;

3、控制:使用full_page_writes参数控制on/off .

4、模式:

       非强制模式:最后一次检查点之后,第一次修改的数据块会进行全页写,后续再修改时不会进行全页写,直到下一次检查点发生。full_page_writes=on后进入非强制模式。

       强制模式:当使用pg_basebackup工具对数据库进行备份时,会自动执行强制模式,在备份期间被修改的数据库会全部写入WAL当中;

            当执行pg_start_backup函数时,系统也会进入全页写模式,执行pg_stop_backup后停止。

二、导致块分离的原因

操作系统进行I/O操作时,以块为单位,例如:512字节、1kb等;

而数据库块一般是操作系统块的整数倍,比如2kb、4kb、8kb等;

因为块是操作系统最小的I/O单位,当数据库写一个数据块时,操作系统需要I/O多次,才能全部写完;

假如在I/O过程中系统断电、磁盘故障等原因,会导致一个数据库的数据块没有完整的写入,从而导致块分离。

三、全页写管理

以下情况可以考虑禁用全页写:

1、数据库有完整的备份;

2、优先考虑数据库整体性能;

3、选择能够阻止部分页面写入的文件系统(比如ZFS)。

文章目录概况安装PostgreSQL设置主节点设置从节点验证故障处理,主从节点切换从节点扩容概况CentOS Linux release 7.7.1908PostgreSQL13三台服务器,一主两从,实时复制。主节点读,从节点只读,读分离不借助插件或第三方中间件,仅使用PostgreSQL自带的流复制功能Replication主节点可建库建表、可读,两个从节点为只读,程序使用时可以将查询和统计相关服务读取从节点,通过读分离减少数据库压力设置同步复制,为热备份,数据实时同步,对于大多数业务来说,可以认为三个库数据完相同,当一个库故障时,其他库仍然可提供服务,增加服务可用性当主节点故障时,数据无法更新,只能手动将从节点升格为主节点,需要修改服务的数据库连接配置等,服务短暂不可用(也可提前准备好监控和切换脚本,服务不可用时尽早发现和切换)。需要根据自己业务特点,是否能接受此种情况,来决定是否使用此方式。单点故障,自动切换的集群,可以考虑使用PGPool-II 等第三方中间件搭建,后面研究好我会出一篇文档安装PostgreSQL命令如下,具体可参考我之前的博客《PostgreSQL简介和安装部署》# 安装 repository 源:sudo yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装 PostgreSQL13:sudo yum install -y postgresql13-server# 初始化数据库,并设置启动命令和开机启动:sudo /usr/pgsql-13/bin/postgresql-13-setup initdbsudo systemctl enable postgresql-13sudo systemctl start postgresql-13# 另外,查看状态,关闭命名和重启命令sudo systemctl status postgresql-13sudo systemctl stop postgresql-13sudo systemctl restart postgresql-13123456789101112131415三个节点安装完成后,就可以开始使用了可以创建用户、赋予权限、修改密码,可以建库建表早一些功能测试等默认安装创建的数据库,没有主从之分,都是主节点,可以使用这条语句验证下是否为从节点,查询结果为"f"表示false,当前数据库节点为主库节点sudo -u postgres /usr/pgsql-13/bin/psql -c "select pg_is_in_recovery()"1下面开始搭建集群,关闭三个PostgreSQL服务,开始改配置文件设置主节点主从节点可以自己规划好,准备好不同机器就行,也可以使用最小集群一主一从主要是修改2个配置文件,都在data目录下,一个是数据库基础配置,一个是访问权限控制默认初始化的数据库,data目录在/var/lib/pgsql/13/data修改文件夹里面的pg_hba.conf,设置 Replication 访问策略,允许流复制# replication privilege.# 追加一条“允许postgres用户,通过部网络地址使用 Replication ”的策略host replication postgres 0.0.0.0/0 trust123继续修改数据库配置文件postgres.conf,进行一些参数设置,允许流复制# -----------------------------# PostgreSQL configuration file# -----------------------------# - Connection Settings -listen_addresses = '*' # what IP address(es) to listen on;#port = 5432 # (change requires restart)max_connections = 200 # (change requires restart)# - Authentication -#authentication_timeout = 1min # 1s-600spassword_encryption = scram-sha-256 # md5 or scram-sha-256#------------------------------------------------------------------------------# RESOURCE USAGE (except WAL)#------------------------------------------------------------------------------# - Memory -shared_buffers = 1GB # min 128kB 官方推荐内存设置带大小为系统内存的1/4temp_buffers = 64MB # min 800kBwork_mem = 64MB # min 64kBmax_stack_depth = 4MB # min 100kBdynamic_shared_memory_type = posix # the default is the first option#------------------------------------------------------------------------------# WRITE-AHEAD LOG#------------------------------------------------------------------------------wal_level = replica # minimal, replica, or logicalfsync = on # flush data to disk for crash safetysynchronous_commit = on # synchronization level;wal_log_hints = on # also do full page writes of non-critical updates# - Checkpoints -checkpoint_timeout = 10min # range 30s-1dmax_wal_size = 1GBmin_wal_size = 80MB# - Archiving -archive_mode = on # enables archiving; off, on, or always# (change requires restart)archive_command = 'cp %p /data/postgresql/archive/%f' # command to use to archive a logfile segment#-----------------------------------------------------------------------------# REPLICATION#------------------------------------------------------------------------------max_wal_senders = 10 # max number of walsender processes 设置了可以最多有几个流复制的链接# (change requires restart)wal_keep_size = 1024 # in megabytes; 0 disablesmax_slot_wal_keep_size = 10 # in megabytes; -1 disableswal_sender_timeout = 120s # in milliseconds; 0 disables# - Standby Servers -hot_standby = on # "off" disallows queries during recovery#------------------------------------------------------------------------------# REPORTING AND LOGGING#------------------------------------------------------------------------------# - Where to Log -log_destination = 'stderr' # Valid values are combinations oflogging_collector = on # Enable capturing of stderr and csvloglog_directory = 'log' # directory where log files are written,# can be absolute or relative to PGDATAlog_filename = 'postgresql-%a.log' # log file name pattern,log_truncate_on_rotation = on # If on, an existing log file with thelog_rotation_age = 1d # Automatic rotation of logfiles willlog_rotation_size = 50MB # Automatic rotation of logfiles willlog_min_duration_statement = 2000 # 配置数据库慢查询时间,如果超过配置的时间,就会将查询的SQL语句记录到日志# - What to Log -log_connections = onlog_disconnections = onlog_line_prefix = '%m [%p] ' # special values:log_timezone = 'Asia/Shanghai'datestyle = 'iso, mdy'#intervalstyle = 'postgres'timezone = 'Asia/Shanghai'# These settings are initialized by initdb, but they can be changed.lc_messages = 'en_US.UTF-8' # locale for system error message# stringslc_monetary = 'en_US.UTF-8' # locale for monetary formattinglc_numeric = 'en_US.UTF-8' # locale for number formattinglc_time = 'en_US.UTF-8' # locale for time formatting# default configuration for text searchdefault_text_search_config = 'pg_catalog.english'shared_preload_libraries = '' # citus (change requires restart)1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586启动服务,使配置生效,主节点设置完毕sudo systemctl start postgresql-13# 或sudo systemctl restart postgresql-13123设置从节点主从要保持一致,主要是 data 保持一致,我们可以直接将主节点data同步到从节点如果从节点没有关闭,可以先关闭 sudo systemctl stop postgresql-13去默认的data位置,删除所有文件
03-29
### 安装与配置 PostgreSQL 13 在 CentOS 7.7.1908 下的一主两从高可用集群 #### 1. 环境准备 在三台服务器上分别安装 CentOS 7.7.1908,确保每台机器的硬件资源满足需求。以下是各节点的基础信息: - **主节点 (Master)** IP 地址:`192.168.123.10` CPU:4 核 内存:4GB - **从节点 1 (Slave 1)** IP 地址:`192.168.123.20` CPU:4 核 内存:4GB - **从节点 2 (Slave 2)** IP 地址:`192.168.123.30` CPU:4 核 内存:4GB 确保所有节点之间的网络连通性正常。 --- #### 2. Yum 源配置 编辑 `/etc/yum.repos.d/pgdg.repo` 文件,添加以下内容以支持 PostgreSQL 的官方仓库[^1]: ```ini [pgdg13] name=PostgreSQL 13 for RHEL/CentOS $releasever - $basearch baseurl=https://download.postgresql.org/pub/repos/yum/13/redhat/rhel-$releasever-$basearch enabled=1 gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG ``` 运行命令更新 yum 缓存: ```bash yum makecache fast ``` --- #### 3. 安装 PostgreSQL 和 repmgr 插件 在所有节点上执行以下命令来安装 PostgreSQL 及其管理工具 `repmgr`: ```bash yum install -y postgresql13-server postgresql13-contrib repmgr15 ``` 初始化主节点上的数据库实例: ```bash /usr/pgsql-13/bin/initdb -D /var/lib/pgsql/13/data/ ``` 启动并设置开机自启服务: ```bash systemctl enable --now postgresql-13 ``` --- #### 4. 主节点配置 修改主节点的配置文件 `/var/lib/pgsql/13/data/postgresql.conf`,启用流复制功能[^2]: ```conf listen_addresses = '*' wal_level = replica max_wal_senders = 10 hot_standby = on archive_mode = on archive_command = 'cd .' ``` 允许从节点连接,在 `/var/lib/pgsql/13/data/pg_hba.conf` 中添加如下条目: ```conf host replication all 192.168.123.20/32 md5 host replication all 192.168.123.30/32 md5 ``` 重启主节点的服务使更改生效: ```bash systemctl restart postgresql-13 ``` --- #### 5. 备份主节点数据至从节点 在主节点上创建用于复制的用户账户: ```sql CREATE USER repl REPLICATION LOGIN CONNECTION LIMIT 1 ENCRYPTED PASSWORD 'your_password'; ``` 使用 `pg_basebackup` 工具将主节点的数据备份到两个从节点上[^5]。例如,在 Slave 1 执行以下命令: ```bash su - postgres pg_basebackup -h 192.168.123.10 -U repl -D /var/lib/pgsql/13/data -Fp -Xs -P -R ``` 完成后调整目录权限: ```bash chown -R postgres:postgres /var/lib/pgsql/13/data chmod 700 /var/lib/pgsql/13/data ``` 重复上述操作完成第二个从节点的数据同步。 --- #### 6. 配置从节点 在每个从节点的 `/var/lib/pgsql/13/data/recovery.conf` 文件中指定主节点的信息(对于 PostgreSQL 13,此文件已被移除,改为直接编辑 `postgresql.auto.conf` 或通过其他方式定义恢复参数)。可以手动创建一个触发器文件实现自动切换为主节点的功能。 启动从节点服务前确认配置无误: ```bash systemctl start postgresql-13 ``` 验证从节点是否成功进入只读模式: ```sql SELECT pg_is_in_recovery(); -- 如果返回 true,则表示当前处于 standby 模式。 ``` --- #### 7. 实现读分离 利用负载均衡技术或者应用程序层面逻辑区分查询请求发送目标。推荐采用 HAProxy 或 PgBouncer 来分发流量给不同的后端实例[^4]。 --- #### 8. 故障切换方案 借助 `repmgr` 提供的自动化脚本简化故障检测与接管流程。具体步骤包括但不限于监控心跳信号丢失情况下的重新选举过程以及通知管理员介入干预必要时刻的手动干预措施[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值