1 环境准备
软件
CentOS 7.6
PGPool 4.1.0
PostgreSQL11.7
节点
node1: pgsql_1_ip : pgsql主库:数据节点1
node2: pgsql_2_ip : pgsql从库:数据节点2
node2: pgsql_3_ip : pgsql从库:数据节点3
VIP pgpool所需的浮动ip,自定义,与上节点同网段
配置信息1 2 3 4 5 6 7 8 9 10 11 12 13 14 PostgreSQL Port:18083 PgPool port:18999 数据库主账号 app/ 健康检查\PCP的用户 pgpool1/pgpool1 同步复制账号:replica/replica-vcredit 目录结构: /data/pgsql11/data /data/pgsql11/bakFile /data/pgsql11/bakFile/logicBackUp /data/pgsql11/bakFile/physicsBakUp /data/pgsql11/bakFile/pg_archive /data/logs/pgsql11 /data/logs/pgpool/
注
模板配置文件:http://112.25.66.177:10080/postgresql/conf/ 此目录下的文件是从模板配置中做初步修改后的,下文 【模板配置文件修改项:】中内容即指此文件需要修改的地方
2 建立ssh互信
创建SSH互信 通过ssh互信,在pgpool集群中,一旦存在pgpool服务器或者postgreSql发生切换,可免密连接。配置步骤如下: 注意:ssh互信需要在pgsql的启动用户下创建
在三个服务器中cd ~/.ssh/ 进入.ssh目录
执行 ssh-keygen -t rsa
生成秘钥,一路回车即可
查看秘钥 ls,其中 id_rsa.pub
为公钥,用于加密,id_rsa
为私钥用于解密
将node1的公钥id_rsa.pub中的内容拷贝到node2的authorized_keys认证文件中,则可在node2上免密连接到node1,完成三个服务器的相互免密登录则需要将本机的id_rsa.pub内容分别放入其余机器的authorized_keys认证文件中
第一次ssh登录时需要输入yes,再次访问时即可免密码登录。第一次连接时会问你是否连接,点击yes就可以了。下次登录就不会再提示了。先在node1上测试连接node2:直接用命令ssh pgsql_2_ip连接。三个环境均需相互测试
注意在ssh连接后,会连接至另一服务器上,此时需要通过exit命令退出再进行测试连接
3 PostGreSQL一主两从搭建 3.1 安装 以下操作三台机器均需配置
在线安装1 2 3 sudo yum install -y https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
离线安装1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 mkidr /data/packages cd /data/packageswget http://112.25.66.177:10080/postgresql/rely/pgsqlSource.tar.gz tar -zxvf pgsqlSource.tar.gz yum install -y createrepo createrepo /data/packages/pgsql/ vim /etc/yum.repos.d/pg.repo [pg] name=pg baseurl=file:///data/packages/pgsql enable =1gpgcheck=0 priority=1 yum clean all yum makecache yum -y install postgresql11 yum install -y postgresql11-devel postgresql11-server yum install -y postgis25_11-client.x86_64 postgis25_11.x86_64
初始化配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 sudo vim /etc/profile export PGSQL_HOME=/usr/pgsql-11export PATH=$PATH :$PGSQL_HOME /binsource /etc/profilemkdir -p /data/pgsql11/ chown -R app:app /data mkdir -p /data/logs/pgsql11 touch /data/logs/pgsql11/pgsql.log mkdir /data/logs/pgpool/ chown -R app:app /var/run/postgresql mkdir -p /data/pgsql11/bakFile/pg_archive
3.2 主服务器配置
主库初始化1 2 initdb -D /data/pgsql11/data
配置文件 /data/pgsql11/data/pg_hba.conf 该文件用于设置pgsql用户登录认证方式 模板配置文件修改项:IP地址 1 2 3 4 5 6 7 8 9 10 11 12 host replication replica pgsql_1_ip/32 md5 host replication replica pgsql_2_ip/32 md5 host replication replica pgsql_3_ip/32 md5 host all all pgsql_1_ip/32 trust host all all pgsql_2_ip/32 trust host all all pgsql_3_ip/32 trust host all all 0.0.0.0/0 md5
配置文件 /data/pgsql11/data/postgresql.conf 模板配置文件修改项:无1 2 3 4 5 6 7 8 listen_addresses = ‘*’ archive_mode = on archive_command = ‘mv %p /data/pgsql11/bakFile/pg_archive/%f’ wal_level = hot_standby max_wal_senders = 32 wal_sender_timeout = 60s wal_keep_segments = 10240 max_connections = 100
启动数据库
1 2 3 4 5 6 7 8 9 10 pg_ctl -D /data/pgsql11/data -l /data/logs/pgsql11/pgsql.log start psql -h pgsql_1_ip -p 18083 -d postgres CREATE USER replica WITH PASSWORD 'replica-vcredit' REPLICATION; CREATE USER pgpool1 WITH PASSWORD 'pgpool1' ; ALTER USER app WITH PASSWORD 'passwd' ;
3.3 从服务器配置
基础备份1 2 3 4 5 6 7 8 9 pg_basebackup -F p --progress -D /data/pgsql11/data/ -h pgsql_1_ip -p 18083 -U replica replica-vcredit 命令行参数如下: -F p 指定输出格式:p原样输出,即把主数据库中的各个数据文件,配置文件、目录结构都完全一样的写到备份目录; -P, --progress 在备份过程中实时打印备份进度 -D 指定把备份写到那个目录 -h 启动的主库数据库地址 -p 端口号 -U 流复制用户
配置文件 /data/pgsql11/data/recovery.conf 模板配置文件修改项:主节点ip1 2 3 4 5 cd /data/pgsql11/data/touch recovery.conf standby_mode = on primary_conninfo = 'host=pgsql_1_ip port=18083 user=replica password=replica-vcredit' recovery_target_timeline = 'latest'
配置文件 /data/pgsql11/data/postgresql.conf 模板配置文件修改项:无1 2 3 4 5 6 7 vim postgresql.conf wal_level = hot_standby max_connections = 300 hot_standby = on hot_standby_feedback = on
启动数据库1 2 pg_ctl -D /data/pgsql11/data -l /data/logs/pgsql11/pgsql.log start
3.4 数据库启动后操作 1 2 3 4 5 6 7 8 9 10 11 12 主库有sender进程 从库有receiver进程 psql -h pgsql_1_ip -p 18083 -d postgres postgres= CREATE EXTENSION postgres= pg_ctl -D /data/pgsql11/data -l /data/logs/pgsql11/pgsql.log start pg_ctl -D /data/pgsql11/data -l /data/logs/pgsql11/pgsql.log stop pg_ctl -D /data/pgsql11/data -l /data/logs/pgsql11/pgsql.log reload
4 Pgpool集群搭建 4.1 pgpool-II安装
安装pgpool-II1 2 sudo yum install -y pgpool-II-11.x86_64 sudo yum install -y pgpool-II-11-extensions.x86_64
安装扩展函数1 2 3 4 5 6 7 psql -h pgsql_1_ip -p 18083 -d postgres postgres= CREATE EXTENSION postgres= CREATE EXTENSION
建立insert_lock 表 该表主要用与解决 pgpool-Ⅱ和 VACUUM 表锁的互斥问题。1 2 psql -f /usr/pgpool-11/share/pgpool-II/insert_lock.sql -h pgsql_1_ip -p 18083 -U app template1
4.2 pgpool-II配置
配置信息 模板配置文件:http://112.25.66.177:10080/postgresql/conf/pgpool/ 操作机器:pgsql_1_ip、pgsql_2_ip、pgsql_3_ip 操作用户:root4.2.1 配置文件 /etc/pgpool-II-11/pgpool.conf
单点配置 默认配置文件修改项 backend_hostname0 backend_hostname1 backend_hostname2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 listen_addresses = '*' port = 18999 socket_dir = '/var/run' pcp_listen_addresses = '*' pcp_port = 18898 pcp_socket_dir = '/var/run' backend_hostname0 = 'pgsql_1_ip' backend_port0 = 18083 backend_weight0 = 1 backend_data_directory0 = '/data/pgsql11/data' backend_flag0 = 'ALLOW_TO_FAILOVER' backend_hostname1 = 'pgsql_2_ip' backend_port1 = 18083 backend_weight1 = 1000 backend_data_directory1 = '/data/pgsql11/data' backend_flag1 = 'ALLOW_TO_FAILOVER' backend_hostname2 = 'pgsql_3_ip' backend_port2 = 18083 backend_weight2 = 1000 backend_data_directory2 = '/data/pgsql11/data' backend_flag2 = 'ALLOW_TO_FAILOVER' enable_pool_hba = on pool_passwd = 'pool_passwd' log_line_prefix = '%t: pid %p: ' log_connections = off log_hostname = off log_statement = off当设置为 on 时生成 SQL 日志消息。 log_per_node_statement = on pid_file_name = '/var/run/pgpool-II-11/pgpool.pid' logdir = '/data/logs/pgpool' replication_mode = off load_balance_mode = on master_slave_mode = on master_slave_sub_mode = 'stream' sr_check_period = 10 sr_check_user = 'pgpool1' sr_check_password = 'pgpool1' sr_check_database = 'postgres' delay_threshold = 10000000 health_check_period = 10 health_check_timeout = 20 health_check_user = 'pgpool1' health_check_password = 'pgpool1' health_check_database = 'postgres'
集群配置 需先完成单点配置1 2 3 4 5 6 7 8 9 10 11 wd_hostname delegate_IP if_up_cmd if_down_cmd heartbeat_destination0 heartbeat_device0 heartbeat_destination1 heartbeat_device1 other_pgpool_hostname0 other_pgpool_hostname1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 use_watchdog = on wd_hostname = 'pgsql_1_ip ' wd_port = 18900 wd_priority = 1 wd_ipc_socket_dir = '/var/run' delegate_IP = 'VIP' if_cmd_path = '/sbin' if_up_cmd = 'ifconfig ens192:0 inet $_IP_$ netmask 255.255.255.0' if_down_cmd = 'ifconfig ens192:0 down' arping_cmd = 'arping -U $_IP_$ -w 1' wd_lifecheck_method = 'heartbeat' wd_interval = 10 wd_heartbeat_port = 9694 wd_heartbeat_keepalive = 2 wd_heartbeat_deadtime = 30 heartbeat_destination0 = 'pgsql_2_ip' heartbeat_destination_port0 = 9694 heartbeat_device0 = 'ens192' heartbeat_destination1 = 'pgsql_3_ip' heartbeat_destination_port1 = 9694 heartbeat_device1 = 'ens192' other_pgpool_hostname0 = 'pgsql_2_ip' other_pgpool_port0 = 18999 other_wd_port0 = 18900 other_pgpool_hostname1 = 'pgsql_3_ip' other_pgpool_port1 = 18999 other_wd_port1 = 18900
4.2.2 配置文件 /etc/pgpool-II-11/pool_hba.conf pgpool可以按照和PostgreSQL的hba.conf类似的方式配置自己的主机认证,所有连接到pgpool上的客户端连接将接受认证,这解决了后端PostgreSQL无法直接对前端主机进行IP地址限制的问题。
配置文件 pool_hba.conf1 2 3 4 5 6 7 8 9 10 11 12 host replication replica pgsql_1_ip/32 md5 host replication replica pgsql_2_ip/32 md5 host replication replica pgsql_3_ip/32 md5 host all all pgsql_1_ip/32 trust host all all pgsql_2_ip/32 trust host all all pgsql_3_ip/32 trust host all all 0.0.0.0/0 md5
认证文件 pool_passwd1 2 3 4 5 cd /etc/pgpool-II-11sudo pg_md5 -p -m -u app pool_passwd password:
4.2.3 配置文件 /etc/pgpool-II-11/pcp.conf pgpool-II 有一个用于管理功能的接口,用于通过网络获取数据库节点信息、关闭 pgpool-II 等。要使用 PCP 命令,必须进行用户认证。这需要在 pcp.conf 文件中定义一个用户和密码。(pcp具体命令可参考网址http://www.pgpool.net/docs/pgpool-II-3.5.4/doc/pgpool-zh_cn.html#memcached_params)。 1 2 3 4 5 6 pg_md5 pgpool1 vim /etc/pgpool-II-11/pcp.conf pgpool1:1fe5203073aa5e6d4bf9480cd93413e8
4.3 pgpool的启动与测试 4.3.1 pgpool的启停 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 sudo pgpool -n > /data/logs/pgpool/pgpool.log 2>&1 & sudo pgpool -C -D -n > /data/logs/pgpool/pgpool.log 2>&1 & sudo pgpool stop sudo pgpool -m fast stop sudo killall -9 pgpool ps -aux | grep pgpool sudo kill pid sudo rm -rf /run/.s.PGSQL.18898 sudo rm -rf /run/.s.PGSQL.18999
4.3.2 测试
连接1 2 3 4 5 psql -h pgsql_1_ip -p 18999 -d postgres psql -h pgsql_2_ip -p 18999 -d postgres psql -h pgsql_3_ip -p 18999 -d postgres psql -h VIP -p 18999 -d postgres
HA测试1 2 3 4 sudo pgpool -m fast stop
5. Q&A 5.1 问题1 问题:如遇pgpool.log中报错 ifup[/sbin/ifconfig] doesn’t have setuid bit 解决:1 2 sudo chmod +s /sbin/ifconfig sudo chmod +s /sbin/arping