用 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 |
这些配置文件位于/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;
获取
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
[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
后期的维护工作细节,网上很多博客和官方网站都有详细介绍。这里就不再一一罗列了。
http://www.pgpool.net/docs/latest/en/html/index.html