pgpool-II的致命弱点

简介:

在health_check_period 有效的情况下,当 pgpool-II 所连接的节点如果有了故障,

会引发如下几件事:

1  在main.c的主循环中标记出故障的节点不可用(log中会看到:类似set 1 th backend down status),

2 然后调用 failover()函数,切断所有的连接(kill 所有process:log中会看到:Restart all children);

3 再然后,重新开始对尚且有效的各节点进行连接
(重新创建一堆子进程:log中会看到:pcp child process received restart request)

设想一下我们正在通过pgpool来执行一个transaction。

    如果尚未提交,发生了某节点故障,
       那么对剩余的正常节点而言,
       failover()会导致向各个节点未提交的内容没有commit的机会,故此各个节点都是数据一致的。

   但如果恰恰是在对各个节点提交的时候,发生了某节点故障,导致failover()呢?

       那么会发生某个节点已经发送commit命令成功,向某些节点发送commit命令之前,连接被切断。
       这样就产生了数据不一致了。 这种事情,虽然发生机会很低,但是已经切实地发生过。

pgpool作为一个第三方的,独立于postgresql 的开源产品,还是有点尴尬的。

它如果不引入 transaction manager来进行 类似于两阶段提交的控制,而是仅仅一行一行地发送客户端的指令给postgresql ,必然会在最坏的情况下,产生出:

由于故障发生退化(failover), 由切断所有连接导致正常节点间出现数据不一致。
又由于failover_if_affected_tuples_mismatch)设定,
导致再次发生退化,进入恶性循环,最坏的情况下,只剩下一个master节点可用。

要想解决这个问题,除非pgpool开发者痛下决心,引入transaction manager,
或者提供高层API,供客户端程序调用。而不再是那种在客户端和数据库节点间处于透明的中介地位。









本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/07/27/2611996.html,如需转载请自行联系原作者

目录
相关文章
|
6月前
|
安全 API UED
A2A(Agent2Agent) 简介
本文主要介绍Google于2025年4月9日发布的Agent2Agent Protocol(简称“A2A”),这是一个旨在促进不同类型智能体(Agent)之间高效沟通与协作的开放协议。
3402 74
A2A(Agent2Agent) 简介
|
12月前
|
算法 关系型数据库 MySQL
复购率 mysql 实例(sample database classicmodels _No.1 )
复购率 mysql 实例(sample database classicmodels _No.1 )
230 0
|
10月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
2152 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
10月前
|
监控 网络协议 数据挖掘
固定窗口和滑动窗口,你真的分得清吗?快来看看!
滑动窗口是一种用于实时数据统计和分析的技术,通过不断移动的时间窗口捕捉最新数据变化。它常用于限流、实时数据分析和TCP协议中的流量控制,能够提供持续更新的统计数据,有效控制请求流量,避免系统过载。与固定窗口相比,滑动窗口更加动态和灵活,适合实时监控和快速响应。
469 0
|
人工智能 Cloud Native Serverless
2024云栖大会资料精选,《云原生+AI核心技术&最佳实践》PPT全量放送!
关注阿里云云原生公众号,后台回复:2024 云栖大会,即可免费下载云原生云栖大会核心资料合集。
2537 35
|
测试技术
单元测试问题之模拟一个无返回值的方法,如何操作
单元测试问题之模拟一个无返回值的方法,如何操作
|
弹性计算 容灾 定位技术
ECS(Elastic Compute Service)地域和可用区的选择
ECS(Elastic Compute Service)地域和可用区的选择
313 2
|
IDE Java 编译器
lombok编译遇到“找不到符号的问题”
【9月更文挑战第18天】当使用 Lombok 遇到 “找不到符号” 的问题时,可能是由于 Lombok 未正确安装、编译器不支持、IDE 配置不当或项目构建工具配置错误。解决方法包括确认 Lombok 安装、编译器支持,配置 IDE 和检查构建工具配置。通过这些步骤通常可解决问题,若问题仍存在,建议检查项目配置和依赖,或查看日志获取更多信息。
4810 2
成功解决:java: 找不到符号 符号: 方法 getSort() 位置: 类型为com.atguigu.gulimall.product.entity.CategoryEntity的变量 menu1
这篇文章讨论了Java中遇到的一个常见错误:"java: 找不到符号 符号: 方法 getSort() 位置: 类型为com.atguigu.gulimall.product.entity.CategoryEntity的变量 menu1",即在尝试调用一个不存在的方法时出现的问题,并提供了相应的解决方法。
|
SQL 关系型数据库 MySQL
搞懂connectTimeout和socketTimeout的区别
搞懂connectTimeout和socketTimeout的区别
851 0