![如果控制器中的所有后端都出现问题,Varnish 是否会计算重新启动?](https://linux22.com/image/631784/%E5%A6%82%E6%9E%9C%E6%8E%A7%E5%88%B6%E5%99%A8%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E5%90%8E%E7%AB%AF%E9%83%BD%E5%87%BA%E7%8E%B0%E9%97%AE%E9%A2%98%EF%BC%8CVarnish%20%E6%98%AF%E5%90%A6%E4%BC%9A%E8%AE%A1%E7%AE%97%E9%87%8D%E6%96%B0%E5%90%AF%E5%8A%A8%EF%BC%9F.png)
我的清漆设置看起来像这样(显然我已经简化了):
director default round-robin {
{ .backend = me! }
}
director peers random {
{ .backend = peer1 }
{ .backend = peer2 }
{ .backend = peer3 }
}
我想知道的 vcl 是:
if (req.restarts == 0) {
set req.backend = default;
} else {
set req.backend = peers;
}
当我!出现故障时,Varnish 会做什么?(或者说,如果 director 中的所有后端都出现故障,但在我的例子中只有 1/1)?它会立即进入 vcl_error 并触发重启吗?
我想知道它将如何处理最大重启次数。在这个例子中,我只想在放弃之前尝试两次。我总是想先尝试在本地获取页面,然后如果失败,再尝试我的一个对等点。但是,如果我提前知道我的本地有问题,我仍然希望能够尝试我的两个对等点。有没有办法设置它?
答案1
我已经进行了自己的测试,当控制器不健康时,这似乎是一个错误。请注意,我从未在第一个池中使用多台服务器进行过测试。
当我将目标 page.php 设置为自动返回标头 500 状态(仅在 me! 服务器上)并观察 varnishlog 时,我看到对 me! 的请求带有 X-Restarts = 0,它返回了 500。随后向其中一个对等点发出请求,X-Restarts = 1,成功获取带有 200 状态的 page.php。
当我设置探测测试来显示我不健康,并对 page.php 发出相同的请求时,日志中第一个(也是唯一的)条目是向 X-Restarts = 1 的其中一个对等点发出的请求。
所以它的行为确实和我猜想的一样……但它真正需要的是一个计数器,用于记录它实际尝试传递到后端的次数。知道失败是来自实际尝试检索页面还是没有尝试检索页面,这两者之间有很大区别。