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安装

[root@pgpool opt]# yum install -y http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-redhat93-9.3-1.noarch.rpm
[root@pgpool opt]# yum install postgresql93-devel
[root@pgpool opt]# wget http://www.pgpool.net/download.php?f=pgpool-II-3.4.2.tar.gz
[root@pgpool opt]# mv download.php\?f\=pgpool-II-3.4.2.tar.gz pgpool-II-3.4.2.tar.gz
[root@pgpool opt]# tar -zxvf pgpool-II-3.4.2.tar.gz
[root@pgpool opt]# cd pgpool-II-3.4.2
[root@pgpool 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错误

[root@pgpool pgpool-II-3.4.2]# make
[root@pgpool pgpool-II-3.4.2]# make install
3.修改pgpool配置

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

[root@pgpool 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

[root@pgpool etc]# cp /usr/local/etc/pcp.conf.sample /usr/local/etc/pcp.conf
此文件是管理端口,可以暂时不用配置。

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

[root@pgpool 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

[root@pgpool etc]# pg_md5 -m -p -u postgres pool_passwd
password:
密码填的是123456,该文件会在执行文件后自动生成。从远程连接pgpool的时候,需要使用该密码来访问,pgpool使用该用户密码来访问后面的真正的数据库。

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

[root@pgpool 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;

[root@pgpool bin]# chmod 700 failover_stream.sh
对应的从库slave的recovery.conf配置:

[root@slave 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主机生成公钥和私钥

[root@pgpool 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 postgres@pgpool
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 postgres@172.16.0.241
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.242
在master节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.241
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.242 
在slave节点上执行

-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.241
-bash-4.1$ ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@172.16.0.242
  

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

5.启动pgpool

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

[root@pgpool etc]# mkdir /var/run/pgpool
[root@pgpool run]# chown -R postgres:postgres /var/run/pgpool
[root@pgpool local]# chown -R postgres:postgres /usr/local/etc
[root@pgpool 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主机检查

[root@slave ~]# 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

[root@slave ~]# 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是从节点。

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

[root@master 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 文件,否则会破坏主从架构,导致后面的实验失败。

转载于:https://www.cnblogs.com/gaoyuechen/p/10979204.html

pgpool-II 高可用搭建相关推荐

  1. SpringCloud注册中心高可用搭建

    转载自 SpringCloud注册中心高可用搭建 Spring Cloud的注册中心可以由Eureka.Consul.Zookeeper.ETCD等来实现,这里推荐使用Spring Cloud Eur ...

  2. spring boot配置ip_Spring Cloud 配置中心高可用搭建

    本文通过config server连接git仓库来实现配置中心,除了git还可以使用svn或者系统本地目录都行. 引入依赖 <dependencies><dependency> ...

  3. HADOOP 高可用搭建

    首先先说一下大概的步骤,就用四台为例,简单适合新手操作. 流程是:创建虚拟机,配置好:搭建linux系统:安装jdk(因为后面好多都依赖jkd):免密登录ssh:安装zookeeper:最后就是搭建高 ...

  4. Nginx反向代理,负载均衡,Redis集群 Twemproxy,redis session共享,keepalived高可用-搭建千万级网站系统

    Nginx反向代理,负载均衡,redis session共享,keepalived高可用-搭建千万级系统架构 1.安装Nginx 安装机器IP地址为: 192.168.91.129 (主) 192.1 ...

  5. pgpool-II + postgressql 集群高可用搭建(保姆级文档)

    文档背景:用公司集群实际搭建过程,用心整理文档. 文档目的:让更多的开发者避开坑点快速将集群搭建成功! 正文: 我们使用 CentOS 7.4 的 3 台服务器.让这些服务器为server1. ser ...

  6. 10-Flink集群的高可用(搭建篇补充)

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  7. MySql高可用搭建 + 读写分离 + 分库分表

    Mysql读写分离与分库分表 一.Mysql读写分离解决的问题 二.mysql处理请求运行流程 三.读写分离结构 四.读写分离产生场景 五.读写分离工具 5.1 MyCat 5.2 HAProxy 5 ...

  8. K8s 集群资源监控、高可用搭建、部署java项目 (下)

    目录 集群资源监控 监控指标和搭建方案 搭建监控平台(k8s部署) 部署守护进程 部署prometheus 部署Grafana 高可用k8s集群 系统初始化 master节点部署keepalived ...

  9. 阿里高可用mysql搭建方案_阿里云环境迁移记录 - MYSQL高可用搭建

    MYSQL高可用方案主要分为两大类,一类是前置管理,一类是后置管理. 前置管理的思想是利用各种前置管理工具,动态切换或者分发请求到不同的实例并切换master,如keepalived.MHA.pack ...

  10. Redis的主从复制与高可用搭建(哨兵模式)

    前言 为什么要使用Redis 首先我们先介绍些redis的基本概念,redis是Nosql数据库,是一个key-value存储系统.虽然redis是key-value的存储系统,但是redis支持的v ...

最新文章

  1. 错误笔记(1)——关于克隆虚拟机引发的后续问题
  2. 2019北京高考分数分布一览表(成绩分布统计)
  3. C语言数据结构(大话数据结构——笔记2)第四章:栈与队列
  4. Android--RxJava2更新体验
  5. vue+vant 移动端H5 商城项目_03
  6. 通过数据评估渠道用户质量的方法
  7. 设置超链接在各种状态改变的样式颜色
  8. 第三季-第3课-Coredump程序故障分析
  9. [转]Go语言中的make和new
  10. css布局的漂浮、position定位
  11. paip.c++ 开发 api 手册文档总结
  12. POJ 3083 Children of the Candy Corn(DFS + BFS)
  13. C++中回调(CallBack)的使用方法
  14. Mixly-数位计及1602屏亮度显示
  15. Python 五个知识点搞定作用域
  16. 有个程序猿很忧桑:一个命令rm -rf/ ,他把整个公司删没了...
  17. 输入数字,控制台打印输出大写,如:输入12 ,控制台打印输出:壹拾贰圆
  18. 微软认证70-541,70-542等考试试题(80%以上的题目是一样的)
  19. 百度js 检测输入法_不明恶意攻击致lt;搜狗搜索gt;lt;搜索结果gt;跳转lt;百度搜索gt;技术原理分析...
  20. golang力扣leetcode 2245.转角路径的乘积中最多能有几个尾随零

热门文章

  1. java pcm16位_Java – 将16位带符号的pcm音频数据数组转换为双数组
  2. microsoft visual c++ 编译c语言,Microsoft Visual C++ 程序的部署方法
  3. BZOJ1095: [ZJOI2007]Hide 捉迷藏(动态点分治)
  4. 织梦自定义表单地区联动类型不可用的解决办法
  5. 思科交换机的初始配置(使用telnet登录)
  6. 计算机科学速成课18:操作系统
  7. Linux命令kill和signal
  8. PHP版本选择讲解:VC6与VC9,Thread Safe与None-Thread Safe等的选择
  9. 诗与远方:无题(三十)- 凄凉缘空
  10. Android学习之自定义标题栏