主从复制的两种形式
1)基于文件的日志传送
创建一个高可用性(HA)集群配置可采用连续归档,集群中主服务器工作在连续归档模式下,备服务器工作在连续恢复模式下(1台或多台可随时接管主服务器),备持续从主服务器读取WAL文件。连续归档不需要对数据库表做任何改动,可有效降低管理开销,对主服务器的性能影响也相对较低。直接从一个数据库服务器移动WAL记录到另一台服务器被称为日志传送,PostgreSQL通过一次一文件(WAL段)的WAL记录传输实现了基于文件的日志传送。日志传送所需的带宽取根据主服务器的事务率而变化;日志传送是异步的,即WAL记录是在事务提交后才被传送,那么在一个窗口期内如果主服务器发生灾难性的失效则会导致数据丢失,还没有被传送的事务将会被丢失;数据丢失窗口可以通过使用参数archive_timeout进行限制,可以低至数秒,但同时会增加文件传送所需的带宽。archive_timeout强制N秒以后进行一次归档,若设置太小,很快就会超过wal_keep_segments 的值,导致数据覆盖丢失,因此不要盲目设置。
2)流复制
PostgreSQL在9.x之后引入了主从的流复制机制,所谓流复制,就是备服务器通过tcp流从主服务器中同步相应的数据,主服务器在WAL记录产生时即将它们以流式传送给备服务器,而不必等到WAL文件被填充。默认情况下流复制是异步的,这种情况下主服务器上提交一个事务与该变化在备服务器上变得可见之间客观上存在短暂的延迟,但这种延迟相比基于文件的日志传送方式依然要小得多,在备服务器的能力满足负载的前提下延迟通常低于一秒;在流复制中,备服务器比使用基于文件的日志传送具有更小的数据丢失窗口,不需要采用archive_timeout
来缩减数据丢失窗口;PostgreSQL 12开始,在执行通过流复制来配置主备数据库的时候,不再需要配置额外配置recovery.conf
文件了。取而代之的是在备库环境的$PGDATA
路径下配置一个standby.signal
文件,注意该文件是一个普通的文本文件,内容为空。理解起来就是,该文件是一个标识文件。如果备库通过执行pg_ctl promote
提升为主库的话,那么该文件将自动消失。
注意:全部操作都以postgres用户进行。
配置主从流复制和归档
1)两台机器做免密登录
我们备份和还原过程中所用的archive_command和restore_command命令都以postgres用户运行,因此我们需要针对postgres用户实现ssh无密码登录。
1、用postgres用户登录到主pgsql服务器
ssh-keygen -t rsa # 一路回车
scp /home/postgres/.ssh/id_rsa.pub postgres@10.10.22.152:/home/postgres/.ssh/authorized_keys
或者拷贝id_rsa.pub文件到从pgsql上,然后到从上执行以下命令
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
登录从pgsql服务器查看权限
chmod 700 /home/postgres/.ssh
chmod 600 /home/postgres/.ssh/authorized_keys
测试登录
ssh postgres@10.10.22.152
2、从pgsql库
ssh-keygen -t rsa # 一路回车
scp /home/postgres/.ssh/id_rsa.pub postgres@10.10.22.151:/home/postgres/.ssh/authorized_keys
登录从pgsql服务器查看权限
chmod 700 /home/postgres/.ssh
chmod 600 /home/postgres/.ssh/authorized_keys
测试登录
ssh postgres@10.10.22.152
2)主库配置
创建用户
ceate user replica with replication login password 'replication';
alter user replica with password 'replication';
修改pg_hba.conf
host replication replica