Sziasztok,
Néhány gondolat, tapasztalat a Repcache, Couchbase kapcsán.
A webszervereink működése során eljutottunk arra a pontra, hogy szükségessé vált a PHP sessionok alternatív módon történő kezelése.
Alapesetben fontos, hogy a jelenlegi két szerver közötti PHP sessionok mindkét szerver által "láthatóak" legyenek, ezt OCFS2-vel oldottuk meg.
Majd jött egy érdekes probléma, a sessionok nagy száma miatt az OCFS2 elérése finoman szólva is problémás volt, 200+ os load-ról beszélünk és álló
szolgáltatásokról, mivel szerencsétlen nem tudta elérni a session fileokat, jobban mondva elérte egy idő után, de ki akarja ezt kivárni?!
Szóval volt vala ez
Tudni kell, hogy a szerverek egy haproxy mögött helyezkednek el, a fenti problémára az ideiglenes megoldás a saját EXT4-es filerendszer használatával
küszöböltük ki, na bumm oda a session redundancia.
Majd lett belőle ez
Sebaj, van egy csodálatos szolgáltatás...Memcache, beállítottuk (persze a tesztrendsezren :) ) - igazából a repcache-t - boldogok voltunk, odasüss, szinkronizál, működik!
A sok transzformáció után lett belőle ez
Aztán jöttek a tesztek és az anomáliák, szerverek közötti váltásoknál nem minden esetben volt sikeres a session file-ok használata, ott volt, de mégsem tudta/akarta olvasni, esetleg a kliens oldalon tűnt el a sessionID, így már esélytelen volt, hogy bármilyen szolgáltatás működjön újbóli bejelentkezés nélkül.
És egy apró, de nem elhanyagolható probléma, ServerA meghal, nem baj, hiszen ServerB tartalmazza az elhalásig szinkronizált összes adatot, de mint fentebb írtam ez nem volt 100%-osan működőképes.
De a fő probléma ott van, hogy ServerA egyszer csak beleordít az éterbe, hogy "DRÁGÁM, MEGJÖTTEM", ServerB erre annyit mond, hogy "ÉS?", nesze itt van 1-2 session, most generálták nálam őket. Na mármost itt van egy kis probléma, ServerB rendelkezik mondjuk 6000 sessional, ServerA pedig 1-2-vel, és nem, nem fogják szinkronizálni, hiszen a repcache ezt nem tudja, ő azt tudja, hogy ha keletkezik egy session ServerA-n vagy ServerB-n azt leszinkronizálja oda-vissza.
Sebaj, erre is van megoldás, egy gyönyörű phpscript amit mondjuk induláskor lefuttatva leszinkronizálhatja az éppen feléledő szerverre a párja tartalmát. Kicsit buhera, nemde?
Aztán képbe került, hogy lesz egy harmadik szerver is, na ekkor vetettük el a repcache-t, egyszerűen erre totálisan alkalmatlan.
Képbe került a Couchbase.
Akkor ugorjunk neki felkiáltással ment is fel a tesztrendszerre, itt már a majdani három szerveres megoldással futottunk neki a beállításnak.
Első körben csináltunk egy Clustert (memcached bucket-el, de ezt hamar elvetettük és a Couchbase bucket-et használjuk), amelyben benne volt mindhárom szerver, be lett állítva a replikáció, csodás ServerA tartalma replikálódik ServerB-re és ServerC-re és ServerB pedig ServerA-ra és ServerC-re és így tovább.
Aztán jött a fekete leves, szerencsétlen PHP ha így van beállítva:
session.save_handler = memcached
session.save_path = '172.18.99.1:11211, 172.18.99.2:11211, 172.18.99.3:11211'
minden gyönyörűen működik amíg az összes szerver elérhető, de a szerverek közötti mozgás továbbra sem tökéletes, megy is meg nem is, leginkább nem.
A másik probléma, hogy a PHP nem igazán tolerálja, ha valamelyik megadott save_path nem elérhető, ha kiesett akkor az eredmény, oldal nem működik, mindenféle config problémákkal dobálózik a logokban, hogy ő bizony nem éri el ServerB-t pedig ez van beállítva.
Itt jogosan kérdezed, hogy akkor miért nem localhost?
Igazából az, de nem a fenti megoldással, emlékszel, replikálódik de az átjárás a szerverek között nem működik rendesen, álló szolgáltatások, ismételt bejelentkezés...nightmare.
A másik megoldás pedig a Couchbase XDCR (Cross DataCenter Replication) szolgáltatása a php.ini localhost-os beállításásval.
Ebben az esetben nem húzod be az összes szerveredet egy Clusterbe ahol ugye egy bazinagy vödörbe kerül a szervereken beállított memóriamennyiség, hanem mindenki a saját kis kiosztott memóriájával gazdálkodhat.
Ha mindegyik kis clusteredet (valójában egy nyamvadt szerver fut a clusterban, de ha a Couchbase clusternek hívja, legyen az) felkonfiguráltad, elindultak mehet a replikáció beállítása az XDCR fülön, itt is a hasonlóan kell beállítani, mint ahogy az egy clusterben történt, csak ez nem automatikus, hanem kézzel történik.
Tehát valahogy így néz ki a kapcsolati ábra most
Tehát fogjuk ServerA-t és felvisszük ServerB-t és ServerC-t az XDCR Remote Clusterek közé, majd a Create Replication gombbal beállítjuk, hogy ezen a szerveren melyik "bucket-et" fogja szinkronizálni a másik cluster melyik bucketjébe. Pl: ServerA default bucket megy ServerB default bucket-be és ServerC default bucket-be. A többi szerveren hasonló séma szerint kell beállítani.
Csak azért default, mert ezt nem lehet változtatni, egyébként is, nekünk tökéletesen megfelel.
Maga a szinkronizálás változásra történik meg, és ami csodálatos, ha bármelyik szerver nem elérhető...nem történik semmi, megy minden tovább a maga útján, a haproxy nem fog odadobni kérést, hiszen azt mondja, hogy hohóó, nálad nem működik a Couchbase, nem kapsz semmit, majd odaadom ServerX-nek a session-t.
De mi történik, ha teszem azt, - maradva az előző példánál - ServerA feladja a harcot és eltűnik az éterből? Semmi, majd ServerB és ServerC dolgozik helyette, a HAProxy megoldja.
Majd később eljön a várva várt pillanat: ServerA egyszer csak azt mondja: "DRÁGÁM, MEGJÖTTEM", erre azt kiáltja ServerB és ServerC, hogy "ÖRÜLÖK, HOGY ITTHON VAGY" nesze itt vannak az adatok, cserélgessünk egymás között, majd kis idő múlva tadaaa az összes session megjelenik ServerA-n is, mindenki boldog, leginkább a felhasználó, nincs kiesés, gyors.
Jelenleg itt állunk, a rendszer tesztelési fázisban van, de a tapasztalatok eddig biztatóak, remélem segítettem, hogy ne kelljen másnak is végigjárnia ezeket a hosszadalmas tesztelési köröket. És ofc szívesen várom az építő jellegű hozzászólásokat :)
A végére néhány unalmas beállítás:
(Rep)Memcache esetében:
php.ini
Memcached: (php5-memecached)
session.save_handler = memcached
session.save_path = '172.18.99.1:11211, 172.18.99.2:11211, 172.18.99.3:11211'
Memcache (php5-memcache)
session.save_handler = memcache
session.save_path = 'tcp://172.18.99.1:11211, tcp://172.18.99.2:11211, tcp://172.18.99.3:11211'"
memcached.ini, letölthető innen: http://sourceforge.net/projects/repcached/files/
extension=memcached.so
[memcached]
memcached.sess_locking = 1
memcached.sess_consistent_hash = 1
memcached.sess_binary = 1
memcached.sess_lock_wait = 150000
memcached.sess_prefix = "memc.sess.key."
memcached.sess_number_of_replicas = 2
memcached.sess_randomize_replica_read = 0
memcached.sess_remove_failed = 0
memcached.compression_type = fastlz
memcached.compression_factor = 1.3
memcached.compression_threshold = 2000
memcached.serializer = php
memcached.use_sasl = 0
memcache.ini:
extension=memcache.so
[memcache]
memcache.dbpath="/var/lib/memcache"
memcache.maxreclevel=0
memcache.maxfiles=0
memcache.archivememlim=0
memcache.maxfilesize=0
memcache.maxratio=0
memcache.allow_failover=1
memcache.max_failover_attempts=2
memcache.session_redundancy=2
memcache.default_timeout_ms=1000
memcache.hash_strategy=consistent
A couchbase esetében, nem tudok config file-okkal szolgálni, lényegében a webes felületen beállíthatóak a szükséges dolgok.
Letölthető innen: http://www.couchbase.com/nosql-databases/downloads
Az install tulajdonképpen next -> next -> finish
dpkg -i couchbase-server-community_3.0.1-ubuntu12.04_amd64.deb
Majd a http://server_ip:8091 -es porton lehet elérni a böngészőben.
Üdv, Thunder