Использование AWS ELB за лаком - возможно ли это?

Я пытаюсь поместить набор экземпляров EC2 за пару серверов Varnish. Конфигурация нашего лака очень редко изменяется (один или два раза в год), но мы всегда добавляем/удаляем/заменяем веб-серверы по всем причинам (обновления, проблемы, всплески нагрузки). Это создает проблемы, потому что нам всегда нужно обновлять нашу конфигурацию Varnish, которая привела к ошибкам и горя.

Что бы я хотел сделать, так это управлять набором серверных серверов просто путем добавления или удаления их из балансировки эластичной нагрузки. Я попытался указать конечную точку ELB в качестве бэкэнд, но я получаю эту ошибку:

Message from VCC-compiler:
Backend host "XXXXXXXXXXX-123456789.us-east-1.elb.amazonaws.com": resolves to multiple IPv4 addresses.
Only one address is allowed.
Please specify which exact address you want to use, we found these:
123.123.123.1
63.123.23.2
31.13.67.3
('input' Line 2 Pos 17)
.host = "XXXXXXXXXXX-123456789.us-east-1.elb.amazonaws.com";

Единственный согласованный публичный интерфейс ELB - это его DNS-имя. Набор IP-адресов: это DNS-имя разрешает изменения со временем и с нагрузкой.

В этом случае я предпочел бы НЕ указывать один точный адрес - я хотел бы объединить все, что вернется из DNS. Это возможно? Или кто-то может предложить другое решение, которое выполнит одно и то же?

Спасибо, Сэм

Ответ 2

Я бы не рекомендовал поставить ELB за лак.

Проблема заключается в том, что Ларниш разрешает имя присвоенный ELB, и его кеширование IP-адресов до тех пор, пока VCL перезагружается. Из-за динамического характера ELB, IPs связанный с cname, может измениться в любое время, в результате чего Лак маршрутизация трафика на IP-адрес, который не связан с правильным ELB больше.

Это интересная статья, которую вы могли бы читать.

Ответ 3

Я написал этот script, чтобы иметь возможность автоматически обновлять vcl как только новый экземпляр появляется вверх или вниз.

он требует, чтобы .vcl имел include для backend.vcl

Этот script является лишь частью решения, задачи должны быть: 1. получить новое имя сервера, а IP (автомасштабирование) может использовать cmds API AWS для этого, также через bash 2. Обновление vcl (это script) 3. перезагрузите лак

script здесь http://felipeferreira.net/?p=1358

Другой pepole сделал это по-разному http://blog.cloudreach.co.uk/2013/01/varnish-and-autoscaling-love-story.html

Ответ 4

Да, вы можете.

в вашем default.vcl put:

include "/etc/varnish/backends.vcl";

и установите backend на:

set req.backend = default_director;

поэтому запустите этот script, чтобы создать backends.vcl:

#!/bin/bash
FILE_CURRENT_IPS='/tmp/elb_current_ips'
FILE_OLD_IPS='/tmp/elb_old_ips'
TMP_BACKEND_CONFIG='/tmp/tmp_backends.vcl'
BACKEND_CONFIG='/etc/varnish/backends.vcl'

ELB='XXXXXXXXXXXXXX.us-east-1.elb.amazonaws.com'
IPS=($(dig +short $ELB | sort))

if [ ! -f $FILE_OLD_IPS ]; then
    touch $FILE_OLD_IPS
fi

echo ${IPS[@]} > $FILE_CURRENT_IPS

DIFF=`diff $FILE_CURRENT_IPS $FILE_OLD_IPS | wc -l`

cat /dev/null > $TMP_BACKEND_CONFIG

if [ $DIFF -gt 0 ]; then

    COUNT=0

    for i in ${IPS[@]}; do
        let COUNT++
        IP=$i
        cat <<EOF >> $TMP_BACKEND_CONFIG
backend app_$COUNT {
    .host = "$IP";
    .port = "80";
    .connect_timeout = 10s;
    .first_byte_timeout = 35s;
    .between_bytes_timeout = 5s;
}

EOF
    done

    COUNT=0

    echo 'director default_director round-robin {' >> $TMP_BACKEND_CONFIG

    for i in ${IPS[@]}; do
        let COUNT++
        cat <<EOF >> $TMP_BACKEND_CONFIG
    { .backend = app_$COUNT; }
EOF
    done

    echo '}' >> $TMP_BACKEND_CONFIG

    echo 'NEW BACKENDS'
    mv -f $TMP_BACKEND_CONFIG $BACKEND_CONFIG

fi

mv $FILE_CURRENT_IPS $FILE_OLD_IPS

Ответ 5

Вы могли бы сделать ELB в своем приватном VPC, чтобы он имел локальный ip. Таким образом, вам не нужно использовать какой-либо DNS-тип Cnames или что-либо, что Лак не поддерживает так легко.

Ответ 6

Использование внутреннего ELB не помогает проблеме, потому что обычно имеет 2 внутренних IP-адреса!

Внутренний хост "internal -XXX.us-east-1.elb.amazonaws.com": разрешает несколько адресов IPv4. Разрешен только один адрес. Укажите, какой именно адрес вы хотите использовать, мы нашли следующее:   10.30.10.134   10.30.10.46 ('ввод' Строка 13 Поз 12)

Я не уверен, что если эти IP-адреса останутся неизменными или они могут измениться? кто-нибудь?

Ответ 7

Вы не получаете 10 тысяч петиций, если должны были разрешить ip на каждом из них. Лак разрешает ips при запуске и не обновляет его, если его перезапуск не перезагружен. Действительно, лак отказывается начинать, если обнаружил два ip для имени dns в определении бэкэнд, например ip, возвращенный для ELB с несколькими АЗ.

Таким образом, мы решили проблему с размещением лака перед nginx. Nginx может определить ELB в качестве backend, так что Varnish backend является локальным nginx, а бэкендом nginx является ELB.

Но я не чувствую себя комфортно с этим решением.

Ответ 8

I мой предыдущий ответ (более трех лет назад) я не решал эту проблему, мой [nginx-лак - nxinx] → ELB-решение работало до тех пор, пока ELB не изменит IP-адреса

Но с некоторого времени назад мы используем одну и ту же настройку, но с nginx, скомпилированным с плагин jdomain

Итак, идея состоит в том, чтобы поместить nginx в тот же хост, что и лак, чтобы настроить вверх по потоку, как это:

resolver 10.0.0.2;  ## IP for the aws resolver on the subnet

upstream backend {                                                                              
    jdomain internal-elb-dns-name port=80;
}

чтобы восходящий поток автоматически перенастроил восходящий IP-адрес, если ELB изменяет свои адреса

Это может быть не решение, использующее лак, но оно работает как ожидалось