pgpool 之四 2 pgpool + 2 postgresql 的 stream replication 模式

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/ctypyb2002/article/details/85629085

os: ubuntu 16.04
db: postgresql 9.6.8
pgpool: pgpool-II-3.7.7

pgpool 简介
准确的名字是Pgpool-II,这里简称为pgpool。pgpool 是介于postgresql 服务和 postgresql 客户端的中间件。它提供如下功能:
1、连接池
2、复制
3、负载均衡
4、限制超过限度的连接
5、并行查询

具有如下工作模式:
1、原始模式
2、连接池模式
3、复制模式
4、主/备模式
5、并行模式

虽然看上去功能强大,但是配置相对繁琐。

本次实验为 node1、node2 两台机器,每个节点上均安装了 postgresql 和 pgpool ,vip 为 192.168.56.100

规划如下:
192.168.56.100 nodevip #vip,pgpool的高可用连接
192.168.56.92 node1 #postgresql 9.6.8,pgpool
192.168.56.90 node2 #postgresql 9.6.8,pgpool

安装 postgresql 9.6.8

使用 apt install 方式安装 postgresql 9.6.8,并配置好 stream replication。
详细过程略

postgres=# \x
Expanded display is on.
postgres=# 
postgres=# select * from pg_stat_replication;

-[ RECORD 1 ]----+------------------------------
pid              | 7402
usesysid         | 16384
usename          | repl
application_name | walreceiver
client_addr      | 192.168.56.90
client_hostname  | 
client_port      | 50798
backend_start    | 2019-01-02 13:51:34.979528+08
backend_xmin     | 591
state            | streaming
sent_location    | 0/C000060
write_location   | 0/C000060
flush_location   | 0/C000060
replay_location  | 0/C000060
sync_priority    | 0
sync_state       | async

安装 pgpool

# vi /etc/sudoers
postgres ALL=(ALL:ALL) NOPASSWD:ALL

# chmod +s /sbin/ifconfig; chmod +s /sbin/ip; chmod +s /usr/sbin/arping; \
mkdir -p /usr/pgpool-3.7.7; chown -R postgres:postgres /usr/pgpool-3.7.7; \
mkdir -p /var/run/pgpool; chown -R postgres:postgres /var/run/pgpool; \
mkdir -p /var/log/pgpool; chown -R postgres:postgres /var/log/pgpool;

# echo "mkdir -p /var/run/pgpool" >> /etc/rc.local
# echo "chown -R postgres:postgres /var/run/pgpool" >> /etc/rc.local

# apt install make gcc libssl-dev libpam0g libpam0g-dev

# su - postgres
$ cd ~
$ wget http://www.pgpool.net/download.php?f=pgpool-II-3.7.7.tar.gz
$ tar -zxvf ./download.php\?f\=pgpool-II-3.7.7.tar.gz
$ cd pgpool-II-3.7.7
$ ./configure --prefix=/usr/pgpool-3.7.7 -with-pgsql=/usr/lib/postgresql/9.6 \
--with-pgsql-includedir=/usr/include/postgresql \
--with-pgsql-libdir=/usr/lib/postgresql/9.6/lib \
--with-openssl --with-pam
$ make 
$ make install

需要在所有的 postgresql server 节点上安装必要的 extension。
由于使用的是 apt install 方式,所以需要 root 权限 make install

$ cd ./src/sql
$ make
$ sudo make install

如果有额外的缺少包错误提示,按照错误提示安装就行了。

$ ls -l /usr/lib/postgresql/9.6/lib |grep -i pool
-rwxr-xr-x 1 root root  66672 Jan  2 11:23 pgpool_adm.so
-rwxr-xr-x 1 root root  46448 Jan  2 11:23 pgpool-recovery.so
-rwxr-xr-x 1 root root  30328 Jan  2 11:23 pgpool-regclass.so

$ ls -l /usr/share/postgresql/9.6/extension/ |grep -i pool
-rw-r--r-- 1 root root  2574 Jan  2 11:23 pgpool_adm--1.0.sql
-rw-r--r-- 1 root root   146 Jan  2 11:23 pgpool_adm.control
-rw-r--r-- 1 root root   407 Jan  2 11:23 pgpool_recovery--1.0--1.1.sql
-rw-r--r-- 1 root root   791 Jan  2 11:23 pgpool_recovery--1.0.sql
-rw-r--r-- 1 root root  1002 Jan  2 11:23 pgpool_recovery--1.1.sql
-rw-r--r-- 1 root root   178 Jan  2 11:23 pgpool_recovery.control
-rw-r--r-- 1 root root   557 Jan  2 11:23 pgpool-recovery.sql
-rw-r--r-- 1 root root   283 Jan  2 11:23 pgpool_regclass--1.0.sql
-rw-r--r-- 1 root root   152 Jan  2 11:23 pgpool_regclass.control
-rw-r--r-- 1 root root   142 Jan  2 11:23 pgpool-regclass.sql

pgpool 函数非必需安装,但强烈建议安装 pgpool_adm, pgpool_regclass, pgpool_recovery 函数 。
官方文档是这样说的 pgpool_adm is an extension and should be installed on all PostgreSQL servers

在 master 节点的 template1 数据库上创建 extension,这样以后新建的数据库都会有这些 pgpool 的扩展。

postgres=# select * from pg_available_extensions where name like '%pool%';
      name       | default_version | installed_version |                      comment                       
-----------------+-----------------+-------------------+----------------------------------------------------
 pgpool_recovery | 1.1             |                   | recovery functions for pgpool-II for V3.4 or later
 pgpool_adm      | 1.0             |                   | Administrative functions for pgPool
 pgpool_regclass | 1.0             |                   | replacement for regclass
(3 rows)

postgres=# \c template1

template1=# create extension pgpool_adm;
create extension pgpool_regclass;
create extension pgpool_recovery;


配置 postgres 的免密登录

$ ssh-keygen -t rsa
$ ssh-copy-id [email protected]
$ ssh-copy-id [email protected]

pgpool 的配置

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

pcp.conf

pcp.conf 用于管理查、看节点信息,如加入新节点。该文件主要是存储管理员的用户名及md5形式的密码。

$ cd /usr/pgpool-3.7.7/etc
$ cp pcp.conf.sample pcp.conf
$ ../bin/pg_md5 -u pgpool -p
password:
b4b8daf4b8ea9d39568719e1e320076f
$ ../bin/pg_md5 -u postgres -p
password:
7f5b916619bfc00bf19709bcfe544962

$ vi pcp.conf
pgpool:b4b8daf4b8ea9d39568719e1e320076f
postgres:7f5b916619bfc00bf19709bcfe544962

pool_hba.conf

pool_hba.conf 用于认证用户登录方式,如客户端IP限制等,类似于postgresql的pg_hba.conf文件。

$ cd /usr/pgpool-3.7.7/etc
$ cp pool_hba.conf.sample pool_hba.conf
$ vi pool_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
host    all         all         ::1/128               trust

host    all         all         192.168.56.1/32         md5
host    all         all         192.168.56.90/32        md5
host    all         all         192.168.56.92/32        md5
host    all         all         192.168.56.100/32       md5

最后几条是手动添加的。

pgpool.conf

pgpool.conf 用于设置pgpool的模式,主次数据库的相关信息等。

功能/模式 原始模式(*3) 复制模式 主/备模式 并行查询模式
连接池      X           O        O        O
复制        X           O        X       (*1)
负载均衡    X           O        O        (*1)
故障恢复    O           O        O        X
在线恢复    X           O       (*2)      X
并行查询    X           X        X        O
需要的
服务器数  1 或更多    2 或更多  2 或更多  2 或更多
是否需要
系统数据库  否          否       否        是

O 意味着“可用”, X 意味着“不可用 
(*1) 并行查询模式需要同时打开复制和负载均衡,但是复制和负载均衡无法用于并行查询模式中的分布式表。 
(*2) 在线恢复可以和流复制同时使用。 
(*3) 客户端仅仅是通过 pgpool-II 连接到 PostgreSQL 服务器。这种模式仅仅用于限制到服务器的连接数,或者在多台机器上启用故障恢复。
$ cd /usr/pgpool-3.7.7/etc
$ cp pgpool.conf.sample-stream pgpool.conf
$ vi pgpool.conf
#------------------------------------------------------------------------------
# 监听配置
#------------------------------------------------------------------------------
listen_addresses = '*'
port = 9999
socket_dir = '/tmp'
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
#------------------------------------------------------------------------------
# 后端数据库
#------------------------------------------------------------------------------
backend_hostname0 = '192.168.56.92'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/data/pg9.6/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'
#------------------------------------------------------------------------------
# 后端数据库
#------------------------------------------------------------------------------
backend_hostname1 = '192.168.56.90'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/data/pg9.6/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'
#------------------------------------------------------------------------------
# 认证方式
#------------------------------------------------------------------------------
enable_pool_hba = on
pool_passwd = 'pool_passwd'
authentication_timeout = 60
ssl = off
#------------------------------------------------------------------------------
# 连接池配置
#------------------------------------------------------------------------------
num_init_children = 32
max_pool = 4
child_life_time = 300
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0
#------------------------------------------------------------------------------
# 日志配置
#------------------------------------------------------------------------------
log_destination = 'syslog'
log_line_prefix = '%t: pid %p: '   # printf-style string to output at beginning of each log line.
log_connections = on
log_hostname = on
log_statement = off
log_per_node_statement = off
log_standby_delay = 'if_over_threshold'
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'
log_error_verbosity = verbose
#------------------------------------------------------------------------------
# pid信息
#------------------------------------------------------------------------------
pid_file_name = '/var/run/pgpool/pgpool.pid'
logdir = '/tmp'
#------------------------------------------------------------------------------
# pgpool 连接池
#------------------------------------------------------------------------------
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
#------------------------------------------------------------------------------
# pgpool 工作模式
#------------------------------------------------------------------------------
replication_mode = off
load_balance_mode = on
master_slave_mode = on
master_slave_sub_mode = 'stream'
#------------------------------------------------------------------------------
# stream 检测
#------------------------------------------------------------------------------
sr_check_period = 5
sr_check_user = 'repl'
sr_check_password = 'replrepl'
sr_check_database = 'postgres'
delay_threshold = 10000000
follow_master_command = ''
#------------------------------------------------------------------------------
# health check 健康检测
#------------------------------------------------------------------------------
health_check_period = 5
health_check_timeout = 20
health_check_user = 'postgres'
health_check_password = 'postgrespostgres'
health_check_database = 'postgres'
#------------------------------------------------------------------------------
# failover and failback
#------------------------------------------------------------------------------
failover_command = '/data/pg9.6/main/pgpool_failover_stream.sh %d %H %P'
failback_command = '/bin/rm –f /tmp/postgresql.trigger.5432'
search_primary_node_timeout = 60
#------------------------------------------------------------------------------
# online recovery
#------------------------------------------------------------------------------
recovery_user = 'postgres'
recovery_password = 'postgrespostgres'
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 600
client_idle_limit_in_recovery = 0
#------------------------------------------------------------------------------
# WATCHDOG
#------------------------------------------------------------------------------
use_watchdog = on
ping_path = '/bin'
wd_hostname = '192.168.56.92'
wd_port = 9000
#------------------------------------------------------------------------------
# WATCHDOG vip
#------------------------------------------------------------------------------
delegate_IP = '192.168.56.100'
if_cmd_path = '/sbin'
#if_up_cmd = 'ifconfig eno1:1 inet $_IP_$ netmask 255.255.255.0'
#if_down_cmd = 'ifconfig eno1:1 down'
if_up_cmd = 'ip addr add $_IP_$/24 dev eno1 label eno1:1'
if_down_cmd = 'ip addr del $_IP_$/24 dev eno1 label eno1:1'
arping_path = '/usr/sbin'
arping_cmd = 'arping -q -A -c 1 -I eno1:1 $_IP_$ '
#------------------------------------------------------------------------------
# WATCHDOG heartbeat mode
#------------------------------------------------------------------------------
wd_heartbeat_port = 9694
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
heartbeat_destination0 = '192.168.56.90'
heartbeat_destination_port0 = 9694
heartbeat_device0 = 'eno1'
#------------------------------------------------------------------------------
# Other pgpool Connection Settings
#------------------------------------------------------------------------------
other_pgpool_hostname0 = '192.168.56.90'
other_pgpool_port0 = 9999
other_wd_port0 = 9000


另外一个节点的 pgpool.conf 酌情改动

pool_passwd

pool_passwd 用于保存 postgresql 用户名及md5密码。

$ cd /usr/pgpool-3.7.7/etc
$ ../bin/pg_md5 -u postgres -p -m

pgpool 环境变量

# vi /etc/profile
PATH=/usr/pgpool-3.7.7/bin:$PATH

至此,安装完毕。

几个有用的脚本
pgpool_failover_stream.sh

$ vi /data/pg9.6/main/pgpool_failover_stream.sh

#!/bin/bash

failed_node=$1
new_master=$2
old_primary_node_id=$3
trigger_command="/usr/lib/postgresql/9.6/bin/pg_ctl promote -D /data/pg9.6/main"

if [ $failed_node = $old_primary_node_id ]; then
   echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` pgpool: FATAL: [$failed_node,$new_master,$trigger_command] will failover,please check immediate"
   /usr/bin/ssh -T $new_master $trigger_command
else
   echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` pgpool: FATAL: [$failed_node,$new_master,$trigger_command] postgresql slave is down,please check immediate"
fi

exit 0;

pgpool_remote_start

$ vi /data/pg9.6/main/pgpool_remote_start

#! /bin/sh

if [ $# -ne 2 ]
then
    echo "pgpool_remote_start remote_host remote_datadir"
    exit 1
fi

DEST=$1
DESTDIR=$2
PGCTL=/usr/lib/postgresql/9.6/bin/pg_ctl

echo "`date +%Y-%m-%d\ %H:%M:%S,%3N` pgpool: FATAL: pgpool_remote_start /usr/bin/ssh -T $DEST $PGCTL -w -D $DESTDIR start"
/usr/bin/ssh -T $DEST $PGCTL -w -D $DESTDIR start 2>/dev/null 1>/dev/null < /dev/null &

参考:
http://www.pgpool.net/mediawiki/index.php/Downloads
http://www.pgpool.net/docs/latest/en/html/index.html

猜你喜欢

转载自blog.csdn.net/ctypyb2002/article/details/85629085