PostgreSQL主备环境搭建

Stella981
• 阅读 460

PostgreSQL主备环境搭建

PG学习初体验--源码安装和简单命令(r8笔记第97天)

记得在2年前写过一篇PostgreSQL的文章,当时处于兴趣,本来想在工作中接一下PG的业务,最后因为各种各样的原因就搁置了。

今天整理了下PostgreSQL的一些基础内容,参考的书是唐成老师的那本《PostgreSQL修炼之道》,有了Oracle和MySQL的基础,看起来会比从零开始要容易一些,总体的感觉,PG功能确实很多很全,功能上像Oracle看齐,技术风格和MySQL很像,在做一些总结的时候,不停的在两个数据库之间来回切换。

关于主备环境的搭建,我使用的基于流复制的方式搭建,这是在PG 9.0之后提供的对WAL传递日志的方法,是基于物理复制,在9.4开始有了逻辑解码,而细粒度的逻辑复制在PG 10中会有较大的改进。

1

3

安装部署数据库软件

安装部署还是得啰嗦几句,使用的是9.5版本的源码安装,源码包很小,就几十兆。

1)解压

tar -zxvf  postgresql-9.5.0.tar.gz

2)切换到解压目录,尝试编译准备

cd postgresql-9.5.0

./configure -prefix /usr/local/pgsql

这个过程很可能有问题,比如下面的错误。

configure: error: zlib library not found

If you have zlib already installed, see config.log for details on the

failure.  It is possible the compiler isn't looking in the proper directory.

Use --without-zlib to disable zlib support.

类似的错误还有readline,实际的情况zlib包和readline包都是有的。

这里需要注意一点:

redhat 系列下这个软件包叫  readline-devel     ubuntu 下叫readline-dev    细分又分为libreadline5-dev   和 libreadline6-dev

所以我们需要安装的是readline-devel和zlib-devel的包即可搞定,而不要只是怀疑,然后把--without-zlib选项给启用了。

接下来的步骤就简单了。

3)开始编译安装

这两个过程耗时相对会多一些,大概几分钟吧,比MySQL的源码编译要快很多。

make

make install

4)创建用户和组

useradd postgres

mkdir -p /data/pgsql9.5

chown -R postgres:postgres /data/pgsql9.5

su - postgres

5)初始化部署

/usr/local/pgsql/bin/initdb -D  /data/pgsql9.5

至此,数据库软件部署就搞定了,在这里我们只做了功能,还没有涉及性能层面的调整和优化。

2

3

配置主库

使用的环境是两台服务器

192.168.179.128  主库

192.168.253.134  备库

1)创建一个复制角色

CREATE ROLE replica login replication encrypted password 'replica';

2)配置访问权限文件gp_hba.conf

添加一条记录,使得备库可以访问,修改后需要重启

host   replication  replica   192.168.253.134/24   trust

因为是跨网段,我额外补充了一条网关的记录

host   replication  replica   192.168.179.1/24   trust

3)修改参数配置文件postgresql.conf

修改如下的几个参数设置,端口还是保留默认的5432

listen_addresses = '*"

port = 5432

wal_level = hot_standby

max_wal_senders = 2

wal_keep_segments = 32

wal_sender_timeout =60s

max_connections =100

这些步骤完成后,切记要重启一下PG使得配置生效

4)重启PG

$ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql9.5 -l logfile restart

3

3

配置备库

备库需要同样的步骤来部署数据库软件,参考第一部分即可。

这个时候备库上还没有初始化数据,我们模拟客户端的方式来访问,可能会有如下的错误。

$ psql -Ureplica -h192.168.179.128 -p5432 --password

Password for user replica: 

psql: FATAL:  no pg_hba.conf entry for host "192.168.179.1", user "replica", database "replica"

1)使用pg_basebackup还原数据

先不必担心,我们可以使用pg_basebackup或者命令行的方式来做备份恢复

$ pg_basebackup -F p --progress -D /data/pgsql9.5 -h 192.168.179.128 -p 5432 -U replica --password

Password: 

22484/22484 kB (100%), 1/1 tablespace

NOTICE:  WAL archiving is not enabled; you must ensure that all required WAL segments are copied through other means to complete the backup

2)配置恢复配置recovery.conf

这个步骤是关键,和Oracle里面的归档参数或者和MySQL里的change master的设置类似。

recovery.conf文件可以从模板里拿到:

cp /usr/local/pgsql/share/recovery.conf.sample  /data/pgsql9.5/recovery.conf

recovery.conf文件的内容改动参考如下:

standby_mode = on

primary_conninfo = 'host=192.168.179.128 port=5432 user=replica password=replica'

recovery_target_timeline = 'latest'

trigger_file = '/data/pgsql9.5/trigger_activestb'

3)修改参数文件postgresql.conf的配置

postgresql.conf文件的内容修改如下,配置和主库差别较大,需要注意。

listen_addresses = '*'

port = 5432

wal_level = minimal

max_wal_senders = 0

wal_keep_segments = 0

max_connections = 1000

synchronous_commit = off

synchronous_standby_names = ''

hot_standby = on

max_standby_streaming_delay = 30

wal_receiver_status_interval = 1s

hot_standby_feedback = on

4)启动PG备库

$ /usr/local/pgsql/bin/pg_ctl -D /data/pgsql9.5 -l logfile start

5)查看复制状态

可以在主库端查看复制状态,参考pg_stat_replication视图,在查看的过程中,这个视图字段较大,看起来会有些乱,我们可以使用类似MySQL \G的方式来查看,即\x的扩展模式。

postgres=# \x

Expanded display is on.

postgres=# select * from pg_stat_replication; 

-[ RECORD 1 ]----+------------------------------

pid              | 20539

usesysid         | 16384

usename          | replica

application_name | walreceiver

client_addr      | 192.168.179.1

client_hostname  | 

client_port      | 49374

backend_start    | 2018-03-25 05:19:15.215181+08

backend_xmin     | 1756

state            | streaming

sent_location    | 0/302F600

write_location   | 0/302F600

flush_location   | 0/302F600

replay_location  | 0/302F600

sync_priority    | 0

sync_state       | async

个人公众号,欢迎扫码关注。

PostgreSQL主备环境搭建

本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
PPDB:今晚老齐直播
【今晚老齐直播】今晚(本周三晚)20:0021:00小白开始“用”飞桨(https://www.oschina.net/action/visit/ad?id1185)由PPDE(飞桨(https://www.oschina.net/action/visit/ad?id1185)开发者专家计划)成员老齐,为深度学习小白指点迷津。
Wesley13 Wesley13
2年前
P2P技术揭秘.P2P网络技术原理与典型系统开发
Modular.Java(2009.06)\.Craig.Walls.文字版.pdf:http://www.t00y.com/file/59501950(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fwww.t00y.com%2Ffile%2F59501950)\More.E
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这