原 GreenPlum + pgpool 架构缓存查询结果,加速web界面展示,并配置脚本开发自动故障转移高可用功能
Tags: 原创GreenPlumPgpool-IIpgpoolAdminpgpool总结
简介
在GreenPlum后端中,若前端有相关的web应用,则可以配置pgpool来缓存相关的结果,可以加速web应用展示。
需要注意几点:
1、在GreenPlum中,standby master是属于不可连接的,所以不能直接使用pgpool来进行高可用的自动切换,可以使用keepalived+脚本的形式来自动切换:
[gpadmin@smdw ~]$ psql
psql: error: FATAL: the database system is in recovery mode
DETAIL: last replayed record at 0/C70BE50
- VERSION: PostgreSQL 12.12 (Greenplum Database 7.3.3 build commit:ce20fc237ed7520a2476c96ed7d9edddea136932) on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-22), 64-bit compiled on Dec 18 2024 05:34:04 Bhuvnesh C.
2、在centos、欧拉、麒麟上都测试,可行!!!
在GreenPlum的mdw节点编译安装pgpool+pgpooladmin
下载:https://www.pgpool.net/mediawiki/index.php/Downloads
https://www.pgpool.net/yum/rpms/4.5/redhat/rhel-8-x86_64/
wget https://www.pgpool.net/mediawiki/download.php?f=pgpool-II-4.5.5.tar.gz
wget https://www.pgpool.net/mediawiki/download.php?f=pgpoolAdmin-4.2.0.tar.gz
安装pgpool
-- 编译安装 root用户
mkdir -p /usr/local/pgpool
source /home/gpadmin/.bashrc
tar -zxvf pgpool-II-*.tar.gz
cd pgpool-II-*/
autoreconf -fi
./configure --prefix=/usr/local/pgpool
make -j8
make install
mkdir -p /etc/pgpool/
chown apache.apache /etc/pgpool/
mkdir -p /var/run/pgpool/
chown apache.apache /var/run/pgpool/
cp /usr/local/pgpool/etc/pgpool.conf.sample /etc/pgpool/pgpool.conf
ln -s /etc/pgpool/pgpool.conf /usr/local/etc/pgpool.conf
find /usr/local/pgpool/bin/ -type f -exec bash -c 'ln -s "$1" /usr/local/bin/$(basename "$1")' _ {} \;
cat >> /etc/pgpool/pgpool.conf <<"EOF"
# - pgpool Connection Settings -
listen_addresses = '*'
pcp_listen_addresses = '*'
port=9999
# - Streaming Replication Check
sr_check_user = 'pgpool'
sr_check_password = 'lhr'
# - Health Check
health_check_period = 5
health_check_timeout = 30
health_check_user = 'pgpool'
health_check_password = 'lhr'
health_check_max_retries = 3
# - Backend Connection Settings -
backend_hostname0 = '152.52.52.10'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/winning/opt/greenplum/data/master/gpseg-1'
backend_flag0 = 'DISALLOW_TO_FAILOVER'
backend_application_name0 = 'gp_mdw'
# pool
connection_cache = on
max_pool = 10
num_init_children = 1000
# IN MEMORY QUERY MEMORY CACHE
memory_cache_enabled = on
memqcache_oiddir = '/var/log/pgpool/oiddir'
memqcache_total_size = 2048MB
memqcache_max_num_cache = 9000000
memqcache_maxcache = 4096000
memqcache_cache_block_size = 10485760
relcache_size = 25600
# - Where to log -
log_destination = 'stderr'
logging_collector = on
log_directory = '/var/log/pgpool'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 1024MB
EOF
mkdir -p /var/log/pgpool/
chmod 777 /var/log/pgpool/ -R
create user pgpool password 'lhr' superuser;
# /usr/local/pgpool/bin/pgpool -f /etc/pgpool/pgpool.conf -n -D
cat > /usr/lib/systemd/system/pgpool.service <<"EOF"
[Unit]
Description=pgpool
After=syslog.target network.target
[Service]
User=root
Group=root
EnvironmentFile=-/etc/sysconfig/pgpool
ExecStart=/usr/local/pgpool/bin/pgpool -f /etc/pgpool/pgpool.conf -n
ExecStop=/usr/local/pgpool/bin/pgpool -f /etc/pgpool/pgpool.conf -m fast stop
ExecReload=/usr/local/pgpool/bin/pgpool -f /etc/pgpool/pgpool.conf reload
LimitNOFILE=65536
KillMode=process
KillSignal=SIGINT
Restart=on-abnormal
RestartSec=30s
TimeoutSec=0
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable pgpool.service
sudo systemctl restart pgpool.service
sudo systemctl status pgpool.service
psql -U gpadmin -h 127.0.0.1 -p 9999 -d postgres -c "show pool_cache;"
psql -U gpadmin -h 127.0.0.1 -p 9999 -d postgres -c "show pool_backend_stats;"
show pool_health_check_stats;
show pool_backend_stats;
show pool_cache;
show pool_processes;
show pool_pools;
for i in $(seq 1 20); do psql -U gpadmin -h 127.0.0.1 -p 9999 -d postgres -c 'SELECT inet_server_addr()'; done | egrep '152.'
for i in $(seq 1 200); do psql -U gpadmin -h 127.0.0.1 -p 9999 -d postgres -c 'SELECT 1'; done | egrep '152.'
安装pgpooladmin
https://www.pgpool.net/docs/pgpoolAdmin/index_en.html
php推荐php7
mkdir -p /var/www/html/
tar -zxvf pgpoolAdmin-4.2.0.tar.gz -C /var/www/html/
mv /var/www/html/pgpoolAdmin-4.2.0 /var/www/html/admin
sudo chown apache.apache -R /var/www/html/admin/
chmod -R 777 /var/www/html/admin/
systemctl enable httpd.service
systemctl restart httpd.service
systemctl status httpd.service
php -v
ncat --sh-exec "ncat 152.52.52.10 80" -l 810 --keep-open
ncat --sh-exec "ncat 152.52.52.10 3389" -l 3380 --keep-open
http://192.16.7.162:810/admin/install/
echo "pgpooladmin:3996643de967b80174e48fb45d7227b1" > /etc/pgpool/pcp.conf
ln -s /etc/pgpool/pcp.conf /usr/local/pgpool/etc/pcp.conf
ln -s /etc/pgpool/pcp.conf /usr/local/etc/pcp.conf
chmod 666 /etc/pgpool/pgpool.conf
chmod 666 /etc/pgpool/pcp.conf
echo "*:*:*:lhr" >> /usr/share/httpd/.pcppass
echo "*:*:*:lhr" >> /usr/share/httpd/.pcppass
chown apache:apache /usr/share/httpd/.pcppass
chmod 0600 /usr/share/httpd/.pcppass
-- 更新pool_passwd:cat /etc/pgpool/pool_passwd
-- pg_md5 --md5auth --username=pgpool "lhr"
-- 数据库创建用户
-- ate user pgpooladmin login encrypted password 'lhr' superuser;
-- sudo chown -R apache:apache /var/lib/php/session
-- sudo chmod 700 /var/lib/php/session
# /etc/pgpool/pcp.conf pgpooladmin界面的登陆密码
systemctl enable php-fpm.service
systemctl restart php-fpm.service
systemctl status php-fpm.service
ln -s /var/www/html/admin/lang/zh_cn.lang.php /var/www/html/admin/lang/.lang.php
欧拉系统安装php7
wget https://www.php.net/distributions/php-7.4.33.tar.gz
tar -xvf php-7.4.33.tar.gz
cd php-7.4.33
yum -y install cmake libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libzip libzip-devel libsodium sqlite sqlite-devel oniguruma oniguruma-devel libwebp-devel
. /usr/local/greenplum-db/greenplum_path.sh
./configure --prefix=/usr/local/php7 --with-config-file-path=/usr/local/php7/etc --with-config-file-scan-dir=/usr/local/php7/etc/php.d --enable-mysqlnd --with-mysqli --with-pdo-mysql --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --enable-gd --with-iconv --with-zlib --enable-xml --enable-shmop --enable-sysvsem --enable-inline-optimization --enable-mbregex --enable-mbstring --enable-ftp --with-openssl --enable-pcntl --enable-sockets --with-xmlrpc --with-zip --with-jpeg --with-webp --enable-soap --without-pear --with-gettext --enable-session --with-curl --with-freetype --enable-opcache --disable-fileinfo --with-pgsql -with-pdo-pgsql
make -j16 && make install
cp /usr/bin/php /usr/bin/php_bk
cp /usr/sbin/php-fpm /usr/sbin/php-fpm_bk
ln -sf /usr/local/php7/bin/php /usr/bin/php
ln -sf /usr/local/php7/sbin/php-fpm /usr/sbin/php-fpm
php -v
cp /usr/local/php7/etc/php-fpm.conf.default /usr/local/php7/etc/php-fpm.conf
cp /usr/local/php7/etc/php-fpm.d/www.conf.default /usr/local/php7/etc/php-fpm.d/www.conf
sudo mkdir -p /run/php-fpm
sudo chown apache:apache /run/php-fpm
cat >> /usr/local/php7/etc/php-fpm.d/www.conf <<"EOF"
user = apache
group = apache
listen = /run/php-fpm/www.sock
listen.owner = apache
listen.group = apache
listen.mode = 0660
EOF
cat > /usr/lib/systemd/system/php7-fpm.service <<"EOF"
[Unit]
Description=The PHP 7 FastCGI Process Manager
After=network.target
[Service]
Type=simple
PIDFile=/usr/local/php7/var/run/php-fpm.pid
ExecStart=/usr/local/php7/sbin/php-fpm --nodaemonize --fpm-config /usr/local/php7/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
ExecStop=/bin/kill -SIGQUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable php7-fpm
sudo systemctl restart php7-fpm
sudo systemctl status php7-fpm
php --ini
php -m | grep pgsql
-- 如果是openEuler 22.03 (LTS-SP3),则需要安装如下匹配的包:
rpm -ivh /soft/pkg/libpng-1.6.37-2.oe2203.x86_64.rpm --force --nodeps
rpm -ivh /soft/pkg/libxml2-devel-2.9.14-13.oe2203sp3.x86_64.rpm --force --nodeps
rpm -ivh /soft/pkg/xz-devel-5.2.5-3.oe2203sp3.x86_64.rpm --force --nodeps
rpm -ivh /soft/pkg/zlib-devel-1.2.11-24.oe2203sp3.x86_64.rpm --force --nodeps
docker使用
docker rm -f lhrpgpool
docker run -d --name lhrpgpool -h lhrpgpool \
-p 19999:9999 -p 19898:9898 -p 180:80 -p 31389:3389 \
-v /sys/fs/cgroup:/sys/fs/cgroup \
--privileged=true lhrbest/lhrpgpool:4.2.2_02 \
/usr/sbin/init
docker network connect bridge lhrpgpool
docker restart lhrpgpool
docker exec -it lhrpgpool bash
systemctl status pgpool
vi /postgresql/pgpool/etc/pgpool.conf
backend_hostname0 = '192.92.0.59'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/opt/greenplum/data/master/gpseg-1/'
backend_application_name0 = 'gpdb6'
systemctl restart pgpool
systemctl status pgpool
systemctl enable httpd
systemctl start httpd
systemctl status httpd
http://192.16.7.162:180/admin/login.php
psql -U postgres -h 127.0.0.1 -p 19999 -d sbtest
for i in $(seq 1 20); do psql -U postgres -h 127.0.0.1 -p 19999 -d sbtest -c 'SELECT inet_server_addr()'; done | egrep '192.'
mkdir -p /var/log/pgpool/oiddir
chown -R pgsql.pgsql /var/log/pgpool/oiddir
内存查询缓存说明
https://www.pgpool.net/docs/latest/en/html/in-memory-query-caching.html
https://www.pgpool.net/docs/latest/en/html/runtime-in-memory-query-cache.html
其他参考:https://my.dbaup.com/pgpoolshiyongzongjie.html
master和standby master自动切换高可用
配置:
1、主备的主机都配置对VIP的免密远程登陆
2、主备的pg_hba.conf文件对VIP需要免密且开放登陆