群集服务器
我有一台运行多个虚拟"集群节点的服务器"。基本上,它们中的每一个都是一个公共的,非常小的HTTP服务器,它有两个功能:
127.0.0.1:XXXXn/ping
127.0.0.1:XXXXn/api/arg/arg/arg
这两个函数都返回一个200OK标题,后跟HTML。 ping
用于测试节点是否繁忙。如果节点n
忙,则连接将超时(因为节点正忙于处理另一个请求)。但是,如果节点具有响应性且可用,则ping
将返回
PING=NODE.FREE
致电服务器
我想编写一个可以在任何Web服务器上加载的PHP程序,以便为API提供更好的界面。以下代码来自较旧的API版本,每个IP只有一个节点,因此代码非常简单:
<?php
error_reporting(0);
ini_set('display_errors', 0);
echo file_get_contents("http://127.0.0.1:XXXX9/".$_REQUEST['script']."/".$_REQUEST['query']."/".$_REQUEST['sort']."/".$_REQUEST['num']);
?>
这当然被称为
http://server.org/api.php?script=api&query=... (etc.)
并返回节点#9的结果(因此XXXX9
)。有10个节点填充一个服务器,因此有10个服务器从:XXXX0
到:XXXX9
。
我想实现PHP(即webserver端)负载平衡。基本上,在调用时,PHP程序应循环遍历所有节点,直到一个节点在少于指定的时间内成功返回PING=NODE.FREE
。
由于我使用file_get_contents
,我读到了为此设置超时的方法。事实证明,有很多方法,例如使用流上下文或curl选项(而不是文件_...)。我认为我面临的问题是每个选项(在这些答案[{3}}和here中提供)仅影响连接或读取。
我要检查的是,如果在给定时间内(例如每个节点1000毫秒),节点连接并且返回消息。然后,只有 ,代码应继续使用上述语法在此节点上调用API。当然,如果没有节点可用。 atm。,它应循环,直到一个人自由。
现在,设置和检查此超时的最佳和最安全的方法是什么?如果可能,我希望避免fsock
,因为大多数托管网络服务器都禁用此功能。
答案 0 :(得分:0)
使用流上下文方法解决:
lease 10.0.0.1 {
starts 1 2015/06/29 07:22:01;
ends 2 2015/06/30 07:22:01;
tstp 2 2015/06/30 07:22:01;
cltt 1 2015/06/29 07:22:01;
binding state active;
next binding state free;
hardware ethernet 08:2e:5f:f0:8b:a1;
}
lease 10.0.0.2{
starts 1 2015/06/29 07:31:20;
ends 2 2015/06/30 07:31:20;
tstp 2 2015/06/30 07:31:20;
cltt 1 2015/06/29 07:31:20;
binding state active;
next binding state free;
hardware ethernet ec:b1:d7:87:6f:7a;
uid "\001\354\261\327\207oz";
client-hostname "SYSTEM123456789";
}