pg主备库的搭建,首先需在2个节点安装pg软件,然后依次在2个节点配置主备。

本文采用os为CentOS7.6,pg版本使用14.2,以下为详细部署步骤。

本文两个节点的ip地址如下:

[root@node1:0 ~]# cat /etc/hosts
#CentOS Linux release 7.6.1810 (Core)
192.168.222.11 node1
192.168.222.12 node2
目录

■■■ 安装、配置、启动

■■ 官网下载安装【不推荐采用此方式安装】

■ Install the repository RPM

yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

■ Install PostgreSQL

yum install -y postgresql14-server

■ Optionally initialize the database and enable automatic start

/usr/pgsql-14/bin/postgresql-14-setup initdb

systemctl start postgresql-14

■ Stop and uninstall

systemctl stop postgresql-14

yum remove -y postgresql*

yum remove -y pgdg*

■■ 编译安装【推荐采用此方式安装】

可参考pg中文社区

cd /u01/pg

wget https://ftp.postgresql.org/pub/source/v14.2/postgresql-14.2.tar.bz2 --no-check-certificate

tar xvfj postgresql*.bz2

cd postgresql-14.2

./configure --prefix=/u01/pg/pgsql

此时如果缺少readline,则yum install -y readline-devel

mkdir -p /u01/pg/pgsql

make install-world

■■ 配置

adduser postgres

passwd postgres

mkdir /u01/pg/pgsql/data

chown -R postgres:postgres /u01/pg

su - postgres

■ 修改默认数据路径

export PGDATA=/u01/pg/pgsql/data

export PATH=/u01/pg/pgsql/bin:$PATH

■ 初始化数据库

initdb

■ 修改其他默认配置

查看配置文件:

grep -Pv "#|$|^\t" $PGDATA/postgresql.conf

vim $PGDATA/postgresql.conf

# 默认监听在127.0.0.1
#listen_addresses = 'localhost' # what IP address(es) to listen on;
# 配置监听在任意ip
listen_addresses = '*'
# 打开log收集
logging_collector = on
注:日志文件默认在log目录下

vim $PGDATA/pg_hba.conf

# IPv4 local connections:
# 默认配置,只允许本机访问
host all all 127.0.0.1/32 trust
# 允许所有ip访问
host all all 0.0.0.0/0 trust
# 允许指定网段访问
host all all 192.168.222.0/24 trust

■ 启停数据库

pg_ctl status

pg_ctl start

pg_ctl stop

■ 客户端工具使用开源的pgAdmin

Set Master Password: postgres

■■■ 主从配置

■■ 主节点

■ 创建用于主从访问的用户, 修改postgres用户的密码,用于远程登录

su - postgres

psql
# 创建 postgres 密码
ALTER USER postgres WITH PASSWORD 'postgres';
# 创建 从库 replica 用户密码
CREATE ROLE replica login replication encrypted password 'replica';
# 检查账号
SELECT usename from pg_user;
SELECT rolname from pg_roles;

■ 修改 pg_hba.conf 配置

vim $PGDATA/pg_hba.conf

# 添加从库网段
host all all 0.0.0.0/0 trust
# replication privilege.
local replication all peer
host replication replica 192.168.222.12/24 md5
注意此处 192.168.222.12/24 需修改为从库的 IP 段

■ 修改 postgresql.conf 配置

vim $PGDATA/postgresql.conf

listen_addresses = '*'
wal_level = hot_standby
synchronous_commit = remote_write
# synchronous_commit 参考文档可选其他 on
max_wal_senders = 32 #同步最大的进程数量
wal_sender_timeout = 60s #流复制主机发送数据的超时时间
max_connections = 100 #最大连接数,从库的max_connections必须要大于主库的

■■ 从节点

■ 从主库同步数据

pg_basebackup -D $PGDATA -h node1 -p 5432 -U replica -X stream -P

注:从库无需初始化

■ 修改 postgresql.conf 配置

从 PostgreSQL 12 开始已移除了 recovery.conf 文件,相关配置合并到了 postgresql.conf 中,由于从主库同步数据库,其中配置也需要移除和修改

vim $PGDATA/postgresql.conf

# 移除或注释 wal_level
wal_level = xxx
# 修改或添加以下
primary_conninfo = 'host=192.168.222.11 port=5432 user=replica password=replica'
recovery_target_timeline = 'latest'

■ 创建 standby.signal

创建 standby.signal 文件,声明从库。

vim $PGDATA/standby.signal

# 声明从库
standby_mode = on

■ 确认数据目录权限,避免踩坑

chown -R postgres.postgres $PGDATA

■ 启动

pg_ctl start

■■ 确认同步

■ 主库查看

ps aux |grep sender
# 返回 postgres: walsender replica 192.168.222.12(64218) streaming 3/27000148 select application_name, state, sync_priority, sync_state from pg_stat_replication;
application_name | state | sync_priority | sync_state
------------------+-----------+---------------+------------
walreceiver | streaming | 0 | async select pid,state,client_addr,sync_priority,sync_state from pg_stat_replication;
pid | state | client_addr | sync_priority | sync_state
-------+-----------+----------------+---------------+------------
33328 | streaming | 192.168.222.12 | 0 | async

■ 从库查看

ps aux |grep receiver
# 返回 postgres: walreceiver streaming 3/27000148

■■■ 监控

■■ Sampler

Sampler 是一个用于 shell 命令执行、可视化和警报的工具,配置了一个简单的 YAML 文件。

wget https://github.com/sqshq/sampler/releases/download/v1.1.0/sampler-1.1.0-linux-amd64 -O sampler

chmod +x sampler

■ 在yaml文件中定义shell命令

cat > config.yml <<-'EOF'
variables:
PGPASSWORD: postgres
postgres_connection: psql -h localhost -U postgres --no-align --tuples-only
runcharts:
- title: Data write(Byte)
position: [[0, 8], [20, 12]]
rate-ms: 500
legend:
enabled: true
details: false
scale: 2
items:
- label: background writer
color: 178
sample: psql -At -U postgres -c "select 8 * (buffers_checkpoint + buffers_clean
+ buffers_backend)/1024 as total_writen from pg_stat_bgwriter;"
- label: checkpoint write
color: 162
sample: psql -At -U postgres -c "select buffers_checkpoint * 8 / (checkpoints_timed
+ checkpoints_req) as checkpoint_write_avg from pg_stat_bgwriter"
- title: PostgreSQL connections
position: [[40, 8], [40, 12]]
rate-ms: 500
legend:
enabled: true
details: false
scale: 2
items:
- label: active connections
color: 178
sample: psql -At -U postgres -c "select count(*) from pg_stat_activity where
state = 'active' and pid <> pg_backend_pid();"
- label: idle connections
color: 162
sample: psql -At -U postgres -c "select count(*) from pg_stat_activity where
state = 'idle' and pid <> pg_backend_pid();"
- label: idle in transaction connections
color: 32
sample: psql -At -U postgres -c "select count(*) from pg_stat_activity where
state = 'idle in transaction' and pid <> pg_backend_pid();"
barcharts:
- title: PostgreSQL Database Status
position: [[0, 0], [40, 8]]
rate-ms: 500
scale: 0
items:
- label: tuple insert
init: $postgres_connection
sample: select tup_inserted from pg_stat_database where datname = current_database();
- label: tuple delete
init: $postgres_connection
sample: select tup_deleted from pg_stat_database where datname = current_database();
- label: tuple update
init: $postgres_connection
sample: select tup_updated from pg_stat_database where datname = current_database();
- label: tuple fetch
init: $postgres_connection
sample: select tup_fetched from pg_stat_database where datname = current_database();
gauges:
- title: PostgreSQL Database Age
position: [[0, 32], [40, 8]]
rate-ms: 500
scale: 2
color: 122
percent-only: false
cur:
sample: psql -At -U postgres -c "select age(datfrozenxid) from pg_database
where datname = current_database();"
max:
sample: psql -At -U postgres -c "select 210000"
min:
sample: psql -At -U postgres -c "select 100"
sparklines:
- title: CPU usage
position: [[0, 20], [40, 12]]
rate-ms: 200
scale: 0
sample: ps -A -o %cpu | awk '{s+=$1} END {print s}'
- title: PostgreSQL cache hit ratio
position: [[40, 20], [40, 12]]
init: $postgres_connection
sample: select round(sum(blks_hit)*100/sum(blks_hit+blks_read),2)::numeric from
pg_stat_database where datname = current_database();
- title: PostgreSQL transaction commit ratio
position: [[40, 0], [40, 8]]
init: $postgres_connection
sample: select round(100*(xact_commit::numeric/(case when xact_commit > 0 then
xact_commit else 1 end + xact_rollback)),2)::numeric as commit_ratio from
pg_stat_database where datname = current_database();
textboxes:
- title: Server status
position: [[20, 8], [20, 12]]
rate-ms: 500
sample: top -bn 1 | head -n 5
asciiboxes:
- title: PostgreSQL Version
position: [[40, 32], [40, 8]]
rate-ms: 500
color: 43
sample: psql -At -U postgres -c "select version()"
border: false
font: 2d
EOF

■ 运行

/u01/pg/monitor/sampler -c /u01/pg/monitor/config.yml

PostgreSQL主备库搭建的更多相关文章

  1. 备份一篇SVN的文章, 从搭建到主备库

    来源: http://h2ofly.blog.51cto.com/6834926/1539141 [svn简介]            svn用于版本管理数据,它采用了分支管理系统.在它出现之前存在C ...

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

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

  3. MySQL主备库切换(MHA)演练与总结

      演练包括被动切换和主动切换两部分.被动切换是主库宕机,主动切换是人工手动触发.   演练步骤大致如下:       1 先停掉主库,模拟主库宕机     2 mha将vip切到备库,备库变成主库, ...

  4. 物理DG主备库切换时遇到ORA-16139: media recovery required错误

    在物理DG主备库切换时遇到ORA-16139: media recovery required错误 SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRI ...

  5. 云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常

    非常抱歉!今天 12:03-12:52 ,由于数据库连接数异常突增超过1万,达到了阿里云RDS的最大连接数限制,影响了全站的正常访问.由此给您带来麻烦,请您谅解. 在发现数据库连接数突增的问题后,我们 ...

  6. [terry笔记]11gR2_dataguard_主备库切换

    主备库切换  Switchover  一般SWITCHOVER切换都是计划中的切换,特点是在切换后,不会丢失任何的数据,而且这个过程是可逆的,整个DATA GUARD环境不会被破坏,原来DATA GU ...

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

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

  8. PostgreSQL主备流复制机制

    原文出处 http://mysql.taobao.org/monthly/2015/10/04/ PostgreSQL在9.0之后引入了主备流复制机制,通过流复制,备库不断的从主库同步相应的数据,并在 ...

  9. PostgreSQL主备切换

    备库如何激活 在PostgreSQL(HOT-Standby)如主库出现异常.备库如何激活:来替换主库工作.有下列2种方式 备库在recovery.conf文件中有个配置项trigger_file.它 ...

  10. POSTGRESQL主备部署模式

    一.预期目的 主数据库(Primary pg ,假定主机名为A,后文不再赘述)和备用数据库(Standby pg,假定主机名为B,后文不再赘述)之间的数据能够相互备份. 主数据库发生故障时备用数据库可 ...

随机推荐

  1. 构建高可用性的 SQL Server:Docker 容器下的主从同步实现

    摘要:本文将介绍如何在 Docker 环境下搭建 MS SQL Server 的主从同步,帮助读者了解主从同步的原理和实现方式,进而提高数据的可靠性和稳定性. 一.前言 在当今信息化的时代,数据的安全 ...

  2. 【Oracle】使用PL/SQL实现冒泡排序

    [Oracle]使用PL/SQL实现冒泡排序 一般来说,SQL要排序的话直接使用order by即可 不一般来说,就是瞎搞,正好也可以巩固自己的数据结构基础 存储包内容如下 规范: create or ...

  3. 利用身份验证和授权机制,例如OAuth、JWT 和 API 密钥,APIaaS 如何帮助解决安全挑战?

    什么是 APIaaS? APIaaS,即 API 即服务(API as a Service)是一种创新的基于云的方法,提供 API(应用程序编程接口),使第三方服务提供商能够访问特定服务.数据或资源. ...

  4. go web学习(四)

    跟着b站https://space.bilibili.com/361469957 杨旭老师学习做的笔记 中间件 什么是中间件 请求----> 中间件 ----> Handler 响应 &l ...

  5. 为什么 kubelet 不使用容器化部署?

    每日一问系列 为什么 kubelet 不使用容器化部署? 通过脚本(shell/ansible 等)在节点上部署 kubelet 服务时,涉及 kubelet 进程 service 启动配置.证书等, ...

  6. 抽象语法树AST必知必会

    1 介绍 AST 打开前端项目中的 package.json,会发现众多工具已经占据了我们开发日常的各个角落,例如 JavaScript 转译.CSS 预处理.代码压缩.ESLint.Prettier ...

  7. Windows查询进程和杀死进程

    查询进程 查询进程占用的端口(通过端口查询) netstat -ano |findstr "端口号" 杀死进程 通过进程号查看所属进程名称 tasklist |findstr &q ...

  8. redis 使用 nologin 用户启动

    添加不可登录的redis用户 sudo useradd -M -s /sbin/nologin redis 为redis新建目录,并设置属性 mkdir -p /data/redis &&am ...

  9. 硬盘分区标准:GPT与MBR

    硬盘分区表的格式选择有二: 说明 格式化命令 MBR 主引导记录,分区表数据存储在硬盘的第一个扇区 fdisk <盘符> GPT GUID分区表,分别占用了硬盘第1个.第2个和后面连续的3 ...

  10. [C#]WPF 分辨率的无关性的问题

    什么是WPF的分辨率无关性? 首先得解什么是Dpi(Density independent pixels ,设备无关像素),百度百科的解释DPI是指每英寸的像素,对应界面显示即是屏幕上每英寸的像素. ...