pgpool-II主备流复制的架设

1.环境

OS:  CentOS release 6.4 (Final)
DB: postgresql 9.3.6
pgpool服务器: pgpool 172.16.0.240
数据库主服务器:master 172.16.0.241
数据库从服务器:slave  172.16.0.242 

其中主从数据库使用的流复制,并且已经配置完毕,新配置的pgpool使用postgres用户进行管理。新架构使用的主备模式外加流复制,此架构支持流复制、负载均衡、故障恢复,不支持复制和并行查询,主库可以支持读写,从库只读。

2.pgpool安装

[[email protected] opt]# yum install -y http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm
[[email protected] opt]# yum install postgresql93-devel
[[email protected] opt]# wget http://www.pgpool.net/download.php?f=pgpool-II-3.4.2.tar.gz
[[email protected] opt]# mv download.php\?f\=pgpool-II-3.4.2.tar.gz pgpool-II-3.4.2.tar.gz
[[email protected] opt]# tar -zxvf pgpool-II-3.4.2.tar.gz
[[email protected] opt]# cd pgpool-II-3.4.2
[[email protected] pgpool-II-3.4.2]# ./configure --with-pgsql=/usr/pgsql-9.3

如果不加--with-pgsql=/usr/pgsql-9.3,可能会出现configure: error: libpq is not installed or libpq is old错误

[[email protected] pgpool-II-3.4.2]# make
[[email protected] pgpool-II-3.4.2]# make install

3.修改pgpool配置

启用并修改配置文件pgpool.conf

[[email protected] etc]# cp /usr/local/etc/pgpool.conf.sample-stream /usr/local/etc/pgpool.conf

修改pgpool.conf文件中的内容

# - pgpool Communication Manager Connection Settings -
listen_addresses = ‘*‘

---默认0是主库,其它是从库,backend_weight可以控制数据库读在两台机器上的分配比例

# - Backend Connection Settings -
backend_hostname0 = ‘172.16.0.241‘
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = ‘/var/lib/pgsql/9.3/data‘
backend_flag0 = ‘ALLOW_TO_FAILOVER‘

backend_hostname1 = ‘172.16.0.242‘
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = ‘/data1‘
backend_flag1 = ‘ALLOW_TO_FAILOVER‘
backend_data_directory0 = ‘/var/lib/pgsql/9.3/data‘

# - Authentication -

---开启pgpool的hba认证

enable_pool_hba = on
#------------------------------------------------------------------------------
# MASTER/SLAVE MODE
#------------------------------------------------------------------------------
sr_check_user = ‘postgres‘
sr_check_password = ‘123456‘

#------------------------------------------------------------------------------
# HEALTH CHECK
#------------------------------------------------------------------------------

health_check_period = 1
health_check_user = ‘postgres‘
health_check_password = ‘123456‘

#------------------------------------------------------------------------------
# FAILOVER AND FAILBACK
#------------------------------------------------------------------------------

---用来在主库失败时,把只读的从库切为主库

failover_command = ‘/usr/local/bin/failover_stream.sh %d %H /tmp/trigger_file0‘

启用并修改配置文件pcp.conf

[[email protected] etc]# cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf

此文件是管理端口,可以暂时不用配置。

启用并修改配置文件pool_hba.conf

[[email protected] etc]# cp /usr/local/etc/pool_hba.conf.sample /usr/local/etc/pool_hba.conf
---添加一行:
host    all         all         172.16.0.0/24   md5
---删除一行
host    all         all         127.0.0.1/32          trust

对pgpool的访问策略,要设置为md5的方式。

启用配置文件pool_passwd

[[email protected] etc]# pg_md5 -m -p -u postgres pool_passwd
password:

密码填的是123456,该文件会在执行文件后自动生成。从远程连接pgpool的时候,需要使用该密码来访问,pgpool使用该用户密码来访问后面的真正的数据库。

添加主备脚本切换脚本failover_stream.sh

[[email protected] bin]# vi /usr/local/bin/failover_stream.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;

[[email protected] bin]# chmod 700 failover_stream.sh

对应的从库slave的recovery.conf配置:

[[email protected] data]# cat recovery.conf
standby_mode = ‘on‘
primary_conninfo = ‘host=172.16.0.241 port=5432 user=rep_user‘
trigger_file = ‘/tmp/trigger_file0‘

该trigger_file的参数要和pgpool.conf文件中failover_command对应的文件保持一致。

4.设置主机互信

修改hosts文件

对每个主机的/etc/hosts文件添加以下内容,

172.16.0.240 pgpool
172.16.0.241 master
172.16.0.242 slave

pgpool主机生成公钥和私钥

[[email protected] bin]# su - postgres
-bash-4.1$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/var/lib/pgsql/.ssh/id_rsa):
Created directory ‘/var/lib/pgsql/.ssh‘.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /var/lib/pgsql/.ssh/id_rsa.
Your public key has been saved in /var/lib/pgsql/.ssh/id_rsa.pub.
The key fingerprint is:
a0:93:d4:b5:ed:26:d0:94:a5:e7:99:95:6b:d6:18:af [email protected]
The key‘s randomart image is:
+--[ RSA 2048]----+
|        oo.      |
|     . +.+   .   |
|    . + + o +    |
|   . o o + + *   |
|    +   S * = o  |
|     .   o o .   |
|            E    |
|                 |
|                 |
+-----------------+

输入命令后一直回车即可。在master和slave节点同样执行上面的操作。

同步公钥

在pgpool节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

在master节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected] 

在slave节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

  

上面的操作执行后,在每个机器检查一下,是否可以用ssh [email protected]的方式,对其他节点进行免密码的ssh访问,第一次访问的时候会记录known_hosts,否则ssh时候会有是否信任节点的提示。

5.启动pgpool

使用postgres用户启动pgpool服务的话,需要修改对应目录的权限,否则pgpool会启动失败

[[email protected] etc]# mkdir /var/run/pgpool
[[email protected] run]# chown -R postgres:postgres /var/run/pgpool
[[email protected] local]# chown -R postgres:postgres /usr/local/etc
[[email protected] local]# chown -R postgres:postgres /usr/local/bin

  

检验主从数据库切换的脚本是否可以正常运行,在pgpool服务器执行命令,检测在slave服务器是否生成了trigger_file0文件

shell脚本在pgpool执行

-bash-4.1$ /usr/local/bin/failover_stream.sh 0 slave /tmp/trigger_file0

切换到slave主机检查

[[email protected] ~]# ls /tmp
ssh-rangWC1783  trigger_file0  yum.log 

启动pgpool

-bash-4.1$ pgpool -n -d > /tmp/pgpool.log 2>&1 &
[1] 10474  

6.检测pgpool功能

任一节点(如slave节点)连接pgpool

[[email protected] ~]# psql -h 172.16.0.240 -p 9999 -d test -U postgres
Password for user postgres:
psql (9.3.6)
Type "help" for help.

test=# select * from t4;
 id
----
  1
(1 row)

test=# show pool_nodes;
 node_id |   hostname   | port | status | lb_weight |  role
---------+--------------+------+--------+-----------+---------
 0       | 172.16.0.241 | 5432 | 2      | 0.500000  | primary
 1       | 172.16.0.242 | 5432 | 2      | 0.500000  | standby
(2 rows)

可以看到此时241数据库是主节点,242是从节点。

关闭主要节点,可以关闭服务也可以直接杀进程模拟数据库崩溃

[[email protected] data]# service postgresql-9.3 stop
Stopping postgresql-9.3 service: [  OK  ]
  
---master关闭后,从节点的连接中断后又成功连接上

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.
test=# show pool_nodes;
 node_id |   hostname   | port | status | lb_weight |  role
---------+--------------+------+--------+-----------+---------
 0       | 172.16.0.241 | 5432 | 3      | 0.500000  | standby
 1       | 172.16.0.242 | 5432 | 2      | 0.500000  | primary

test=# insert into t4 values (6);
INSERT 0 1
test=# select * from t4;
 id
----
  1
  6
(2 rows)

test=#  

pgpool发生主从切换后,242节点变为主节点,241节点关闭(status为3)。

上面查询show pool_nodes中得status字段含义

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

可以看到主备已经切换完成。

7.其它注意事项

    • 若pgpool上的主从切换脚本忘记写,或者没能正常执行,show pool_nodes命令会显示两个节点都是standby,而集群整体是只读的,此时可以关闭并启动节点的数据库服务,然后重启pgpool。
    • 测试trigger文件的时候,注意要及时删除生成的trigger 文件,否则会破坏主从架构,导致后面的实验失败。
时间: 2024-11-09 21:23:15

pgpool-II主备流复制的架设的相关文章

PostgreSQL使用pg_basebackup搭建主备流复制环境

今天用pg_basebackup搭建了主备流复制环境,操作流程很简单,可在线操作,相当方便. 环境均为CentOS6.6 + postgresql9.4,我用已安装的库做测试,端口不一致,不影响环境搭建,但要注意某些相关配置: 主:192.168.3.201 port:5431 备:192.168.3.202 port:5432 数据库安装过程省略.可参考 http://blog.csdn.net/baiyinqiqi/article/details/45560229 主库参数配置postgre

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

请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间【转】

本文来自:http://www.woqutech.com/?p=1116 MySQL 本身通过 show slave status 提供了 Seconds_Behind_Master ,用于衡量主备之间的复制延迟,但是 今天碰到了一个场景,发现 Seconds_Behind_Master 为 0 , 备库的 show slave status 显示IO/SQL 线程都是正常的 , MySQL 的主库上的变更却长时间无法同步到备库上.如果没有人为干预,直到一个小时以后, MySQL 才会自动重连主

请不要用SECONDS_BEHIND_MASTER来衡量MYSQL主备的延迟时间

链接:http://www.woqutech.com/?p=1116 MySQL 本身通过 show slave status 提供了 Seconds_Behind_Master ,用于衡量主备之间的复制延迟,但是今天碰到了一个场景,发现 Seconds_Behind_Master 为 0 , 备库的 show slave status 显示 IO/SQL 线程都是正常的 , MySQL 的主库上的变更却长时间无法同步到备库上.如果没有人为干预,直到一个小时以后,MySQL 才会自动重连主库,继

PGPool-II+PG流复制实现HA主备切换

基于PGPool的双机集群如下图所示:pg主节点和备节点实现流复制热备,pgpool1,pgpool2作为中间件,将主备pg节点加入集群,实现读写分离,负载均衡和HA故障自动切换.两pgpool节点可以委托一个虚拟ip节点作为应用程序访问的地址,两节点之间通过watchdog进行监控,当pgpool1宕机时,pgpool2会自动接管虚拟ip继续对外提供不间断服务. 1. 主机规划 192.168.20.201 redis01 192.168.20.202 redis02 192.168.20.2

PostgreSQL数据库Streaming Replication流复制主备延迟测试

PostgreSQL数据库流复制主库和备库之间的延迟时间是多少,无论对HA还是负载均衡来说都应该做个评估.比如单纯的HA架构,当主库发生故障时,我们允许多少时间内的数据丢失.不废话,直接进入本次实验测试. 测试环境: 主库:内存:32G,CPU:8核,IP:192.168.122.101 备库:内存:32G,CPU:8核,IP:192.168.122.102 数据库配置:默认 测试准备: 在两台服务器上安装好PostgreSQL数据库,安装过程不清楚的可以参考文章<PostgreSQL数据库编译

Postgresql流复制+pgpool实现高可用

pgpool 概述 pgpool-II 是一个位于 PostgreSQL 服务器和 PostgreSQL 数据库客户端之间的中间件,它提供以下功能:连接池.复制.负载均衡.限制超过限度的连接以及并行查询.文档在此. 四种模式 O 意味着“可用”, X 意味着“不可用(1) 并行查询模式需要同时打开复制和负载均衡,但是复制和负载均衡无法用于并行查询模式中的分布式表.(2) 在线恢复可以和流复制同时使用.(*3) 客户端仅仅是通过 pgpool-II 连接到 PostgreSQL服务器.这种模式仅仅

redis演练(6) redis复制(主备模式)

redis是一款面向分布式的Nosql产品,天生对主备模式有很好的支持,而且配置一套完整的主备模式,非常简单.针对redis,主备模式配置非常简单,但线上意义重大. 主要内容 1.CAP理论 2.简单redis的复制原理 3.redis replaction相关配置参数解析 4.配置星型模型主备模式 5.配置有向无欢模型主备模式 1.研磨redis的复制与集群概念 redis的复制与集群,刚开始我把两者闹了个误会,在不断深入学习过程中及时改正了. 简单区分一下. redis复制:可以理解为把re

mysql+mycat搭建稳定高可用集群,负载均衡,主备复制,读写分离

主要思路 测试环境 实现mysql主备复制 配置A主mysql 配置B备mysql 验证同步配置结果 验证是否同步 关闭B备mysql的同步,验证读写分离 实现读写分离 安装mycat 配置mycat 启动mycat 测试读写分离 验证是否同步 关闭B备mysql的同步,验证读写分离 数据库性能优化普遍采用集群方式,oracle集群软硬件投入昂贵,今天花了一天时间搭建基于mysql的集群环境. 主要思路 简单说,实现mysql主备复制-->利用mycat实现负载均衡. 比较了常用的读写分离方式,