本章解释了如何开始使用 Pgpool-II

安装

在本节中,我们假设您已经安装了 Pgpool-IIPostgreSQL 集群。

你的第一个复制(Replication)

在本节中,我们将解释如何使用 Pgpool-II 管理具有流复制的 PostgreSQL 集群,这是最常见的设置之一。

在继续之前,您应该正确设置 pgpool.conf 与流复制模式。Pgpool-II 提供了示例配置,配置文件位于 /usr/local/etc,默认从源代码安装。您可以将 pgpool.conf.sample 复制为 pgpool.conf

cp /usr/local/etc/pgpool.conf.sample pgpool.conf

如果你打算使用 pgpool_setup,输入:

pgpool_setup

这将创建一个具有流复制模式安装、主 PostgreSQL 安装和异步备用 PostgreSQL 安装的 Pgpool-II

从现在开始,我们假设您使用 pgpool_setup 在当前目录下创建安装。请注意,在执行 pgpool_setup 之前,当前目录必须是空的。

要启动整个系统,请输入:

./startall

系统启动后,您可以通过向任何数据库发出名为 show pool_nodes 的伪 SQL 命令来检查集群状态。 pgpool_setup 自动创建 test 数据库。我们使用数据库。注意端口号是 11000,这是 pgpool_setup 分配给 Pgpool-II 的默认端口号。

$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 0          | false             | 0                 | 2019-01-31 10:23:09
1       | /tmp     | 11003 | up     | 0.500000  | standby | 0          | true              | 0                 | 2019-01-31 10:23:09
(2 rows)

结果显示 status 列为 up,表示 PostgreSQL 已启动并正在运行,这很好。

测试复制

让我们使用标准 PostgreSQL 安装附带的基准工具 pgbench 来测试复制功能。键入以下内容以创建基准表

$ pgbench -i -p 11000 test

要查看 replication 是否正常工作,请直接连接到主服务器和备用服务器,看看它们是否返回相同的结果。

$ psql -p 11002 test
\dt
List of relations
Schema |       Name       | Type  |  Owner
--------+------------------+-------+---------
public | pgbench_accounts | table | t-ishii
public | pgbench_branches | table | t-ishii
public | pgbench_history  | table | t-ishii
public | pgbench_tellers  | table | t-ishii
(4 rows)
\q
$ psql -p 11003 test
\dt
List of relations
Schema |       Name       | Type  |  Owner
--------+------------------+-------+---------
public | pgbench_accounts | table | t-ishii
public | pgbench_branches | table | t-ishii
public | pgbench_history  | table | t-ishii
public | pgbench_tellers  | table | t-ishii
(4 rows)

主服务器(端口 11002)和备用服务器(端口 11003)返回相同的结果。接下来,让我们运行 pgbench 一段时间并检查结果。

$ pgbench -p 11000 -T 10 test
starting vacuum...end.
transaction type: <builtin: TPC-B (sort of)>
scaling factor: 1
query mode: simple
number of clients: 1
number of threads: 1
duration: 10 s
number of transactions actually processed: 4276
latency average = 2.339 ms
tps = 427.492167 (including connections establishing)
tps = 427.739078 (excluding connections establishing)$ psql -p 11002 -c "SELECT sum(abalance) FROM pgbench_accounts" test
sum
--------
216117
(1 row)$ psql -p 11003 -c "SELECT sum(abalance) FROM pgbench_accounts" test
sum
--------
216117
(1 row)

同样,结果是相同的。

测试负载均衡(Load Balance)

Pgpool-II 允许读取查询负载均衡。默认情况下启用。要查看效果,让我们使用 pgbench -S 命令。

$ ./shutdownall
$ ./startall
$ pgbench -p 11000 -c 10 -j 10 -S -T 60 test
starting vacuum...end.
transaction type: <builtin: select only>
scaling factor: 1
query mode: simple
number of clients: 10
number of threads: 10
duration: 60 s
number of transactions actually processed: 1086766
latency average = 0.552 ms
tps = 18112.487043 (including connections establishing)
tps = 18125.572952 (excluding connections establishing)$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 537644     | false             | 0                 | 2019-01-31 11:51:58
1       | /tmp     | 11003 | up     | 0.500000  | standby | 548582     | true              | 0                 | 2019-01-31 11:51:58
(2 rows)

select_cnt 列显示有多少 SELECT 被分派到每个节点。由于使用默认配置,Pgpool-II 尝试调度相同数量的 SELECT,因此该列显示几乎相同的数字。

测试故障转移(Fail Over)

PostgreSQL 服务器宕机时,Pgpool-II 允许自动故障转移。在这种情况下,Pgpool-II 将服务器的状态设置为 down 并使用剩余的服务器继续数据库操作。

$ pg_ctl -D data1 stop
waiting for server to shut down.... done
server stopped
$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 4276       | true              | 0                 | 2019-01-31 12:00:09
1       | /tmp     | 11003 | down   | 0.500000  | standby | 1          | false             | 0                 | 2019-01-31 12:03:07
(2 rows)

备用节点被 pg_ctl 命令关闭。Pgpool-II 检测到它并分离备用节点。show pool_nodes 命令显示备用节点处于关闭状态。您可以在没有备用节点的情况下继续使用集群:

$ psql -p 11000 -c "SELECT sum(abalance) FROM pgbench_accounts" test
sum
--------
216117
(1 row)

如果主服务器宕机了怎么办?在这种情况下,剩余的备用服务器之一被提升为新的主服务器。 对于这个测试,我们从两个节点都启动的状态开始。

$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | primary | 0          | false             | 0                 | 2019-01-31 12:04:58
1       | /tmp     | 11003 | up     | 0.500000  | standby | 0          | true              | 0                 | 2019-01-31 12:04:58
(2 rows)$ pg_ctl -D data0 stop
waiting for server to shut down.... done
server stopped
$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | down   | 0.500000  | standby | 0          | false             | 0                 | 2019-01-31 12:05:20
1       | /tmp     | 11003 | up     | 0.500000  | primary | 0          | true              | 0                 | 2019-01-31 12:05:20
(2 rows)

现在主节点从 0 变成了 1。里面发生了什么?当节点 0 宕机时,Pgpool-II 检测到它并执行 pgpool.conf 中定义的 failover_command。这是文件的内容。

#! /bin/sh
# Execute command by failover.
# special values:  %d = node id
#                  %h = host name
#                  %p = port number
#                  %D = database cluster path
#                  %m = new main node id
#                  %M = old main node id
#                  %H = new main node host name
#                  %P = old primary node id
#                  %R = new main database cluster path
#                  %r = new main port number
#                  %% = '%' character
failed_node_id=$1
failed_host_name=$2
failed_port=$3
failed_db_cluster=$4
new_main_id=$5
old_main_id=$6
new_main_host_name=$7
old_primary_node_id=$8
new_main_port_number=$9
new_main_db_cluster=${10}
mydir=/home/t-ishii/tmp/Tutorial
log=$mydir/log/failover.log
pg_ctl=/usr/local/pgsql/bin/pg_ctl
cluster0=$mydir/data0
cluster1=$mydir/data1date >> $log
echo "failed_node_id $failed_node_id failed_host_name $failed_host_name failed_port $failed_port failed_db_cluster $failed_db_cluster new_main_id $new_main_id old_main_id $old_main_id new_main_host_name $new_main_host_name old_primary_node_id $old_primary_node_id new_main_port_number $new_main_port_number new_main_db_cluster $new_main_db_cluster" >> $logif [ a"$failed_node_id" = a"$old_primary_node_id" ];then   # main failed
!   new_primary_db_cluster=${mydir}/data"$new_main_id"
echo $pg_ctl -D $new_primary_db_cluster promote >>$log    # let standby take over
$pg_ctl -D $new_primary_db_cluster promote >>$log # let standby take over
sleep 2
fi

该脚本从 Pgpool-II 接收必要的信息作为参数。如果主服务器宕机,它会执行 pg_ctl -D data1 promote ,这应该将备用服务器提升为新的主服务器。

测试在线恢复(Online Recovery)

Pgpool-II 允许通过称为 Online Recovery 的技术来恢复宕机的节点。 这会将数据从主节点复制到备用节点,以便与主节点同步。 这可能需要很长时间,并且在此过程中可能会更新数据库。这没问题,因为在流式配置中,备用服务器将接收 WAL 日志并将其应用于赶上主服务器。为了测试在线恢复,让我们从之前的集群开始,其中节点 0 处于关闭状态。

$ pcp_recovery_node -p 11001 -n 0
Password:
pcp_recovery_node -- Command Successful$ psql -p 11000 -c "show pool_nodes" test
node_id | hostname | port  | status | lb_weight |  role   | select_cnt | load_balance_node | replication_delay | last_status_change
---------+----------+-------+--------+-----------+---------+------------+-------------------+-------------------+---------------------
0       | /tmp     | 11002 | up     | 0.500000  | standby | 0          | false             | 0                 | 2019-01-31 12:06:48
1       | /tmp     | 11003 | up     | 0.500000  | primary | 0          | true              | 0                 | 2019-01-31 12:05:20
(2 rows)

pcp_recovery_nodePgpool-II 安装附带的控制命令之一。参数 -p 是指定分配给命令的端口号,它是 pgpool_setup 设置的 11001。参数 -n 是指定要恢复的节点 id。执行命令后,节点 0 恢复到 up 状态。

pcp_recovery_node 执行的脚本在 pgpool.conf 中被指定为 recovery_1st_stage_command。这是 pgpool_setup 安装的文件。

#! /bin/sh
psql=/usr/local/pgsql/bin/psql
DATADIR_BASE=/home/t-ishii/tmp/Tutorial
PGSUPERUSER=t-ishiimain_db_cluster=$1
recovery_node_host_name=$2
DEST_CLUSTER=$3
PORT=$4
recovery_node=$5pg_rewind_failed="true"log=$DATADIR_BASE/log/recovery.log
echo >> $log
date >> $log
if [ $pg_rewind_failed = "true" ];then$psql -p $PORT -c "SELECT pg_start_backup('Streaming Replication', true)" postgresecho "source: $main_db_cluster dest: $DEST_CLUSTER" >> $logrsync -C -a -c --delete --exclude postgresql.conf --exclude postmaster.pid \
--exclude postmaster.opts --exclude pg_log \
--exclude recovery.conf --exclude recovery.done \
--exclude pg_xlog \
$main_db_cluster/ $DEST_CLUSTER/rm -fr $DEST_CLUSTER/pg_xlog
mkdir $DEST_CLUSTER/pg_xlog
chmod 700 $DEST_CLUSTER/pg_xlog
rm $DEST_CLUSTER/recovery.done
fi
cat > $DEST_CLUSTER/recovery.conf $lt;$lt;REOF
standby_mode          = 'on'
primary_conninfo      = 'port=$PORT user=$PGSUPERUSER'
recovery_target_timeline='latest'
restore_command = 'cp $DATADIR_BASE/archivedir/%f "%p" 2> /dev/null'
REOFif [ $pg_rewind_failed = "true" ];then
$psql -p $PORT -c "SELECT pg_stop_backup()" postgres
fiif [ $pg_rewind_failed = "false" ];then
cp /tmp/postgresql.conf $DEST_CLUSTER/
fi

架构基础

Pgpool-II 是位于客户端和 PostgreSQL 之间的代理服务器。Pgpool-II 理解 PostgreSQL 使用的称为 前端和后端协议(frontend and backend protocol)线路(wire)级协议。 有关该协议的更多详细信息,请参阅 PostgreSQL 手册。使用 Pgpool-II 不需要修改 PostgreSQL(更准确地说,您需要一些扩展才能使用 Pgpool-II 的全部功能)。因此 Pgpool-II 可以应对各种 PostgreSQL 版本。理论上,即使是最早的 PostgreSQL 版本也可以与 Pgpool-II 一起使用。对客户端也可以这样说。只要它遵循协议,Pgpool-II 就会愉快地接受来自它的连接,无论它使用什么样的语言或驱动程序。

Pgpool-II 由多个进程组成。有一个主进程,它是所有其他进程的父进程。 它负责分叉子进程,每个子进程都接受来自客户端的连接。 还有一些从主进程派生的工作进程,负责检测流复制延迟。还有一个特殊的进程叫做 pcp 进程,专门用于管理 Pgpool-II 本身。Pgpool-II 有一个内置的高可用性功能,称为 watchdogWatchdog 由一些进程组成。

更多

  • Pgpool-II 4.3 中文手册-前言
  • 「在 Kubernetes 上运行 Pgpool-Il」实现 PostgreSQL 查询(读)负载均衡和连接池

pgpool-II 4.3 中文手册 - 入门教程相关推荐

  1. Smarty中文手册,Smarty教程,Smarty模板的入门教材

    Smarty中文手册,Smarty教程,Smarty模板的入门教材 首先,这份Smarty中文手册的翻译工作是由喜悦国际村村民自发组织的,不代表任何人的意见和观点.对他们的无私奉献精神,我们表示感谢, ...

  2. 一本比较简单易懂的中文python入门教程

    http://woodpecker.org.cn/abyteofpython_cn/chinese/index.html 转载于:https://www.cnblogs.com/ericsun/arc ...

  3. 【监控仪表系统】Grafana 中文入门教程 | 构建你的第一个仪表盘

    Grafana 读音:/grəˈfɑːnˌɑː/ Grafana 中文入门教程 1. Grafana 是什么 Grafana 支持的数据源 2. 什么情况下会用到 Grafana 或者监控仪表盘 3. ...

  4. 自己的电脑上怎么用python3.7_python 3.7极速入门教程9最佳python中文工具书籍下载...

    筛选了2年内优秀的python书籍,个别经典的书籍扩展到5年内. python现在的主流版本是3.7(有明显性能提升,强烈推荐) 3.6, 不基于这两个或者更新版本的书,慎重选择.很多库已经不提供py ...

  5. python中文编程教学_Python入门教程完整版400集(懂中文就能学会)快来带走

    2020最新Python零基础到精通资料教材,干货分享,新基础Python教材,看这里,这里有你想要的所有资源哦,最强笔记,教你怎么入门提升!让你对自己更加有信心,重点是资料都是免费的,免费!!! 如 ...

  6. python入门教程完整版(懂中文就能学会)-Python入门教程完整版(懂中文就能学会)...

    不过小编的内心是强大的,网友虐我千百遍,我待网友如初恋,因为今天又给大家带来了干货,Python入门教程完整版,完整版啊!完整版! 言归正传,小编该给大家介绍一下这套教程了,希望每个小伙伴都沉迷学习, ...

  7. python3菜鸟教程-总算理解python3中文入门教程

    为了提高模块加载的速度,每个模块都会在__pycache__文件夹中放置该模块的预编译模块,命名为module.version.pyc,version是模块的预编译版本编码,一般都包含Python的版 ...

  8. python基础教程是什么语言-终于懂得python中文入门教程

    Python作为一门新型的编程语言(一般常用作脚本语言)很受欢迎,毕竟相对其他的编程语言(Java ,C#等)来说比较容易入手.那么,在刚开始学习Python时有哪些疑难点需要掌握呢?以下是小编为你整 ...

  9. python免费入门手册-Python 基础入门教程

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. <Python 基础入 ...

最新文章

  1. Spring Boot+Redis+拦截器+自定义Annotation实现接口自动幂等
  2. 【Oracle RAC+DG实验】Oracle RAC+ASM+DataGuard配置实验记录+常见问题
  3. linux 下Eclipse的安装
  4. 一天一个设计模式(一) - 总体概述
  5. git commit提示Your branch is up-to-date with 'origin/master'.(做过测试不错)
  6. python 查看excel 多少行_13行代码实现对Excel自动分表(python)
  7. dnf强化卷代码_这行代码告诉你!为什么你地下城与勇士(DNF)的装备强化老是失败?...
  8. 开启进程的两种方式:类、函数
  9. #深度解析# GAN(生成对抗神经网络)
  10. 计算机怎么算平均分公式,平均分怎么算
  11. requests的Proxy-SSL错误
  12. 推荐上百本优质大数据书籍,附必读清单(大数据宝藏)
  13. 京东商城在掩盖什么?(1)
  14. [PHP] PHP7.4.2安全和修复版本的更改日志
  15. springboot-莫名其妙的登录界面“Please sign in“
  16. 关于编辑Windows的右键【新建】删除和添加
  17. 巧用Html5 History Api解决SPA的SEO问题
  18. 人啊,除了健康,什么都是浮云
  19. 【动手学深度学习】06-ResNet解析
  20. ios打包报错: DXT1 compressed textures are not supported when publishing to iPhone

热门文章

  1. 5G手机决战中途岛:荣耀V30系列为行业划下基准线
  2. HTML CSS元素浮动
  3. 全新DR5超级汉化加强版来了, 一键即可完成大师级磨皮
  4. 开发app需要什么?
  5. 《灰色系统理论及其应用》第7版 刘思峰 P193 9.3基于Captuo模型分数阶导数的灰色模型
  6. Python 多因素方差分析
  7. python按照队列顺序打印文件
  8. LG显示器L194CW拆下底座
  9. Android 中屏幕点击事件的实现2
  10. SaltStack遇到的一些问题及解决