[笔记] postgresql 流复制(streaming replication)
基本环境说明:
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)的更多相关文章
- PostgreSQL 9.3 Streaming Replication 状态监控
postgresql是使用Streaming Replication来实现热备份的,热备份的作用如下: 灾难恢复 高可用性 负载均衡,当你使用Streaming Replication来实现热备份(h ...
- PostgreSQL流复制
原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组 ...
- PostgreSQL流复制参数max_wal_senders详解
转自:http://my.oschina.net/Kenyon/blog/152234PostgreSQL 9.2.4 主机:192.25.10.76 从机:192.25.10.71 做postgre ...
- PostgreSQL流复制记录
参考了别人的部分,添加了自己在实践中的内容,仅做记录. 1.同步流复制中 主机操作 1.1postgresql.conf wal_level = hot_standby # 这个是设置主为wal的主机 ...
- PostgreSQL 流复制+高可用
QA PgPool-II 同步 Postgresql X1 服务器准备 192.168.59.121 PostgreSQL10 192.168.59.120 PGPool-II 3.7 X2 安装Po ...
- postgresql流复制配置
一.配置环境: 示例环境 主机名 IP 角色 系统版本 数据目录 pg版本 db1 192.168.128.128 主库 RedHat5.3 /app/postgreSQL/data 9.1.7 db ...
- 再不了解PostgreSQL,你就晚了之PostgreSQL主从流复制部署
前言 在MySQL被收购之后,虽然有其替代品为: MariaDB,但是总感觉心里有点膈应.大家发现了另一款开源的数据库: PostgreSQL. 虽然centos自带版本9.2也可以用,但是最近的几次 ...
- 20181219-PostgreSQL 流复制监控脚本
PostgreSQL 流复制监控脚本 https://github.com/AndyYHM/Writing/blob/PostgreSQL/20181219-PostgreSQL%20Stream%2 ...
- PostgreSQL数据库单机扩展为流复制
primary:10.189.102.118 standby:10.189.100.195 1. 配置ssh互信机制 在primary主库执行 $ ssh-keygen -t rsa $ cp ~/. ...
随机推荐
- iOS 使约束带动画效果(Animate NSLayoutconstraints)
http://stackoverflow.com/questions/12926566/are-nslayoutconstraints-animatable http://stackoverflow. ...
- Java并发编程(十一)常用工具
Java为开发提供了很多有用的工具类,这些工具类可以帮助我们更加高效的编写并发程序,本篇我们将介绍这些实用工具的用法. ThreadLocal ThreadLocal类用于解决多线程共享一个变量的问题 ...
- Vue中,给当前元素添加类名移除兄弟元素类名的方法
在Vue中,给当前元素添加类名移除兄弟元素类名的方法 今天在项目中需要做一个效果,点击对应的li改变当前的color,其他的li取消颜色,在jQuery中这很容易,由于之前已经引入了jQuery,所以 ...
- js基础(闭包)
1. "闭包就是跨作用域访问变量." [示例一] var name = 'wangxi' function user () { // var name = 'wangxi' fun ...
- 一条常用的 Sql
select * from table where 条件1 .... group by 字段...... Having 条件1.....Limit 0,10; 1. 根据where ...
- 大数据:spark集群搭建
创建spark用户组,组ID1000 groupadd -g 1000 spark 在spark用户组下创建用户ID 2000的spark用户 获取视频中文档资料及完整视频的伙伴请加QQ群:9479 ...
- MySQL用户账户管理/权限管理/资源限制
MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了. mysql 的权限体系大致分为5个层级: ...
- mysql secure_file_priv 文件读写问题
secure_file_priv特性 使用 show global variables like '%secure%'; 查询显示 secure_file_priv的值为null,那么secure_f ...
- A1033
找出最小开销. 思路: 出发点的加油站编号设为0,终点的加油站编号设为n,其他加油站编号按距离依次排序. 如果0号加油站的距离!=0,则无法出发,行驶距离为0. 从起点开始,寻找规则为,如果存在油价小 ...
- VC6无法生成Release版本程序
在工程设置,将Setting for后面的选项改为Win32 Release.然后重新编译.结果仍然没有生成release,而且打开设置时,依然是Win32 Debug. 解决办法,在VC6.0的工具 ...