pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool

用 repmgr实现 pg的master/slave 搭建高可用和自动切换过程略

(详见htthttps://blog.csdn.net/zhaowenzhong/article/details/80774004

ps://blog.csdn.net/zhaowenzhong/article/details/80774568

https://blog.csdn.net/zhaowenzhong/article/details/80774619)

本文章相对简单,只是利用pgpool实现 负载均衡+缓冲池

 

version:pgpool-II 4.0.4

http://www.pgpool.net/docs/latest/en/html/index.html

对于每个Pgpool-II操作模式,都有样本配置。

pgpool-II的工作模式有

这些模式相互独占,启动服务器后无法更改。您应该在设计系统的早期阶段做出决定。如果您不确定,建议使用流式复制模式.

在任何模式下,Pgpool-II都提供连接池,自动故障转移和在线恢复

 

原始模式:

    只实现一个故障切换功能,可以配置多个后端数据库,当第一个后端数据库不能工作时,pgpool-II会自动切换到第二个后端数据库,以此类推。该模式下无法进行负载均衡

 

复制模式:

    此模式下,实现了同步复制功能,实际上就是把修改数据库的操作分发到后端所有数据库上处理,而只读查询则发送给任意一台数据库,此模式下还实现了负载均衡的功能

     优点:

                1、复制是同步是,不存在最终一致性问题。

                2、自动 Failover。

                3、读可以负载均衡。

                4、可以在线恢复,不需要停止pgpool-II,就可以在线修复或增加一个后端数据库节点。

                5、配置容易。

    缺点:

                1、写性能不好,有30%的写性能下降。

                2、不支持部分查询。如随机函数、序列号,直接在不同的后端数据库上执行SQL,将产生不同的结果。

 

主/备模式

        此模式下,使用其他软件完成实际的数据复制(比如 slony-I(被流式淘汰了),流复制中间层使用pgpool-II式),pgpool-II主要提供高可用和连接池功能。在该模式中,DDL和DML操作在主节点上执行,select可以在主备节点上执行,也可以强制select在主节点上执行。但这需要在SELECT 语句前添加 /*NO LOAD BALANCE*/ 注释。 不建议使用该模式

        优点:

                1、写性能较好,只有10%到20%的性能下降。

                2、自动 Failover。

                3、读可以负载均衡。

        缺点:

                1、复制是异步的;

                2、不支持大对象的复制,如果使用了slony-I实现主/备模式,不能实现DDL的复制。

                3、配置复杂

并行模式:

    本模式实现了查询的并行执行。表可以被分割,数据分布在每个节点中。而且,复制和负载均衡功能也可以同时使用并行模式和主/备模式不能同步使用。

 

操作模式

配置文件名

流复制模式(推荐使用pgpool-II的最佳方式)

pgpool.conf.sample-stream

复制模式(本地复制模式)

pgpool.conf.sample-replication

主从模式

pgpool.conf.sample-master-slave

原始模式

pgpool.conf.sample

用户名及密码文件

pcp.conf.sample

pgpool-II认证配置文件

pool_hba.conf.sample

pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool_第1张图片

这些配置文件位于/usr/local/etc,默认安装源代码

在配置之前,强烈建议 拷贝一份模板出来并重命名,再最重命名后的文件进行配置。

 

启动 pgpool-II前 强烈建议 先配置 pcp.conf 和 pool_hba.conf  pgpool.conf 

 

[root@vlnx107001 pgpool-II-10]# cp /etc/pgpool-II-10/pcp.conf.sample /etc/pgpool-II-10/pcp.conf

[root@vlnx107001 pgpool-II-10]# cp /etc/pgpool-II-10/pgpool.conf.sample /etc/pgpool-II-10/pgpool.conf

[root@vln x107001 pgpool-II-10]# cp /etc/pgpool-II-10/pool_hba.conf.sample /etc/pgpool-II-10/pool_hba.conf

 

 

pgpool-II的管理接口名为PCP,可通过网络获取数据库的节点信息,并且可以关闭pgpool-II等。要使用PCP命令必须进行用户认证,该种认证不同于PostgreSQL的用户认证。它需。要在pcp.conf文件中定义一个永和密码。在该文件中 用户名和密码是成对出现在每一行中,它们用冒号(:)隔开,密码的格式是md5哈希加密。密码可以使用 pg_md5 your_passwd 加密,然后将your_passwd 密码加密后的串 保存到文件中。

pg_md5 是 pgpool-II提供的一个工具。

也可以通过 

postgres=# select usename,passwd from pg_shadow;

postgres=# select rolname,rolpassword from pg_authid;

获取

pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool_第2张图片

vim  pcp.conf (用 pg_md5生成的hash密码串)

zhaowz:2aaccca61f2099744a57e9fbe6b9db56

liuj:2aaccca61f2099744a57e9fbe6b9db56

vim  pgpool.conf

详见  http://www.pgpool.net/docs/latest/en/html/runtime-config.html 

服务器

角色

vlnx107001    172.31.107.1

 master

vlnx107002    172.31.107.2

slave

vlnx107001  172.31.107.254

VIP

vlnx107001    172.31.107.1

pgpoo-II Master

vlnx107002   172.31.107.2

pgpoo-II Slave

 

 

mkdir /var/lib/pgsql/pgpool

mkdir /var/run/pgpool-II-10

touch /etc/pgpool-II-10/pool_passwd

mkdir /var/log/pgpool-II-10

touch /var/log/pgpool-II-10/pgpool.log

 

vim /etc/rsyslog.conf

*.info;mail.none;authpriv.none;cron.none;LOCAL1.none    /var/log/messages

LOCAL1.*                                                /var/log/pgpool-II-10/pgpool.log

vim /etc/logrotate.d/syslog

/var/log/pgpool-II-10/pgpool.log

systemctl restart rsyslog

 

firewall-cmd --zone=public --add-port=5432/tcp --permanent

firewall-cmd --zone=public --add-port=9999/tcp --permanent

firewall-cmd --zone=public --add-port=9898/tcp --permanent

firewall-cmd --zone=public --add-port=9000/tcp --permanent

firewall-cmd --zone=public --add-port=9694/tcp --permanent   

firewall-cmd --reload

或者

firewall-cmd --permanent --zone=public --add-port=9999/tcp --add-port=9898/tcp --add-port=9000/tcp  --add-port=9694/tcp

firewall-cmd --permanent --zone=public --add-port=9999/udp --add-port=9898/udp --add-port=9000/udp  --add-port=9694/udp

firewall-cmd --reload

 

vim  /etc/pgpool-II-10/pcp.conf

postgres:e8a48653851e28c69d0506508fb27fc5

zhaowz:2aaccca61f2099744a57e9fbe6b9db56

liuj:2aaccca61f2099744a57e9fbe6b9db56

 

vim /etc/pgpool-II-10/pool_hba.conf

# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD

host    all         all         0.0.0.0/0                md5

local   all         all                               trust

 

vim    /etc/pgpool-II-10/pgpool.conf

#connections

list_addresses = *

port = 9999

socket_dir = '/var/run/pgpool-II-10/'

pcp_listen_addresses=  *

pcp_port =9898

pcp_socket_dir = '/var/run/'

num_init_children = 16

#authentication

enable_pool_hba = on

pool_passwd = 'pool_passwd'

allow_clear_text_frontend_auth = false

authentication_timeout =60

#backend connection

backend_hostname0 = '172.31.107.1'

backend_port0 = 5432

backend_weight0 = 1

backend_data_directory0 = '/var/lib/pgsql/10/data'

backend_flag0 = 'ALLOW_TO_FAILOVER'

backend_hostname1 = '172.31.107.2'

backend_port1 = 5432

backend_weight1 = 1

backend_data_directory1 = '/var/lib/pgsql/10/data'

log_destination = 'syslog,stderr'

syslog_facility = 'LOCAL1'

pid_file_name = '/var/lib/pgsql/pgpool/pgpool.pid'

logdir = '/var/lib/pgsql/pgpool'

log_per_node_statement = on

log_line_prefix = '%a:pid %p:%d:%u:%t'

master_slave_mode = on

master_slave_sub_mode = 'stream'

replication_mode = off

load_balance_mode =on

ignore_leading_white_space = on

allow_sql_comments = off

failover_command = '/var/lib/pgsql/pgpool/failover.sh'

# failback   恢复脚本必须放在$PGDATA目录下。恢复过程的俩个脚本不要写具体路径,因为恢复脚本都放在$PGDATA目录下

backend_flag1 = 'ALLOW_TO_FAILOVER'

recovery_user = 'postgres'

recovery_password = 'postgres'

recovery_1st_stage_command = 'recovery_1st_stage'

recovery_2nd_stage_command = 'recovery_2nd_stage'

recovery_timeout = 3600 

client_idle_limit_in_recovery = -1

#watchdog health check

use_watchdog = on

wd_ipc_socket_dir = /var/lib/pgsql/pgpool/

wd_interval = 10

wd_lifecheck_method = 'heartbeat'

wd_hostname = '172.31.107.1'

wd_heartbeat_port = 9694

wd_port = 9000

wd_heartbeat_keepalive = 2

wd_heartbeat_deadtime = 30

heartbeat_destination0 = '172.31.107.2'

heartbeat_destination_port0 = 9694

# method 为 query时适用

#wd_life_point = 3

#wd_lifecheck_query = 'SELECT 1'

#wd_lifecheck_dbname = 'postgres'

#wd_lifecheck_user = 'postgres'

#wd_lifecheck_password = 'postgres'

#watchdog server configuration

other_pgpool_hostname0 = '172.31.107.2'

other_pgpool_port0 = 9999

other_wd_port0 = 9000

 

sr_check_user = 'postgres'

sr_check_password = 'postgres'

sr_check_database = 'postgres'

health_check_user0 = 'postgres'

health_check_password0 = 'postgres'

health_check_database0 = 'postgres'

health_check_period0 = 2

health_check_timeout0 = 20

delegate_IP = '172.31.107.254'

ifconfig_path = '/sbin'

if_up_cmd = 'ifconfig eth0:1 inet $_IP_$ netmask 255.255.0.0  broadcast 172.31.255.255 up'

if_down_cmd = 'ifconfig eth0:1 down'

arping_path = '/usr/sbin'

arping_cmd = 'arping -U $_IP_$ -w 1'

#pgpool

connection_cache = on

max_pool = 20

listen_backlog_multiplier = 2

child_life_time = 180

client_idle_limit = 180

reset_query_list ='ABORT'

 

vim /etc/pgpool-II-10/pool_passwd

postgres:md53175bce1d3201d16594cebf9d7eb3f9d

zhaowz:md53a496d6e74bee0f18abc9b540d422797

liuj:md5ccb9d6a00145aa2001304cebd847d550

配置 hba

pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool_第3张图片

pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool_第4张图片

开启pgpool

[root@vlnx107001 pgpool-II-10]#pgpool

停止 pgpool

[root@vlnx107001 pgpool-II-10]# pgpool stop

重新加载 pgpool

[root@vlnx107001 pgpool-II-10]# pgpool reload

连接 

[zhaowzh@vlnx107001 ~]$ psql -h 127.0.0.1 -p 9999 -Upostgres -d postgres

pgpool-II(二)pgpool-II+repmgr(master/slave)+balance+pgpool_第5张图片

 

后期的维护工作细节,网上很多博客和官方网站都有详细介绍。这里就不再一一罗列了。

http://www.pgpool.net/docs/latest/en/html/index.html

你可能感兴趣的:(Postgresql,PG-高可用)