У меня есть архитектура с двумя серверами лакировки, расположенными перед 5 веб-головками. Каждый сервер varnish настроен с помощью бэкэнд-директора циклического перебора, но временами от умеренной до высокой нагрузки varnish, кажется, сильно отдает предпочтение первому определенному бэкэнду в списке.
Версия лака - 3.0.5.
Если первый бэкэнд отмечен как неисправный, второй бэкэнд в списке пользуется большим преимуществом и так далее.
varnish> backend.list
200
Backend name Refs Admin Probe
web1(************,,8080) 102 probe Healthy 8/8
web2(************,,8080) 17 probe Healthy 8/8
web3(************,,8080) 9 probe Healthy 8/8
web4(************,,8080) 17 probe Healthy 8/8
web5(************,,8080) 12 probe Healthy 8/8
Некоторые части VCL, которые могут быть уместны:
probe healthcheck {
.request =
"GET /LICENSE.txt HTTP/1.1"
"Host: **********.co.uk"
"Connection: close";
.interval = 120s;
.timeout = 90s; # High values due to expected slow responses
.window = 8;
.threshold = 3;
.initial = 3;
#.expected_response = 200; # Still want the Magento maintenance page to display so no response code check
}
backend web1 {
.host = "************";
.port = "8080";
.connect_timeout = 240s; # High values due to expected slow responses
.first_byte_timeout = 240s; # High values due to expected slow responses
.between_bytes_timeout = 240s; # High values due to expected slow responses
.probe = healthcheck;
}
backend web2 {
.host = "************";
.port = "8080";
.connect_timeout = 240s; # High values due to expected slow responses
.first_byte_timeout = 240s; # High values due to expected slow responses
.between_bytes_timeout = 240s; # High values due to expected slow responses
.probe = healthcheck;
}
backend web3 {
.host = "************";
.port = "8080";
.connect_timeout = 240s; # High values due to expected slow responses
.first_byte_timeout = 240s; # High values due to expected slow responses
.between_bytes_timeout = 240s; # High values due to expected slow responses
.probe = healthcheck;
}
backend web4 {
.host = "************";
.port = "8080";
.connect_timeout = 240s; # High values due to expected slow responses
.first_byte_timeout = 240s; # High values due to expected slow responses
.between_bytes_timeout = 240s; # High values due to expected slow responses
.probe = healthcheck;
}
backend web5 {
.host = "************";
.port = "8080";
.connect_timeout = 240s; # High values due to expected slow responses
.first_byte_timeout = 240s; # High values due to expected slow responses
.between_bytes_timeout = 240s; # High values due to expected slow responses
.probe = healthcheck;
}
director backend_director round-robin {
{ .backend = web1; }
{ .backend = web2; }
{ .backend = web3; }
{ .backend = web4; }
{ .backend = web5; }
}
sub vcl_recv {
set req.backend = backend_director;
# loads more stuff
}
Может ли кто-нибудь пролить свет на то, почему циклический директор так сильно отдает предпочтение первому заданному бэкэнду или что может привести к полному обходу директора? Я уже убедился, что return(pipe)
не используется в vcl_recv.