读写分离是数据库架构中的一种常见策略,它通过将读操作和写操作分开处理来优化数据库的负载,可以显著提高数据库系统的性能和可伸缩性。
Pgpool-II 是一个强大的 PostgreSQL 中间层代理,能够为PostgreSQL 集群提供读写分离、负载均衡等功能。通过正确配置 pgpool.conf 和使用 pcp 命令,可以有效地管理和优化 PostgreSQL 集群的性能与可靠性。
IvorySQL 作为一款基于 PostgreSQL 研发的兼容 Oracle 的数据库,同样完美适配Pgpool-II,通过搭建IvorySQL流复制集群、配置Pgpool-II等一系列操作后,即可完成一个高效易用的读写分离架构。下面我们将开始介绍Pgpool-II与IvorySQL适配过程及读写分离实践方案。
1
系统环境及应用版本
操作系统:CentOS Stream 9
数据库版本:IvorySQL 3.3
pgpool版本:Pgpool-II-4.5.2
2
IvorySQL 3.3安装与运行
CentOS Stream 9 已支持一键安装IvorySQL3.3
dnf install -y https://yum.highgo.ca/dists/ivorysql-rpms/repo/ivorysql-release-3.0-1.noarch.rpm
dnf install -y ivorysql3 ivorysql3-server ivorysql3-contrib ivorysql3-test
配置IvorySQL
sudo chown -R ivorysql:ivorysql /usr/local/ivorysql
su ivorysql
cd ~
vim .bash_profile
将以下配置写入~/.bash_profile文件并使用source命令该文件使环境变量生效:
PATH=/usr/local/ivorysql/ivorysql-3/bin:$PATH
export PATH
LD_LIBRARY_PATH=/usr/local/ivorysql/ivorysql-3/lib
export LD_LIBRARY_PATH
source ~/.bash_profile
initdb -D /usr/local/ivorysql/ivorysql-3/data
pg_ctl -D /usr/local/ivorysql/ivorysql-3/data -l ivory.log start
更多IvorySQL3.3的安装与数据库启动说明,请查阅文档:
https://docs.ivorysql.org/cn/ivorysql-doc/v3.3/v3.3/6
3
源码编译及安装 Pgpool-II
wget https://www.pgpool.net/mediawiki/images/pgpool-II-4.5.2.tar.gz
tar -xvf pgpool-II-4.5.2.tar.gz
cd pgpool-II-4.5.2
./configure --prefix=<path>
make & make install
4
安装扩展函数
为提高 Pgpool-II 与 PostgreSQL 的集成稳定性,我们通常还需要安装一些扩展函数。
以pgpool-regclass为例
cd sql/pgpool-regclassmake && make installpsql -U ivorysql -f pgpool-regclass.sql template1
5
配置Pgpool-II及启动
cd /usr/local/etc
cp pcp.conf.sample pcp.conf
cp pgpool.conf.sample pgpool.conf
修改 pcp.conf
pg_md5 postgres
echo "postgres:e8a48653851e28c69d0506508fb27fc5" >> pcp.conf
修改pgpool.conf
对下列配置选项进行修改
listen_addresses = '*'
pcp_listen_addresses = '*'
backend_hostname0 = '127.0.0.1'
backend_port0 = 5432
backend_weight0 = 1
sr_check_period = 20
sr_check_user = 'ivorysql'
sr_check_password=''
sr_check_database = 'ivorysql'
保存修改后,启动Pgpool-II
pgpool -f pgpool.conf
pgpool将自动在后台运行,尝试使用 Pgpool-II 端口连接IvorySQL
psql -p 9999 -U ivorysql
我们成功通过Pgpool-II连上IvorySQL,IvorySQL与Pgpool-II适配成功。
7
一主一备的IvorySQL读写分离实践方案
接下来,简单介绍如何配置pgpool实现读写分离。
首先,本地启动两个数据库,并已开启流复制,5432为主库,5433为备库
将已启动的Pgpool-II停止。
pgpool -f pgpool.conf stop
编辑 pgpool.conf,添加或修改如下配置。
backend_hostname0 = '127.0.0.1'
backend_port0 = 5432
backend_weight0 = 0.1
backend_data_directory0 = '/usr/local/ivorysql/ivorysql-3/data'
backend_flag0 = 'ALWAYS_PRIMARY|DISALLOW_TO_FAILOVER'
backend_hostname1 = '127.0.0.1'
backend_port1 = 5433
backend_weight1 = 0.9
backend_data_directory1 = '/usr/local/ivorysql/ivorysql-3/data-1'
backend_flag1 = 'DISALLOW_TO_FAILOVER'
load_balance_mode = on
重新启动Pgpool-II
pgpool -f pgpool.conf
连入Pgpool-II,通过show pool_nodes,查看数据库状态。
我们看到,5432作为主节点,5433作为备节点,均处于启动状态。
接下来,简单测试读写分离是否成功。
测试create、insert语句
查看主库的log,我们可以找到create 与 insert 记录。
测试 select 语句
在备库 data-1 的log中,就会出现刚才执行的 select 查询语句。
这样,一个包含一主一备的IvorySQL数据库集群的读写分离架构就完成了。
8
Pgpool-II适配IvorySQL兼容Oracle端口
在读写分离架构基础上,将PG端口修改成Oracle兼容端口。
重启Pgpool-II,并查询主备状态及兼容模式。
由此证明,Pgpool-II不但可以兼容IvorySQL的PG端口,也可以完美适配IvorySQL兼容的Oracle端口,并实现读写分离架构,这也为想要快速搭建读写分离架构的Oracle用户,提供了一种可行的方案。
本文简单介绍了Pgpool-II的启动与读写分离实践,想了解更多关于Pgpool-II的使用,请参阅官方文档:
https://www.pgpool.net/docs/latest/en/html/index.html