1 复制类型

PostgreSQL支持物理复制(流复制)及逻辑复制2种。通过流复制技术,可以从实例级复制出一个与主库一模一样的实例级的从库。流复制同步方式有同步、异步两种。

另一种复制方式为逻辑复制,区别于物理复制的是物理复制是基于实例级的复制,只能复制整个PostgreSQL实例,而不能基于部分库及表。从PostgreSQL10开始,出现了基于表级别的复制,即逻辑复制。

2  流复制

主库安装及从库编译此处就省略了,直接进入主从复制的安装环节。

2.1 修改主库配置文件postgresql.conf

/*  除了基础参数,搭建备库至少需要配置如下参数 */
listen_address = '*'
wal_level = replica
archive_mode = on
archive_command = 'cp %p /data/postgresql/archive/%f '
max_wal_senders= 10
wal_keep_segments=1024
hot_standby = on

参数简要说明:

listen_address:  按需设置,本次测试配置为所有主机均可以访问,生产环境可以按需配置网段或IP等
wal_level: 设置流复制模式至少设置为replica
archive_mode: 本次启用归档
archive_command:WAL日志归档命令,生产环境可以将归档拷贝到对应目录或其他机器上,本次测试配置为归档到本机的另一个目录下
max_wal_senders: 最大WAL发送进程数,此数量需大于等于从库个数且比max_connections小。
wal_keep_segments: pg_wal目录下保留WAL日志的个数,每个WAL文件默认16M,为保障从库能在应用归档落后时依旧能追上主库,此值建议设置较大一点。
hot_standby: 此参数控制在恢复归档期间是否支持只读操作,设置为ON后从库为只读模式。

注意: 上述参数中有涉及归档日志的路径,需手动创建

mkdir -p  /data/postgresql/archive/

2.2  创建复制账号

为了数据安全及便于权限控制,创建一个复制专用的数据库账号

postgres=# create user repl  REPLICATION  LOGIN ENCRYPTED  PASSWORD 'repl123';
CREATE ROLE

2.3  修改配置文件pg_hba.conf

添加复制账号的权限,因可能会主从切换,因此 主从机器的IP均添加。也可以设置网段,以便于后期添加从库。

# replication privilege.
local replication all trust
host replication all 127.0.0.1/32 trust
host replication all ::1/128 trust
host replication repl 192.168.56.33/24 md5
host replication repl 192.168.56.32/24 md5

2.4  备份数据

从机上在线备份主库数据,并将数据放在指定路径,此路径建议与主库路径一致。可以使用pg_basebackup

命令在线热备份,具体命令如下:

pg_basebackup -h 192.168.56.32 -U repl -p 5432 -F p   -X s  -v -P -R -D /data/postgresql/data/ -l postgres32

pg_basebackup命令中的参数说明:

-h 指定连接的数据库的主机名或IP地址,这里就是主库的ip

-U 指定连接的用户名,此处是我们刚才创建的专门负责流复制的repl用户

-F 指定生成备份的数据格式,支持p(plain原样输出)或者t(tar格式输出)

-X 表示备份开始后,启动另一个流复制连接从主库接收WAL日志,有 f(fetch)和s (stream)两种方式,建议使用s方式

-P 表示显示数据文件、表空间传输的近似百分比 允许在备份过程中实时的打印备份的进度

-v 表示启用verbose模式,命令执行过程中会打印各阶段日志,建议启用

-R 表示会在备份结束后自动生成recovery.conf文件,这样也就避免了手动创建

-D 指定把备份写到哪个目录,这里尤其要注意一点就是做基础备份之前从库的数据目录(/data/postgresql/data)目录需要手动清空

-l 表示指定个备份的标识,运行命令后可以看到进度提示

以上备份命令输出过程如下

[postgres@PG33 data]$ pg_basebackup -h 192.168.56.32 -U repl -p  -F p   -X s  -v -P -R -D /data/postgresql/data/ -l postgres32
Password:
pg_basebackup: initiating base backup, waiting for checkpoint to complete
pg_basebackup: checkpoint completed
pg_basebackup: write-ahead log start point: / on timeline
pg_basebackup: starting background WAL receiver
pg_basebackup: created temporary replication slot "pg_basebackup_17737"
/ kB (%), / tablespace
pg_basebackup: write-ahead log end point: /20000F8
pg_basebackup: waiting for background process to finish streaming ...
pg_basebackup: base backup completed

从以上日志信息看出pg_basebackup命令首先对数据库做一次checkpoint,之后基于时间点做一个全库基准备份,全备过程中会拷贝$PGDATA数据文件和表空间文件到备库节点对应目录。

2.5 修改recovery.conf

以上备份命令中生成了recovery.conf 文件,因此简单修改即可。

standby_mode = 'on'
primary_conninfo = 'user=repl password=repl123 host=192.168.56.32 port=5432 sslmode=disable sslcompression=0 target_session_attrs=any'
## 添加如下信息
recovery_target_timeline = 'latest'

参数说明:

standby_mode: 设置是否启用数据库为备库,如果设置成on,备库会不停地从主库上获取WAL日志流,直到获取主库上最新的WAL日志流
primary_conninfo:设置主库的连接信息,这里设置了主库IP、端口、用户名信息等,此处是明文密码,生产环境建议配置非明文密码,而是将密码配置在另一个隐藏文件中
covery_target_timeline: 设置恢复的时间线(timeline),默认情况下是恢复到基准备份生成时的时间线,设置成latest表示从备份中恢复到最近的时间线,通常流复制环境设置此参数为latest,复杂的恢复场景可将此参数设置成其他值

2.6 启动从库

直接使用pg_ctl或配置服务启动从库即可。

pg_ctl  -D /data/postgresql/data/  -l pg33.log  start

如果启动过程中出现如下错误

waiting for server to start....2019-09-26 10:40:54.327 CST [10267] FATAL: data directory "/data/postgresql/data" has invalid permissions

2019-09-26 10:40:54.327 CST [10267] DETAIL: Permissions should be u=rwx (0700) or u=rwx,g=rx (0750).

stopped waiting

pg_ctl: could not start serve

Examine the log output.

则需要先修改权限,再启动即可

[postgres@PG33 data]$ chmod  /data/postgresql/data/
[postgres@PG33 data]$ pg_ctl -D /data/postgresql/data/ -l pg33.log start
waiting for server to start.... done
server started

2.7 测试主从同步

在主库创建表并新增数据

[postgres@PG32 ~]$ psql
psql (11.4)
Type "help" for help.
postgres=# create table test2(id int primary key, name varchar());
CREATE TABLE
postgres=# insert into test2 values(,'aaa'),(,'abc');
INSERT

在从库查看

[postgres@PG33 data]$ psql
psql (11.4)
Type "help" for help. postgres=# select * from test2;
id | name
----+------
| aaa
| abc

数据已正常同步

2.8 查看复制状态

通过pg_stat_replication视图可以查看复制状态

postgres=# select  pid ,usesysid,usename,client_addr,state,sync_state  from  pg_stat_replication;
pid | usesysid | usename | client_addr | state | sync_state
-------+----------+---------+----------------+-----------+------------
| | repl | 192.168.56.33 | streaming | async
( row)

以上查询结果sync_state字段值为async,表示主备数据复制使用异步方式;state值为streaming,表示流复制方式。

2.9 调整为同步复制

前面的步骤部署的为异步复制,如想配置为同步复制,则调整recovery.conf配置文件里的 synchronous_commit及synchronous_standby_names 后重启或reload即可。

synchronous_commit = remote_write
synchronous_standby_names = '*'

之后再查看结果如下:

postgres=# select  pid ,usesysid,usename,client_addr,state,sync_state  from  pg_stat_replication;
pid | usesysid | usename | client_addr | state | sync_state
-------+----------+---------+----------------+-----------+------------
| | repl | 192.168.56.33 | streaming | sync
( row)

此时状态已变为同步复制了。

注: synchronous_commit 有多种方式,在流复制模式下,主要设置情况如下:

remote_write: 当流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入备节点操作系统缓存中,之后向客户端返回成功,这种情况下备库实例出现异常关闭时不会有已传送的WAL日志丢失风险,但备库操作系统异常宕机就有已传送的WAL丢失风险了,此时WAL可能还没完全写入备节点WAL文件中,简单地说remote_write表示本地WAL已落盘,备库的WAL还在备库操作系统缓存中,也就是说只有一份持久化的WAL,这个选项带来的事务响应时间较低

on: 设置成on表示流复制主库提交事务时,需等待备库接收主库发送的WAL日志流并写入WAL文件,之后才向客户端返回成功,简单地说on表示本地WAL已落盘,备库的WAL也已落盘,也就是说有两份持久化的WAL,但备库此时还没有完成重做,这个选项带来的事务响应时间较高

remote_apply: 表示表示流复制主库提交事务时,需等待备库接收主库发送的WAL并写入WAL文件,同时备库已经完成重做,之后才向客户端返回成功,简单地说remote_apply表示本地WAL已落盘,备库WAL已落盘并且已完成重做,这个设置保证了拥有两份持久化的WAL,同时备库也完成了重做,这个选项带来的事务响应时间最高,即性能最差。

postgresql从库搭建的更多相关文章

  1. postgresql从库搭建--逻辑复制

    1 物理复制及逻辑复制对比 前文做了PostgreSQL物理复制的部署,其有如下主要优点 物理层面完全一致,是主要的复制方式,其类似于Oracle的DG 延迟低,事务执行过程中产生REDO recor ...

  2. 备库搭建后,进入备库报错psql: FATAL: the database system is starting up

        备库搭建后,进入备库报错psql: FATAL:  the database system is starting up  原因:备库配置文件没有hot_standby = on   mast ...

  3. PostgreSQL同步复制搭建

    摘要: PostgreSQL同步复制搭建 一.初始化master节点 1. 安装PostgreSQL 2. 初始化db initdb -D /data/pg940_data 二.配置master节点 ...

  4. Nginx+PostgreSQL+Django+UWSGI搭建

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

  5. Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤

    Git库搭建好之后,当要提交一个新的文件,需要做的是3个步骤 1.git add new.txt 2.git commit -m "add a new file" 3.git pu ...

  6. MySQL复制--最快的从库搭建方法(tar包) -转

    最快的从库搭建方法0,准备从库第一次数据备份,临时锁所有表开启窗口1 mysql> flush tables with read lock; Query OK, 0 rows affected  ...

  7. linux下oracle11G DG搭建(三):环绕备库搭建操作

    linux下oracle11G DG搭建(三):环绕备库搭建操作 环境 名称 主库 备库 主机名 bjsrv shsrv 软件版本号 RedHat Enterprise5.5.Oracle 11g 1 ...

  8. 使用innobackupex基于从库搭建级联从库及一两从

    使用innobackupex基于从库搭建mysql主从架构 现有的架构是一主一从,版本为Mysql5.6.37.实施要求是:利用从库,搭建第二个从库,版本为5.7.21 主库:192.168.1.21 ...

  9. Percona XtraBackup不锁库搭建slave数据库-基于GTID

    Percona XtraBackup不锁库搭建slave数据库-基于GTID 1.下载安装epel源并安装 wget http://ftp.cuhk.edu.hk/pub/linux/fedora-e ...

随机推荐

  1. .net core 微服务项目-介绍篇

    项目介绍 1.各种方式连接API都会连接到 APIGateway 来进行统一的分发 Ocelot 2.当api需要授权时 需要请求授权服务 IdentityServer4 3.授权服务对请求进行调用u ...

  2. NMS的python实现

    https://blog.csdn.net/a1103688841/article/details/89711120

  3. js循环(while循环,do while循环,for循环)相关知识点及练习

    08.循环 1.循环! 循环的作用: 简化代码,处理重复执行的代码 遍历数组.json对象.节点集合 2.while循环 语法: while(循环的条件){ 循环体 } 3.循环的五大要素 循环变量 ...

  4. HackerRank - maximum-gcd-and-sum

    题意:给你两个等长的数列,让你在两个数列中各选择一个数字,使得这两个数的gcd是这n * n种组合中最大的. 思路:如果上来就考虑分解因式什么的,就想偏了,假设数列1的最大数为max1,数列2的最大数 ...

  5. spring-cloud-kubernetes官方demo运行实战

    关于spring-cloud-kubernetes spring-cloud-kubernetes是springcloud官方推出的开源项目,用于将Spring Cloud和Spring Boot应用 ...

  6. CentOS7下使用SonatypeNexus3搭建Docker私有仓库

    前置条件:安装docker(如果机器上没有安装的话) //安装一些必要的系统工具: sudo yum install -y yum-utils device-mapper-persistent-dat ...

  7. Solr7.0搭建过程

    小李经过Elasticsearch和solr之我为什么选择solr之后决定使用使用Solr作为项目的搜索引擎,然后和同事们开始讨论细节问题. 小李:虽然我会solr4.7版本的搭建,但是人总要有点梦想 ...

  8. android CTS 命令

    > h //help Host:  help: show this message  help all: show the complete tradefed help  exit: grace ...

  9. 一文读懂 Android TouchEvent 事件分发、拦截、处理过程

    什么是事件?事件是用户触摸手机屏幕,引起的一系列TouchEvent,包括ACTION_DOWN.ACTION_MOVE.ACTION_UP.ACTION_CANCEL等,这些action组合后变成点 ...

  10. Java ArrayList源码分析(有助于理解数据结构)

    arraylist源码分析 1.数组介绍 数组是数据结构中很基本的结构,很多编程语言都内置数组,类似于数据结构中的线性表 在java中当创建数组时会在内存中划分出一块连续的内存,然后当有数据进入的时候 ...