Как я могу использовать лак для отправки запросов на локальный httpd-сервер, но если он не работает, отправьте запрос циклически в группу других узлов - PullRequest
2 голосов
/ 07 марта 2012

У нас есть набор из 6 бэкэндов, которые обслуживают наш сайт. Поскольку мы используем несколько центров обработки данных, мы обнаружили, что лучшая производительность достигается для нас, когда у нас при помощи лака отправляется запрос на httpd-сервер localhost (работает на порту 81). Это, конечно, очень простая конфигурация, хорошо поддерживаемая лаком, и ее можно выполнить с помощью резервного директора:

director default fallback {
    { .backend = localbackend; }
    { .backend = web1; }
    { .backend = web2; }
    { .backend = web3; }
etc...
}

Однако резервный директор пробует другие серверы по порядку, пока не найдет здоровый. БОЛЬШАЯ проблема заключается в том, что в приведенном выше конфиге web1 будет принимать весь трафик, если localbackend завершится неудачно !!! Это перегрузит web1 и он заболеет. Затем все запросы отправляются на web3 ... и теперь он будет получать в 3 раза больше обычного трафика ... вызывая каскадный сбой.

Таким образом, вместо этого нам нужна конфигурация, которая позволит всем запросам отправляться на httpd-сервер localhost, если он исправен, но если нет, отправлять запросы на другие работоспособные серверы в режиме циклического перебора.

Заранее благодарим вас за любые предложения и решения, о которых вы можете подумать ... Ваша помощь очень ценится.

Ответы [ 3 ]

2 голосов
/ 25 января 2014

Это может быть выполнено несколькими способами, одним из самых простых является:

  1. Установка локального хоста в качестве бэкэнда по умолчанию
  2. Создание директора циклического перебора для остальных бэкэндов
  3. Проверьте поверх вашего vcl_recv, если бэкэнд по умолчанию исправен и если он не переключается на Round Roind Director.

При таком подходе вы можете даже переключать бэкэнды, если текущий запрос не удался.

Что-то вроде:

probe my_probe {
  .url       = "/";
  .interval  = 1s;
  .timeout   = 0.2 s;
  .window    = 3;
  .threshold = 2;
  .initial   = 1;
}
backend default {
  .host  = 127.0.0.1;
  .probe = my_probe;
}
backend server1 {
  .host  = 192.168.8.21;
  .probe = my_probe;
}
backend server2 {
  .host  = 192.168.8.22;
  .probe = my_probe;
}
backend server3 {
  .host  = 192.168.8.23;
  .probe = my_probe;
}
director server_pool round-robin {
  { .backend = server1; }
  { .backend = server2; }
  { .backend = server3; }
}

sub vcl_recv {
  if ( req.backend == default
    && ! req.backend.healthy
  ) {
    set req.backend = server_pool;
  }
  /* Uncomment if you want to divert restarted requests to the server pool
   * if (req.restarts > 0) {
   *   set req.backend = server_pool;
   * }
   */
}
1 голос
/ 25 января 2014

Это полностью не проверено, но теоретически должно работать.

probe healthcheck {
  .url = "/status.php";
  .interval = 60s;
  .timeout = 0.3 s;
  .window = 8;
  .threshold = 3;
  .initial = 3;
  .expected_response = 200;
}

backend server1 {
  .host = "server1.example.com";
  .probe = healthcheck;
}
backend server2 {
  .host = "server2.example.com";
  .probe = healthcheck;
}
backend server3 {
  .host = "server3.example.com";
  .probe = healthcheck;
}

director fallback round-robin {
  { .backend = server1; }
  { .backend = server2; }
  { .backend = server3; }
}

sub vcl_recv {
  # Set backend to fallback director until we find the proper localhost backend.
  # If we can't figure out which is localhost, at least we still work.
  set req.backend = fallback;

  # Set the default backend to localhost by hostname
  if (server.hostname == "server1") {
    set req.backend = server1;
    set obj.http.X-LocalCache = "YES";
  }
  else if (server.hostname == "server2") {
    set req.backend = server2;
    set obj.http.X-LocalCache = "YES";
  }
  else if (server.hostname == "server3") {
    set req.backend = server3;
    set obj.http.X-LocalCache = "YES";
  }

  # If the localhost fails, go to fallback director.
  if (obj.http.X-LocalCache ~ "YES") {
    if (!req.backend.healthy) {
      set req.backend = fallback;
      unset obj.http.X-LocalCache
    }
  }
}

Он автоматически определит, какой сервер является локальным, используя имя хоста.Вам просто нужно убедиться, что имена бэкэндов совпадают с вашими именами хостов.

0 голосов
/ 13 марта 2012

Вы можете сделать некоторую базовую балансировку нагрузки с помощью Varnish.Проверьте это:

https://www.varnish -cache.org / trac / wiki / LoadBalancing

...