Каскадирование squid'ов

    Во времена слишком дорогого анлима (64кбита — 1000рур), сотворили с товарищами кластер проксей, дабы увеличить суммарную пропускную способность. Время шло, цены менялись. Сейчас они уже более дружелюбны — мбитный анлим (с ночным удвоением скорости) стоит всё те же 1000рур. Но, не смотря на это, кластером всё ещё иногда пользуемся. Решил вот поделиться с общественностью методом создания такого добра, вдруг кому будет интересно.
    Для опытов нам потребуется:
    • 1 сервер с установленным на нём squid'ом + ещё какой-нибудь проксёй (если хотите, чтобы этот сервер был не только центральным, но и делился инетом).
      я расскажу про поднятие кластера на базе дебиана, 2 интернет-каналов и 3 сквидов (сквиды для родительских проксе выбраны по 2 причинам: из-за возомжности предоставления статистики по текущим соединениям; из-за лени искать альтернативу)
    • любое количество компьютеров, с любыми ОС и любыми http-проксями
    • опционально — апач, пхп и скрипт SqStat — для просмотря активности прокси

    Будем считать что у нас есть 2 машины — 192.168.1.1 (у неё так же есть 2й ип, со 2м провайдером — 192.168.2.1) и 192.168.1.2
    Немного погуглив — я нашёл заметку без малого 5летней давности — Squid 2 chans. Из неё было выцеплено 2 момента — как, собственно, организовать кластер и как проксировать на разных интерфейсах.

    Для начала — создадим дополнительные сервисы squid'a.
    Сперва — немного подправим конфиг сервера ( /etc/squid/squid.conf ). Т.к. кэш мне не нужен — я его отрубил. Делается это установкой параметра cache_dir следующим образом:
    cache_dir null /var/spool/squid

    Т.к. отключили кэш — отрубаем и лог записи в кэш
    cache_store_log none

    Откроем доступ к прокси для всех (нужно вставить до записи 'http_access deny purge'):
    acl all src 0.0.0.0/0.0.0.0
    http_access allow all

    Откроем доступ к прокси по протоколу cache_mgr с локалхоста (я в упор не помню, какие параметры указаны в дефолтном конфиге — так что не помешает перед вставкой проверить, что уже есть):
    acl manager proto cache_object # это строка, скорее всего, уже есть в конфиге
    http_access allow manager localhost
    http_access deny manager

    Слушать порт 8080 (по дефолту — 3128):
    http_port 8080

    Для ограничения доступа к прокси — я предпочитаю использовать iptables (по-умолчанию — все пакеты отбрасываются), а не авторизацию, поэтому прокся из конфига открыта для всех:
    iptables -N proxy
    iptables -A proxy -j REJECT
    iptables -I proxy -s 192.168.1.2 -j ACCEPT
    iptables -I INPUT -p tcp --dport 8080 -j proxy

    Теперь добавим родительские прокси (говорю сразу — с приведённой ниже конфигурацией — ничерта не заработает. но дальше, по ходу повествования — ошибка будет найдена и исправлена :)):
    cache_peer 127.0.0.1 parent 8081 0 no-query no-digest round-robin weight=4
    cache_peer 127.0.0.1 parent 8082 0 no-query no-digest round-robin weight=1
    cache_peer 192.168.1.2 parent 8080 0 no-query no-digest round-robin weight=4

    Итого — 3 родительских прокси, с которых не будет запрашиваться кэш (no-query) и cache-digest (no-digest), родители будут циклически переключаться (round-robin). Ну и разный weight — ибо 2й канал у меня слабый.
    Запрещаем сквиду ходить напрямую (не через родителей):
    never_direct allow all

    Создаём 2 копии конфига — /etc/squid/squid_2.conf и /etc/squid/squid_3.conf. Удаляем из них строки, начинающиеся на cache_peer, never_direct. Изменяем значение параметра http_port на 8081 и 8082 соответственно. Изменяем пути до логов (здесь и далее по тексту — изменения будут указываться только для squid_2, для squid_3 — изменения аналогичны):
    access_log /var/log/squid_2/access.log
    cache_log /var/log/squid_2/cache.log

    Так же не помешает создать этот путь и сменить владельца, дабы сквид мог писать логи:
    mkdir /var/log/squid_2
    chown proxy:proxy /var/log/squid_2

    Указываем расположение pid-файла:
    pid_filename /var/run/squid_2.pid

    Расположение кэша я не менял — все 3 прокси спокойно работают с 1 каталогом. Но squid -z (инициализировать кэш) перед первым запуском сделать не помешает.

    Теперь приступим к созданию init-скриптов. В файле /etc/init.d/squid комментируем код, ответственный за инициализацию кэша (т.к. скрипт не рассчитан на null-кэш):
    # if [ -d "$cdr" -a! -d "$cdr/00" ]
    # then
    # log_warning_msg «Creating squid spool directory structure»
    # $DAEMON -z
    # fi

    Копируем /etc/init.d/squid => /etc/init.d/squid_2.
    Изменяем squid_2:
    NAME=squid_2

    SQUID_ARGS="-D -sYC -f /etc/squid/squid_2.conf"

    Так же, для душевного равновесия, можно изменить сообщения, которые выдаёт скрипт:
    log_daemon_msg «Starting Squid HTTP proxy» «squid_2»

    log_daemon_msg «Stopping Squid HTTP proxy» «squid_2»

    log_daemon_msg «Restarting Squid HTTP proxy» «squid_2»

    Для следующего фокуса — в начале инит-скрипта должны быть примерно следующие строки:
    # Default-Start: 2 3 4 5
    # Default-Stop: 0 1 6

    Настраиваем запуск свеже созданного сервиса с системой:
    update-rc.d squid_2 defaults

    Запускаем дочерние прокси:
    invoke-rc.d squid_2 start
    invoke-rc.d squid_3 start

    Вот он, момент истины — запускаем центральный прокси
    invoke-rc.d squid start
    и…
    FATAL: ERROR: cache_peer 127.0.0.1 specified twice
    … и нас жестоко обламывают.
    Немного подумав (руки до гугля не доходят) — заменяем в одной записи 127.0.0.1 => localhost.
    Запускаем, и вот оно — счастье.
    Сквид на 2й машине можно настроить копированием /etc/squid/squid.conf и удалением оттуда упоминаний о cache_peer и never_direct + поправить права доступа по протоколу cache_mgr.
    Для тестирования — настроить любимый браузер на использования прокси и открыть любую страницу. Смотрим /var/log/squid/access.log, там должны быть примерно следующие строки:
    1214499645.364 15335 89.189.176.111 TCP_MISS/206 214755 GET ru.download.nvidia.com/Windows/177.41/177.41_geforce_winxp_64bit_international_whql.exe — ROUNDROBIN_PARENT/192.168.1.2 application/octet-stream
    1214499646.148 11138 89.189.176.111 TCP_MISS/206 534572 GET ru.download.nvidia.com/Windows/177.41/177.41_geforce_winvista_64bit_international_whql.exe — ROUNDROBIN_PARENT/127.0.0.1 application/octet-stream
    1214499650.695 3564 89.189.176.111 TCP_MISS/206 370947 GET ru.download.nvidia.com/Windows/177.41/177.41_geforce_winvista_64bit_international_whql.exe — ROUNDROBIN_PARENT/localhost application/octet-stream
    1214499658.899 52092 89.189.176.111 TCP_MISS/206 1115575 GET ru.download.nvidia.com/Windows/177.41/177.41_geforce_winvista_64bit_international_whql.exe — ROUNDROBIN_PARENT/192.168.1.2 application/octet-stream


    Далее по плану — SqStat. Скачиваем архив, распаковываем в любую www-папку, переименовываем config.inc.php.defaults => config.inc.php и правим:
    $squidhost[0]=«localhost»;
    $squidport[0]=8080;
    $cachemgr_passwd[0]="";
    $resolveip[0]=false; # для красоты — можно и true поставить :)
    $hosts_file[0]=«hosts.txt»;
    $group_by[0]=«host»;

    $squidhost[]=«localhost»;
    $squidport[]=8081;
    $cachemgr_passwd[]="";
    $resolveip[]=false;
    $hosts_file[]=«hosts.txt»;
    $group_by[]=«host»;

    $squidhost[]=«localhost»;
    $squidport[]=8082;
    $cachemgr_passwd[]="";
    $resolveip[]=false;
    $hosts_file[]=«hosts.txt»;
    $group_by[]=«host»;

    $squidhost[]=«localhost»;
    $squidport[]=8081;
    $cachemgr_passwd[]="";
    $resolveip[]=false;
    $hosts_file[]=«hosts.txt»;
    $group_by[]=«host»;

    $squidhost[]=«192.168.1.2»;
    $squidport[]=8080;
    $cachemgr_passwd[]="";
    $resolveip[]=true;
    $hosts_file[]=«hosts.txt»;
    $group_by[]=«host»;

    Открываем браузером sqstat.php и наблюдаем за активностью.
    Если кому-нибудь интересно — могу выложить выкладываю немного изменённую версию — дополнительно отображает суммарную скорость\объём по параметру группировки — http://narod.ru/disk/26137171001/sqstat.class.php.bz2.html, там только 1 файл — sqstat.class.php, потому необходимо распаковывать архив в папку с оригинальным sqstat.

    В пассивном режиме 3 сквида жрут 2.3% памяти, что в пересчёте на МБ составляет 14,72.
    P.S. # squid -v
    Squid Cache: Version 2.6.STABLE5

    UPD: все же, надеюсь, понимают, что при скачивании в 1 поток через такую прокси — увеличения скорости не будет? для увеличения скорости необходимо запустить закачку с n потоками, где n — количество проксей в кластере (если веса одинаковы).
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 34

      +1
      кому-нибудь интересно, выкладывай :)
        +2
        выложил :)
        +2
        Proxy cluster
          +1
          А смысл всего этого действа?
            0
            дык... смысл в моём случае - в первом же предложении указан. 64кбитный анлим - то ещё удовольствие, а с "кластером" - хоть немного побольше вышло.
              0
              плюс еще кеширование контента и ответов днс серверов
              так же еще можно резать баннеры
                0
                вот только кэширование я отключил. а для ндс - у меня бинд поднят :)
                  0
                  ну и зря
                    0
                    прокся всё-равно пользуются только для тоскания больших файлов. их кэшировать - у меня места не хватит на диске.
              +3
              у нескольких человек есть по мегабиту.
              не все одновременно используют инет, получается, что когда один не использует - то его мегабит "простаивает". а так он делится своим мегабитом с остальными. т.е. если людей двое, то пока один спит, второй может качать на 2-х мегабитах.
              0
              Спасибо за открытие для меня SqStat! А то иногда сетяне в локальном чате начинают орать "Кто качает на всю?!", а тут раз - и посмотрят кто :0)
              Только уберу показ ссылок, все же приватность должна быть обеспечена и оставлю лишь скорость.
                0
                лог сквида не так уж и сложен, к тому же настраиваем. распарсить и сделать простейшую статистику использования канала сможет практически любой)
                  0
                  только вот данные в лог (если хитрых патчей нет, конечно) попадают после завершения закачки, а sqstat отображает текущие коннекты.
                0
                а что все это дает?
                я вижу разве что использование нескольких соединений одновременно.
                  0
                  в идеале - балансировка (хоть и примитивная) нагрузки на прокси-сервера.
                  в моём случае цель была другая - увеличение скорости.
                    0
                    для того же самого (почти) можно использовать ip route c несколькими шлюзами по умолчанию ( http://lartc.org/howto/lartc.rpdb.multiple-links.html ) или iptables ( http://tetro.net/misc/multilink.html ). Но это не через родительские прокси, нужен прямой интернет, но и дает прямой интернет.
                    Под виндой же я лично довольно долго использую 3proxy - работает как с родительскими прокси, так и без них. (также есть NAT32 - дает прямой интернет, но у меня оно работать не захотело)
                    +1
                    Для заинтересовавшихся, во FreeBSD и пакетном фильтре pf это можно сделать используя адресные пулы и балансировку нагрузки. Проще и быстрее (pf работает на уровне ядра)
                      0
                      Правильно ли я понимаю, что для TCP при обоих способах обеспечивается балансировка на уровне сессий, но не мельче? Т.е. если мы хотим, чтобы флэш-плеер в N раз быстрее скачал свой flv с youtube, то придется обломаться?
                        0
                        Балансировка на уровне tcp-коннекта. А быстрей ролик скачать не получится.
                        К примеру, послали вы запрос на flv через 2 канала с разной скоростью. Как вы думаете система будет собирать пакеты, пришедшие разными по размеру частями и с разной задержкой ?
                        0
                        поподробнее пожалуйста
                          0
                          Достаточно неплохой перевод pf fag на русский
                          http://www.opennet.ru/base/net/pf_faq.txt.html,
                          смотреть секцию "Адресные пулы и балансировка нагрузки". FAQ с примерами, понять о чём речь не сложно.
                            0
                            оно же в оригинале
                            http://www.openbsd.org/faq/pf/pools.html
                          0
                          iptables тоже так умеет с дополнительными модулями.
                          0
                          Возник вопрос по sqstat.
                          Сложилась такая проблема:
                          распаковал, настройки поправил... а он говорит - у вас ошибка в строке
                          $group_by[0]="Host";
                          ни Host ни Username не принимает, из за чего не пойму...
                            0
                            Error in the configuration file.
                            "group_by" can be only "username" or "host"
                            вот так ругается? в нижнем регистре попробуйте написать.
                              0
                              Ошибка другая, но всё равно спасибо, разобрался. Возникает теперь другая:
                              SqStat error
                              Error (1): Cannot get data. Server answered: HTTP/1.0 403 Forbidden
                                0
                                acl manager proto cache_object
                                http_access allow manager localhost
                                http_access deny manager
                                вот такое в конфиге сквида есть?
                                  0
                                  Уф, чувствую не разберемся мы с коллегами без вашей помощи. Может, перенесем общение в IM? мои контакты в профиле.
                            0
                            родные СС :)))
                              0
                              привет соседям :)
                              0
                              iptables -N proxy
                              itpables -A proxy -j REJECT
                              iptables -I proxy -s 192.168.1.2 -j ACCEPT
                              iptables -I INPUT -p tcp --dport 8080 -j proxy

                              вроде две буквы местами перепутали (очепятка)
                                0
                                ххы, спасибо :)
                                0
                                можно перевыложить файлы на народ.ру, а то ссылки устарели…

                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                              Самое читаемое