使用 haproxy 和 php websocket 执行查询

Posted

技术标签:

【中文标题】使用 haproxy 和 php websocket 执行查询【英文标题】:executing queries using haproxy and php websocket 【发布时间】:2015-05-01 08:30:50 【问题描述】:

我正在使用 HAproxy 和 php websocket a link! 开发负载平衡 php 应用程序。 用户登录到我的应用程序(每个人都有自己的会话)并发送触发执行 mysql 查询的表单。

我将后端创建为三个 websocket 服务器实例,它们在后台运行在不同的 IP 地址和端口上。

类服务器

class server 
...

        $server1=new server('127.0.0.2','9001');
        $server2=new server('127.0.0.3','9002');
        $server3= new server('127.0.0.4','9003');  
    
        $server1->run(); // calling function run from library
        $server2->run();
        $server3->run();

如何确保 mysql 查询将由 php websockets 处理?

问题是任务(执行查询)没有分布在这些服务器之间(我没有看到统计报告中的变化)。 当然,我正确配置了我的 haproxy 配置文件。我认为 haproxy 无法捕获我的 http 请求并对其进行处理。

HAproxy 前端

frontend webservers
     bind *:80
     mode http
     default_backend websockets

Haproxy 后端

  backend websockets
      mode http
      balance roundrobin
      server web1 127.0.0.2:9001  check
      server web2 127.0.0.3:9002  check
      server web3 127.0.0.4:9003  check

我查看了 haproxy 统计报告,发现 haproxy 知道该服务器。

可以为此使用 websockets 吗?或者更好的解决方案是 node.js ?我没有看到任何与 php websocket 类似的解决方案。 php websocket可以与数据库通信吗? 如果你知道一些关于它的文章......请告诉我。

感谢您的回答。

【问题讨论】:

【参考方案1】:

在这种情况下,您需要同时运行 3 个不同的脚本。最好在 3 台不同的机器上,否则没有必要进行负载平衡。

server1.php:

<?php
require_once('./websockets.php');
class FirstServer extends WebSocketServer  ... 

$server = new FirstServer('127.0.0.2', '9001');
$server->run();

server2.php:

<?php
require_once('./websockets.php');
class SecondServer extends WebSocketServer  ... 

$server = new SecondServer('127.0.0.3', '9002');
$server->run();

server3.php:

<?php
require_once('./websockets.php');
class ThirdServer extends WebSocketServer  ... 

$server = new ThirdServer('127.0.0.4', '9003');
$server->run();

然后,在您的命令行中,执行以下操作:

user@web1$ nohup php /path/to/server1.php > /dev/null 2>&1 &
user@web1$ ssh user@web2 "nohup php /path/to/server2.php > /dev/null 2>&1 &"
user@web1$ ssh user@web3 "nohup php /path/to/server3.php > /dev/null 2>&1 &"

一点评论:

$server = new Server('127.0.0.4', '9003'); 可能应该是$server = new Server('0.0.0.0', '9003');,除非你有理由(它甚至不必是一个很好的理由......只是任何理由)不监听该机器的所有 IP 地址。也就是说,每台机器都有 127.0.0.1,以及每个配置的网络接口的地址。大多数人都想收听所有地址。

我怀疑您与 MySQL 服务器的连接绝对没有问题。问题是 $server1-&gt;run() 永远不会返回,所以永远不会执行下一行 $server2-&gt;run()

【讨论】:

以上是关于使用 haproxy 和 php websocket 执行查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 服务器已消失 haProxy 不断出现错误

haproxy反向代理功能配置

websock第一次连不上window

websock使用

负载均衡haproxy+keepalivedlvs+keepalived后端php+nginx框架

Saltstack自动部署Haproxy+keepalived+nginx+memcache+php(fastcgi)