Как выполнить отказоустойчивость, если Varnish находится между HAProxy и Apache

Как выполнить отказоустойчивость, если Varnish находится между HAProxy и Apache

Я думаю о том, чтобы поставить Varnish между HAProxy и Apache. Это работает, однако с Varnish между HAProxy следит за Varnish. Если Apache выйдет из строя, он не переключится на другой Apache.

Есть ли конфигурация в HAProxy, которая позволит решить эту проблему?

решение1

Если Varnish находится между HAproxy и Apache, вы можете просто заставить Varnish выполнитьБалансировка нагрузки, хотя он и не так надежен, как варианты, предоставляемые HAproxy.

Возможно, было бы лучше, если бы HAproxy отправлял статический контент в Varnish, а остальное — напрямую на внутренние серверы.

На Haproxy.com есть очень хорошая статья о том, как это сделать.здесь.

Если вы действительно хотите, чтобы HAproxy проверял статус VarnishиApache одновременно (которые находятся на одном хосте), у вас есть два варианта:

  1. Настройте фиктивные бэкэнды/серверы в HAProxy, которые проверяют Apache, а соответствующий сервер Varnish отслеживает фиктивные:

    frontend HTTP-IN
      mode http
      default_backend Varnishes
    
    # All traffic goes here
    backend Varnishes
      mode http
      balance roundrobin 
      server Varnish-1 1.1.1.1:80 track Apache-1/Apache-1
      server Varnish-2 2.2.2.2:80 track Apache-2/Apache-2
    
    # No traffic ever goes here
    # Just used for taking servers out of rotation in 'backend Varnishes'
    backend Apache-1
      server Apache-1 1.1.1.1:8080 check
    
    backend Apache-2
      server Apache-2 2.2.2.2:8080 check
    
  2. Varnish должен вернуть результат проверки работоспособности, соответствующий статусу Apache (OK, если Apache работает, в противном случае FAILED).

    лак.vcl

    backend default {
      .host = "127.0.0.1";
      .port = "8080";
    }
    
    # Health Check
    if (req.url == "/varnishcheck") {
      if (req.backend.healthy) {
        return(synth(751, "OK!"));
      } else {
        return(synth(752, "FAILED!"));
      }
    }
    
    sub vcl_synth {
      # Health Checks
      if (resp.status == 751) {
        set resp.status = 200;
        return (deliver);
      }
      if (resp.status == 752) {
        set resp.status = 503;
        return (deliver);
      }
    }
    

    haproxy.cfg

    frontend HTTP-IN
      mode http
      default_backend Varnishes
    
    backend Varnishes
      mode http
      balance roundrobin 
      option httpchk HEAD /varnishcheck
      http-check expect status 200
      server Varnish-1 1.1.1.1:80 check
      server Varnish-2 2.2.2.2:80 check
    

Связанный контент