5、pgpool

Wesley13
• 阅读 612

官网示例

一、实现原理

使用 pgpool-II 软件;我们常用来实现流复制的高可用性;备库只读的,不可写;就是当主库出现问题时;需要把备库自动激活为主库;来接管服务。

这在其他高可用软件也有这功能,而 pgpool-II 在配置文件 pgpool.conf 中提供配置项 failover_command 。让用户配置一个脚本,当发生故障切换时,执行该脚本。

二、示例演练

本示例采用 PostgreSQL12 + pgpool-II4。

演练目的:

  1. 搭建 pgpool 集群
  2. 测试数据库的高可用性
  3. 修复 primary 节点重新加入集群

2.1、环境规划

1、PostgreSQL库的IP/Port规划

主机名

角色

ip

端口

数据目录

node3

pgpool

192.168.1.221

9999

node3

primary

192.168.1.221

6000

/data1/postgres/data

node4

standby

192.168.1.202

6000

/data1/postgres/data

2、数据库用户规划

用户

密码

用途详情

postgres

123456

用于在线恢复

replica

replica

流复制用户

pgpool

123456

Pgpool-II health check (health_check_user) replication delay check (sr_check_user)

2.2、数据库环境准备

1、安装 PostgreSQL 软件

N/A

2、安装 pgpool-II 软件

查看 《 pgpool-II安装 》

本示例涉及到在线恢复;需要安装 pgpool_recovery

-- 在 primary 操作psql -c "create extension pgpool_recovery" template1

3、配置 PostgreSQL 数据库

primary 节点操作

创建数据库用户

alter user postgres password '123456';CREATE ROLE pgpool WITH LOGIN password '123456';;CREATE ROLE replica WITH REPLICATION LOGIN password 'replica';--If you want to show "replication_state" and "replication_sync_state" column in SHOW POOL NODES command result, role pgpool needs to be PostgreSQL super user or or in pg_monitor group (Pgpool-II 4.1 or later)GRANT pg_monitor TO pgpool;

配置归档
搭建流复制是不需要配置归档;但是在线恢复需要归档日志。

$ mkdir /data1/archivedir$ vi postgresql.confarchive_mode = on              archive_command = 'cp %p /data1/archivedir/%f'wal_log_hints = on

4、搭建流复制

--在 standby 操作# 用 root 操作系统用户在202创建PostgreSQL工作目录mkdir -p /data1/postgres/datachown -R postgres:postgres /data1/postgres/datachmod 700 /data1/postgres/data# 用 postgres 操作系统用户执行 pg_basebackup 命令;进行备库拷贝pg_basebackup -F p -R --progress -D /data1/postgres/data -h 192.168.1.221 -p 6000 -U replica# 用 postgres 操作系统户用启动备库pg_ctl start

5、配置 ssh 互信

在上面讲到的 实现原理,使用Pgpool-II的自动故障转移和在线恢复;需要 pgpool 服务免密码在各个机器上执行;以及后续在在线恢复功能;这里我们使用 postgres 操作用户。

-- 在pgpool节点执行$ cd ~/.ssh$ ssh-keygen -t rsa -f id_rsa_pgpool$ ssh-copy-id -i id_rsa_pgpool.pub postgres@node3$ ssh-copy-id -i id_rsa_pgpool.pub postgres@node4-- 验证免密码登录ssh postgres@serverX -i ~/.ssh/id_rsa_pgpool

6、配置 pgpool

可以查考 《 pgpool 配置 》;这里我们是用 postgres 操作用户进行安装

配置环境变量

export PGHOME=/opt/pg12export PGDATA=/data1/postgres/dataexport PGPOOLHOME=/opt/pgpoolexport PATH=$PGHOME/bin:$PATH:$HOME/bin:$PGPOOLHOME/bin

1、设置 pcp 的管理用户/密码文件 pcp.conf
“pcpadm/pgpool123”

#1 进入配置目录[postgres@node3 ~]$ cd /opt/pgpool/etc[postgres@node3 etc]$ cp pcp.conf.sample pcp.conf# 在该文件中;用户/密码出现在每一行; # USERID:MD5PASSWD#2 pg_md5 生成配置的用户名密码是 pgpool123 [postgres@node3 etc]$ pg_md5 pgpool123fa039bd52c3b2090d86b0904021a5e33#3 编辑pcp.conf;这里配置用户是 pcpadm,[postgres@node3 etc]$ vi pcp.conf# USERID:MD5PASSWDpcpadm:fa039bd52c3b2090d86b0904021a5e33

2、配置 pool_hba.conf
用于认证用户登录方式,如客户端IP限制等,类似于postgresql的pg_hba.conf文件

[postgres@node3 ~]$ cd /opt/pgpool/etc/[postgres@node3 etc]$ vi pool_hba.conf# 添加下面内容host    all     all     0.0.0.0/0       md5

3、生成 pool_passwd
pgpool 密钥文件;通过 pgpool 访问需要用户验证;

这里暂用数据库用户 pgpool

[postgres@node3 ~]$ cd /opt/pgpool/etc/[postgres@node3 etc]$ pg_md5 --md5auth -u pgpool -ppassword: [postgres@node3 etc]$ ll pool_passwd -rw-r--r--. 1 postgres postgres 132 Nov 30 10:43 pool_passwd

4、配置.pgpass
使用pgpool-II进行故障库自动切换(failover)、或在线恢复(online recovery)(在线恢复:主库故障后切换,原主库恢复后变更为备库。注意是 Online recovery,而不是自动恢复,需要手工执行命令恢复),需要能够无密码 SSH 访问其他 PostgreSQL 服务器。为了满足此条件,我们需要在每个 PostgreSQL 服务器上,在 postgres 用户的 home file下创建了.pgpass 文件,并修改器文件权限为600

# su - postgres$ vi /var/lib/pgsql/.pgpassserver1:5432:replication:repl:<repl user password>server2:5432:replication:repl:<repl user passowrd>server3:5432:replication:repl:<repl user passowrd>$ chmod 600  /var/lib/pgsql/.pgpass

若设置 pg_hba.conf 的该网段免密码验证 trust;可以忽略该步骤

host replication replica 192.168.1.0/24 trust

5、配置 pcp 的 .pcppass
需要 follow_master_command 脚本情况下,由于此脚本必须在不输入密码的情况下执行pcp命令,所以我们在 postgres 用户的home directory下创建.pcppass

# echo 'localhost:9898:pgpool:pgpool' > ~/.pcppass# chmod 600 ~/.pcppass

6、配置pgpool.conf

listen_addresses = '*'port = 9999backend_hostname0 = '192.168.1.221'backend_port0 = 6000backend_weight0 = 1backend_data_directory0 = '/data1/postgres/data'backend_flag0 = 'ALLOW_TO_FAILOVER'backend_application_name0 = 'server0'backend_hostname1 = '192.168.1.202'backend_port1 = 6000backend_weight1 = 1backend_data_directory1 = '/dat.........
点赞
收藏
评论区
推荐文章
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年前
Oracle 12c DG备库Alert报错ORA
环境是12.2.0.1version,OracleDataGuard备库近段时间一直报错,但是备库主库同步一致,数据一致。20190306T23:42:22.18404808:00Errorsinfile/u01/app/oracle/diag/rdbms/ccdb/ccdb/trace/ccdb_m000_12
Stella981 Stella981
2年前
Android So动态加载 优雅实现与原理分析
背景:漫品Android客户端集成适配转换功能(基于目标识别(So库35M)和人脸识别库(5M)),导致apk体积50M左右,为优化客户端体验,决定实现So文件动态加载.!(https://oscimg.oschina.net/oscnet/00d1ff90e4b34869664fef59e3ec3fdd20b.png)点击上方“蓝字”关注我
可莉 可莉
2年前
13_ redis数据库高可用
数据库高可用1.1数据库高可用说明当数据库的主库宕机之后.如果没有高可用机制,则可能导致整个服务全部不能正常的使用.解决策略:双主模式(双机热备)1.2数据库双机热备实现1.2.1双机热备的说明将2台数据库设置为双主模式.互为主从的结构.其中任意的数据库服务器既是主机.也是从机.!在这里插入图
Wesley13 Wesley13
2年前
Oracle 11g DataGuard搭建(一)
(一)DataGuard概要DataGuard中文称为”数据卫士“,提供了数据库高可用性、数据保护和灾难恢复的功能。DataGuard通过建立primary数据库和standby数据库来确立参照关系,DataGuard将主库(primary)的redo日志传递给备库(standby),然后在备库中应用redo进行同步。备库又分为2种类型:物理
Wesley13 Wesley13
2年前
ORACLE DATAGUARD 日志传输状态监控
ORACLEDATAGUARD的主备库同步,主要是依靠日志传输到备库,备库应用日志或归档来实现。当主、备库间日志传输出现GAP,备库将不再与主库同步。因此需对日志传输状态进行监控,确保主、备库间日志没有GAP,或发现GAP后及时处理。除了在告警日志中查看日志同步情况外,还可以通过查看相关视图来对日志传输状态进行监控。1、主、备库查看当前日志状况
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这