pgpool-II高可用性(一)数据库的高可用性

官网示例

一、实现原理

使用 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.conf
archive_mode = on              
archive_command = 'cp %p /data1/archivedir/%f'
wal_log_hints = on

4、搭建流复制

--在 standby 操作
# 用 root 操作系统用户在202创建PostgreSQL工作目录
mkdir -p /data1/postgres/data
chown -R postgres:postgres /data1/postgres/data
chmod 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/pg12
export PGDATA=/data1/postgres/data
export PGPOOLHOME=/opt/pgpool
export 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 pgpool123
fa039bd52c3b2090d86b0904021a5e33
#3 编辑pcp.conf;这里配置用户是 pcpadm,
[postgres@node3 etc]$ vi pcp.conf
# USERID:MD5PASSWD
pcpadm: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 -p
password: 
[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/.pgpass
server1: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 = 9999
backend_hostname0 = '192.168.1.221'
backend_port0 = 6000
backend_weight0 = 1
backend_data_directory0 = '/data1/postgres/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'server0'
backend_hostname1 = '192.168.1.202'
backend_port1 = 6000
backend_weight1 = 1
backend_data_directory1 = '/data1/postgres/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'server1'
enable_pool_hba = on
pool_passwd = 'pool_passwd'
pid_file_name = '/opt/pgpool/pgpool.pid'
logdir = '/opt/pgpool'
replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'
sr_check_period = 10
sr_check_user = 'pgpool'
sr_check_password = '123456'
sr_check_database = 'postgres'
delay_threshold = 10000000
health_check_period = 5
health_check_user = 'pgpool'
health_check_password = '123456'
health_check_database = 'postgres'
health_check_max_retries = 3
failover_command = '/opt/pgpool/failover.sh %d %h %p %D %m %H %M %P %r %R %N %S'
# If we use 3 PostgreSQL servers, we need to specify follow_primary_command to run after failover on the primary node failover. 
# In case of two PostgreSQL servers, follow_primary_command setting is not necessary
# follow_primary_command = '/opt/pgpool/follow_primary.sh %d %h %p %D %m %H %M %P %r %R'
# online recovery
recovery_user = 'postgres'
recovery_password = '123456'
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90

7、配置 failover_command 脚本

[postgres@node3 ~]$ cd $PGPOOLHOME
[postgres@node3 pgpool]$ cp etc/failover.sh.sample failover.sh
[postgres@node3 pgpool]$ vi failover.sh 
 修改变量 PGHOME
[postgres@node3 pgpool]$ chmod +x failover.sh 

2.3、启动 pgpool

[postgres@node3 ~]$ pgpool -n > /tmp/pgpool.log  &
[postgres@node3 ~]$ psql -p 9999 postgres  pgpool
2020-12-01 14:50:09: pid 2422: LOG:  new connection received
2020-12-01 14:50:09: pid 2422: DETAIL:  connecting host=[local]
psql (12.2)
Type "help" for help.
postgres=> show pool_nodes;
 node_id |   hostname    | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | replication_state | replication_syn
c_state | last_status_change  
---------+---------------+------+--------+-----------+---------+------------+-------------------+-------------------+-------------------+----------------
--------+---------------------
 0       | 192.168.1.221 | 6000 | up     | 0.500000  | primary | 0          | false             | 0                 |                   |                
        | 2020-12-01 14:38:09
 1       | 192.168.1.202 | 6000 | up     | 0.500000  | standby | 0          | true              | 0                 |                   |                
        | 2020-12-01 14:38:09
(2 rows)

2.4、测试高可用性

1、备份自动激活为主库

我们先把主库停掉,看看备库是否可以激活为主库;

[postgres@node3 ~]$ pg_ctl stop
waiting for server to shut down..... done
server stopped
# 再次查看节点信息
[postgres@node3 ~]$ psql -p 9999 postgres  pgpool
2020-12-01 14:53:57: pid 2591: LOG:  new connection received
2020-12-01 14:53:57: pid 2591: DETAIL:  connecting host=[local]
psql (12.2)
Type "help" for help.
postgres=> show pool_nodes;
 node_id |   hostname    | port | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | replication_state | replication_syn
c_state | last_status_change  
---------+---------------+------+--------+-----------+---------+------------+-------------------+-------------------+-------------------+----------------
--------+---------------------
 0       | 192.168.1.221 | 6000 | down   | 0.500000  | standby | 0          | false             | 0                 |                   |                
        | 2020-12-01 14:53:07
 1       | 192.168.1.202 | 6000 | up     | 0.500000  | primary | 0          | true              | 0                 |                   |                
        | 2020-12-01 14:53:07
(2 rows)

测试结果: 备库成功激活为新主库
从上面的查询结果可以看到 “node_id=1”的 role 变成了 “primary”

2、原主库重加回集群

现在我们把原主库加回集群,变成备库。后面再演示 online recovery。先手动执行

1、同步时间线

202 备库提升为新主库;其时间线 +1;与 221 不同步;这是需要使用pg_rewind同步数据

[postgres@node3 ~]$ pg_rewind --target-pgdata $PGDATA --source-server='host=192.168.1.202 port=6000 user=postgres dbname=postgres password=123456'
pg_rewind: servers diverged at WAL location 0/18000000 on timeline 1
pg_rewind: rewinding from last common checkpoint at 0/17000148 on timeline 1
pg_rewind: Done!

2、配置 postgresql.conf

# 192.168.1.221 
$ cd $PGDATA
$ touch standby.signal
$ vi postgresql.conf
primary_conninfo = 'host=192.168.1.202 port=6000 user=replica'

3、启动 postgresql

[postgres@node3 ~]$ pg_ctl start

后续讲解online recovery。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352

推荐阅读更多精彩内容