【问题标题】:Managing connections via datastax/php-driver通过 datastax/php-driver 管理连接
【发布时间】:2018-05-25 14:52:36
【问题描述】:

如何管理与datastax/php-driver 的连接总数?

我们遇到了 TCP 连接过多的问题,我们怀疑这与此驱动程序的工作方式有关。

我们已将YACassandra PDO 驱动程序移至此驱动程序。我发现的最大问题之一是连接池将为每个 HTTP 线程连接到集群中的所有 服务器。

我们的集群中有 4 个盒子。那是 4 个打开的持久 连接,每个 Apache 子。我怀疑这是造成我们麻烦的罪魁祸首。

历史上,我们使用的是 YACassandra PDO,它每个线程只使用 1 个连接。

我们如何优化它?有没有办法阻止datastax/php-drive 进行集群发现?

【问题讨论】:

    标签: php cassandra datastax-php-driver


    【解决方案1】:

    驱动程序会自动发现集群中的节点,并在会话(连接)建立时根据负载均衡策略与每个节点建立连接。要限制与特定主机的连接,您可以使用whitelist policy;但是,不建议这样做,因为这会在主机关闭/不可用的情况下破坏好处或路由请求。白名单政策有它的位置,但我认为主要用于测试目的。

    可能发生的另一个问题是分叉。问题是所有子进程和父进程共享相同的底层套接字,并且 php-driver 没有可移植的方式来处理这个问题。下面是一个示例,说明在分叉时如何在应用程序代码中处理此问题:

    $cluster = Cassandra::cluster()->build();
    
    // fork!
    
    if ($pid) { // parent process
        $session = $cluster->connect();
    
        // do parent stuff
    } else { // child process
        $session = $cluster->connect();
    
        // do child stuff
    }
    

    【讨论】:

    • 一切都运行良好,直到我们打开了太多的 TCP 连接,因为 Apache 正在创建一个新的 httpd 线程来处理额外的请求。我的问题是我们实际上将我们的服务器节点列入白名单:两个用于跟踪,两个用于报告,但它们是同一个集群。以前使用 PDO,线程将使用与 Cassandra 的随机/循环连接打开单个连接。我不喜欢 php-driver 的自动发现
    • 明白。听起来您想要快速断开的快速连接,这可以通过禁用 persistent sessionsschema metadata 以及强制单节点连接的白名单策略来完成。这并不理想,因为可能会增加 IO 线程和较长的连接时间。
    • "增加了 IO 线程和较长的连接时间。" ——这让我很担心。现在,我将禁用模式元数据,但保留持久连接 + 白名单以帮助最小化 tcp 影响。到目前为止,它看起来很稳定。
    • 更新:添加了白名单,但这并没有解决问题。在添加到我们的集群后的几分钟内,服务器就完全崩溃了。 YACassandra PDO 上一切正常。是否有(仍然支持)PDO Cassandra 扩展?我们的服务器每分钟获得数千次点击,唯一的变化是我们转移到 php-driver,仍然使用 mod_php。我们需要一个可以快速连接和断开的驱动程序,比如 PDO。我们的代码应该在几毫秒内进出,这正是 Cassandra 的设计目的。这会在 fpm 下处理得更好吗?
    猜你喜欢
    • 2018-01-20
    • 2016-12-11
    • 1970-01-01
    • 2016-07-31
    • 2023-04-03
    • 2015-05-13
    • 1970-01-01
    • 2015-09-23
    • 2017-06-16
    相关资源
    最近更新 更多