apache2 + mod_proxy_balancer + mod_cache

Fórumok

Sziasztok!

Szeretnek egy http-frontend szervert osszerakni de sajnos nem mukodik tokeletesen.Funkcioja szerint szetosztja a kereseket a backend szerverek kozott mikozben a statikus tartalmat a sajat cache-ebol szolgalja ki. Mindezt egy apache2 szerverrel es a kovetkezo modulokkal:

    * mod_proxy
    * mod_proxy_balancer
    * mod_proxy_http
    * mod_cache
    * mod_mem_cache
    * mod_disk_cache

A konfig fajlok a kovetkezok:

frontend



  <IfModule mod_cache.c>
    <IfModule mod_disk_cache.c>
      CacheMinFileSize 1
      CacheMaxFileSize 52428800
      CacheDirLength 4
      CacheDirLevels 4
      CacheRoot /var/cache/apache2/mod_disk_cache
    </IfModule>
    <IfModule mod_mem_cache.c>
      MCacheMinObjectSize 1
      MCacheMaxObjectSize 1048576
      MCacheMaxObjectCount 65536
      MCacheSize 1572864
      MCacheRemovalAlgorithm GDSF
    </IfModule>
    #UseCanonicalName On
    CacheDefaultExpire 14400
    CacheMaxExpire 86400

    CacheEnable mem /
    CacheEnable disk /

  </IfModule>

  ProxyRequests Off
  ProxyIOBufferSize 8192
  ProxyReceiveBufferSize 65535
  ProxyMaxForwards 1000
  ProxyTimeout 30

  <Proxy *>
    Order deny,allow
    Allow from all
  </Proxy>

  <Proxy balancer://proba_cluster>
    BalancerMember http://www1.proba.hu route=ha1
    BalancerMember http://www2.proba.hu route=ha2
    ProxySet lbmethod=byrequests
  </Proxy>

  ProxyPass /balancer-manager !
  ProxyPass /server-status !
  ProxyPass / balancer://proba_cluster/ stickysession=BALANCEID nofailover=On

  ProxyPassReverse / http://www1.proba.hu/
  ProxyPassReverse / http://www2.proba.hu/

backend 1


  RewriteEngine On
  RewriteRule .* - [CO=BALANCEID:balancer.www1:.proba.hu]

backend 2


  RewriteEngine On
  RewriteRule .* - [CO=BALANCEID:balancer.www2:.proba.hu]

A problemam az, hogy ha be van kapcsolva a mem_cache vagy a disk_cache kozul barmelyik vagy akar mindketto akkor elofordul, hogy hiaba van a stickysession szerint a www1 szerveren a kliens egyszer csak atrakja a masik szerverre. Ilyenkor elveszlik a session.

Nem talalok logikus magyarazatot, hogy miert tortenik ez. Mi koze lehet a cache-nek ehhez? Mit csinalok rosszul?

Hozzászólások

Bocs az offtopic-ért, de ilyet inkább squid reverse proxy-val szokás csinálni, esetleg PLB-vel.
Apache az egyik legkevésbé hatékony megoldás erre a célra.

Squid-ben be lehet állítani egy redirectort, ami a bejövő URL és egyéb adatok alapján állítja elő a kimenő URL-t. Ez akár egy bash script is lehet, ami stdin-en kapja a bejövő adatokat és stdout-on adja a kimenetét (persze jobb egy C/C++ progi).
Létezik egy csomó ilyen redirector mindenféle célokra, köztük load balancerek is, de ezeket még nem próbáltam, mert én sajátot írtam a speciális igények miatt.

Ja igen...
Session követést nem tudott régen a squid, át is kellett írni, hogy a session-cookie-t is továbbítsa a redirectornak (elég egyszerű hack amúgy).
Lehet, hogy az újba ezt már betették, de ezt nem tudom, csak renmélem...
Ha idengenkedsz a squid hackelésétől, akkor tényleg kell haproxy vagy plb vagy valami hasonló is mellé. Nagyon valószínű, hogy még így is sokkal jobban fog teljesíteni, mintha apache lenne.

Nekem az apache teljesitmenyevel nincs semmi bajom. Rengeteg szalon nagyon gyorsan kepes kiszolgalni es a disk_cache, mem_cache hatekonyan gyorsitja a kiszolgalast. Csak sajnos ez az anomalia felboritja az egesz tervet...

Es az a szomoru hogy ilyen apache2 megoldast (proxy + palancer) meg nem lattam dokumentalva a neten. Egyeb doksiban emlitik a ketto egyuttmukodeset. Tehat elviekben mukodnie kellene. Ezert azt tartom valoszinunek, hogy en valamit elrontok a konfig fajlokban.

Azert fordultam az itteni kozosseghez segitsegert, hatha talalkozott mar valaki ilyen hibaval.

--
maszili

Vagy 4-5 éve vacakoltam ezzel, de az a helyzet, hogy apache akkoriban iszonyú erőforrás-igényes volt squid-hez képest. Ezt az mpm verziót nem próbáltam, de az tény, hogy squid non-blocking architektúrája már elméleti szinten is sokkal alkalmasabb proxy célokra, mint az apache "socket-en blokkoló szálak" megoldása.
Mindenesetre squid bevált és ha jól tudom, azóta sincs semmi gond a rendszerrel, pedig ott tényleg előfordul több ezer nyitott socket egy időben. Ráadásul az még a régi select-es squid verzió volt.

Azóta sqiud képes használni a kernel epoll interface-ét is, ami lényegesen hatékonyabbá teszi.
Itt egy összehasonlítás is:
http://monkey.org/~provos/libevent/libevent-benchmark.jpg

kiprobaltam en is es nalam is ezt csinalja. te milyen bongeszovel probaltad? nem teszteltem agyon, de nekem ugy tunt, csak explorer alatt csinalja. firefox alatt nem.