Postgresql standby(备机只读)环境搭建
下载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(备机只读)环境搭建的更多相关文章
- appium ios真机自动化环境搭建&运行(送源码)
appium ios真机自动化环境搭建&运行(送源码) 原创: f i n 测试开发社区 6天前 Appium测试环境的搭建相对比较烦琐,不少初学者在此走过不少弯路 首先是熟悉Mac的使用 ...
- appium ios真机自动化环境搭建&运行(送源码)
appium ios真机自动化环境搭建&运行(送源码) 原创: f i n 测试开发社区 6天前 Appium测试环境的搭建相对比较烦琐,不少初学者在此走过不少弯路 首先是熟悉Mac的使用 ...
- Docker & k8s 系列二:本机k8s环境搭建
本篇将会讲解k8s是什么?本机k8s环境搭建,部署一个pod并演示几个kubectl命令,k8s dashboard安装. k8s是什么 k8s是kubernetes的简写,它是一个全新的基于容器技术 ...
- appium ios 真机自动化环境搭建
近期由于工作需要,本小菜在弄appium+ios+iphone真机的移动自动化,在网上找寻各种资料,发现针对IOS方面的资料少之又少,公司其它部门的弄过的同事也寥寥无几,即使有,也是安卓方面的.本次书 ...
- MAC电脑下Appium + python3 + robotframework ios的真机测试环境搭建
本人的环境搭建前的准备,MAC电脑一台(macOS Mojave 10.14.0及以上),Xcode 10.0及以上 ,自己注册的一个Apple ID 账户,必须你的电脑能连接互联网,最好不要用公 ...
- appium -ios 真机连接 环境搭建
补充点一: 安装ios-deploynpm install -g ios-deploy 安装不了报错.! 后来找了找,发现sudo npm install -g ios-deploy --unsafe ...
- postgresql数据库异步流复制hot standby环境搭建
生命不息,test不止. 最近组里面修改了几个postgresql的bug,要进行回归测试,除了前面提到的WAL的RT测试和Mirroring Controller的RT测试,还要测试下postgre ...
- Windows 环境搭建 PostgreSQL 物理复制高可用架构数据库服务
PostgreSQL 高可用数据库的常见搭建方式主要有两种,逻辑复制和物理复制,上周已经写过了关于在Windows环境搭建PostgreSQL逻辑复制的教程,这周来记录一下 物理复制的搭建方法. 首先 ...
- Python之Django环境搭建(MAC+pycharm+Django++postgreSQL)
Python之Django环境搭建(MAC+pycharm+Django++postgreSQL) 转载请注明地址:http://www.cnblogs.com/funnyzpc/p/7828614. ...
随机推荐
- FIFO 和 LRU 调度算法
在一个采用页式虚拟存储管理的系统中(字地址序列.页号.块号均从零开始编址),有一用户作业,它依次要访问的字地址序列是:15,128,300,388,246,402,223,142,360,267,若该 ...
- Init.rc分析(刘举奎)
http://www.360doc.com/content/14/0926/20/13253385_412582822.shtml
- Codeforces #377 Div2
打得还不错的一场CF,题目质量也很高,今后还要继续努力 A题: 题意:给定一个数k,让其乘一个最小的数,使乘得以后的数要不被10整除,要不减去r以后被10整除,求这个最小的数 #include < ...
- php的命名空间层级与目录层级是一致的吗?
php的命名空间和目录的层级之间并不是说一定 要一致,两者之间没有必然的联系.并没有直接的关联,当然了,推荐关联起来,不然管理会非常混乱,但你确实可以自己实现一个Autoload来管理“混乱”的nam ...
- ArcEngine部分工作总结
Arcengine工作总结地物点查询本部分可以在一个窗体中实现,也可以在两个窗体中实现.由于工作要求本人是在两个窗体中实现的:弹出窗体的名称为FormQuery主窗体单机查询时间的代码FormQuer ...
- 静态方法List
public class Country { public static List<Country> CountryList = new List<Country> { new ...
- 原理图及PCB设计
原理图以及元件的绘制1. 画数据总线时,需要给总线一个Net Label,例如:databus[0..7],并且还需要在每个入口和出口处设置一致的标号.2. ERC 电气规则检查,Electronic ...
- ubuntu 14.04 安装torch及编译环境zbstudio
ubuntu 14.04 安装torch及编译环境zbstudio torch zbstudio 本来是安装官网给的步骤安装torch的,可是碰到一系列的问题,后来参考网上的安装方法安装成功了 官网安 ...
- xml常用四种解析方式优缺点的分析×××××
xml常用四种解析方式优缺点的分析 博客分类: xml 最近用得到xml的解析方式,于是就翻了翻自己的笔记同时从网上查找了资料,自己在前人的基础上总结了下,贴出来大家分享下. 首先介绍一下xml语 ...
- pyhton字符编码问题--decode和encode方法
1 decode和encode方法 字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成uni ...