我一直在尝试配置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来排队额外的连接请求,上面的配置是否正确?请告知正确的配置.
我试着解释我的问题!!!
我使用PDO扩展通过pgpool-II连接到PostgreSQL.它在Apache中运行良好,但是从PHP CLI(在同一台机器上)我收到此PDO错误:
SQLSTATE [HY000]:一般错误:7没有连接到服务器
我已经在谷歌和这里搜索了,但似乎没有人试过这样做.有谁有想法吗?
编辑:
这是我用来建立连接的代码:
include 'manage_db.php';
include_once 'properties.php';
global $properties;
$dsn = 'pgsql:dbname=' . $properties['db_pgpool'] . ';host=localhost;port=' . $properties['port_pgpool'];
try{
$mgmtDb = new ManageDb($dsn, $properties['username_pgpool'], $properties['password_pgpool']);
} catch (Exception $e) {
echo 'PDO - Caught exception: ', $e->getMessage(), "\n";
}
Run Code Online (Sandbox Code Playgroud)
ManageDB是我自己的类,它实现了一些实用程序功能以及创建数据库连接:
class ManageDb {
var $db;
function ManageDb($dsn, $username, $password){
$this->db = new PDO($dsn, $username, $password);
$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
....
Run Code Online (Sandbox Code Playgroud) 我的公司计划使用pgPool-II以使其"故障转移","负载平衡"(以及最终"复制")功能受益.
我们在这里考虑我们有一个由服务器集群托管的J2EE Tomcat Web应用程序,其中Jakarta Tomcat Connector(JK)或类似服务用于在客户端和这些Tomcat服务器之间建立链接(负载平衡).此外,我们认为我们有一个PostgreSQL 9.3数据库集群,其中pgPool-II用于执行Tomcat服务器集群和数据库集群之间的链接.我们的应用程序是一个多用户应用程序,其中每个用户都与不同的角色相关联(当然,就数据库而言).
我了解到pgPool-II使用与postgreSQL相同的协议,所以连接到池我们只需要连接到它,因为我们通常连接到数据库,对吧?
在这个邮件副本中,我看到有2个池层是没用的,所以除了pgPool-II之外,不需要使用JDBC Tomcat池.我们将池任务委托给JDBC Tomcat池,要么将它委托给pgPool-II,对吧?
所以我最后的问题是:
在这种情况下如何正确地从pgPool-II与JDBC建立连接,每次用户需要执行SQL请求时,我是否只需要一个新的pgPool-II连接?不影响性能?
哪个部分应该负责池任务以获得最佳性能?JDBC Tomcat,pgPool-II还是像pgBouncer这样的其他服务?什么是最好的方法?
提前致谢!
PS:如果有些问题不明确,请告诉我,我会编辑我的帖子.
我已经使用 pgpoolII-3.3.3 和 pgPoolAdmin 在 ubuntu 12.04 上安装了 postgresql 9.1
如果我尝试从带有 sudo pgpool 的终端运行 pgpool 它似乎开始了。查看 ubuntu 文件资源管理器,我可以看到如何在 /var/run/pgpool/pgpool.id 中创建 pgpool.pid 文件(这是 pgpool.conf 中的路径)
但是一秒钟后文件消失了。
我试图更改目录的所有者和目录权限,但似乎没有任何解决方法。
如果之后我尝试使用 sudo pgpool -m fast stop 停止 pgpool,我会收到一个错误:错误。找不到pid文件
似乎文件被创建并突然被破坏。我想知道为什么。
如果我尝试从 pgPoolAdmin 运行 pgpool,我会收到此错误:pgpool start failed。未找到 pgpool.pid。
像其他时候一样,这可能是一个愚蠢的问题,我无法解决它,因为我对这些系统没有很高的了解。
知道要尝试什么吗?
Xrry 圣诞节
我在 pgpool 中创建了以下函数。
CREATE OR REPLACE Function fun1(Id int)
RETURNS boolean as $executionStatus$
DECLARE
BEGIN
DELETE FROM table1 where table1_id = Id ;
DELETE from table2 where table2_id = Id ;
DELETE from table3 where table3_id = Id ;
RETURN true;
END;
$executionStatus$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)
我在 pgpool 的 postgres shell 中运行以下命令
select fun1(1);
Run Code Online (Sandbox Code Playgroud)
仅从主站删除数据。我再次尝试,然后它从不同的服务器中删除。因此在这种情况下复制失败。但如果我单独使用删除查询,那么它工作正常。它正在从所有服务器中删除数据。
DELETE FROM table1 where table1_id = 1 ;DELETE from table2 where table2_id = 1 ;DELETE from table3 where table3_id = 1 ;
Run Code Online (Sandbox Code Playgroud)
请让我知道如何解决这个问题。
假设有一个 PostgreSQL 集群,由一个主节点和两个通过流复制的只读副本组成。
如何配置 Tomcats DBCP 以了解数据库集群内有多个不同的节点,从而将变异语句分配给主节点的连接,并将无副作用语句(负载平衡)分配给任何从节点的连接?
正如 PostgreSQL 的 JDBC 驱动程序文档所述,可以在 JDBC 连接 URL 中声明多个节点:
jdbc:postgresql://host1:port1,host2:port2/database
于是就产生了在Tomcats server.xml中配置两个连接池的想法。一个 JNDI 资源用于读/写主数据源,另一个池用于只读副本:jdbc:postgresql://host1:port1/database?targetServerType=master和 用于副本jdbc:postgresql://host1:port1,host2:port2/database?targetServerType=preferSlave&loadBalanceHosts=true
在这种情况下,Tomcat 上运行的应用程序需要知道有两个具有不同语义的数据库连接池,因此需要根据每个 SQL 语句来决定从哪个池请求连接。这似乎是一个不好的模式,因为应用程序依赖于特定的数据库基础设施,并且 JDBC 池应该抽象底层数据库的实现。
Tomcat DBCP 和 PostgreSQL 集群之间的附加抽象层(例如pgpool-II)可以在这种情况下提供帮助吗?(特别是当将来基础设施增长到多个 Tomcat 服务器实例或 PostgreSQL 数据库的高可用性和故障转移要求上升时)
我有一个高可用性设置,其中数据流如下:
... <-> Objection.js <-> Knex.js (pool) <-> Pgpool-II (pool) <-> PostgreSQL Cluster
Run Code Online (Sandbox Code Playgroud)
如您所见,连接池现在在两个地方进行管理 - Knex.js 和 Pgpool-II。我想知道我是否真的需要两者,或者我可以完全禁用 Knex.js 池pool: {min: 0, max: 0}并让 Pgpool-II 完成所有工作?谢谢你。
我有一个 PostgreSQL 复制 MS,pgpool 仅作为主服务器上的负载平衡器。复制过程正常,过程没有延迟。问题是,即使我为每台服务器配置了不同于 50% 的余额,主服务器收到的请求也比从服务器多。
这是后端权重为 M(1)-S(2) 的 pgpool show_pool_nodes
node_id | hostname | port | status | lb_weight | role | select_cnt | load_balance_node | replication_delay
---------+-------------+------+--------+-----------+---------+------------+-------------------+-------------------
0 | master-ip | 9999 | up | 0.333333 | primary | 56348331 | false | 0
1 | slave-ip | 9999 | up | 0.666667 | standby | 3691734 | true | 0
Run Code Online (Sandbox Code Playgroud)
正如你所理解的,主服务器比从服务器接收 +10 倍的请求
这是后端权重为 M(1)-S(5) 的 pgpool show_pool_nodes
node_id | hostname | port | status | …Run Code Online (Sandbox Code Playgroud) 我在主线程中插入一个实体,然后在另一个线程中尝试modifiedAt通过 Spring JPA 存储库的 JPA 查询读取该插入实体的字段 ()。
interface SettlementRepository : JpaRepository<Settlement, Long> {
/**
* Fetches the state of a settlement.
*/
@Query("SELECT s.modifiedAt FROM Settlement s WHERE s.id = :id")
fun findModifiedAtById(id: Long): Instant
}
/* ... */
val transactionTemplate = TransactionTemplate(transactionManager)
val settlements: List<Settlement> = transactionTemplate.execute {
amounts.map {
settlementRepository.save(Settlement(...))
}
}!!
val executorService = Executors.newFixedThreadPool(4)
settlements.forEach {
executorService.execute {
val lastModified = settlementRepository.findModifiedAtById(it.id)
// But sometimes EmptyResultDataAccessException throws!
}
}
Run Code Online (Sandbox Code Playgroud)
插入是在事务中完成的TransactionTemplate,并且必须在数据库(PostgreSQL)中持久化和刷新,但有时(并非总是)EmptyResultDataAccessException抛出异常。 …
我用于pgpool管理postgres使用 k8s 部署的数据库集群,
我遇到了这个错误:
ERROR: unable to read data from front end
DETAIL: EOF encountered with front end
Run Code Online (Sandbox Code Playgroud)
有人知道这个吗?