一、Pgpool-II 内置复制原理
在 pgpool-II 内置复制模式;架构图如下:
- 对数据库的写操作直到所有 PostgreSQL 服务器完成写操作后才返回,对写模式性能有损耗
- 对数据库的读操作可以发送任意一台,并不是随机分发的;可以通过 show pool_nodes 查看,可以实现读的负载均衡
- 该复制级别是数据库集
- 该模式下 pgpool 相当于 连接池
二、Pgpool-II 内置复制配置示例
Pgpool-II 内置复制示例环境
角色 | ip | 端口 | 数据目录 |
---|---|---|---|
pgpool | 192.168.1.221 | 9999 | |
db1 | 192.168.1.221 | 6000 | /data/postgres/data |
db2 | 192.168.1.221 | 6001 | /data/postgres/data1 |
1、在 两个实例下 分别创建数据库pgpool01,数据库用户pgpool
postgres=# create user pgpool password '123456';
CREATE ROLE
postgres=# create database pgpool01 owner pgpool;
CREATE DATABASE
2、在数据库创建insert_lock表
[postgres@node3 ~]$ psql -p 6001 -f insert_lock.sql pgpool01 pgpool
psql:insert_lock.sql:3: ERROR: schema "pgpool_catalog" does not exist
CREATE SCHEMA
CREATE TABLE
INSERT 0 1
GRANT
GRANT
GRANT
GRANT
3、生成密码文件 pool_passwd
[pgpool@node3 etc]$ pg_md5 --md5auth -u pgpool -p
password:
4、配置 pgpool.conf 文件
listen_addresses = '*'
backend_hostname0 = '192.168.1.221'
backend_port0 = 6000
backend_weight0 = 1
backend_data_directory0 = '/data/postgres/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'server0'
backend_hostname1 = '192.168.1.221'
backend_port1 = 6001
backend_weight1 = 1
backend_data_directory1 = '/data/postgres/data1'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'server1'
enable_pool_hba = on
#管理密码文件
pool_passwd = 'pool_passwd'
#pid文件存放炉具
pid_file_name = '/opt/pgpool/pgpool.pid'
# 管理日志存放路径
logdir = '/opt/pgpool/log/pgpool'
#要启用数据库复制功能,需要设置 pgpool.conf 文件中的 replication_mode 为 on
#当 replication_mode 被设置为 on,pgpool-II 将发送一份接收到的查询的拷贝到所有的数据库节点
replication_mode = on
#当 load_balance_mode 被设置为 on,pgpool-II 将在数据库节点之间分发 SELECT 查询。
load_balance_mode = on
# 内置复制模式不支持该参数
#failover_when_quorum_exists = on
5、启动 pgpool
启动 pgpool;并进入 pgpool01 数据库;创建表 lottu01
[pgpool@node3 pgpool]$ pgpool
[pgpool@node3 pgpool]$ psql -h 192.168.1.221 -p 9999 -d pgpool01 pgpool
Password for user pgpool:
psql (12.2)
Type "help" for help.
pgpool01=> create table lottu01(id int, info text, regtime timestamp);
CREATE TABLE
pgpool01=> insert into lottu01 values (1, 'pgpool native replication', now());
INSERT 0 1
6、查看后端数据库
进入后段数据库进行数据验证
[postgres@node3 ~]$ psql -p 6000 pgpool01 pgpool
psql (12.2)
Type "help" for help.
pgpool01=> set PROMPT1 '%`echo db6000=`'
db6000=select * from lottu01;
id | info | regtime
----+---------------------------+----------------------------
1 | pgpool native replication | 2020-11-13 16:05:30.190939
(1 row)
db6000=q
[postgres@node3 ~]$ psql -p 6001 pgpool01 pgpool
psql (12.2)
Type "help" for help.
pgpool01=> set PROMPT1 '%`echo db6001=`'
db6001=select * from lottu01;
id | info | regtime
----+---------------------------+----------------------------
1 | pgpool native replication | 2020-11-13 16:05:30.190939
(1 row)
# 或者
for port in 6000 6001; do
echo $port
psql -c "SELECT count(1) FROM lottu01" -p $port pgpool01
done
参考文献
https://www.pgpool.net/docs/latest/en/html/example-basic.html#EXAMPLE-CONFIGS-REPLICATION