转一篇pgpool配置

http://dz.sdut.edu.cn/blog/subaochen/2013/08/postgresql-9-1的failover配置及其管理/

环境介绍

在两台虚拟机上分别安装debian 7.1.0、pgpool II 3.3.0、postgresql 9.1,其中debian为最小安装,postgresql 9.1为debian 7.1.0的默认版本,pgpool II 3.3.0为手工安装(debian 7.1.0默认安装版本为3.1,这里采用3.3版本是为了将来使用3.3版本的watchdog功能)。

两台虚拟机的IP地址分别为172.16.76.128(db1),172.16.76.129(db2),hostname分别为db1,db2,后面一律使用hostname引用这两台服务器。其中,初始状态下db1为primary server,db2为standby server,我们将测试primary server停掉的时候,db2能否自动切换为primary server,即failover。

准备工作

首先设置两台服务器的hosts文件:

172.16.76.128   db1
172.16.76.129 db2

然后设置两台服务器使得postgres用户可以无密码相互访问:
在db1执行:

su - postgres
ssh-keygen
ssh-copy-id postgres@db2

在db2执行:

su - postgres
ssh-keygen
ssh-copy-id postgres@db1

配置步骤

pgpool的配置

pgpool的配置主要涉及到两个文件:pcp.conf和pgpool.conf。pcp.conf文件很简单:

#postgres:postgres
postgres:e8a48653851e28c69d0506508fb27fc5

即,当我们使用pcp和pgpool通讯的时候将使用postgres:postgres作为用户名和密码。

pgpool.conf文件的主要内容如下:

listen_addresses = '*'
port = 9999
socket_dir = '/var/run/postgresql'
pcp_port = 9898
pcp_socket_dir = '/var/run/postgresql'
backend_hostname0 = 'db1'
backend_port0 = 5432
backend_weight0 = 1
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = 'db2'
backend_port1 = 5432
backend_weight1 = 1
backend_flag1 = 'ALLOW_TO_FAILOVER'
replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'
sr_check_period = 10
sr_check_user = 'postgres'
sr_check_password = '111111'
health_check_period = 30
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = '111111'
failover_command = '/usr/local/bin/failover_stream.sh %d %H /tmp/trigger_file'

上面的failover_command引用了一个failover_stream.sh脚本,目的是在standby server创建一个/tmp/trigger_file文件,以便standby server提升为primary server,内容如下:

#! /bin/sh
# Failover command for streaming replication.
# This script assumes that DB node 0 is primary, and 1 is standby.
#
# If standby goes down, do nothing. If primary goes down, create a
# trigger file so that standby takes over primary node.
#
# Arguments: $1: failed node id. $2: new master hostname. $3: path to
# trigger file. failed_node=$1
new_master=$2
trigger_file=$3 # Do nothing if standby goes down.
if [ $failed_node = 1 ]; then
exit 0;
fi # Create the trigger file.
/usr/bin/ssh -T $new_master /usr/bin/touch $trigger_file exit 0;

这样,pgpool就算是配置完毕了,在实验阶段可以这样启动pgpool,以便观察pgpool的log输出:

pgpool -nd

或者将log写入到文件中:

pgpool -nd > /tmp/pgpool.log 2>&1 &

db1的配置

数据库的配置主要涉及到pg_hba.conf,postgresql.conf,recovery.conf三个配置文件。

为了测试方便,这里忽略了数据库的权限认证,因此pg_hba.conf文件内容如下:

local   all             postgres                                trust
local all all trust
host all all 127.0.0.1/32 trust
host all all 172.16.76.0/24 trust
local replication postgres trust
host replication postgres 127.0.0.1/32 trust
host replication postgres ::1/128 trust
host replication postgres 172.16.76.0/24 trust

postgresql.conf文件主要内容如下:

# primary server需要
wal_level = hot_standby
# 这个不是必需的
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/9.1/main/archive/%f'
# primary server需要
max_wal_senders = 32
# standby server需要
hot_standby = on

还需要在$PGDATA目录(在debian下面默认是/var/lib/postgresql/9.1/main)下面创建archive目录:

mkdir /var/lib/postgresql/9.1/main/archive
chown postgres.postgres /var/lib/postgresql/9.1/main/archive

创建recovery.done文件内容如下:

standby_mode=on
primary_conninfo='host=db2'
trigger_file='/tmp/trigger_file'
recovery_target_timeline='latest'

这样就可以启动postgresql了:

service postgresql restart

db2的配置

db2的pg_hba.conf和postgresql.conf和db1完全相同,同样的,也需要创建archive目录,不再赘述。
db2的recovery.conf文件内容如下:

standby_mode=on
primary_conninfo='host=db1'
trigger_file='/tmp/trigger_file'
recovery_target_timeline='latest'

现在首先需要停掉db2的postgresql,然后构建standby server,命令序列如下:

service postgresql stop
rm -rf /var/lib/postgresql/9.1/main/*
su - postgres
/usr/lib/postgresql/9.1/bin/pg_basebackup -Fp -D /var/lib/postgresql/9.1/main -x -v -h db1 -w
mkdir /var/lib/postgresql/9.1/main/archive
exit
ln -s /etc/ssl/certs/ssl-cert-snakeoil.pem /var/lib/postgresql/9.1/main/server.crt
ln -s /etc/ssl/private/ssl-cert-snakeoil.key /var/lib/postgresql/9.1/main/server.key
cp ..../recovery.conf /var/lib/postgresql/9.1/main

现在可以启动db2了:

service postgresql start

观察db2的log,如果说:database system is ready to accept read only connections,那就说明standby server已经配置成功!

pgpool的使用

postgresql的primary server和standby server跑起来后,我们就可以使用pgpool来观察和操作了:

psql -p 9999 -h db1 -U postgres

列出当前集群服务器的状态:

postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------+------+--------+-----------+---------
0 | db1 | 5432 | 2 | 0.500000 | primary
1 | db2 | 5432 | 2 | 0.500000 | standby

其中的status根据pgpool documentation的描述为:
0:从未使用,直接忽略
1:server已经启动,但是连接池中没有连接
2:server已经启动,并且在连接池中存在连接
3:server没有启动或者联系不上

创建测试数据库和测试数据:

postgres=# create database test;
CREATE DATABASE
postgres=# \c test;
您现在已经连线到数据库 "test",用户 "postgres".
test=# create table t(id int);
CREATE TABLE
test=# insert into t select * from generate_series(1,100);

然后分别登录到db1和db2上查看测试数据库的内容,验证pgpool确实已经正常工作了。

failover的管理

现在我们模拟primary server停掉的情况,在db1上面执行:

service postgresql stop

重新链接到pgpool可以看到:

subaochen@debian:~$ psql -p 9999 -h db1 -U postgres
psql (9.1.9)
输入 "help" 来获取帮助信息. postgres=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------+------+--------+-----------+---------
0 | db1 | 5432 | 3 | 0.500000 | standby
1 | db2 | 5432 | 2 | 0.500000 | primary

可以看出,db2已经成功变身为primary server,而db1由于已经停掉,因此状态为3(pgpool无法链接到db1)。这时可以尝试通过pgpool往数据库里面添加更多的测试数据,此处略。

db1在重新启动前需要做如下的工作:

  • 将recovery.done更名为recovery.conf,因为此时的db1只能作为standby server启动
  • 复制db2的/var/lib/postgresql/9.1/main/pg_xlog里面最新的.history文件到db1的pg_xlog目录下,否则会报告timeline mismatch。这个问题在9.3版本已经解决,在9.1/9.2版本必须手工处理

然后启动db1:

service postgresql start

然后重新将db1加入到pgpool集群中:

pcp_attach_node -d 5 localhost 9898 postgres postgres 0

再次show pool_nodes会发现:

test=# show pool_nodes;
node_id | hostname | port | status | lb_weight | role
---------+----------+------+--------+-----------+---------
0 | db1 | 5432 | 1 | 0.500000 | standby
1 | db2 | 5432 | 2 | 0.500000 | primary

此时db1已经作为standby server加入到集群中了,只是还没有连接请求而已。

standby服务器的人工恢复

如果发现show pool_nodes显示如下的信息:

 node_id | hostname | port | status | lb_weight |  role
---------+----------+------+--------+-----------+---------
0 | db1 | 5432 | 2 | 0.500000 | primary
1 | db2 | 5432 | 3 | 0.500000 | standby

并且很长时间状态都不能恢复为2的话,多半standby的自动恢复(failover)失败,最简单的办法就是手工重新构建standby服务器,参见数据库构建脚本dbsetup.sh

failover机制浅析

standby server能够成功promote为primary server的关键是trigger file,即在recovery.conf文件中定义的

trigger_file='/tmp/trigger_file'

也就是说,只要在/tmp目录创建一个名字为trigger_file的文件,postgresql即开始一个promote的过程。整个过程大致如下图所示:

注意事项

pgpool的运行身份:必须和postresql的运行身份一致,否则postgresql无法自动删除pgpool创建的trigger_file

转一篇pgpool配置的更多相关文章

  1. 从0开始搭建SQL Server AlwaysOn 第一篇(配置域控)

    从0开始搭建SQL Server AlwaysOn 第一篇(配置域控) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www.cnb ...

  2. 从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  3. 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://w ...

  4. 从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点)

    从0开始搭建SQL Server AlwaysOn 第四篇(配置异地机房节点) 第一篇http://www.cnblogs.com/lyhabc/p/4678330.html第二篇http://www ...

  5. 深度学习篇——Tensorflow配置(傻瓜安装模式)

    前言 如果你是一个完美主义者,那么请绕过此文,请参考<深度学习篇——Tensorflow配置(完美主义模式)> 安装 pip install tensorflow ok,只要不报错,安装就 ...

  6. 从0开始搭建SQL Server 2012 AlwaysOn 第二篇(配置故障转移集群)

    本篇主要讲配置Windows 故障转移集群及遇到的相关问题(坑),因为AlwaysOn是基于Windows的故障转移集群的 在讲解步骤之前需要了解一下故障转移集群仲裁配置 四种集群的仲裁配置: 1.多 ...

  7. Spring Cloud第十一篇 | 分布式配置中心高可用

    ​ 本文是Spring Cloud专栏的第十一篇文章,了解前十篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...

  8. (转) 从0开始搭建SQL Server AlwaysOn 第三篇(配置AlwaysOn)

    原文地址: http://www.cnblogs.com/lyhabc/p/4682986.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第三篇,这一篇才真正开始搭建Alwa ...

  9. (转)从0开始搭建SQL Server AlwaysOn 第二篇(配置故障转移集群)

    原文地址:  http://www.cnblogs.com/lyhabc/p/4682028.html 这一篇是从0开始搭建SQL Server AlwaysOn 的第二篇,主要讲述如何搭建故障转移集 ...

随机推荐

  1. SQL JOIN使用方法

    (转自W3School相关教程:http://www.w3school.com.cn,W3School是不错的在线教程,简洁高效!) 下面列出不同的SQL JOIN类型,以及他们之间的差异: JOIN ...

  2. Python之初识函数(Day11)

    一.函数的定义与调用 总结一: 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开... ...

  3. 编程语言的介绍(Day2)

    1.什么是编程,为什么要编程? 编程==编写程序(写代码) 2.编程语言有哪些 机器语言 优点是最底层,速度最快,缺点是最复杂,开发效率最低 汇编语言 优点是比较底层,速度最快,缺点是复杂,开发效率最 ...

  4. springmvc自定义视图

    自定义视图 可以整合jfreechart.excel @RequestMapping("/testView") public String testView(){ System.o ...

  5. 什么是jstack

    以下是百度百科的内容 jstack是java虚拟机自带的一种堆栈跟踪工具. jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成 ...

  6. [转]Linux下RPM软件包的安装及卸载 yum操作

    在 Linux 操作系统下,几乎所有的软件均通过RPM 进行安装.卸载及管理等操作.RPM 的全称为Redhat Package Manager ,是由Redhat 公司提出的,用于管理Linux 下 ...

  7. MySQL-Last_Errno: 1594

    故障现象  :MySQL slave所在机器自动重启,启动MySQL后,查看主从信息如下: Error_code: 1594   mysql> show slave status \G . ro ...

  8. 20165101刘天野 2018-2019-2《网络对抗技术》Exp2 后门原理与实践

    目录 20165101刘天野 2018-2019-2<网络对抗技术>Exp2 后门原理与实践 1. 实验内容 1.1 使用netcat获取主机操作Shell,cron启动 1.2 使用so ...

  9. Python 对象学习一

    # 对象的基本理论 # 什么是对象? # 万物皆对象 # 对象是具体物体 # 拥有属性 # 拥有行为 # 把很多零散的东西,封装成为一个整体 # 举例:王二小 # 属性 # 姓名 # 年龄 # 身高 ...

  10. 【P3355】骑士共存问题(最大流+黑白染色,洛谷)

    这个题刚看上去就让人不禁想到一道叫做方格取数问题的题目,事实上也就是这么做,对棋盘黑白染色,然后黑格子连源点,白的连汇点,点权为1.然后判断一下黑格子能影响到的白格子,边权为inf,跑一遍最大流就可以 ...