Postgresql流复制+pgpool实现高可用

pgpool

概述

pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:连接池、复制、负载均衡、限制超过限度的连接以及并行查询。文档在此

四种模式

O 意味着“可用”, X 意味着“不可用
(1) 并行查询模式需要同时打开复制和负载均衡,但是复制和负载均衡无法用于并行查询模式中的分布式表。
(
2) 在线恢复可以和流复制同时使用。
(*3) 客户端仅仅是通过 pgpool-II 连接到 PostgreSQL服务器。这种模式仅仅用于限制到服务器的连接数,或者在多台机器上启用故障恢复。

pgpool在不同模式下,提供不同的功能,本文将选择在主备模式下,实现故障恢复,即自动failover的功能。

体系结构

配置文件介绍

pgpool有四个主要的配置文件,分别是

  • pcp.conf 用于管理查、看节点信息,如加入新节点。该文件主要是存储用户名及md5形式的密码。
  • pgpool.conf 用于设置pgpool的模式,主次数据库的相关信息等。
  • pool_hba.conf 用于认证用户登录方式,如客户端IP限制等,类似于postgresql的pg_hba.conf文件。
  • pool_passwd 用于保存相应客户端登录帐号名及md5密码。

拓扑结构

安装

postgresql流复制设置

参考

pgpool安装设置
安装
sudo apt-get insatll pgpool2
设置pcp.conf
/usr/sbin/pg_md5 password

将得到md5加上用户名以以下方式写入文件/etc/pgpool2/pcp.conf中,
pgpool:5f4dcc3b5aa765d61d8327deb882cf99

设置pgpool.conf

确保相关配置项设置如下:

listen_addresses = ‘*‘
backend_hostname0 = ‘10.10.10.104‘ #主机ip
backend_port0 = 5432
backend_weight0 = 1 #loadbalance不开启,无效
backend_data_directory0 = ‘/var/lib/postgresql/9.5/main‘
backend_flag0 = ‘ALLOW_TO_FAILOVER‘

backend_hostname1 = ‘10.10.10.102‘ #备机ip
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ‘/var/lib/postgresql/9.5/main‘
backend_flag1 = ‘ALLOW_TO_FAILOVER‘

enable_pool_hba = on
pool_passwd = ‘pool_passwd‘

master_slave_mode = on
master_slave_sub_mode = ‘stream‘
sr_check_user = ‘replication‘ #流复制账号
sr_check_password = ‘password‘

failover_command = ‘/var/lib/postgresql/failover.sh %h %H /var/lib/postgresql/state/recovery_trigger‘ #主机失败后,touch文件使得备机从只读状态变成可读写状态
设置pool_hba.conf

设置可以参考postgresql的hba设置,如

# IPv4 local connections:
host    all               all           127.0.0.1/32    md5
host    all               all           0.0.0.0/0       md5
host    replication     replication     0.0.0.0/0       md5
设置pool_passwd

前提:对应的postgresql实例中,已经建立相应的账号。设置pool_passwd的目的是允许该数据库账号能够通过pgpool登录数据库。
方法一:设置与数据库账号同名的系统账号,然后直接调用pg_md5,该命令会自动产生好pool_passwd文件。例如我有系统账号cloud,密码为cloud

/usr/sbin/pg_md5 -m -u cloud cloud

方法二: 直接访问数据库,将结果以以下方式放入文件/etc/pgpool2/pool_passwd中

cloud:md5313e20fe4ca8bf6751ffd3c5b963a9ad

查询数据库:

select usename,passwd from pg_shadow;
failover.sh

当主机宕机后,pgpool会将链接转至standby,所以需要将standby从只读状态修改为可读写状态,即创建一个trigger文件或者调用promote命令。

#! /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 /bin/touch $trigger_file

exit 0;
配置主机间的互信

主要用途是使得pgpool所在主机能登录postgresql所在主机,创建trigger文件。
参考命令:

ssh-keygen
ssh-copy-id [email protected]

测试

连接
psql -h10.10.10.105 -p9999 -Ucloud

cloud=> show pool_nodes;
 node_id |   hostname   | port | status | lb_weight |  role
---------+--------------+------+--------+-----------+---------
 0       | 10.10.10.102 | 5432 | 2      | 0.500000  | primary
 1       | 10.10.10.104 | 5432 | 2      | 0.500000  | standby
(2 rows)
模拟主机宕机

关闭主机的服务。再次连接查看。

server closed the connection unexpectedly
	This probably means the server terminated abnormally
	before or while processing the request.
The connection to the server was lost. Attempting reset: Succeeded.
cloud=> show pool_nodes;
 node_id |   hostname   | port | status | lb_weight |  role
---------+--------------+------+--------+-----------+---------
 0       | 10.10.10.102 | 5432 | 3      | 0.500000  | standby
 1       | 10.10.10.104 | 5432 | 2      | 0.500000  | primary
(2 rows)

可以发现standby已经升级为主,原来的主机status变成了3。status对应的意义为:

Status 由数字 [0 - 3]来表示。0 - 该状态仅仅用于初始化,PCP从不显示它。1 - 节点已启动,还没有连接。2 - 节点已启动,连接被缓冲。3 - 节点已关闭。
修复及重新加入

原来的主机经过修复,重新提供服务后,可以重新作为新主机的standby加入pgpool。步骤如下:

  • 更新ppgpool.conf, host0改为新主机,host1改为原来新standby。pgpool需要重启才能生效该选项的修改,所以这里的修改只是防止pgpool重启而导致指向错误的主机,实际修复不需要重启pgpool。
  • 重新建立standby,即流复制。
  • 使用pcp命令将修复的standby加入pgpool。
/usr/sbin/pcp_attach_node 10 localhost 9898 pgpool cloud 0

psql -h10.10.10.105 -p9999 -Ucloud

cloud=> show pool_nodes;
 node_id |   hostname   | port | status | lb_weight |  role
---------+--------------+------+--------+-----------+---------
 0       | 10.10.10.102 | 5432 | 2      | 0.500000  | standby
 1       | 10.10.10.104 | 5432 | 2      | 0.500000  | primary
(2 rows)

这样在不停机的情况下,完成了修复工作。

时间: 2024-11-07 21:48:47

Postgresql流复制+pgpool实现高可用的相关文章

mysql主主复制及keepalived高可用群集

mysql主主复制及keepalived高可用 Keepalived+mysql双主来实现MySQL-HA,我们必须保证两台MySQL数据库的数据完全一样,基本思路是两台MySQL互为主从关系(双主),通过Keepalived配置虚拟IP,实现当其中的一台MySQL数据库宕机后,应用能够自动切换到另外一台MySQL数据库,保证系统的高可用. 实验基本拓扑: 主主同步就是两台机器互为主从的关系,在任何一台机器上写入都会同步. 在master1 mysql主配置文件中添加下面参数(/etc/my.c

Postgresql流复制切换的时候遇到的一个小问题

Pg10搭建了流复制主备切换 配置主库10.10.10.13 pghost4备库10.10.10.14 pghost5 测试主库出现问题,停止后,备库自动切换成为新主库.老主库现在应该是备库了,启动它验证状态.发现备库启动不起来.通过以下方法,备库启动了. 新备库通过pg_ctl start启动,出现告警日志. [[email protected] ~]# su - pg10[email protected]>pg_ctl startwaiting for server to start....

mysql主主复制+keepalived实现高可用

mysql最简单的高可用 2台pc机 mysql主主复制实现数据的同步 keepalive实现双机热备,保证服务的正常运行 1.环境 Master1  10.0.0.201 Master2 10.0.0.202 2.Master1操作授权 mysql>grant replication slave on *.* to'admin'@'10.0.0.202' identified by '123456';///授权 mysql>show master status\G; 3.Master2操作授

PostgreSQL流复制

原理机制 参考--https://yq.aliyun.com/articles/51009 主备总体结构 PG主备流复制的核心部分由walsender,walreceiver和startup三个进程组成. walsender进程是用来发送WAL日志记录的 walreceiver进程是用来接收WAL日志记录的 startup进程是用来apply日志的 配置环境 主机名 IP地址 角色 数据目录 postgres202 192.168.1.202 primary /home/postgres/dat

mysql学习-mysql8.0配置双主复制+keepalived实现高可用架构

一般小型公司数据库,使用主从复制即可保证数据库的高可用,但是一旦主数据库故障,切换到从库需要一定的时间,这样就导致了停机时间过长,不能及时恢复业务.使用双主(master)配合keepalived这种mysql高可用架构也是基于主从复制的原理而搭建的.这是一种简单.便捷的解决方案,在高可用集群环境中,keepalived使用vip,利用keepalived自带的服务监控功能和自定义脚本来实现mysql故障时自动切换. 1.mysql双主复制介绍 双主复制,就是相互做主从复制,每个master既是

postgresql 流复制(streaming replication)

基本环境说明: os:FreeBSD 9.3 postgresql version:9.3.6 master:192.168.56.101 standby:192.168.56.102 安装过程略,基于pkg包 1.配置master端 # psql -U pgsql -d postgres -c "CREATE USER rep REPLICATION LOGIN ENCRYPTED PASSWORD 'password';" # cd /usr/local/pgsql # vim d

超详细MySQL主主复制+MMM实现高可用

简介 MMM(Master-Master Replication Manager for MySQL, MySQL主主复制管理器)是一套灵活的脚本程序,基于perl实现,用来对mysql replication进行监控和故障迁移,并能管理mysql Master-Master复制的配置.注意同一时间只有一个节点是可写.MMM的监管端会提供多个虚拟IP(VIP)包括一个可写VIP,多个可读VIP,通过监管的管理,这些IP会绑定在可用mysql之上,当某一台mysql宕机时,会将VIP迁移至其他my

mysql主主复制+keepalived 打造高可用mysql集群

为了响应公司需求,打造出更安全的mysql集群,能够实现mysql故障后切换,研究了几天终于有了成果,一起分享一下. 首先介绍一下这套集群方案实现的功能 1.mysql服务器故障后自动转移,修好后自动切回 2.mysql服务故障自动转移,修好后自动切回 3.可以实现在几秒钟内转移 以下内容均是实验环境,请根据实际情况修改响应参数 实验环境: mysql1 ip:10.1.1.20 mysql2  ip:10.1.1.21 mysql vip:10.1.1.25 三台机器均安装centos 6.5

【Postgresql】postgresql9.3.9版本基于流复制方式双机热备方案

系统环境:centos6.5数据库版本: postgres9.3.9虚拟机2台:Master:10.0.2.160Slave:10.0.2.69数据存储位置:/usr/local/pgsql/data/ 安装pgsql数据库 安装过程可参考我上一篇博客:http://blog.51cto.com/13632960/2117902 两台机器都需要安装完成,我在做热备的时候,Master数据库开启,Slave关闭. 创建流复制用户 Master端进入数据库并执行: CREATE USER repus