【一文搞懂PGSQL】6. PostgreSQL + pgpool-II 实现读写分离

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云原生内存数据库 Tair,内存型 2GB
简介: 本文介绍了如何使用 PostgreSQL 和 pgpool-II 实现读写分离。pgpool-II 支持连接池、负载均衡等功能,适用于多种模式。文中详细描述了安装、配置及启动过程,并提供了示例命令,帮助读者快速搭建并验证读写分离环境。通过配置 `pgpool.conf` 文件指定监听地址、端口及节点信息等参数,确保系统的高效运行与故障转移。

PostgreSQL + pgpool-II 实现读写分离

pgpool-II 简介

支持 连接池、准备切换、负载均衡、读写分离

支持原始模式,复制模式,主备模式,并行模式多种模式

写性能不好,不支持部分查询

pgpool-II单点只能绑定在主库。

网站:www.pgpool.net

配置文件简介

escalation.sh.sample   
failover.sh.sample
follow_primary.sh.sample
pcp.conf.sample            # 管理pgpool用户相关的配置
pgpool.conf.sample         # 主配置文件
pgpool.conf.sample-logical
pgpool.conf.sample-raw
pgpool.conf.sample-replication
pgpool.conf.sample-slony
pgpool.conf.sample-snapshot
pgpool.conf.sample-stream
pgpool_remote_start.sample
pool_hba.conf.sample        # 用户白名单及监控用户配置
pool_password               # 加密存储密码(后创建)
recovery_1st_stage.sample
recovery_2nd_stage.sample

安装

# 下载包
wget https://www.pgpool.net/mediawiki/download.php?f=pgpool-II-4.2.5.tar.gz

# 解压
tar xf download.php?f=pgpool-II-4.2.5.tar.gz

# 配置
cd pgpool-II-4.2.5
./configure --prefix=/pgdata/pgpool --with-pgsql=/usr/local/pg12

# --prefix      # 指定安装路径
# --with-pgsql  # 指定postgresql的安装路径

# 编译
make

# 安装
make install

修改配置文件

-- 主库创建心跳检测用户
create role nobody with login password 'dyh666';

-- 创建业务用户
create database yewu;
create role yewu with login  password 'dyh666';
grant all  on database yewu to yewu;
\c yewu
create table t1(id int);

# 生成加密密码 // 创建数据库的用户密码 
/pgdata/pgpool/bin/pg_md5 -m -p -u nobody pool_passwd
/pgdata/pgpool/bin/pg_md5 -m -p -u yewu pool_passwd
# 编辑数据库密码文件
vim /pgdata/pgpool/etc/pool_passwd
# 以下为用户及加密的密码
nobody:md5fc056767b2f222f4f4697a99267612a4
yewu:md5fc056767b2f222f4f4697a99267612a4

# 创建 pgpool.conf 配置文件
cp /pgdata/pgpool/etc/pgpool.conf.sample  /pgdata/pgpool/etc/pgpool.conf

# 编辑配置文件
vim /pgdata/pgpool/etc/pgpool.conf
backend_clustering_mode = 'streaming_replication'
# 配置监听地址
listen_addresses = '*'
port = 9999
socket_dir = '/tmp'
reserved_connections = 0
pcp_listen_addresses = '*'
pcp_port = 9898
pcp_socket_dir = '/tmp'
listen_backlog_multiplier = 2
serialize_accept = off

################################################################
# 节点信息配置
backend_hostname0 = '10.10.8.176'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/pgdata/12/data'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_application_name0 = 'pg-01'
################################################################
backend_hostname1 = '10.10.8.106'
backend_port1 = 5432
backend_weight1 = 1
backend_data_directory1 = '/pgdata/12/data'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_application_name1 = 'pg-02'
################################################################
backend_hostname2 = '10.10.8.177'
backend_port2 = 5432
backend_weight2 = 1
backend_data_directory2 = '/pgdata/12/data'
backend_flag2 = 'ALLOW_TO_FAILOVER'
backend_application_name2 = 'pg-03'
################################################################
# 开启身份验证
enable_pool_hba = on
pool_passwd = 'pool_passwd'
authentication_timeout = 1min
allow_clear_text_frontend_auth = off
ssl = off
ssl_ciphers = 'HIGH:MEDIUM:+3DES:!aNULL'
ssl_prefer_server_ciphers = off
ssl_ecdh_curve = 'prime256v1'
ssl_dh_params_file = ''
num_init_children = 32
max_pool = 4
child_life_time = 5min
child_max_connections = 0
connection_life_time = 0
client_idle_limit = 0

# 将日志写入到系统日志
log_destination = 'syslog'
log_line_prefix = '%t: pid %p: '   # printf-style string to output at beginning of each log line.
log_connections = off
log_disconnections = off
log_hostname = off
log_statement = all
log_per_node_statement = on
log_client_messages = on
log_standby_delay = 'if_over_threshold'
syslog_facility = 'LOCAL0'
syslog_ident = 'pgpool'

# 日志相关配置
client_min_messages = notice
log_min_messages = info
log_directory = '/tmp/pgpool_logs'
log_filename = 'pgpool-%Y-%m-%d_%H%M%S.log'
log_file_mode = 0600
log_truncate_on_rotation = on
log_rotation_age = 1d
log_rotation_size = 10MB

pid_file_name = '/var/run/pgpool/pgpool.pid'
logdir = '/tmp'
connection_cache = on
reset_query_list = 'ABORT; DISCARD ALL'
replicate_select = off
insert_lock = off
lobj_lock_table = ''
replication_stop_on_mismatch = off
failover_if_affected_tuples_mismatch = off
load_balance_mode = on
ignore_leading_white_space = on
read_only_function_list = ''
write_function_list = ''
primary_routing_query_pattern_list = ''
database_redirect_preference_list = ''
app_name_redirect_preference_list = ''
allow_sql_comments = off
disable_load_balance_on_write = 'transaction'
dml_adaptive_object_relationship_list= ''
statement_level_load_balance = off
sr_check_period = 10
sr_check_user = 'nobody'
sr_check_password = ''
sr_check_database = 'postgres'
delay_threshold = 10000000
follow_primary_command = ''
health_check_period = 0
health_check_timeout = 20
health_check_user = 'nobody'
health_check_password = ''
health_check_database = ''
health_check_max_retries = 0
health_check_retry_delay = 1
connect_timeout = 10000
failover_command = ''
failback_command = ''
failover_on_backend_error = on
detach_false_primary = off
search_primary_node_timeout = 5min
recovery_user = 'nobody'
recovery_password = ''
recovery_1st_stage_command = ''
recovery_2nd_stage_command = ''
recovery_timeout = 90
client_idle_limit_in_recovery = 0
auto_failback = off
auto_failback_interval = 1min
use_watchdog = off
trusted_servers = ''
ping_path = '/bin'
hostname0 = ''
wd_port0 = 9000
pgpool_port0 = 9999
wd_priority = 1
wd_authkey = ''
wd_ipc_socket_dir = '/tmp'
delegate_IP = ''
if_cmd_path = '/sbin'
if_up_cmd = '/usr/bin/sudo /sbin/ip addr add $_IP_$/24 dev eth0 label eth0:0'
if_down_cmd = '/usr/bin/sudo /sbin/ip addr del $_IP_$/24 dev eth0'
arping_path = '/usr/sbin'
arping_cmd = '/usr/bin/sudo /usr/sbin/arping -U $_IP_$ -w 1 -I eth0'
clear_memqcache_on_escalation = on
wd_escalation_command = ''
wd_de_escalation_command = ''
failover_when_quorum_exists = on
failover_require_consensus = on
allow_multiple_failover_requests_from_node = off
enable_consensus_with_half_votes = off
wd_monitoring_interfaces_list = ''
wd_lifecheck_method = 'heartbeat'
wd_interval = 10
heartbeat_hostname0 = ''
heartbeat_port0 = 9694
heartbeat_device0 = ''
wd_heartbeat_keepalive = 2
wd_heartbeat_deadtime = 30
wd_life_point = 3
wd_lifecheck_query = 'SELECT 1'
wd_lifecheck_dbname = 'template1'
wd_lifecheck_user = 'nobody'
wd_lifecheck_password = ''
relcache_expire = 0
relcache_size = 256
check_temp_table = catalog
check_unlogged_table = on
enable_shared_relcache = on
relcache_query_target = primary
memory_cache_enabled = off
memqcache_method = 'shmem'
memqcache_memcached_host = 'localhost'
memqcache_memcached_port = 11211
memqcache_total_size = 64MB
memqcache_max_num_cache = 1000000
memqcache_expire = 0
memqcache_auto_cache_invalidation = on
memqcache_maxcache = 400kB
memqcache_cache_block_size = 1MB
memqcache_oiddir = '/var/log/pgpool/oiddir'
cache_safe_memqcache_table_list = ''
cache_unsafe_memqcache_table_list = ''


# 密码加密
/pgdata/pgpool/bin/pg_md5 dyh666

# 修改 pcp.conf 用户密码文件
cp -a /pgdata/pgpool/etc/pcp.conf.sample   /pgdata/pgpool/etc/pcp.conf
vim  /pgdata/pgpool/etc/pcp.conf
pgpool:fc056767b2f222f4f4697a99267612a4

# 修改 pool_hba.conf 防火墙文件
cp  -a  /pgdata/pgpool/etc/pool_hba.conf.sample /pgdata/pgpool/etc/pool_hba.conf
vim /pgdata/pgpool/etc/pool_hba.conf
host    all         all         0.0.0.0/0            md5
host    replication all         0.0.0.0/0            md5

启停pg_pool

# 启动
/pgdata/pgpool/bin/pgpool -f /pgdata/pgpool/etc/pgpool.conf

# 停止
/pgdata/pgpool/bin/pgpool -m fast stop

# 重载配置
/pgdata/pgpool/bin/pgpool reload

验证

# 登录监控用户查看节点信息状态
PGPASSWORD=dyh666 psql  -h10.10.8.177 -d postgres   -p 9999 -U nobody -c "\x" -c"show pool_nodes;"

# 查看pgpool 状态信息
/pgdata/pgpool/bin/pcp_node_info  -U pgpool -h10.10.8.177 -p9898 -n 0 -v

# 验证读写分离功能 // 多开几个session 
PGPASSWORD=dyh666  psql  -h10.10.8.177 -d yewu   -p 9999 -U yewu -c "select * from t1;"
PGPASSWORD=dyh666  psql  -h10.10.8.177 -d yewu   -p 9999 -U yewu -c "insert into t1 values(1);"

# server 端实时查看日志
tail -f /var/log/messages
相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
15天前
|
运维 监控 关系型数据库
【一文搞懂PGSQL】7. PostgreSQL + repmgr + witness 高可用架构
该文档介绍了如何构建基于PostgreSQL的高可用架构,利用repmgr进行集群管理和故障转移,并引入witness节点增强网络故障检测能力。repmgr是一款轻量级的开源工具,支持一键部署、自动故障转移及分布式节点管理。文档详细描述了环境搭建步骤,包括配置postgresql参数、安装与配置repmgr、注册集群节点以及配置witness节点等。此外,还提供了故障手动与自动切换的方法及常用命令,确保集群稳定运行。
|
存储 关系型数据库 OLAP
PgSQL · 应用案例 · PostgreSQL OLAP加速技术之向量计算
背景 在主流的OLTP数据库产品中,毫无疑问,PostgreSQL已经具备非常强大的竞争力(性能、功能、稳定性、成熟度、案例、跨行业应用等)。 通过这些文章我们可以了解更细致的情况。 《数据库十八摸 - 致 架构师、开发者》 《数据库界的华山论剑 tpc.org》 《PostgreSQL 前世今生》 在OLAP领域,PostgreSQL社区也是豪情万丈的,比如内核已经实现了基于CPU的多
7335 0
|
关系型数据库 PostgreSQL
『PostgreSQL』PGSQL手动创建Sequence序列
📣读完这篇文章里你能收获到 - 在PostgreSQL中对Sequence的管理及使用
668 0
『PostgreSQL』PGSQL手动创建Sequence序列
|
运维 负载均衡 Cloud Native
「读写分离」RDS PostgreSQL数据库代理发布,助力降本增效
基于MaxScale的RDS数据库代理服务能够帮助客户实现数据库的读写分离架构,以低成本实现应用横向扩展能力。
748 0
「读写分离」RDS PostgreSQL数据库代理发布,助力降本增效
|
关系型数据库 数据库 PostgreSQL
PgSQL · 特性分析 · 浅析PostgreSQL 中的JIT
--- title: PgSQL · 特性分析 · 浅析PostgreSQL 中的JIT author: 卓刀 --- ## 背景 估计很多同学看过之前的月报[PgSQL · 特性分析· JIT 在数据仓库中的应用价值](http://mysql.taobao.org/monthly/2016/11/10/),对JIT(just in time)和LLVM(Low Level Vir
2762 0
|
关系型数据库 PHP 数据库
CentOS6.9编译安装postgresql和php的pdo_pgsql,pgsql扩展
这篇笔记记录了在CentOS6.9中源码编译安装postgresql的过程,也记录了源码编译安装php的pdo_pgsql,pgsql扩展的过程,由于mysql存在闭源风险,现在postgresql真是越来越火啊
2129 0
|
关系型数据库 PostgreSQL 索引
PgSQL · 应用案例 · PostgreSQL 图像搜索实践
背景 imgsmlr是PostgreSQL的一款支持以图搜图的插件, 支持 1、几种图像特征值数据类型, 2、图像特征值相似算子, 3、图像特征值相似排序索引支持, 4、图像相似排序的索引(通过扩展GiST索引接口实现)支持, 5、png,gif等图像格式特征值提取函数。
1969 0
|
SQL 关系型数据库 Java
PgSQL · 应用案例 · PostgreSQL flashback(闪回) 功能实现与介绍
背景 闪回的需求往往是救命的需求,因为通常情况下数据库正常运行是不需要闪回的,往往是出现了误操作,被攻击,被注入后,数据库的数据被删除或恶意纂改并且纂改的事务已提交,也就是说纂改已经被持久化了。 这种情况下需要闪回来救命,回到被破坏前的状态。
3260 0
|
SQL 关系型数据库 测试技术
PgSQL · 应用案例 · 阿里云 RDS PostgreSQL 高并发特性 vs 社区版本
背景 进程模型数据库,需要为每个会话指派独立的进程与之服务,在连接数非常多,且大都是活跃连接时,进程调度浪费或引入的开销甚至远远大于实际任务需要的开销(例如上下文切换,MEMCPY等),性能下降会较为严重。
2881 0
|
关系型数据库 Java 数据库
Mycat(实践篇 - 基于PostgreSQL的水平切分、主从复制、读写分离)
写在前面   Mycat作为独立的数据库中间件,我们只需要进行相关的配置,就可以非常方便的帮我们实现水平切分、垂直切分、读写分离等功能,但PostgreSQL的主从复制需要我们通过其它方式实现。
3346 0