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

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

  1. kernel.shmmni= 4096
  2. kernel.sem =501000 6412800000 501000 12800
  3. fs.file-max =767246
  4. net.ipv4.ip_local_port_range= 1024 65000
  5. net.core.rmem_default= 1048576
  6. net.core.rmem_max= 1048576
  7. net.core.wmem_default= 262144
  8. net.core.wmem_max= 262144
  9. net.ipv4.tcp_tw_recycle=1
  10. net.ipv4.tcp_max_syn_backlog=4096
  11. net.core.netdev_max_backlog=10000
  12. vm.overcommit_memory=0
  13. net.ipv4.ip_conntrack_max=655360
  14. sysctl -生效

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

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

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

  1. * soft    nofile  131072
  2. * hard    nofile  131072
  3. * soft    nproc   131072
  4. * hard    nproc   131072
  5. * soft    core    unlimited
  6. * hard    core    unlimited
  7. * soft    memlock 50000000
  8. * hard    memlock 50000000
  9.  
  10. --vi/etc/pam.d/login
  11. sessionrequired pam_limits.so

设置环境变量

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

先修改好两台机器的名称

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

以上操作备库也执行

修改data/pg_hba.conf

  1. host   replication     postgres        192.168.5.0/24          trust

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

  1. [postgres@primarybin]./pg_ctl start -../data

检测数据库是否启动成功

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

基础备份

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

  1. ./psqld postgres
  2. postgres=#select pg_start_backup('base backup for logstreaming');

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

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

  1. [postgres@primarypgsql]$ cp -r data data_bak

创建从数据库(standby)

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

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

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

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

#修改postgres.conf

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

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

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

#删除pid文件

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

启动从数据库,并观察CSVLOG

  1. bin/pg_ctl start -../data_bak/

观察CSVLOG

  1. [postgres@primarypg_log]$ tail -f postgresql-2014-10-28_155549.csv
  2. 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"".",,,,,,,""
  3. 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",,,,,,,,,""
  4. 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",,,,,,,,,""
  5. 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",,,,,,,,,""
  6. 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]",,,,,,,,,""
  7. 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",,,,,,,,,""
  8. 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",,,,,,,,,""
  9. 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",,,,,,,,,""
  10. 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",,,,,,,,,""
  11. 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",,,,,,,,,""
  12.  
  13. 这些信息说明流复制已经成功,从库正准备接收主库的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 ” 进程。

测试

主库上创建用户

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

从库上验证

  1. 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)

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

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

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

主库上

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

--在从库上验证

  1. postgres=# \db
  2.                           List of tablespaces
  3.     Name    |  Owner   |                   Location                  
  4. -------------+----------+----------------------------------------------
  5.  pg_default | postgres |
  6.  pg_global  | postgres |
  7.  tbs_browser | browser  |/home/proxy_pg/pgsql/data/pg_tbs/tbs_browser

(3 rows)

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

主库上创建数据库

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

--从库上验证

  1. postgres=# \l
  2.                                   List ofdatabases
  3.    Name   |  Owner   | Encoding |   Collate  |    Ctype    |  Access privileges  
  4. -----------+----------+----------+-------------+-------------+-----------------------
  5.  browser  | browser  | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |
  6.  postgres | postgres | UTF8     |zh_CN.UTF-8 | zh_CN.UTF-8 |
  7.  template0 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |=c/postgres          +
  8.            |          |          |             |             | postgres=CTc/postgres
  9.  template1 | postgres | UTF8     | zh_CN.UTF-8 | zh_CN.UTF-8 |=c/postgres          +
  10.            |          |          |             |             | postgres=CTc/postgres
  11. (4 rows)

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

在从库上建表

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

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

监控streaming

  1. postgres=# select * from pg_stat_replication ;
  2.   pid  |usesysid | usename  | application_name|  client_addr  | client_hostname | client_port |         backend_start         |  state   | sent_location
  3. | write_location |flush_location | replay_location | sync_priority | sync_state
  4. -------+----------+----------+------------------+---------------+-----------------+-------------+-------------------------------+-----------+---------------
  5. +----------------+----------------+-----------------+---------------+------------
  6.  28251 |      10 | postgres | walreceiver      |192.168.5.252 |                 |       50285 | 2014-10-28 16:11:29.501421+08 |streaming | 0/6001C70    
  7. | 0/6001C70      | 0/6001C70      | 0/6001C70       |             0 | async
  8. (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. FIFO 和 LRU 调度算法

    在一个采用页式虚拟存储管理的系统中(字地址序列.页号.块号均从零开始编址),有一用户作业,它依次要访问的字地址序列是:15,128,300,388,246,402,223,142,360,267,若该 ...

  2. Init.rc分析(刘举奎)

    http://www.360doc.com/content/14/0926/20/13253385_412582822.shtml

  3. Codeforces #377 Div2

    打得还不错的一场CF,题目质量也很高,今后还要继续努力 A题: 题意:给定一个数k,让其乘一个最小的数,使乘得以后的数要不被10整除,要不减去r以后被10整除,求这个最小的数 #include < ...

  4. php的命名空间层级与目录层级是一致的吗?

    php的命名空间和目录的层级之间并不是说一定 要一致,两者之间没有必然的联系.并没有直接的关联,当然了,推荐关联起来,不然管理会非常混乱,但你确实可以自己实现一个Autoload来管理“混乱”的nam ...

  5. ArcEngine部分工作总结

    Arcengine工作总结地物点查询本部分可以在一个窗体中实现,也可以在两个窗体中实现.由于工作要求本人是在两个窗体中实现的:弹出窗体的名称为FormQuery主窗体单机查询时间的代码FormQuer ...

  6. 静态方法List

    public class Country { public static List<Country> CountryList = new List<Country> { new ...

  7. 原理图及PCB设计

    原理图以及元件的绘制1. 画数据总线时,需要给总线一个Net Label,例如:databus[0..7],并且还需要在每个入口和出口处设置一致的标号.2. ERC 电气规则检查,Electronic ...

  8. ubuntu 14.04 安装torch及编译环境zbstudio

    ubuntu 14.04 安装torch及编译环境zbstudio torch zbstudio 本来是安装官网给的步骤安装torch的,可是碰到一系列的问题,后来参考网上的安装方法安装成功了 官网安 ...

  9. xml常用四种解析方式优缺点的分析×××××

    xml常用四种解析方式优缺点的分析 博客分类: xml   最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...

  10. pyhton字符编码问题--decode和encode方法

    1  decode和encode方法 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成uni ...