下载PostgreSQL源码包,放在任意目录

设置/etc/sysctl.conf,增加以下内容

kernel.shmmni= 4096
kernel.sem =501000 6412800000 501000 12800
fs.file-max =767246
net.ipv4.ip_local_port_range= 1024 65000
net.core.rmem_default= 1048576
net.core.rmem_max= 1048576
net.core.wmem_default= 262144
net.core.wmem_max= 262144
net.ipv4.tcp_tw_recycle=1
net.ipv4.tcp_max_syn_backlog=4096
net.core.netdev_max_backlog=10000
vm.overcommit_memory=0
net.ipv4.ip_conntrack_max=655360
sysctl -p 生效

如果这里出现最后一个参数未生效可:

modprobeip_conntrack
echo"modprobe ip_conntrack" >> /etc/rc.local

设置/etc/security/limits.conf 增加以下内容

* soft    nofile  131072
* hard    nofile  131072
* soft    nproc   131072
* hard    nproc   131072
* soft    core    unlimited
* hard    core    unlimited
* soft    memlock 50000000
* hard    memlock 50000000
 
--vi/etc/pam.d/login
sessionrequired pam_limits.so

设置环境变量

#vi .bash_profile 在文件尾添加 
exportPATH=$PATH:/usr/local/pgsql/bin
exportMANPATH=$MANPATH:/usr/local/pgsql/man
exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/pgsql/lib
export PGDATA=/opt/pgdata

先修改好两台机器的名称

[root@primary ~]# groupadd postgres
[root@primary ~]# useradd -g postgres postgres
[root@primary ~]# passwd postgres
[postgres@primary~]$ tar -zxvf postgresql-9.3.0.tar.gz 
[postgres@primary~]$ cd postgresql-9.3.0
[postgres@primary postgresql-9.3.0]$ ./configure --prefix /home/proxy_pg/pgsql  #配置安装目录
[postgres@primary postgresql-9.3.0]$ make   #这里需要安装基础的库(gcc、readline、zlib、) 可以不必理会,make时会提示
[root@primary ~]# mkdir /home/proxy_pg
[root@primary ~]# chown -R postgres /home/proxy_pg
[postgres@primary postgresql-9.3.0]$ make install#安装
[postgres@primary pgsql]$ mkdir /home/proxy_pg/pgsql/data        #在你想要存放数据的地方创建data文件夹
[postgres@primary bin]$ ./initdb -D ../data/             #初始化数据库
 
[postgres@primarydata]$ vi postgresql.conf    #修改data/postgresql.conf
port = 5432                        #可以任意更改你想要的,这里直接用5432
wal_level = hot_standby       #主库设置成 hot_standby ,从库才能以READ-ONLY模式打开
max_wal_senders = 30        #WAL STREAM 日志发送进程数
log_connections = on              #设置日志参数,记录连接信息
logging_collector = on                #开启csvlog输出功能(默认为off)
log_directory = 'pg_log'        #设置csv日志输出目录($PGDATA目录下,如果不存在该目录,则会自动新建)
log_destination = 'csvlog'   #设置输出的日志式(类型),pg中的日志类型有stderr、csvlog、syslog以及eventlog,本例中设置为csvlog
#该选项默认为stderr类型
archive_mode= on
archive_command = 'test ! -f /archive/pg93/archive_active || cp %p/archive/pg93/%f' #备注:归档标识文件 archive_active  需要手工创建。
wal_keep_segments = 1024      #主库设置的 wal_keep_segments 参数为 1024,一个较大的 wal_keep_segments 设置,允许
            备库在宕机较长的时间内依然能够重新追上主库,当然这与主库的繁忙程度有关,主库越忙,
           产生的 WAL 日志越多,之前的 WAL 日志越容易被覆盖,进而出现FATAL,XX000错误。
 
 
注:修改完logging_collector后需要重启数据库(当然你也可以继续配置,在所有配置都完成后再重启)
 
[root@primary   ~]#mkdir -p /archive/pg93    
[root@primary ~]# chown -R postgres /archive
[root@primary ~]# cd /archive/pg93/
[root@primary pg93]#touch archive_active

以上操作备库也执行

修改data/pg_hba.conf

host   replication     postgres        192.168.5.0/24          trust

启动主数据库bin/pg_ctl start -D ../data/

[postgres@primarybin]$ ./pg_ctl start -D ../data

检测数据库是否启动成功

[postgres@primarybin]$ ./psql -d postgres
psql(9.3.0)
Type"help" for help.
 
postgres=#         #说明启动成功了

基础备份

基本流程:在主数据库服务器上执行pg_start_backup(),复制data目录,在执行pg_stop_backup()。

./psql–d postgres
postgres=#select pg_start_backup('base backup for logstreaming');

#使用这个方法后,所有请求在写日志之后不会再刷新到磁盘。直到执行pg_stop_backup()这个函数。

#下面需要拷贝一份data目录,并通过scp复制到子数据库中

[postgres@primarypgsql]$ cp -r data data_bak

创建从数据库(standby)

#通过scp方式拷贝data_bac目录到从数据库下(当然也可以通过其他方式)

[postgres@primarypgsql]$ scp -r data_bak/postgres@192.168.5.252:/home/proxy_pg/pgsql/

#进入从数据库服务器,进入刚刚拷贝过来的data_bac目录下

[postgres@standby~]$ cd /home/proxy_pg/pgsql/data_bak

#修改postgres.conf

port = 5432 #改成你想的端口
hot_standby = on    #从库上可以执行只读操作
 log_connections = on

copy完后,停止主数据库基础备份

postgres=#select pg_stop_backup();
#增加recovery.conf配置下连接的主数据库信息(ip、端口、用户)
[postgres@standby share]$ cp recovery.conf.sample ../data/recovery.conf     #可以从share中拷贝一份模板
[postgres@standbydata_bak]$ vi recovery.conf
standby_mode= 'on'
primary_conninfo= 'host=192.168.5.248 port=5432 user=postgres'
trigger_file = '/tmp/postgresql.trigger.5432'

#删除pid文件

[postgres@standbydata_bak]$ rm -f postmaster.pid

启动从数据库,并观察CSVLOG

bin/pg_ctl start -D ../data_bak/

观察CSVLOG

[postgres@primarypg_log]$ tail -f postgresql-2014-10-28_155549.csv
2014-10-2815:55:49.522 GMT-8,,,27977,,544f4c05.6d49,1,,2014-10-28 15:55:49GMT-8,,0,LOG,00000,"ending log output to stderr",,"Future logoutput will go to log destination""csvlog"".",,,,,,,""
2014-10-2815:55:49.523 GMT-8,,,27979,,544f4c05.6d4b,1,,2014-10-28 15:55:49GMT-8,,0,LOG,00000,"database system was shut down at 2014-10-28 15:33:33GMT-8",,,,,,,,,""
2014-10-2815:55:49.612 GMT-8,,,27977,,544f4c05.6d49,2,,2014-10-28 15:55:49GMT-8,,0,LOG,00000,"database system is ready to acceptconnections",,,,,,,,,""
2014-10-2815:55:49.612 GMT-8,,,27983,,544f4c05.6d4f,1,,2014-10-28 15:55:49GMT-8,,0,LOG,00000,"autovacuum launcher started",,,,,,,,,""
2014-10-2815:56:34.436 GMT-8,,,28048,"",544f4c32.6d90,1,"",2014-10-2815:56:34 GMT-8,,0,LOG,00000,"connection received:host=[local]",,,,,,,,,""
2014-10-2815:56:34.437GMT-8,"postgres","postgres",28048,"[local]",544f4c32.6d90,2,"authentication",2014-10-2815:56:34 GMT-8,2/1,0,LOG,00000,"connection authorized: user=postgresdatabase=postgres",,,,,,,,,""
2014-10-2816:06:14.597 GMT-8,,,28199,"",544f4e76.6e27,1,"",2014-10-2816:06:14 GMT-8,,0,LOG,00000,"connection received: host=192.168.5.252port=49654",,,,,,,,,""
2014-10-2816:06:14.598GMT-8,"postgres","",28199,"192.168.5.252:49654",544f4e76.6e27,2,"authentication",2014-10-2816:06:14 GMT-8,3/21,0,LOG,00000,"replication connection authorized:user=postgres",,,,,,,,,""
2014-10-2816:11:29.501 GMT-8,,,28251,"",544f4fb1.6e5b,1,"",2014-10-2816:11:29 GMT-8,,0,LOG,00000,"connection received: host=192.168.5.252port=50285",,,,,,,,,""
2014-10-2816:11:29.502GMT-8,"postgres","",28251,"192.168.5.252:50285",544f4fb1.6e5b,2,"authentication",2014-10-2816:11:29 GMT-8,3/28,0,LOG,00000,"replication connection authorized:user=postgres",,,,,,,,,""
 
这些信息说明流复制已经成功,从库正准备接收主库的WAL-STREAM。

主库观察WAL-Sender进程

[postgres@primarybin]$ ps -ef |grep post

postgres 2825127977  0 16:11 ?        00:00:00 postgres: wal sender processpostgres 192.168.5.252(50285) streaming 0/60009A8

说明:将输出结果省略部分,可以看到 " wal sender process repuser"进程

在从库上观察 WAL-接收进程

[postgres@standbydata_bak]$ ps -ef |grep post

postgres 1191611911  0 16:11 ?        00:00:00 postgres: wal receiverprocess   streaming 0/60009A8

说明:同样省略部分输出结果,可以看到“ wal receiver process ” 进程。

测试

主库上创建用户

postgres=# CREATE ROLE browser LOGIN ENCRYPTED PASSWORD 'browser'
postgres-# nosuperuser noinherit nocreatedb nocreateroleCONNECTION LIMIT 200;
CREATE ROLE

从库上验证

postgres=# \du

List of roles

Role name |                   Attributes                   | Member of

-----------+------------------------------------------------+-----------

browser  | No inheritance                                +| {}

| 200 connections                                |

postgres | Superuser, Create role, Create DB, Replication | {}

说明:果然,在从库上就立刻创建了新用户 'browser'

主库上创建表空间(On Master)

[postgres@primarydata]$ mkdir -p/home/proxy_pg/pgsql/data/pg_tbs/tbs_browser

从库上也执行 mkdir -p  (On  Sandby)

[postgres@standbydata_bak]$  mkdir -p /home/proxy_pg/pgsql/data/pg_tbs/tbs_browser

主库上

postgres=# create tablespace tbs_browser owner browser LOCATION
postgres-# '/home/proxy_pg/pgsql/data/pg_tbs/tbs_browser';
CREATE TABLESPACE

--在从库上验证

postgres=# \db
                          List of tablespaces
    Name    |  Owner   |                   Location                  
-------------+----------+----------------------------------------------
 pg_default | postgres |
 pg_global  | postgres |
 tbs_browser | browser  |/home/proxy_pg/pgsql/data/pg_tbs/tbs_browser

(3 rows)

表空间"tbs_browser" 也立刻创建过来了

主库上创建数据库

postgres=# CREATE DATABASE browser WITH OWNER = browser TEMPLATE= template0 ENCODING = 'UTF8' TABLESPACE = tbs_browser;
CREATE DATABASE

--从库上验证

postgres=# \l
                                  List ofdatabases
   Name   |  Owner   | Encoding |   Collate  |    Ctype    |  Access privileges  
-----------+----------+----------+-------------+-------------+-----------------------
 browser  | browser  | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
 postgres | postgres | UTF8     |zh_CN.UTF-8 | zh_CN.UTF-8 |
 template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |=c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
 template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |=c/postgres          +
           |          |          |             |             | postgres=CTc/postgres
(4 rows)

从库上数据库 "browser" 也立刻有了,几乎没有延时。

在从库上建表

postgres=# create table table3(id integer);
ERROR:  cannot execute CREATE TABLE in a read-onlytransaction

说明:从库是以只读形式打开,只能执行读操作,不能写。

监控streaming

postgres=# select * from pg_stat_replication ;
  pid  |usesysid | usename  | application_name|  client_addr  | client_hostname | client_port |         backend_start         |  state   | sent_location
| write_location |flush_location | replay_location | sync_priority | sync_state
-------+----------+----------+------------------+---------------+-----------------+-------------+-------------------------------+-----------+---------------
+----------------+----------------+-----------------+---------------+------------
 28251 |      10 | postgres | walreceiver      |192.168.5.252 |                 |       50285 | 2014-10-28 16:11:29.501421+08 |streaming | 0/6001C70    
| 0/6001C70      | 0/6001C70      | 0/6001C70       |             0 | async
(1 row)

本文出自 “岁伏” 博客,请务必保留此出处http://suifu.blog.51cto.com/9167728/1575880

Postgresql standby(备机只读)环境搭建的更多相关文章

  1. appium ios真机自动化环境搭建&运行(送源码)

    appium ios真机自动化环境搭建&运行(送源码) 原创: f i n  测试开发社区  6天前 Appium测试环境的搭建相对比较烦琐,不少初学者在此走过不少弯路 首先是熟悉Mac的使用 ...

  2. appium ios真机自动化环境搭建&运行(送源码)

    appium ios真机自动化环境搭建&运行(送源码) 原创: f i n  测试开发社区  6天前 Appium测试环境的搭建相对比较烦琐,不少初学者在此走过不少弯路 首先是熟悉Mac的使用 ...

  3. Docker & k8s 系列二:本机k8s环境搭建

    本篇将会讲解k8s是什么?本机k8s环境搭建,部署一个pod并演示几个kubectl命令,k8s dashboard安装. k8s是什么 k8s是kubernetes的简写,它是一个全新的基于容器技术 ...

  4. appium ios 真机自动化环境搭建

    近期由于工作需要,本小菜在弄appium+ios+iphone真机的移动自动化,在网上找寻各种资料,发现针对IOS方面的资料少之又少,公司其它部门的弄过的同事也寥寥无几,即使有,也是安卓方面的.本次书 ...

  5. MAC电脑下Appium + python3 + robotframework ios的真机测试环境搭建

    本人的环境搭建前的准备,MAC电脑一台(macOS Mojave 10.14.0及以上),Xcode 10.0及以上   ,自己注册的一个Apple ID 账户,必须你的电脑能连接互联网,最好不要用公 ...

  6. appium -ios 真机连接 环境搭建

    补充点一: 安装ios-deploynpm install -g ios-deploy 安装不了报错.! 后来找了找,发现sudo npm install -g ios-deploy --unsafe ...

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

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

  8. Windows 环境搭建 PostgreSQL 物理复制高可用架构数据库服务

    PostgreSQL 高可用数据库的常见搭建方式主要有两种,逻辑复制和物理复制,上周已经写过了关于在Windows环境搭建PostgreSQL逻辑复制的教程,这周来记录一下 物理复制的搭建方法. 首先 ...

  9. Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)

    Python之Django环境搭建(MAC+pycharm+Django++postgreSQL) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7828614. ...

随机推荐

  1. mutilple output reduce cannot write

    package org.lukey.hadoop.classifyBayes; import java.io.BufferedReader; import java.io.IOException; i ...

  2. 【knockoutjs】 Computed VS Pure Computed 区别

    Pure Computed只有当有其他subscriber的时候才会有这个对象,所对应的DOM对象 不激活的时候不存在,这样可以防止内存泄露,在Component等场景下不用担心dispose的问题. ...

  3. Firebug Console 与命令行全集

    Console API 当打开 firebug (也包括 Chrome 等浏览器的自带调试工具),window 下面会注册一个叫做 console 的对象,它提供多种方法向控制台输出信息,供开发人员调 ...

  4. 创建mysql数据库的时候指定编码

    CREATE DATABASE xxx DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

  5. jar2exe 配置jre

    http://www.regexlab.com/zh/jar2exe/support.htm

  6. windows服务器下IIS7 安装URL Rewrite(URL重写)模块

    URL Rewrite Module是一个基于规则的URL重写引擎,用于在URL被Web服务器处理之前改变请求的URL.对于动态Web应用程序,它可以为用户和seo/seo.html" ta ...

  7. Git GitHub的使用

    Git的工作区示意 GIT总结 使用git github也一段时间突然发现还是少了一些总结,那就从这儿开始吧! (1)git的配置,这儿就从单独的安装配置开始 安装:sudo yum install ...

  8. Unity3d 开发之 ulua 坑的总结

    相同的 lua 代码在安卓上能正常运行,但在 IOS 上可能不会正常运行而导致报红,崩溃等,我在使用 lua 编程时遇到的一些坑总结如下: 1. File.ReadAllText, 诸如以下代码在 i ...

  9. objective-c学习笔记2

    Objective-c学习笔记 1.cocoa的对象初始化一般使用alloc和init两个方法,不适用new,其中alloc用于分配内存,init用于初始化,因为初始化方法返回的对象可能和分配的对象不 ...

  10. 使用idea建立gradle+SSM项目

    目录: 一.创建一个gradle项目   二 .在gradle中创建SSM项目 一 .创建一个gradle项目 第一步: 第二步:选择gradle,并选中web,然后点击Next进入下一步 第三步:此 ...