我有一个使用Postgres数据库的Java应用程序,我正在尝试引入PGPool以扩展我的数据库.我遇到了Postgres抛出以下错误的问题:unnamed prepared statement does not exist
.在启动Postgres上的日志记录之后,我看到我的应用程序执行的每个select语句都发生了以下事情:
EDTLOG: 00000: duration: 7.585 ms parse <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 0.088 ms bind <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 79.014 ms execute <unnamed>: "my select statement here"
Run Code Online (Sandbox Code Playgroud)
但有时,在解析/绑定/执行步骤之间,PGPool会执行一些额外的查询,因此日志看起来像这样:
EDTLOG: 00000: duration: 7.585 ms parse <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 0.088 ms bind <unnamed>: "my select statement here"
EDTLOG: 00000: duration: 0.328 ms statement: SELECT count(*) FROM pg_class AS c, pg_namespace AS n WHERE …
Run Code Online (Sandbox Code Playgroud) 我们有一个使用Postgresql 9.0和PGPool-ii的现有Web应用程序.我正在考虑将我们的基础设施迁移到Amazon EC2,并受到以下链接的启发:http://aws.typepad.com/aws/2008/12/running-everything-on-aws-soocialcom.html使用类似的架构.
由于Amazon RDS不支持PGSQL,因此我们将坚持使用PGPool-ii对不同数据库服务器上的查询进行负载均衡,并使它们在彼此之间保持同步.
因此,我们计划部署3个前端Web服务器,其中包含以下内容: - Web服务器+ PHP代码 - PGPool-ii
然后,我们将在仅具有PGSQL的单独Amazon实例上拥有2个数据库服务器.这两个PG服务器将由位于3个前端服务器上的PGPools使用.
我的问题是我不知道这个解决方案是否足够可靠,因为多个PGPool将访问多个PGSQL服务器.大多数PGPool示例演示了一个使用N个底层PGSQL服务器的PGPool.在每个Web服务器上部署PGPool实例是一个很好的实践吗?
如果没有,是否有其他/更好的架构,以避免使用亚马逊SPOF?
非常感谢您的回复.
我们正在考虑将Slony和PGPool作为我们应用程序中处理故障转移的替代方案 - 似乎因为我们需要至少两个数据库服务器,所以我们也可以利用负载平衡 -
我的应用程序使用Postgresql 9.0,由一个或多个与全局数据库交互的站组成:它就像一个普通的客户端服务器应用程序,但为了避免任何额外的硬件,所有站都包括客户端和服务器:主站被提升为行动也作为服务器,以及任何其他作为客户端的行为.这个解决方案允许我进行扩展:用户最初可能需要一个站点,但它可以决定在未来没有无用的独立服务器的情况下扩展到更多.
我试图避免,如果主站倒塌所有其他人停止工作; 要做到这一点,最好的解决方案可能是将主数据库连续复制到一个或多个工作站上未使用的数据库.
搜索我发现pgpool可以用于我的需求,但是从所有示例和教程看,似乎故障点从主数据库移动到运行pgpool的服务器.
我读了一些关于多个pgpool和heartbeat工具的内容,但目前尚不清楚如何做到这一点.
考虑到我的架构,哪里不存在分离和专用服务器,有人可以给我一些提示吗?在故障转移的情况下,似乎pgpool自动执行所有操作,我是否可以认为故障转移情况可以由标准用户处理而无需管理员的干预?
我有一个Python/Django应用程序,需要在不久的将来某个时候进行数据库负载平衡.与此同时,我正在尝试学习在本地虚拟机设置上实现pgpool.
我有4个Ubuntu 12.04虚拟机:
192.168.1.80 <- pool, pgppool2 installed and accessible
192.168.1.81 <- db1 master
192.168.1.82 <- db2 slave
192.168.1.83 <- db3 slave
Run Code Online (Sandbox Code Playgroud)
我有pgpool-II版本3.1.1,我的数据库服务器正在运行PostgreSQL 9.1.
我的应用程序的数据库连接指向192.168.1.80:9999,它工作正常.
问题是当我使用Apache ab向它抛出一些负载时,SELECT查询似乎都没有平衡.所有负载都转到我的db1 master.另外,非常令人担忧的是池服务器本身的负载,与db1相比真的很高,平均可能高出8-10倍.与此同时,我的db2和db3服务器的负载几乎为零,它们似乎只是从db1复制,这对我的ab测试来说不是非常负载.
ab -n 300 -c 4 -C 'sessionid=80a5fd3b6bb59051515e734326735f80' http://192.168.1.17:8000/contacts/
Run Code Online (Sandbox Code Playgroud)
这会将我的池服务器上的负载驱动到大约2.3.db1上的负载大约为0.4,db2和db3上的负载几乎为零.
有人可以看看我的配置,看看我做错了什么?
backend_hostname0 = '192.168.1.81'
backend_port0 = 5432
backend_weight0 = 1
backend_data_directory0 = '/var/lib/postgresql/9.1/main'
backend_flag0 = 'ALLOW_TO_FAILOVER'
backend_hostname1 = '192.168.1.82'
backend_port1 = 5433
backend_weight1 = 1
backend_data_directory1 = '/var/lib/postgresql/9.1/main'
backend_flag1 = 'ALLOW_TO_FAILOVER'
backend_hostname2 = '192.168.1.83'
backend_port2 = 5434
backend_weight2 = 1
backend_data_directory2 = '/var/lib/postgresql/9.1/main' …
Run Code Online (Sandbox Code Playgroud) 我不是一个DBA,所以我很欣赏易于理解的答案.我必须为我们的数据库和pgpool提供复制似乎更方便,因为如果一个postgresql实例失败,客户端不需要更改任何东西以继续工作,对吧?因此,在这种情况下,使用pgpool更有意义,但配置部分(对我来说)似乎更复杂和令人困惑.例如,我是否需要在两个postgresql服务器上设置WAL?或者只有在我想设置postgresql复制时才需要这个?我试图得到这些问题的答案越多,它就越不清楚.也许我忘记了如何google ...
我一直在尝试配置PgPool接受大约150的请求.Postgres服务器配置为只接受100个连接.超过100的任何东西都需要由PgPool汇集.我似乎没有那样做.我只需要PgPool对请求进行排队,我当前的配置不会这样做.从我的JMeter测试中,当我尝试连接超过100时,postgres给出了一个错误,说PSQL错误:sorry, too many clients
.
我只使用以下参数配置了PGPool:
listen_address = 'localhost'
port = 9999
backend_hostname0 = 'localhost'
backend_port0 = 5432
num_init_children = 100
max_pool = 4
child_life_time =120
child_max_connections = 0
connections_life_tome = 120
client_idle_limit = 0
Run Code Online (Sandbox Code Playgroud)
由于我只需要PgPool来排队额外的连接请求,上面的配置是否正确?请告知正确的配置.
我正在使用pgAdmin III从客户端管理我的数据库.我有一个在流复制模式下运行的master和slave postgreSQL.在他们面前还有另一个pgpool服务器来进行连接池和负载平衡.
当我将pgAdmin连接到pgpool时,我得到了:
Error connecting to the server: ERROR: unable to read message kind
DETAIL: kind does not match between master(52) slot[1] (45)
Run Code Online (Sandbox Code Playgroud)
我以前连接到它没有问题,但不知何故pgpool死了,我重新启动它,然后这个错误弹出了没有位置.
pgpool和postgreSQL服务器运行良好.我可以用它来访问它们psql -h hostname database user
.应用服务器也可以连接到它,并且Web应用程序通常正在运行.我只是无法从pgAdmin访问它.
如果我们比较多种类型的复制(单领导者、多领导者或无领导者),单领导者复制有可能是线性化的。在我的理解中,线性化意味着一旦写入完成,所有后续读取都应返回该值或后续写入的值。或者说,只有一个数据库应该有印象,但没有更多。所以我想,没有陈旧的阅读。
PostgreSQL 在其流复制中,能够使用 使其所有副本同步synchronous_standby_names
,并且还能够使用该synchronous_commit
选项进行微调,可以将其设置为remote_apply
,因此领导者会等待,直到事务在备用数据库上重播(使其对查询可见)。在文档中,在讨论 remote_apply 选项的段落中,它指出这允许在简单情况下实现负载平衡并具有因果一致性。
前几页,它是这么说的:
,,一些解决方案是同步的,这意味着在所有服务器都提交了数据修改事务之前,该事务不会被视为已提交。这保证了故障转移不会丢失任何数据,并且无论查询哪个服务器,所有负载平衡的服务器都将返回一致的结果,
因此,我很难理解如果我们将读取查询负载平衡到只读副本,可以保证什么,以及会发生什么异常情况。还会有陈旧的读吗?当我查询不同的副本以获得不同的结果时,即使在领导者上发生后没有写入,也会发生这种情况吗?我的印象是肯定的,但我不太确定。如果不是,PostgreSQL 如何防止过时读取?我没有找到任何关于它如何在引擎盖下完全工作的更多细节。它是否使用两阶段提交或对其进行某种修改,或者使用其他算法来防止过时读取?
如果它不提供无陈旧读取的选项,有没有办法实现这一点?我看到,PgPool 必须选择对落后于不超过定义阈值的副本进行负载平衡,但我不明白是否可以将其定义为对与领导者一致的副本进行负载平衡。
我真的很困惑如何真正理解 PostgreSQL 中的完全同步复制是否会发生异常。
我知道这样的设置存在可用性问题,但现在这不是问题。
pgpool ×10
postgresql ×8
django ×2
failover ×2
replication ×2
amazon-ec2 ×1
django-1.7 ×1
java ×1
jdbc ×1
pgadmin ×1
pgbouncer ×1
slony ×1