一、 简介:

         PG在9.*版本后热备提供了新的一个功能,那就是Stream Replication的读写分离,是PG高可用性的一个典型应用。这个功能在oracle中叫active dataguard,在PostgreSQL中称为hot standby。 
 

二、系统环境

   系统平台:CentOS 6.2
   PostgreSQL版本:9.5.0
   master :   192.168.1.202
   slave  :   192.168.1.201
 
、搭建步骤
   数据库搭建参考地址http://www.cnblogs.com/lottu/p/5149191.html
   注:slave库可不需要init数据库;
 
  • master库操作
  1. 创建流复制用户repuser
CREATE USER repuser replication LOGIN CONNECTION LIMIT 3 ENCRYPTED PASSWORD 'li0924';
# replication    做流复制的时候用到的一个用户属性,一般单独设定。
# LOGIN  用户登录的属性;CREATE USER默认自带;所以LOGIN关键字可以略去。
 
   2. 在master数据库的/data/pgdata/postgresql.conf文件中设置如下配置项: 
 
wal_level = hot_standby
max_wal_senders = 1
wal_keep_segments = 32
# max_wal_senders   是slave库的节点数,有多少个slave库就设多少,
# wal_keep_segments  默认值是16,是PG_XLOG下的日志文件数相关参数
 
   3.在主数据库中的/var/lib/pgsql/data/pg_hba.conf中添加如下配置:
host    replication     repuser         192.168.1.201/16          md5
# 第二项必须填 replication;

4.重新启动主数据库,让配置生效:

pg_stop;pg_start
  5.采用热备份的方式;把master数据库的PGDATA目录下面的文件传到slave库中.同时把创建的数据文件夹也传过去;
这个步骤就是一个数据库克隆的工作。
 
  • slave库操作

1.在slave数据库的/data/pgdata/postgresql.conf文件中设置如下配置项:

hot_standby = on

2.在PGDATA目录下;也就这里的/data/pgdata;新建文件recovery.conf

standby_mode = 'on'
primary_conninfo = 'host=192.168.1.202 port=5432 user=repuser password=li0924'
trigger_file = '/data/pgdata/trigger_standby'                   

3.删除原先从master库上过来的/data/pgdata/postmaster.pid文件,

rm /data/pgdata/postmaster.pid   

4.根据master库中的环境变量文件;修改slave库的postgres用户的环境变量 然后启动备库:

pg_start
 
 

四、验证工作

  • 查看进程

master库

[postgres@sdserver40_210 ~]$ ps -ef | grep postgre
root      2021   556  0 15:18 pts/1    00:00:00 su - postgres
postgres  2022  2021  0 15:18 pts/1    00:00:00 -bash
postgres  2239     1  0 15:24 pts/1    00:00:00 /opt/pgsql95/bin/postgres
postgres  2249  2239  0 15:24 ?        00:00:00 postgres: checkpointer process   
postgres  2250  2239  0 15:24 ?        00:00:00 postgres: writer process   
postgres  2251  2239  0 15:24 ?        00:00:00 postgres: wal writer process   
postgres  2252  2239  0 15:24 ?        00:00:00 postgres: autovacuum launcher process   
postgres  2253  2239  0 15:24 ?        00:00:00 postgres: archiver process   last was 00000006000000000000001E.00000028.backup
postgres  2254  2239  0 15:24 ?        00:00:00 postgres: stats collector process   
postgres  3235  2239  0 15:54 ?        00:00:00 postgres: wal sender process repuser 183.60.192.229(40399) streaming 0/1F000D80
   

slave库

[postgres@sdserver40_222 pgdata]$ ps -ef | grep postgres
postgres  6856     1  0 15:54 pts/0    00:00:00 /opt/pgsql/bin/postgres
postgres  6863  6856  0 15:54 ?        00:00:00 postgres: startup process   recovering 00000006000000000000001F
postgres  6864  6856  0 15:54 ?        00:00:00 postgres: checkpointer process   
postgres  6865  6856  0 15:54 ?        00:00:00 postgres: writer process   
postgres  6866  6856  0 15:54 ?        00:00:00 postgres: wal receiver process   streaming 0/1F000CA0
postgres  6867  6856  0 15:54 ?        00:00:00 postgres: stats collector process   
root      6922 30527  0 16:08 pts/0    00:00:00 su - postgres
postgres  6923  6922  0 16:08 pts/0    00:00:00 -bash
postgres  6974  6923  0 16:49 pts/0    00:00:00 ps -ef
postgres  6975  6923  0 16:49 pts/0    00:00:00 grep postgres
 
 
  • 数据验证

在master库操作

[postgres@sdserver40_210 ~]$ psql mydb repuser
psql (9.5.0)
Type "help" for help.
mydb=> \d 
             List of relations
 Schema | Name  |     Type      |  Owner   
--------+-------+---------------+----------
 public | dept  | table         | lottu
 public | emp   | foreign table | postgres
 public | test  | table         | lottu
 public | trade | table         | lottu
(4 rows)
 
mydb=> create table t_lottu (id int primary key,name varchar(20));
CREATE TABLE
mydb=> \d
              List of relations
 Schema |  Name   |     Type      |  Owner   
--------+---------+---------------+----------
 public | dept    | table         | lottu
 public | emp     | foreign table | postgres
 public | t_lottu | table         | repuser
 public | test    | table         | lottu
 public | trade   | table         | lottu
(5 rows)
 
mydb=> insert into t_lottu values (1001,'lottu');
INSERT 0 1
mydb=> insert into t_lottu values (1002,'vincent');
INSERT 0 1
mydb=> insert into t_lottu values (1003,'rax');
INSERT 0 1
mydb=> select * from t_lottu;
  id  |  name   
------+---------
 1001 | lottu
 1002 | vincent
 1003 | rax
(3 rows)
 

登录slave库查看数据

[postgres@sdserver40_222 pgdata]$ psql mydb repuser
psql (9.5.0)
Type "help" for help.
 
mydb=> select * from t_lottu;
  id  |  name   
------+---------
 1001 | lottu
 1002 | vincent
 1003 | rax
(3 rows)
 
mydb=> delete from t_lottu where id = 1003;
ERROR:  cannot execute DELETE in a read-only transaction

参考博客 --http://my.oschina.net/Kenyon/blog/54967

PostgreSQL Hot Standby的搭建的更多相关文章

  1. postgresql数据库异步流复制hot standby环境搭建

    生命不息,test不止. 最近组里面修改了几个postgresql的bug,要进行回归测试,除了前面提到的WAL的RT测试和Mirroring Controller的RT测试,还要测试下postgre ...

  2. PostgreSQL Hot Standby的主备切换

    一. 简介:          PG在9.*版本后热备提供了新的一个功能,那就是Stream Replication的读写分离,是PG高可用性的一个典型应用.其中备库是只读库:若主库出现故障:备库这个 ...

  3. Postgresql监控pgwatch的搭建

    一,需要环境: You will need a handful of components to make this work: - Apache (webserver) #apache搭建web页面 ...

  4. Logical standby database 搭建(配置)

    说明 Logical standby 数据库是通过Physical standby数据库转换的.本Logical standby是通过之前创建的Physical standby转换的. Physica ...

  5. postgresql 10.5 主从复制--搭建测试

    env: role master slave host pg1 pg2 ip 11 12 pg-version 10.5 10.5 1 初始化查看 [ceiec@localhost ~]$ df -h ...

  6. postgresql集群的搭建

    目录 架构图 部署详情 postgresql的安装与配置 pgpool的安装与配置 写在安装前 postgresql是一款很强大的数据库,具体有多强大呢,请谷歌... 网上的相关资料不是很多,参考了大 ...

  7. ORACLE Physical Standby DG搭建

    主库: 一:强制force logging: alter database force logging; 二:开启主库的归档模式 三:主库添加standby redo log,比redo日志组多一组: ...

  8. Nginx+PostgreSQL+Django+UWSGI搭建

    最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx.常见的 django webapp 部署方式采用FCGI 或 WSGI ...

  9. postgreSQL 时间线

    “时间线”(Timeline)是PG一个很有特色的概念,在备份恢复方面的文档里面时有出现.但针对这个概念的详细解释却很少,也让人不太好理解,我们在此仔细解析一下. 时间线的引入 为了理解引入时间线的背 ...

随机推荐

  1. Group的操作

    1. 概述 “Group By”从字面意义上理解就是根据“By”指定的规则对数据进行分组 示例 2. group by的简单操作 3. Group By中Select指定的字段限制 select指定的 ...

  2. Flask服务入门案例

    安装 pip install Flask 入门例子 from flask import Flask app = Flask(__name__) @app.route('/hello.world') d ...

  3. javascript设计模式学习之五——策略模式

    一.策略模式定义: 定义一些列的算法/规则,将它们封装起来,使得它们可以互相替换/组合使用.其目的在于将算法/规则封装起来,将算法/规则的使用与实现分离出来. 通过策略模式,可以减少算法计算过程中大量 ...

  4. Spring boot中使用springfox来生成Swagger Specification小结

    Rest接口对应Swagger Specification路径获取办法: 根据location的值获取api   json描述文件 也许有同学会问,为什么搞的这么麻烦,api json描述文件不就是h ...

  5. maven 无法安装plugin的问题

    spring有一个入门例子,在docker里跑spring-boot程序 下载后按照教程执行mvn package docker:build.并不能成功.会报错. [ERROR] No plugin ...

  6. UITextFiled

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  7. c# yyyyMMdd,dd/MM/yyyy 类型字符串转换为datetime 类型

    DateTime ConvertDate = DateTime.ParseExact("20140504", "yyyyMMdd", null, System. ...

  8. Java基础之线程——派生自Thread类的子类(TryThread)

    控制台程序. 程序总是至少有一个线程,程序开始执行时就会创建这个线程.在普通的Java应用程序中,这个线程从mian()方法的开头启动. 要开始执行线程,可以调用Thread对象的start()方法. ...

  9. java中创建线程的几种方法及区别

    1,实现Runnable接口创建线程 特点: A:将代码和数据分开,形成清晰的模型 B:线程体run()方法所在的类可以从其它类中继承一些有用的属性和方法 C:有利于保持程序风格的一致性 2,继承Th ...

  10. scan cell

    scan cell有两种不同的input: 1)data input:由电路的combinational logic驱动: 2)scan input:由另一个scan cell驱动,从而形成scan  ...