基本环境说明:

os:FreeBSD 9.3
postgresql version:9.3.
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 = # 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.conf
hot_standby = on
--------删除master端的三条配置语句------------
#listen_addresses = '*'
#wal_level = 'hot_standby'
#max_wal_senders = 1
------------------------------------------- # vim data/recovery.conf
standby_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(,);
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端更新数据。实际环境下未测试。

[笔记] postgresql 流复制(streaming replication)的更多相关文章

  1. PostgreSQL 9.3 Streaming Replication 状态监控

    postgresql是使用Streaming Replication来实现热备份的,热备份的作用如下: 灾难恢复 高可用性 负载均衡,当你使用Streaming Replication来实现热备份(h ...

  2. PostgreSQL流复制

    原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...

  3. PostgreSQL流复制参数max_wal_senders详解

    转自:http://my.oschina.net/Kenyon/blog/152234PostgreSQL 9.2.4 主机:192.25.10.76 从机:192.25.10.71 做postgre ...

  4. PostgreSQL流复制记录

    参考了别人的部分,添加了自己在实践中的内容,仅做记录. 1.同步流复制中 主机操作 1.1postgresql.conf wal_level = hot_standby # 这个是设置主为wal的主机 ...

  5. PostgreSQL 流复制+高可用

    QA PgPool-II 同步 Postgresql X1 服务器准备 192.168.59.121 PostgreSQL10 192.168.59.120 PGPool-II 3.7 X2 安装Po ...

  6. postgresql流复制配置

    一.配置环境: 示例环境 主机名 IP 角色 系统版本 数据目录 pg版本 db1 192.168.128.128 主库 RedHat5.3 /app/postgreSQL/data 9.1.7 db ...

  7. 再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署

    前言 在MySQL被收购之后,虽然有其替代品为: MariaDB,但是总感觉心里有点膈应.大家发现了另一款开源的数据库: PostgreSQL. 虽然centos自带版本9.2也可以用,但是最近的几次 ...

  8. 20181219-PostgreSQL 流复制监控脚本

    PostgreSQL 流复制监控脚本 https://github.com/AndyYHM/Writing/blob/PostgreSQL/20181219-PostgreSQL%20Stream%2 ...

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

    primary:10.189.102.118 standby:10.189.100.195 1. 配置ssh互信机制 在primary主库执行 $ ssh-keygen -t rsa $ cp ~/. ...

随机推荐

  1. 爬虫实战:汽车之家配置页面 破解伪元素和混淆JS

    本篇介绍如何破解汽车之家配置页面的伪元素和混淆的JS. ** 温馨提示:如需转载本文,请注明内容出处.** 本文链接:https://www.cnblogs.com/grom/p/9242156.ht ...

  2. canvas转img,blob相互转换

    摘自:https://www.cnblogs.com/jyuf/p/7251591.html 函数都比较简单,直接看就ok了 /*----------------------------------- ...

  3. mysql 8 windows 版本zip方式安装步骤

    mysql 8 windows 版本zip方式安装步骤(下载地址:https://dev.mysql.com/downloads/mysql/)1,解压ZIP文件到指定目录下:如D:\mysql-8. ...

  4. Navicat 12 连接 Mysql8.0 使用日志

    目前最新的Mysql8.0 + Navicat12,使用中常有一些棘手问题 解决了的都会贴出来,受益于小伙伴们 我们的目标是发现问题,解决问题,欢迎大家贴出自己使用时遇到的问题,集思广益 好了,上干货 ...

  5. jsp小基础归纳

    JSP的本质就是一个Servlet,JSP的运行之前会先被Tomcat服务器翻译为.java文件,然后在将.java文本编译为.class文件,而我们在访问jsp时,处理请求的就是那个翻译后的类. 1 ...

  6. redis必会

    1.NosqL 非关系型数据库,里面包含Redis和MondoDB2.为什么会用到关系型数据库?因为当数据量太多,访问人数过多的时候,在访问关系型数据库时会到硬盘里进行读写过多 这样就会导致访问速度很 ...

  7. 详解 Python3 正则表达式(三)

    上一篇:详解 Python3 正则表达式(二) 本文翻译自:https://docs.python.org/3.4/howto/regex.html 博主对此做了一些批注和修改 ^_^ 模块级别的函数 ...

  8. python 银行系统

    目前代码只写到这 主要部分已经实现 功能部分展现 首先我们需要五个类 用户类  : 成员属性 name  id  以及 card 卡类: 成员属性 卡号  密码  余额   锁 界面类:   管理员界 ...

  9. Leecode刷题之旅-C语言/python-326 3的幂

    /* * @lc app=leetcode.cn id=326 lang=c * * [326] 3的幂 * * https://leetcode-cn.com/problems/power-of-t ...

  10. svn文件管理

    将VS2010工程提交给Git管理时需要哪些文件:    *.h  *.cpp  *.sln  *.vcxproj  *.vcxproj.filters  *.qrc以及Resources目录下的资源 ...