2016-09-26 4 views
0

У меня есть два сервера Varnish, средний уровень между балансировщиком нагрузки F5 и двумя серверами приложений (Apache httpd). Я хочу, чтобы Varnish разделил нагрузку более или менее равномерно между двумя серверами Apache. Вот важные биты конфигурации я использую:Varnish client.identity - как распределить нагрузку более равномерно?

backend prod1 { 
    .host = "172.16.1.1"; 
    .port = "80"; 
} 

backend prod2 { 
    .host = "172.16.2.1"; 
    .port = "80"; 
} 

director wpprod client { 
    { .backend = "prod1"; .weight = 1; } 
    { .backend = "prod2"; .weight = 1; } 
} 

sub vcl_recv { 
    set client.identity = req.http.user-agent; 
    set req.backend = wpprod; 
} 

Цель состоит в том, чтобы взять заголовок, который не должен менять во время сессии, но должен быть полу-случайных чисел (клиента User-Agent: заголовок) , и использовать его для разделения нагрузки между двумя серверными серверами.

К сожалению, на практике нагрузка разделяется примерно на 70-30, при этом один бэкэнд получает примерно вдвое больше трафика, чем другой.

Я также попытался использовать заголовок X-Forwarded-For: мои F5 добавляются как client.identity, но имеют ту же проблему.

Я мог бы немного подправить весы, чтобы попытаться выровнять нагрузку, но это не очень масштабируемо или возможно с более чем несколькими серверами.

Любые предложения по заголовкам, которые я могу использовать, приведут к более четкому разделению трафика?

+0

Итак, это в конечном итоге оказалось вовсе не проблемой с лаком. В другом месте в нашей сети, беглый поисковик/паук забивал эти серверы. Так как это было около 40% всего нашего трафика, и поскольку каждый отправленный запрос имел тот же User-Agent :, исправление этой проблемы восстановило баланс примерно 50-50. –

ответ

0

Предполагая, что вы используете Varnish 3.x, а также предполагаете, что вам нужна какая-то липкость (иначе вы могли бы сыграть случайного или кругового директора), вы могли бы заполнить client.identityclient.ip, или, что еще лучше, вы могли бы генерировать/использовать свой собственный файл cookie, чтобы назначить каждого клиента группе:

... 

sub vcl_recv { 
    cookie.parse(req.http.Cookie); 

    unset req.http.X-Group; 
    if (cookie.get("group")) { 
     set client.identity = cookie.get("group"); 
    } else { 
     set req.http.X-Group = std.random(1, 1000); 
     set client.identity = req.http.X-Group; 
    } 

    set req.backend = wpprod; 
} 

sub vcl_deliver { 
    if (req.http.X-Group) { 
     header.append(
      resp.http.Set-Cookie, 
      "group=" + req.http.X-Group + "; domain=.example.com; path=/; expires=" + cookie.format_rfc1123(now, 365d)); 
    } 
} 
+0

client.ip не будет работать, поскольку серверы Varnish находятся за балансировщиком нагрузки. (Таким образом, все запросы, похоже, поступают с одного и того же IP-адреса.) И я попытался использовать X-Forwarded-For:, но имел ту же проблему (примерно 2: 1 между серверами Varnish). –

+0

Идея «добавить свой собственный файл cookie», безусловно, имеет свои достоинства, но это больше кода, и, следовательно, больше вещей, которые могли бы сработать, больше вещей, которые я должен документировать и т. Д. Если есть лучший «родной» способ разделить нагрузку, я думаю, что это было бы предпочтительнее. Тем не менее, я определенно собираюсь реализовать что-то подобное в моей тестовой среде, чтобы определить, равномерно ли он распределяет трафик. –

Смежные вопросы