第二十六天:PostgreSQL体系架构和备份
一、PostgreSQL体系架构
1、体系架构概览
PostgresQL和MySQL相似,也采用典型的C/S模型。
PostgresQL体系结构分两部分
实例instance
磁盘存储
实例 instance 包括
进程.
内存存储结构
2、进程和内存结构
(1)进程
Postmaster 主进程
它是整个数据库实例的主控制进程,负责启动和关闭该数据库实例。
实际上,使用pg ct来启动数据库时,pg_ctl也是通过运行postgres来启动数据库的,只是它做了一些包装,更容易启动数据库。
它是第一个PostgreSQL进程,此主进程还会fork出其他子进程,并管理它们。
当用户和PostgreSQL建立连接时,首先是和Postmaster进程建立连接。首先,客户端会发出。身份验证的信息给Postmaster进程,Postmaster进程根据消息中的信息进行身份验证判断如果验证通过,它会fork出一个会话子进程为这个连接服务。
当某个服务进程出现错误的时候,Postmaster主进程会自动完成系统的恢复。恢复过程中会0停掉所有的服务进程,然后进行数据库数据的一致性恢复,等恢复完成后,数据库又可以接受新的连接。
验证功能是通过配置文件pg_hba.conf和用户验证模块来提供。。
opostmaster程序是指向postgres的软链接
BgWriter 后台写进程
为了提高插入、删除和更新数据的性能,当往数据库中插入或者更新数据时,并不会马上把数据持久化到数据文件中,而是先写入Buffer中
该辅助进程可以周期性的把内存中的脏数据刷新到磁盘中
WalWriter预写式日志进程
WAL是write ahead log的缩写,WALlog旧日版中称为xlog,相当于MySQL中Redo log。
预写式日志是在修改数据之前,必须把这些修改操作记录到磁盘中,这样后面更新实际数据时,就不需要实时的把数据持久化到文件中了。即使机器突然宕机或者数据库异常退出,导致一部分内存中的脏数据没有及时的刷新到文件中,在数据库重启后,通过读取WAL日志并把最后一部分WAL日志重新执行一遍,就能恢复到宕机时的状态了
WAL日志保存在pg_wal目录(早期版本为pg_xlog)下。每个xlog文件默认是16MB,为了满足恢o复要求,在pg_wal目录下会产生多个WAL日志,这样就可保证在宕机后,未持久化的数据都可以通过WAL日志来恢复,那些不需要的WAL日志将会被自动覆盖
Checkpointer 检查点进程
检査点(Checkpoints)是事务序列中的点,保证在该点之前的所有日志信息都更新到数据文件中。
在检查点时,所有脏数据页都冲刷到磁盘并且向日志文件中写入一条特殊的检查点记录。在发。生崩溃的时候,恢复器就知道应该从日志中的哪个点(称做 redo 记录)开始做 REDO 操作,因为在该记录前的对数据文件的任何修改都已经在磁盘上了。在完成检查点处理之后,任何在redo记录之前写的日志段都不再需要,因此可以循环使用或者删除。在进行WAL归档的时候,这些日志在循环利用或者删除之前应该必须先归档保存
检査点进程(CKPT)在特定时间自动执行一个检査点,通过向数据库写入进程(BgWriter)传递消。息来启动检查点请求
AutoVacuum 自动清理进程
执行delete操作时,旧的数据并不会立即被删除,在更新数据时,也不会在旧的数据上做更新,而是新生成一行数据。旧的数据只是被标识为删除状态,在没有并发的其他事务读到这些旧数据时,它们才会被清除掉
autovacuum lanucher 负责回收垃圾数据的master进程,如果开启了autovacuum的话,那么postmaster会fork这个进程
autovacuum worker 负责回收垃圾数据的worker进程,是lanucher进程fork出来的
PgArch 归档进程
默认没有此进程,开启归档功能后才会启动archiver进程
WAL日志文件会被循环使用,也就是说WAL日志会被覆盖,利用PgArch进程会在覆盖前把WAL日志备份出来,类似于binlog,可用于备份功能
PostgreSQL从8.X版本开始提供了PITR(Point-n-Time-Recovery)技术,即就是在对数据库0进行过一次全量备份后,该技术将备份时间点后面的WAL日志通过归档进行备份,将来可以使用数据库的全量备份再加上后面产生的WAL日志,即可把数据库向前恢复到全量备份后的任意一个时间点的状态
SysLogger 系统日志进程
默认没有此进程,配置文件 postgresql.conf 设置参数logging_collect设置为"on”时,主进程才会启动SysLogger辅助进程
它从Postmaster主进程、所有的服务进程以及其他辅助进程收集所有的stderr输出,并将这0些输出写入到日志文件中
startup 启动进程
用于数据库恢复的进程
Session 会话进程
每一个用户发起连接后,一旦验证成功,postmaster进程就会fork一个新的子进程负责连接此用户。
通常表现为进程形式:postgres postgres [local] idle
(2)内存结构
PostgresQl的内存空间包括共享内存和本地内存两部分
共享内存
PostgreSQL启动后,会生成一块共享内存,共享内存主要用做数据块的缓冲区,以便提高读写性能。WAL日志缓冲区和CLOG(Commit log)缓冲区也存在于共享内存中。除此以外,一些全局信息也保存在共享内存中,如进程信息、锁的信息、全局统计信息等。
PostgreSQL9.3之前的版本与0racle数据库一样,都是使用“System V类型的共享内存,但o到PostgreSQL9.3之后,PostgreSQL使用mmap()方式共享内存,好处能使用较大的共享内存。
可以通过配置postgresql.conf文件中shared buffers 指定,默认128M,建议是内存的50%
本地内存
后台服务进程除访问共享内存外,还会申请分配一些本地内存,以便暂存一些不需要全局存储的数据。
都可以通过在配置postgresql.conf文件中指定
这些内存缓冲区主要有以下几类:
temp_buffers :用于访问临时表的本地缓冲区,默认为8M
work mem:内部排序操作和Hash表在使用临时磁盘文件之前使用的内存缓冲区,默认为4Mo
maintenance_work mem:在维护性操作(比如 VACUUM、CREATE INDEX和ALTERTABLEADD FOREIGN KEY 等)中使用的内存缓冲区,默认为64M
3、数据更新过程
先将数据库文件中的更改的数据加载至内存
在内存更新数据
将日志写入内存WAL的缓存区
将日志提交,将日志写入操作系统cache
同步日志到磁盘
后台写数据库的更新后的数据到操作系统 cache
写完数据后,更新检查点checkpoint
同步数据到磁盘
4、数据库目录结构
数据库数据存放在环境变量PGDATA指向数据目录。这个目录是在安装时指定的,所以在安装时需要指定一个合适的目录作为数据目录的根目录,而且,每一个数据库实例都要有一个对应的目录。目录的初始化是使用initdb来完成的。
初始化完成后,PGDATA数据目录下就会生成三个配置文件。
postgresq1.conf #数据库实例的主配置文件,基本上所有的配置参数都在此文件中。 pg_hba.conf #认证配置文件,配置了允许哪些工P的主机访问数据库,认证的方法是什么等信息。 pg_ident.conf #认证方式ident的用户映射文件。
此外在PGDATA目录下还会生成如下一些子目录
base #默认表空间的目录,每个数据库都对应一个base目录下的子目录,每个表和索引对应一个独立文件
globa] #这个目录对应pg-globa1表空间,存放实例中的共享对象 pg-c1og #存储事务提交状态数据 pg_bba.conf #数据库访问控制文件 pg_10g #数据库系统日志目录,在査询一些系统错误时就可査看此目录下日志文件。(根据配置定义,可能没有这个目录) pg_xact #提交日志commit 1og的目录,pg 9之前叫pg_c1og pg_multixact #共享行锁的事务状态数据
pg_notify #异步消息相关的状态数据
pg_seria] #串行隔离级别的事务状态数据
pg_snapshots #存储执行了事务snapshot导出的状态数据
pg_stat_tmp #统计信息的临时文件
pg_subtrans #子事务状态数据 pg_stat #统计信息的存储目录。关闭服务时,将pg_stat_tmp目录中的内容移动至此目录实现保存
pg_stat_tmp #统计信息的临时存储目录。开启数据库时存放统计信息
pg-tb1sp #存储了指向各个用户自建表空间实际目录的链接文件
pg-twophase#使用两阶段提交功能时分布式事务的存储目录
pg_wa] #WAL日志的目录,早期版一本目录为pg_x10g PG VERSION #数据库版本 postmaster.opts #记录数据库启动时的命令行选项
postmaster.pid #数据库启动的主进程信息文件,包括PID,SPGDATA目录,数据库启动时间,监听端口,socket文件路径,临听地址,共享内存的地址信息(ipsc可查看),主进程状态
(1)postgresql.conf 配置项
PostgresQL的配置参数是在postgresql.conf文件中集中管理的,这个文件位于数据库实例的目录下PGDATA
此文件中的每个参数配置项的格式都是“参数名=参数值'
配置文件中可以使用“#“注释。
所有配置项的参数名都是大小写不敏感的
参数值有以下五种类型。
布尔:布尔值都是大小写无关的,可以是on、off、true,false、yes、no、1、0。
整数:数值可以指定单位。如一些内存配置的参数可以指定KB、MB、GB等单位。
另外还支持浮点数,字符串,枚举
postgresql.conf文件中可以使用include指令包含其他文件中的配置内容,如:include filename ,如果指定被包含的文件名不是绝对路径,那么就相对于当前配置文件所在目录的相对路径。此外,包含还可以被嵌套。
所有的配置参数都在系统视图pg_settings中
$PGDATA目录下如果含有postgresql.con和postgresql.auto.conf,而postgresql.auto.conf的优先级高于postgresql.conf,即如果一个参数同时存在postgresql.auto.conf和postgresql.conf里面,系统会先读postgresql.auto.conf的参数配置
常用配置说明
1isten_addresses='*· #监听客户端的地址,默认是本地的,需要修改为*或者0.0.0.0 port=5432 #pg端口,默认是5432
max connections=2000#最大连接数,默认100
unix socket directories #socket文件的位置,默认在/tmp下面
shared buffers #数据缓存区,建议值1/4--1/2主机内存,和oracle的buffer cache类似
maintenance_work mem #维护工作内存,用于vacuum,create index,reindex等。建议值(1/4主机内存)/autovacuum max workers max_worker processes #总worker数 max_para11el_workers_per_gather #单条QUERY中,每个node最多允许开启的并行计算WORKER数
wal level #wa]级别,版本11+默认是replicawal buffers #类似oracle的log buffer checkpoint timeout #checkpoint时间间隔 max wa] size #控制wa]的最大数量 min_wa]_size #控制wa]的最小数量
archive_command #开启归档命令,示例:'test !-f /arch/%f && cp %p /arch/%f
autovacuum#开启自动vacuum
(2)pg ident.conf
pg_ident.conf是用户映射配置文件。结合pg_hba.conf文件,method为ident可以用特定的操作系统用户以指定的数据库用户身份登录数据库。
这个文件记录着与操作系统用户匹配的数据库用户,如果某操作系统用户在本文件中没有映射用户,则默认的映射数据库用户与操作系统用户同名。比如,服务器上有名为user1的操作系统用户,同时数据库上也有同名的数据库用户user1,user1登录操作系统后可以直接输入psql,以user1数据库用户身份登录数据库且不需密码
如果操作系统用户和数据库用户不同名,可以用下面格式进行映射
(3)数据文件
PostgreSQL中的每个索引和表都是一个单独的文件,称为Segment。默认是每个大于1G的Segment会被分割pg_class.efilenode.1这样的文件。Segment的大小可以在initdb时通过选项--with-segsize=SEGSIZE指定
注意:truncate表之后relfilenode会变。对应的物理文件名字也会变。
Segment 物理位置
$PGDATA/BASE/DATABASE OID/PG CLASS.RELFILENODE
(4)控制文件
控制文件存放了数据库当前的状态,存放在PGDATAglobal/pg_control
#PG14版的控制文件 postgres@ubuntu2004:~$ file /pgsql/data/global/pg_contro1/
pgsql/data/global/pg_control:PGp secret sub-key-
#PG12版的控制文件
postgres@ubuntu2004:~$ file /pgsql/data/global/pg_ control
/pgsql/data/globa1/pg_control:data
#查看控制文件内容 postgres@ubuntu2004:~$ pg_controldata$PGDATA
(5)日志文件
日志种类
运行日志: $PGDATA/log(pg10之前为$PGDATA/pg log),默认不存在,需要开启配置项ogging collector
在线重做日志:$PGDATA/pg_wal(pg10之前为$PGDATA/pg xlog)
事务提交日志:$PGDATA/pg xact(pg10之前为$PGDATA/pg_clog)
服务器日志:可以在启动的时候指定:pg_ctl start -l./logfile
运行日志
运行日志配置项
1ogging_co11ector:这个参数启用日志收集器,它是一个捕捉被发送到stderr的日志消息的后台进程,并且它会将这些消息重定向到日志文件中;默认是OFF,修改参数需要重启。 1og_destination:有三种输出方法,stderr,csvlog,sys10g;在windows上还支持event10g。默认是stderr,如果使用csv10g的话,1ogging_co1lector必须开启。也可以同时使用csvlog和stderr,会记录两种格式的日志。
将csv格式运行日志存储至数据库
在线 WAL 日志
Online WAL(WRITE-AHEAD LOG)日志功能是为了保证崩溃后的安全,如果系统崩溃,可以"重放"从最后一次检査点以来的日志项来恢复数据库的一致性。但是也存在日志膨胀的问题,相当于MySQL的事务日志redolog
归档 WAL 日志
归档日志记录的是checkpoint前的WAL日志,即数据的历史日志,即把pg_wal里面的在线日志备份出来功能上归档日志相当于MySQL的二进制日志
生产环境中为了保证数据高可用性,通常需要开启归档,当系统故障后可以通过归档的日志文件对数据进行恢复
五、PostgreSQL备份还原
1、备份说明
防止数据丢失的最重要方法就是备份。这些数据丢失有的是因硬件损坏导致的,有的是因人为原因(如误操作)而导致的,也有因为应用程序的bug而误删数据等情况
备份的内容包括:
数据(配置文件)
归档WAL日志
表空间目录
数据库备份方式
逻辑备份: 适用于跨版本和跨平台的备份恢复
物理备份:适用于小版本的恢复,但不支持跨平台和大版本
2、 逻辑备份
PostgreSQL提供了pg_dump、pg_dumpal 命令进行数据库的逻辑备份。两者的功能差不多,只是pg dumpall 是将一个PostgreSQL数据库集群全部转储到一个脚本文件中,而pg_dump命令可以选择一个数据库或部分表进行备份。另外利用COPY命令也能对表和SQL子集进行备份,实现表的还原
(1)pg_dump和pg_dumpall
pg_dump是PostgresQL提供的一个非常有用的数据库备份工具。它甚至可以在数据库正在使用的时候进行完整一致的备份。pgdump工具执行时,可以将数据库备份成一个文本文件或归档文件,该文件中实际上包含了多个CREATE和INSERT语句,使用这些语句可以重新创建表和插入数据。
pg_dumpall工具可以存储一个数据库集群里的所有数据库到一个脚本文件。本质上pg_dumpall是通过对数据库集群里的每个数据库调用pg_dump实现这个功能。
Pg_dumpall还可以备份出所有数据库公用的全局元数据对象。这些信息包括:数据库用户和组,密码以及适用于整个数据库的访问权限。而pg_dump并不保存这些对象。
pg_dump可生成归档格式的备份文件,然后与pg_restore配合使用,从而提供一种灵活的备份和恢复机制
pg_dump可以将整个数据库备份到一个归档格式的备份文件中,而pg_restore则可从这个归档格式的备份文件中选择性地恢复部分表或数据库对象。归档格式的备份文件又分为两种,最灵活的输出文件格式是“custom”自定义格式(使用命令项参数-Fc来指定),它允许对归档元素进行选取和重新排列,并且默认时是压缩的;另一种格式是tar格式(使用命令项参数-Ft来指定),这种格式的文件不是压缩的,并且加载时不能重排列,但是它也很灵活,可以用标准 UNIX下的 tar工具进行处理。
pg_dumpall只支持文本格式
pg_dump 的具体使用语法如下:
使用pg_dump 的自定义备份或tar类型的备份需要使用pg_restore工具来恢复。
pg_restore命令的格式如下:
(2)COPY命令实现备份还原
帮助文档
http://www.postgres.cn/docs/12/sq1-copy.htm1
COPY命令支持在PostgresQL表和文件之间交换数据。
COPY TO把一个表的所有内容都拷贝到一个文件,而COPY FROM从一个文件里拷贝数据到一个表里(把数据附加到表中已经存在的内容里)。COPY TO还能拷贝SELECT查询的结果。
如果声明了一个字段列表,COPY将只在文件和表之间拷贝已声明字段的数据。 如果表中有任何不在字段列表里的字段,那么COPYFROM将为那些字段插入缺省值。带文件名的COPY指示PostgreSQL服务器直接从文件中读写数据。如果声明了文件名,那么服务器必须可以访问该文件,而且文件名必须从服务器的角度声明。如果使用了PROGRAM选项,则服务器会从指定的这个程序进行输入或是写入该程序作为输出。如果使用了STDIN 或STDOUT选项,那么数据将通过客户端和服务器之间的连接来传输。
命令:
3、物理备份
物理备份分为冷备份和热备份
冷备份:最简单的物理备份就是冷备份,也就是把数据库停止,然后把数据库的PGDATA目录拷贝出来即可。
由于PostgreSOL把与数据库实例有关的配置文件和数据文件都放在$PGDATA目录下,所以PostgreSQL做冷备份很简单
热备份:不停止数据库的数据库备份,称之为热备份或在线备份。在 PostgreSQL中通常的热备份方法有两种。
第一种方法:使用数据库的PITR方法利用pg basebackup工具进行热备份
第二种方法:使用文件系统或块设备级别的快照功能完成备份。因为使用了快照,所以也能让0备份出来的数据库与原数据库一致。
热备份流程
以数据库超级用户身份连接到数据库,发出命令:SELECT pgstart_backup('label');pg_start_backup()主要做了以下两个工作:0设置写日志标志为:XLogCt->Insert.forcePageWrites=true,也就是把这个标志设置为true后,数据库会把变化的整个数据块都记录到数据库中,而不仅仅是块中记录的变化。。强制发生-次checkpoint点。
执行备份。使用任何方便的文件系统工具比如 tar,或直接把数据目录复制下来。这些操作过程中既不需要关闭数据库,也不需要停止数据库的任何操作。再次以数据库超级用户身份连接数据库,然后发出命令:SELECTpg_stop_backup 0);这将中止备份模式并自动切换到下一个WAL段。自动切换是为了让在备份间隔中写人的最后一个WAL段文件可以立即为下次备份做好准备。
·拷贝备份过程中产生的归档WAL日志文件
4、 PITR(Point-in-Time Recovery)介绍
PostgreSQL支持类似于MySQL的主从复制的架构,一个Master 服务器 database同步数据到多个Standby Server
PostgreSQL的主从同步是基于WAL(write ahead log预写式日志)日志实现的
PostgreSQL在数据目录的$PGDATA/pg_wal重做日志目录中始终维护着一个 WAL日志文件。这个日志文件用于记录数据库数据文件的每次改变。当初设计这个日志文件的主要目的是为了在数据库异常崩溃后,能够通过重放最后一次checkpoint点之后的日志文件,把数据库推到一致状态。
事实上,这种日志文件机制,也提供了一种数据库热备份方案:在把数据库使用文件系统的方式备份出来的同时把相应的在线WAL日志也备份出来。虽然直接拷贝数据库数据文件会导致拷贝出来的文件不一致(比如拷贝的多个数据文件不是同一个时间点文件;拷贝一个8KB 的数据块时,也存在不一致的情况:假设刚拷贝完前4KB的块,数据库又写了后4KB的块内容,那么所拷贝的块就不是一个完整的数据块),但因为有了WAL日志,即使备份出来的数据块不一致,也可以重放备份开始后的 WAL日志,把备份的内容推到一致状态。
由此可见,有了WAL日志之后,备份数据库时不再需要完美的一致性备份了,备份中任何数据的非一致性都会被重放WAL日志文件进行纠正,所以在备份数据库时可以通过简单的cp命令或tar等拷贝、备份文牛来实现数据库的在线备份。
不停地重放WAL日志就可以把数据推到备份结束后的任意一个时间点,这就是基于时间点的备份Point-in-Time Recovery,缩写为PITR.
使用简单的cp命令或其他命令把数据库给在线拷贝出来的备份,被称为基础备份。后续WAL日志的备份与此基础备份构成一个完整备份。把基础备份恢复到另一台主机,然后不停地从原始数据库机器上接收WAL日志,在新机器上持续重放WAL日志,这样就可以在任何时间内在另一台机器上打开新产生的数据库。它拥有当前数据最新的数据状态。此新主机上的数据库称为Standby 数据库,当前的主数据库出现问现故障无法正常提供服务时,可以把 Standby数据库打开提供服务,从而实现高可用。
把, WAL日志传送到另一台机器上的方法有两种,一种是通过归档WAL日志实现,一种是被称为流复制的方法
5、pg_basebackup 实现完全备份和还原
pg_basebackup是基于流复制协议可以实现完全备份,并支持热备份这个工具会把整个数据库实例的数据都拷贝出来,而不只是把实例中的部分(如某个数据库或某些表)单独备份出。
该工具使用replication协议连接到数据库实例上,所以主数据库中的pg_hba.conf必须允许replication连接,也就是在pg hba.conf中必须有类似下面的内容:
local replication hostreplication dba dba 0.0.0.0/0 trust md5 #上面的dba为备份的用户名,如果指令a11,即所有用户
(1)pg basebackup 的命令行参数
pg_basebackup命令的使用方法如下:
(2)完全备份
#在postgresQL服务器先授权 postgres@gpserver ~$vi/pgsql/data/pg_hba.confhost replication a11 10.0.0.0/24 md5 [postgres@gpserver ~]$pg_ctl restart -D $PGDATA #在备份服务器执行下面操作 #注意:备份目录/pgsq1/backup/必须为空[postgres@gpserver ~]mkdir-p/pgsq1/backup/ #备份 [postgres@gpserver ~]$pg_basebackup -D /pgsql/backup/ -Ft -Pv -upostgres -h10.0.0.200-p 5432 -Rpostgres@gpserver ~$cat /pgsq1/data/backup_labe1.0ldSTART WAL LOCATION: 0/45000028 (fi1e 000000010000000000000045)CHECKPOINT LOCATION:0/45000060BACKUP METHoD:streamedBACKUP FROM: masterSTART TIME:2020-05-11 10:38:49 UTCLABEL: pg basebackup base backupSTART TIMELINE:1 #自动在$PGDATA目录下生成备份记录文件 基蜘王 的高薪职。 #查看备份生成的文件[postgres@gpserver ~]$ 1s /pgsql/backup/base.tar pg_wal.tar
(3)利用完全备份实现恢复
#在备份服务器上执行下面操作进行还原 [root@@gpserver ~]#mkdir /archive/ [root@@gpserver ~]#chown postgres.postgres /archive/ #确认备份文件存在 [postgres@gpserver ~$ 1s /pgsql/backup/ base.tar pg_wal.tar #模拟故障 [postgres@gpserver ~l$echo $PGDATA pgsql/data [postgres@gpserver ~$ pg_ct -D $PGDATA stop postgres@gpserver ~]$ rm-rf $PGDATA/* [postgres@gpserver l$rm-rf/archive/* #进行还原 [postgres@gpserver ~]$ tar xf /pgsql/backup/base.tar -C $PGDATA/Ipostgres@gpserver ~]$ tar xf /pgsql/backup/pg_wal.tar -c /archive #修改配置 [postgres@gpserver ~]$ vim $PGDATA/postgresql.conf#添加下面行 restore_command='cp /archive/%f %precovery_target ="immediate #如果pg_basebackup 执行时添加-R选项,可以不执行下面,否则会无法启动服务,执行下面指令创建文件后才能启动 postgres@gpserver ~$touch /pgsql/data/recovery.signal [postgres@gpserver ~$pg_ctlstart -D $PGDATA #停止恢复过程,否则为只读 postgres=# select pg_wal_replay_resume();
6、利用PITR实现误删除的实战
六、PostgreSQL高可用
1、流复制介绍
流复制 streaming replication 是实现PostgresQL的高可用的常见技术,PostgresQl流复制相当于MySQL的主从复制,可以实现数据同步和数据备份
官方文档:
http://postgres.cn/docs/12/warm-standby.htMI#STREAMING-REPLICATION
(1)什么是流复制
PostgresQL通过 WAL 日志来传送的方式有两种:基于文件的日志传送和流复制。
不同于基于文件的日志传送,流复制的关键在于“流”,所谓流就是没有界限的一串数据,类似于河里的水流,是连成一片的。
流复制比使用基于文件方式的日志传送更能使一台后备服务器保持最新的状态。后备服务器连接到主服务器,主服务器则在 WAL记录产生时即将它们以流式传送给后备服务器而不必等到 WAL 文件被填充,。比如有一个大文件要从本地主机发送到远程主机,如果是按照“流"接收到的话,我们可以一边接收,一边将文本流存入文件系统。这样,等到“流“接收完了,硬盘写入操作也已经完成。
(2)流复制原理
备库不断的从主库同步相应的数据,并在备库apply每个WALrecord,这里的流复制每次传输单位是WAL日志的record.
(3)流复制按照同步方式分类
流复制类似于MySQL的的同步机制,支持以下两种同步机制
异步流复制
同步流复制
在实际生产环境中,建议需要根据环境的实际情况来选择同步或异步模式,同步模式需要等待备库的写盘才能返回成功,如此一来,在主备库复制正常的情况下,能够保证备库的数据不会丢失,但是带来的一个负面问题,一旦备库宕机,主库就会挂起而无法进行正常操作,即在同步模式中,备库对主库的有很大的影响,而异步模式就不会。因此,在生产环境中,大多会选择异步复制模式,而非同步模式.
(4) 流复制特点
延迟极低,不怕大事务
支持断点续传
支持多副本
配置简单章
备库与主库物理完全一致,并支持只读
2、实现流复制
(1)Master 节点配置
#创建复制的用户并授权 [postgres@master ~]$ psq1 postgres=#create role repluser with replication login password '123456'; #修改pg_hba.conf进行授权 [postgres@master ~$vi /pgsql/data/pg_hba.confhost replication repluser 0.0.0.0/0 md5 #修改配置(可选): [postgres@master ~]$vi /pgsql/data/postgresql.confsynchronous_standby_names ='*’ #开启此项,表示同步方式,需要同时打开synchronous_commit = on,此为默认值,,默认是异步方式 synchronous_commit=on #开启同步模式 archive mode = on#建议打开归档模式,防止长时间无法同步,WAL被覆盖造成数据丢失archive_command='[!-f /archive/'%f ] && cp %p /archive/%f'wa1 level= replica #设置wa]的级别 max_wal_senders =5 #这个设置可以最多有几个流复制连接,一般有几个从节点就设置几个wa]_keep_segments = 128 #设置流复制保留的最多的WAL文件数目wa] _sender timeout = 60s #设置流复制主机发送数据的超时时间maxconnections =200 #一般査多于写的应用从库的最大连接数要比较大hot_standby = on #对主库无影响,用于将来可能会成为从库,这台机器不仅仅是用于数据归档,也用于数据查询,在从库上配置此项后为只读 max standby_streaming delay = 30s #数据流备份的最大延迟时间wa]_receiver_status_interval = 10s #多久向主报告一次从的状态,当然从每次数据复制都会向主报告状态,只是设置最长的间隔时间hot_standby_feedback= on #如果有错误的数据复制,是否向主进行反馈wal 1og_hints = on#对非关键更新进行整页写入 [postgres@master ~l$pg_ctl restart -D /pgsql/data
(2)standby 节点配置
#清空数据和归档 [postgres@standby ~]$ pg_ctl stop -D $PGDATALpostgres@standby ~]$ rm-rf /pgsql/data/*Lpostgres@standby ~]$ rm -rf /archive/*postgres@standby ~]$ rm -rf /pgsql/backup/* #备份主库数据到备库 剀麦 基蜘 [postgres@standby ~]$ pg_basebackup -D /pgsq1/backup/ -Ft -Pv -urepluser -h10.0.0.101 -p 5432 -R #还原备份的数据,实现初始的主从数据同步[postgres@standby ~]$ tar xf /pgsq1/backup/base.tar -c /pgsql/dataIpostgres@standby ~]$ tar xf /pgsgl/backup/pg_wal.tar -c /archive/ #方法1 #修改postgresql.conf文件[postgres@standby ~]$ vi /pgsql/data/postgresql.conf#添加下面两行 primary_conninfo = 'host=10.0.0.101 port=5432 user=repluser password=123456restore_command='cp/archive/%f %p’#此项可不配置 #修改配置(可选): hot_standby=on #开启此项,此是默认项 recovery_target_timeline =latest #默认 max_connections = 120 #大于等于主节点,正式环境应当重新考虑此值的大小 max_standby_streaming_delay = 30s wal receiver status interval= 10 shot standby feedback = on max wal senders =15 logging_collector =on log_directory='pg_10g 1og filename ='postgresg1-%Y-%m-%d_%H%MKs.10g‘
3、监控同步状态
(1)在主库查看状态
root@master ~#pg controldata postgres=#select pid,state,client_addr,sync_priority,sync_state frompg_stat replication; #下面只在主节点查看同步模式,注意:如果无从节点连接,将无任何显示信息postgres=# SELEcT pg_current_wal_insert isnO,* from pg stat_replication; #服务器查看数据库是否为各库,f表主库t表示为各库 postgres=# select *from pg_is_in_recovery(); postgres=# select application_name,client_addr,sync_state frompg stat replication;
(2)在从库查看状态
#从节点可以读 hellodb=# select *from teachers; #从节点不支持写 hellodb=# delete from teachers where tid=4; postgres=# select *from pg is in recovery(): postgres=# SELECT * FRoM pg stat wal receiver:
4、切换主从
(1)将从库切换为主库
[postgres@slave ~$pg_ctl promote [postgresaslave ~$pg_controldata [postgres@rocky8 ~]$pg_ct1 restart #恢复正常模式() postgres=# select pg_wal_replay_resume();
(2)原主库切换为从库
#在原主库修复故障后,在主库服务器重复上面standby节点的6.2.3的步骤 #在原主库服务器创建standby.signa1文件 postgres@master ~l$touch $PGDATA/standby.signal #在原主库服务器启动服务 postgres@master ~l$pg_ct1 -D /pgsql/data restart #在原主库服务器查看状态 postgres@master ~]$/pgsq1/data$ pg_controldata hellodb=# select *from pg_is_in_recovery;
5、实现同步的流复制
(1)配置同步的流复制
主节点需要特殊的如下配置,从节点同6.2.3配置
Lpostgres@master ~]$vi /pgsql/data/postgresql.confsynchronous_standby_names ='*' #开启此项,表示同步方式,默认是异步方式synchronous_commit =on #开启同步模式
(2)验证同步状态
#在主节点查看sync状态 postgres=# select pid,state,client_addr,sync_priority,sync_state frompg_stat_replication; #从节点停止服务 postgres@slave:~$ pg_ctl stop #主节点只支持读,但写入时会处于卡顿状态,直至从节点恢复正常同步hellodb=# deete from teachers where tid=4;