postgresql 流复制(streaming replication)

基本环境说明:

os:FreeBSD 9.3
postgresql version:9.3.6
master:192.168.56.101
standby:192.168.56.102

安装过程略,基于pkg包

1.配置master端

# psql -U pgsql -d postgres -c "CREATE USER rep REPLICATION LOGIN ENCRYPTED PASSWORD ‘password‘;"
# cd /usr/local/pgsql
# vim data/postgresql.conf
listen_addresses = ‘*‘
wal_level = ‘hot_standby‘
max_wal_senders = 1

# vim data/pg_hba.conf
host replication rep 192.168.56.102/32 md5

修改完配置需要重启postgresql# /usr/local/etc/rc.d/postgresql restart

2.复制数据至standby端

master端操作:
# psql -U pgsql -d postgres -c "select pg_start_backup(‘backup‘)"

# cd /usr/local/pgsql# tar zcf data.tgz data# scp data.tgz 192.168.56.102:/usr/local/pgsql

# psql -U pgsql postgres -c "select pg_stop_backup()"

3.配置standby端

# /usr/local/etc/rc.d/postgresql stop

# cd /usr/local/pgsql# rm -r data# tar zxf data.tgz# rm -r data/postmaster.pid data/pg_xlog/* data/backup_label

# vim data/postgresql.confhot_standby = on--------删除master端的三条配置语句------------#listen_addresses = ‘*‘#wal_level = ‘hot_standby‘#max_wal_senders = 1-------------------------------------------

# vim data/recovery.confstandby_mode = ‘on‘primary_conninfo = ‘host=192.168.56.101 port=5432 user=rep password=password‘

# vim data/pg_hba.conf---------删除master端的一条配置文句-----------#host replication rep 192.168.56.102/32 md5-------------------------------------------# /usr/local/etc/rc.d/postgresql start

4.测试数据是否配置成功

master端
# createdb -U pgsql mydb
# psql -U pgsql mydb
mydb=# create table foo(id bigint);
mydb=# insert into foo select * from generate_series(1,100000);mydb=# select * from pg_stat_replication;

standby端
# psql -U pgsql mydb
mydb=# select count(*) from foo;

参考地址:

https://www.byvoid.com/zhs/blog/postgresql-wal-replication

http://blog.sciencenet.cn/home.php?mod=space&uid=419883&do=blog&id=537939

实现原理

主服务器在接受到每个事务请求时,将数据改动用预写日志(WAL)记录。具体而言,事务采用两段提交(Two Phase Commit),即先将改动写入预写日志,然后再实际改动数据库。这样可以保证预写日志的时间戳永远不落后于数据库,即便是正在写入时服务器突然崩溃,重启以后也可以依据预写日志将数据恢复,因为预写日志保留了比数据库记录中更新的版本。PostgreSQL的异步复制解决方案正是利用了预写日志,将预写日志从主服务器(Master Sever)传输到备用服务器(Standby Server),然后在备用服务器上回放(Replay)出预写日志中记录改动,从而实现主从复制。PostgreSQL使用了两种方式传输预写日志:存档式(archive)和流式(streaming)。

存档式复制的原理是主服务器将预写日志主动拷贝到一个安全的位置(可以直接到备用服务器,也可以是第三台服务器),同时备用服务器定期扫描这个位置,并将预写日志拷贝到备用服务器端然后再回放。这样即使主服务器崩溃了,备用服务器也可以从这个安全的位置获取到一份完整的记录,以确保任何数据不会丢失。而流式复制则简化了这一个步骤,由主服务器直接通过TCP协议向备用服务器传输日志,避免了两次复制的开销,有利于减小备用服务器和主服务器直接的数据延时。但当主服务器崩溃时,未被传输到备用服务器的日志则会丢失,造成数据损失。PostgreSQL支持存档式和流式两种模式的混合,当两种模式都开启时,备用服务器会定期检查是否有存档已经到达指定的位置,并回放日志。一旦检测到指定的位置没有新的日志,则会切换到流式模式试图直接从网络传输日志,接着再检查存档,不断重复这一循环。

standby端启动报错:

May 22 05:43:51 93b postgres[634]: [3-1] FATAL:  could not receive data from WAL stream: ERROR:  requested WAL segment 000000010000000000000002 has already been removed

这是因为standby端启动时,会从上文data.tgz记录的wal位置到master端的data/pg_xlog目录下查找文件,而master端的data/pg_xlog日志文件,在standby端恢复数据的过程中已经被master端更新操作覆盖替换掉,已找不到000000010000000000000002该文件。

解决方法:重新去master端备份数据复制到standby重做,若测试环境下记得不要在完成配置standby端前,往master端更新数据。实际环境下未测试。

时间: 2024-10-01 12:56:58

postgresql 流复制(streaming replication)的相关文章

Postgresql流复制+pgpool实现高可用

pgpool 概述 pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:连接池.复制.负载均衡.限制超过限度的连接以及并行查询.文档在此. 四种模式 O 意味着“可用”, X 意味着“不可用(1) 并行查询模式需要同时打开复制和负载均衡,但是复制和负载均衡无法用于并行查询模式中的分布式表.(2) 在线恢复可以和流复制同时使用.(*3) 客户端仅仅是通过 pgpool-II 连接到 PostgreSQL服务器.这种模式仅仅

Postgresql流复制切换的时候遇到的一个小问题

Pg10搭建了流复制主备切换 配置主库10.10.10.13 pghost4备库10.10.10.14 pghost5 测试主库出现问题,停止后,备库自动切换成为新主库.老主库现在应该是备库了,启动它验证状态.发现备库启动不起来.通过以下方法,备库启动了. 新备库通过pg_ctl start启动,出现告警日志. [[email protected] ~]# su - pg10[email protected]>pg_ctl startwaiting for server to start....

PostgreSQL流复制

原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组成. walsender进程是用来发送WAL日志记录的 walreceiver进程是用来接收WAL日志记录的 startup进程是用来apply日志的 配置环境 主机名 IP地址 角色 数据目录 postgres202 192.168.1.202 primary /home/postgres/dat

【Postgresql】postgresql9.3.9版本基于流复制方式双机热备方案

系统环境:centos6.5数据库版本: postgres9.3.9虚拟机2台:Master:10.0.2.160Slave:10.0.2.69数据存储位置:/usr/local/pgsql/data/ 安装pgsql数据库 安装过程可参考我上一篇博客:http://blog.51cto.com/13632960/2117902 两台机器都需要安装完成,我在做热备的时候,Master数据库开启,Slave关闭. 创建流复制用户 Master端进入数据库并执行: CREATE USER repus

Postgresql9 PPAS9流复制配置

PostgreSQL流复制集群搭建,这个是翻的陈年旧档 主机: PPAS1 PPAS2 1 安装PPAS 9.0 [[email protected] ~]# setenforce 0 [[email protected] ~]# ppasmeta-9.0.4.14-linux-x64.run--全部安装 [[email protected] ~]# vim /etc/bashrc 加入: PATH=$PATH:/opt/PostgresPlus/9.0AS/binexport PATH --L

Oracle流复制

Stream 是Oracle 的消息队列(也叫Oracle Advanced Queue)技术的一种扩展应用. Oracle 的消息队列是通过发布/订阅的方式来解决事件管理.流复制(Stream replication)只是基于它的一个数据共享技术,也可以被用作一个可灵活定制的高可用性方案. 它可以实现两个数据库之间数据库级,schema级,Table级的数据同步,并且这种同步可以是双向的. Oracle Stream也是通过数据冗余来提高可用性,这一点和Data Guard 类型. Oracl

PostgreSQL数据库Streaming Replication流复制主备延迟测试

PostgreSQL数据库流复制主库和备库之间的延迟时间是多少,无论对HA还是负载均衡来说都应该做个评估.比如单纯的HA架构,当主库发生故障时,我们允许多少时间内的数据丢失.不废话,直接进入本次实验测试. 测试环境: 主库:内存:32G,CPU:8核,IP:192.168.122.101 备库:内存:32G,CPU:8核,IP:192.168.122.102 数据库配置:默认 测试准备: 在两台服务器上安装好PostgreSQL数据库,安装过程不清楚的可以参考文章<PostgreSQL数据库编译

postgresql异步流复制搭建

节点 IP 角色 citus-master 10.10.100.1 master citus-standby 10.10.100.2 standby master上创建流复制所需要的用户. CREATE ROLE replication WITH REPLICATION PASSWORD 'replication' LOGIN; 修改master的pg_hba.conf文件,设置replication用户远程访问权限 ## vim /data/pgsql/data/pg_hba.conf,追加下

PostgreSQL数据库单机扩展为流复制

1. 在standby服务器安装postgres数据库,不需要初始化. 安装过程详见:http://www.cnblogs.com/ilifeilong/p/6979288.html 2. 在primary服务器创建具有REPLICATION权限的复制用户 postgres=# CREATE ROLE repl WITH REPLICATION PASSWORD 'repl' LOGIN; 3. 允许复制用户远程连接到primary服务器 $ grep "^host" pg_hba.c