我想设置以下基础设施:
美国的 PSQL 9.6(主)
欧洲的 PSQL 9.6(从属)
欧洲的 PgPool-II
欧洲的应用服务器(它在 90% 的时间内读取数据库)。
我的问题是:我可以在 pgpool 中设置只写和只读数据库吗?我想将我所有的读取发送给从属设备,并将每次写入(但只写)发送给主控设备。这可能吗?或者在主/从模式下,读取查询被发送到主从模式?
我想设置以下基础设施:
美国的 PSQL 9.6(主)
欧洲的 PSQL 9.6(从属)
欧洲的 PgPool-II
欧洲的应用服务器(它在 90% 的时间内读取数据库)。
我的问题是:我可以在 pgpool 中设置只写和只读数据库吗?我想将我所有的读取发送给从属设备,并将每次写入(但只写)发送给主控设备。这可能吗?或者在主/从模式下,读取查询被发送到主从模式?
处理这个问题的正确方法是设置两个不同的数据库用户
user_ro
,user_rw
例如,然后您授予您需要访问的模式的使用权,并仅授予SELECT
只读用户和读写用户的所有权限。然后,您在应用程序中创建两个数据库连接并使用适当的一个。您不能使用 pgpool-II 自动分发读写查询,因为它无法以编程方式检查查询并说它不会在数据库中产生写入。如果表上有记录访问的触发器(敏感数据的常见场景),即使是简单的
select * from sometable;
也可以触发写入。pgpool-II 在保持连接池打开和准备就绪以及透明地管理从主服务器到副本的故障转移方面做得很好,但是如果不使用两个单独的连接并在应用程序代码中处理这些连接,它就无法解决您遇到的问题. 有一些方法可以解决这个问题;就像在所有只读副本上尝试所有查询并重试在主服务器上失败的那些。但是从概念卫生的角度来看,最好决定何时写入数据库以及何时读取数据库。