postgresql 12版本搭建及主备部署操作

postgresql 12版本主备部署

环境搭建

centos 7+

postgresql 12.0

# 网络检查
ping -c2 baidu.com
#关闭防火墙,selinux
systemctl stop firewalld && sudo systemctl disable firewalld
sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config
setenforce 0
### 配置阿里云yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#echo "isntalling tools"
yum -y install vim net-tools wget ntpdate
yum -y groupinstall "Development Tools"
# 时间同步
echo "*/10 * * * * /usr/sbin/ntpdate ntp.aliyun.com > /dev/null 2>&1" >>/etc/crontab
# 加快ssh连接
sed -ri s/"#UseDNS yes"/"UseDNS no"/g /etc/ssh/sshd_config
systemctl restart sshd
## 环境准备,根据自身需要,减少或者增加
yum install -y wget gcc gcc-c++ epel-release llvm5.0 llvm5.0-devel clang libicu-devel perl-ExtUtils-Embed readline readline-devel zlib zlib-devel openssl openssl-devel pam-devel libxml2-devel libxslt-devel openldap-devel systemd-devel tcl-devel python-devel
## 下载、解压,安装
cd /usr/local/src
wget https://ftp.postgresql.org/pub/source/v12.0/postgresql-12.0.tar.gz
tar -xvzf postgresql-12.tar.gz
cd postgresql-12
./configure --prefix=/usr/local/pgsql/12 --enable-nls --with-python --with-tcl --with-gssapi --with-icu --with-openssl --with-pam --with-ldap --with-systemd --with-libxml --with-libxslt
make && make install
## 创建目录和用户,以及配置环境变量
groupadd postgres
useradd -g postgres postgres
## 密码设置在引号内输入自己的密码
echo "postgres" | passwd --stdin postgres
mkdir -p /data/pgdata/{data,archivedir}
chown -R postgres:postgres /usr/local/pgsql -R
chown postgres:postgres /data/pgdata -R
echo "export PATH=/usr/local/pgsql/12/bin:$PATH" >/etc/profile.d/pgsql.sh
source /etc/profile.d/pgsql.sh

环境部署已经完成,接下来我们来搭建postgresql的主备

主备搭建

备库搭建

以下的操作均在postgres用户下进行

su - postgres
##初始化
initdb -D /data/pgdata/data -U postgres --locale=en_US.UTF8 -E UTF8
cp /data/pgdata/data/{pg_hba.conf,pg_hba.conf.bak}
## 允许repl用户进行流复制
cat <<-eof >>/data/pgdata/data/pg_hba.conf
host all    all    0.0.0.0/0    md5
host replication  repl   192.168.0.0/22   trust
eof
cp /data/pgdata/data/{postgresql.conf,postgresql.conf.bak}
##配置postgresql.conf
cat <<-eof >/data/pgdata/data/postgresql.conf
listen_addresses = '*'
port = 5432
max_connections = 100
superuser_reserved_connections = 10
full_page_writes = on
wal_log_hints = off
max_wal_senders = 50
hot_standby = on
log_destination = 'csvlog'
logging_collector = on
log_directory = 'log'
log_filename = 'postgresql-%Y-%m-%d_%H%M%S'
log_rotation_age = 1d
log_rotation_size = 10MB
log_statement = 'mod'
log_timezone = 'PRC'
timezone = 'PRC'
unix_socket_directories = '/tmp'
shared_buffers = 512MB
temp_buffers = 16MB
work_mem = 32MB
effective_cache_size = 2GB
maintenance_work_mem = 128MB
#max_stack_depth = 2MB
dynamic_shared_memory_type = posix
## PITR
full_page_writes = on
wal_buffers = 16MB
wal_writer_delay = 200ms
commit_delay = 0
commit_siblings = 5
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /data/pgdata/archivedir/%f && cp %p /data/pgdata/archivedir/%f'
archive_timeout = 60s
eof
## 启动数据库
pg_ctl -D /data/pgdata/data -l /data/pgdata/data/serverlog start
## 创建用户进行流复制连接
psql -U postgres -c "ALTER USER postgres WITH PASSWORD 'postgres';"
psql -U postgres -c "CREATE USER repl WITH PASSWORD 'postgres' REPLICATION;"

备库搭建

## 备份复制,备库配置,
pg_basebackup -h 192.168.3.62 -p 5432 -U repl -w -Fp -Xs -Pv -R -D /data/pgdata/data
根据主库的postgresql.conf 配置文件 修改参数配置:
1, listen_addresses = '* '
2, wal_level = hot_standby
3, max_connections = xxx, # 一般比主库大一些.
4,hot_standby = on
5, max_standby_streaming_delay = 30s
6. wal_receiver_status_interval = 10s
7, hot_standby_feedback = on # 如果有错误的数据复制,是否向 主进行范例.
### 在postgre.auto.conf 添加 application_name =slave1,配置如下
primary_conninfo = 'application_name=slave1 user=repl passfile=''/home/postgres/.pgpass'' host=192.168.3.62 port=5432 sslmode=prefer sslcompression=0 gssencmode=prefer krbsrvname=postgres target_session_attrs=any'
## 启动备库
pg_ctl -D /data/pgdata/data start

写在最后(状态检查)

##状态检查
### 回到主库查看状态
$ psql -c "select client_addr,usename,backend_start,application_name,sync_state,sync_priority FROM pg_stat_replication;"
 client_addr | usename |   backend_start   | application_name | sync_state | sync_priority
--------------+---------+-------------------------------+------------------+------------+---------------
 192.168.3.61 | repl | 2019-10-16 15:34:45.130732+08 | slave1   | async  |    0
(1 row)
$ psql -c "select client_addr, sync_state from pg_stat_replication;"
 client_addr | sync_state
--------------+------------
 192.168.3.61 | async
(1 row)
##备库只读, 所以任何操作, 都会告警失败:
postgres=# drop database pgtest;
ERROR: cannot execute DROP DATABASE in a read-only transaction
## 查看主备的状态
#主
ps -ef |grep sender
postgres 92996 51692 0 15:34 ?  00:00:00 postgres: walsender repl 192.168.3.61(53958) streaming 0/8000060
postgres 101845 20470 0 15:45 pts/2 00:00:00 grep --color=auto sender
#备
ps -ef |grep recover
postgres 98311 98309 0 15:34 ?  00:00:00 postgres: startup recovering 000000010000000000000008
postgres 108029 21054 0 15:46 pts/2 00:00:00 grep --color=auto recover
#通过此命令判断主备
pg_controldata -D /data/pgdata/data/ |grep state
in archive recovery ## 表示从库
in production  ## 表示主库

补充:PostgreSQL 12:新功能和增强功能

介绍

PostgreSQL 12是世界上最受欢迎和功能最丰富的开源数据库的下一个主要发行版。PostgreSQL 12的稳定版本计划于2019年末发布。版本12的Beta 4已于2019年9月12日发布。

本文将引导您完成最重要的新功能的摘要。PostgreSQL 12中的增强功能和重大更改。

新功能和增强功能

CTE增强

在PostgreSQL中,CTE是优化屏障(外部查询限制不传递给CTE),数据库在CTE内部评估查询,并缓存结果(即具体化的结果)和外部where子句,这意味着在处理外部查询时,要么执行完整表扫描,要么执行完整索引查找。对于大表来说,这会导致糟糕的性能。

WITH AllUsers AS (SELECT * FROM Users)
SELECT * FROM AllUsers WHERE Id = 100;

为了克服这个问题,您可以在PostgreSQL中将该查询重写为:

WITH UserRecord AS (SELECT * FROM Users WHERE Id = 100)
SELECT * FROM UserRecord;

PostgreSQL 12通过引入查询优化器提示来解决此问题,以使我们能够控制是否应实现CTE:MATERIALIZED,NOT MATERIALIZED。因此,可以将查询重写如下,以获得更好的性能。

WITH AllUsers AS NOT MATERIALIZED (SELECT * FROM Users)
SELECT * FROM AllUsers WHERE Id = 100;

这有效地内联了CTE表达式,并显着提高了性能。

生成列

SQL Server和Oracle长期以来都有计算列,而PostgreSQL中缺少计算列使从其他数据库的迁移变得非常困难。PostgreSQL 12引入了生成列(Generated Columns)来解决这个问题。

生成列对于列就像视图对于表一样。该列的值始终是根据表中的其他列计算的。生成的列可以是虚拟的或存储的。虚拟列的值是在查询期间动态计算的,它们不会占用存储空间。已存储的列的值已预先计算并存储为表数据的一部分。PostgreSQL当前仅实现存储的生成列。

GENERATED ALWAYS AS子句用于创建生成的列

CREATE TABLE Employee (
 ...,
 dob timestamp,
 age integer GENERATED ALWAYS AS (date_part('year', CURRENT_TIME - dob)) STORED
);

在PostgreSQL 11.x和更早的版本中,唯一的方法是将age声明为普通列并编写触发器以在插入和更新期间填充该列

CREATE OR REPLACE FUNCTION calc_age() RETURNS TRIGGER AS $body$
BEGIN
 NEW.age := date_part('year', CURRENT_TIME - NEW.dob::timestamp);
 RETURN NEW;
END;
$body$ LANGUAGE plpgsql;

计算列的SQL Server语法

将此与SQL Server语法进行对比。SQL Server中没有特殊的关键字来声明计算列。您只需在AS子句后指定使我们成为计算列的表达式。

-- SQL Server Syntax
CREATE TABLE Employee (
 ...,
 dob datetime,
 age AS DATEDIFF(year,dob,GETDATE()) PERSISTED
);

请注意PERSISTED 子句与PostgreSQL的STORED 子句等效。SQL Server还支持非持久的计算列,只是不指定PERSISTED 子句。

那么,生成列与带有DEFAULT子句的普通列有何不同?

1、如果未提供其他值,则在首次插入行时对列默认值进行一次评估。每当行发生更改且无法覆盖时,生成的列都会更新。

2、可以在INSERT或UPDATE语句中为具有DEFAULT约束的列提供值。生成的列不能被赋予值,它们总是被计算的。

3、列的默认值不能引用表的其他列,而生成的列则专门用于引用该表。

4、列默认值可以使用易变函数,例如random()或current_time,生成的列不能使用。

重新索引改进

REINDEX CONCURRENTLY可以重建索引而不会阻止对其表的写入。CONCURRENTLY子句先前仅在CREATE INDEX语句中可用。

CREATE TABLE test (x INTEGER);
INSERT INTO test SELECT generate_series(1, 1000000);
CREATE INDEX i_test ON test (x);
REINDEX INDEXCONCURRENTLY i_test;

在早期版本的PostgreSQL中,REINDEX在大表上经常引起阻塞写入和严重的性能问题。

默认情况下启用JIT编译

如果服务器是在其支持下构建的,则默认情况下启用即时(JIT)编译。请注意,默认情况下不构建此支持,但是在配置构建时必须明确选择。这对于数据仓库查询特别有用。

查询并行性改进

在SERIALIZABLE隔离模式下,允许并行查询。以前,在此模式下禁用并行性。

PL/pgSQL增强

允许在相同的PL/pgSQL函数中使用与这些命令同名的SQL命令和变量。例如,允许一个调用变量comment存在于调用COMMENT SQL命令的函数中。以前,此组合导致解析错误。

SQL / JSON路径查询

PostgreSQL 12现在允许按照SQL:2016标准中的SQL / JSON规范执行JSON路径查询。JSON路径表达式使您可以评估各种算术表达式和函数,并比较JSON文档中的值,类似于XML的XPath表达式。可以使用GIN索引来加速这些表达式,从而改善跨JSON数据的查找执行。

分区改进

在处理带有成千上万个分区的表的命令时,只需使用所有可用分区的子集,PostgreSQL 12的性能就会得到显著提高。与以前的版本相比,INSERT和COPY到分区表的速度也要快得。 ATTACH PARTITION现在可以执行,而不会阻止对分区表的并发查询。现在可以将分区表称为外键。分区边界现在可以是表达式。

拼写改进

PostgreSQL 12现在支持对ICU提供的排序规则(也称为“非确定性排序规则”),不区分大小写和不区分重音的比较。使用这些排序规则时,可以为比较和排序提供便利,但是由于排序规则可能需要对字符串进行其他检查,因此也可能导致性能下降。

MCV统计信息现在支持多列

CREATE STATISTICS命令允许对多列进行最常用值统计。以前,多列只记录了一个相关值。

CREATE STATISTICS stts3 (mcv) ON state, city FROM zipcodes;
ANALYZE zipcodes;

从旧版本迁移

1、PostgreSQL 12中的某些更改可能会影响与早期版本的兼容性。

recovery.conf不再使用,并且如果该文件存在,服务器将不会启动。recovery.signal和standby.signal文件现在用于切换到非主要模式。trigger_file已重命名为promove_trigger_file。standby_mode设置已被删除。

2、在新的btree索引中,最大索引条目长度减少了八个字节,以改善重复条目的处理。这意味着REINDEX对先前版本的索引pg_upgrade 进行的操作可能会失败。

3、如果没有提供参数列表,并存在多个匹配对象,DROP IF EXISTS FUNCTION/ PROCEDURE/ AGGREGATE/ ROUTINE以产生一个错误

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • PostgreSQL+Pgpool实现HA主备切换的操作

    PostgreSQL流复制实现HA主备切换 环境说明和主机规划 操作系统 主机名 主机 角色 端口 CentOS 7 master 10.0.0.11 PG-Master 54321 CentOS 7 slave 10.0.0.12 PG-Slave 54321 CentOS 7 pool 10.0.0.13 pgpool 54321 基础环境配置(所有主机操作) 配置HOSTS echo -e "10.0.0.11 master\n10.0.0.12 slave\n10.0.0.13 pool

  • postgresql之使用lsn 获取 wal文件名的实例

    10.0及以后版本: pg_walfile_name() 用法: postgres=# select pg_current_wal_lsn(), pg_walfile_name(pg_current_wal_lsn()), pg_walfile_name_offset(pg_current_wal_lsn()); pg_current_wal_lsn | pg_walfile_name | pg_walfile_name_offset --------------------+---------

  • 修改postgresql存储目录的操作方式

    修改postgresql存储目录: sudo rsync -av /var/opt/gitlab/postgresql /data/gitlab/ 修改 /etc/gitlab/gitlab.rb postgresql['data_dir'] = "/data/gitlab/postgresql/data" postgresql['dir'] = "/data/gitlab/postgresql" postgresql['home'] = "/data/g

  • postgresql 如何查看pg_wal目录下xlog文件总大小

    当然如果你登录服务器所在主机,直接在$PGDAT/pg_wal下执行: du -h --max-depth=1 ./ 可以得到. #du -h --max-depth=1 ./ 4.0K ./archive_status 193M ./ 如果通过客户端怎么做呢? 答案:pg_ls_waldir()函数.pg_ls_waldir()是pg 10.0引入的函数,可以输出数据库WAL目录的所有文件. postgres=# select sum(size) from pg_ls_waldir(); su

  • PostgreSQL 数据同步到ES 搭建操作

    安装python 和dev 开发包 [root@rtm2 Packages]# rpm -ivh python-devel-2.7.5-58.el7.x86_64.rpm 准备中... ################################# [100%] 正在升级/安装... 1:python-devel-2.7.5-58.el7 ################################# [100%] [root@rtm2 Packages]# ls 安装 multicor

  • PostgreSQL 主备数据宕机恢复测试方案

    主节点宕机数据,备库数据恢复 背 景 在从节点停止服务,然后往主库不断写入数据,然后把主机宕机掉,启动从库,把主库宕机期间的增量wal日志复制到从库的archive目录下, 执行恢复脚本,则会把主机宕机后的增量数据追加到数据库. 环境 服务器 角色 10.10.56.16 master 10.10.56.18 slave - 配置16 master 的 pg_hba,conf 文件 host all all 10.10.56.0/0 md5 host replication all 10.10.

  • postgresql运维之远程迁移操作

    背景:高可用架构版本. 主备分别部署在机器A和B上,现在要将其分别迁移到机器C和D上. 思路: 1.首先根据源实例的备份(云盘上可用snapshot),创建一个mirror实例,mirror包含两个节点,分别部署在C和D上. 2.在源实例主节点hba.conf中增加mirror主节点的ip的设置,允许源实例主节点接受来自mirror主节点的连接. 3.mirror实例主节点,创建recovery.conf文件,设置primary_conninfo指向源主节点.启动mirror主节点,建立源实例主

  • postgresql 12版本搭建及主备部署操作

    postgresql 12版本主备部署 环境搭建 centos 7+ postgresql 12.0 # 网络检查 ping -c2 baidu.com #关闭防火墙,selinux systemctl stop firewalld && sudo systemctl disable firewalld sed -ri s/SELINUX=enforcing/SELINUX=disabled/g /etc/selinux/config setenforce 0 ### 配置阿里云yum源

  • postgres主备切换之文件触发方式详解

    本文测试参考PostgresSQL实战一书. 本文档测试环境: 主库IP:192.168.40.130 主机名:postgres 端口:5442 备库IP: 192.168.40.131 主机名:postgreshot 端口:5442 PostgreSQL9.0版本流复制主备切换只能通过创建触发文件方式进行,这一小节将介绍这种主备切换方式,测试环境为一主一备异步流复制环境,postgres上的数据库为主库,postgreshot上的数据库为备库,文件触发方式的手工主备切换主要步骤如下: 1)配置

  • 基于Docker的Mysql主备搭建的实现步骤

    目录 前期规划: 配置过程: Docker mysql主从配置.我们会在一台centos的虚拟机上,配置mysql主备 前期规划: docker mysql版本 mysql:5.7 docker网络配置,我们会创建名称为mysql的网络,子网掩码为 172.88.0.0/16 docker mysql主对应的容器名称:mysql-master, ip地址:172.88.0.11,映射端口:3307,文件卷配置(配置文件和数据文件持久化)mysql配置文件地址:/usr/local/docker/

  • 基于mysql+mycat搭建稳定高可用集群负载均衡主备复制读写分离操作

    数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,推荐mycat,社区活跃,性能稳定. 测试环境 MYSQL版本:Server version: 5.5.53,到官网可以下载WINDWOS安装包. 注意:确保mysql版本为5.5以后,以前版本主备同步配置方式不同. linux实现思路类似,修改my.cnf即可. A主mysql.19

  • CentOS PostgreSQL 12 主从复制(主从切换)操作

    主从复制 1. 基于文件的日志传送 创建一个高可用性(HA)集群配置可采用连续归档,集群中主服务器工作在连续归档模式下,备服务器工作在连续恢复模式下(1台或多台可随时接管主服务器),备持续从主服务器读取WAL文件. 连续归档不需要对数据库表做任何改动,可有效降低管理开销,对主服务器的性能影响也相对较低. 直接从一个数据库服务器移动WAL记录到另一台服务器被称为日志传送,PostgreSQL通过一次一文件(WAL段)的WAL记录传输实现了基于文件的日志传送. 日志传送所需的带宽取根据主服务器的事务

  • redis 主从备份及其主备切换的操作

    首先原文是用了3 个服务器,我是用了一个服务器: 然后再原文的基础上,稍加了自己的整理. 前提: redis中,主从切换场景中,没有绝对的主和从,只有初始化的主和从,然后当主down后,从就变成主了,而主即使连接上,也是从,不会变为主 1.redis-server的主备关系: master : redis-1 slave1 : redis-2 slave3 : redis-3 2. 首先进行主从备份: 修改从服务 redis-1 redis-2 的redis.conf 在从服务上 修改redis

  • MySQL GTID主备不一致的修复方案

    目录 方案一:重建 Replicas 前提条件 优点 缺点 操作步骤 Master Slave 方案二:使用percona-toolkit进行数据修复 前提条件 优点 缺点 操作步骤 背景示例 校验一致性 方案一:重建 Replicas MySQL 5.6及以上版在复制中引入了新的全局事务ID(GTID)支持. 在启用了GTID模式的情况下执行MySQL和MySQL 5.7的备份时,Percona XtraBackup会自动将GTID值存储在xtrabackup_binlog_info中. 该信

  • 解决redis sentinel 频繁主备切换的问题

    问题描述 操作redis发现原有Master变成slave,其他slave成master,切换较频繁 问题分析 查看redis服务器sentinel日志,发现主机频繁在凌晨左右sentinel哨兵检查到master挂了,主备切换,排查为每天凌晨左右对hash:sms:qxt:mobile:content:day队列进行删除触发的切机,队列量级过大,删除时导致redis服务器卡住,切机. 问题处理 队列改用分批删除,避免对大数据量队列进行删除而引起切机 补充:redis一主一从一哨兵,第一次主从切

  • Spring Boot中自定义注解结合AOP实现主备库切换问题

    摘要:本篇文章的场景是做调度中心和监控中心时的需求,后端使用TDDL实现分表分库,需求:实现关键业务的查询监控,当用Mybatis查询数据时需要从主库切换到备库或者直接连到备库上查询,从而减小主库的压力,在本篇文章中主要记录在Spring Boot中通过自定义注解结合AOP实现直接连接备库查询. 一.通过AOP 自定义注解实现主库到备库的切换 1.1 自定义注解 自定义注解如下代码所示 import java.lang.annotation.ElementType; import java.la

随机推荐