Loadbalanced Memcached Sessies met MySQL backend

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zit met een rechten issue welke in een database zijn opgeslagen, een zogenaamde ACL. Wat is mijn probleem? Veel gebruikers en veel verschillende rechten, dus performance bunch. Oplossing? Memcached!

Ik heb al verschillende mogelijkheden bekeken en ben er echt uit dat ik voor memcached met een MySQL DB als backend ga. Ik sla hier mijn sessies in op en tevens de ACL. Als er wat wijzigt wordt alles direct ge-update in memcached.

Ik heb een aparte memcached server en aparte MySQL server, deze wil ik beide redundant uitvoeren of met meer machines in een master <> master replicatie.

Het probleem zit hem in beide connecties voor de redundancy. Ik gebruik een PHP script om mijn sessies in MySQL en Memcached te zetten. Verandert er iets in de sessie dan wordt MySQL geupdate, daarna Memcached waarna Memcached weer leading is tot de volgende wijziging in de sessie...

In mijn script connect ik naar mijn MySQL server en mijn Memcached server, hier zit meteen mijn bottleneck in redundancy.

Ik probeer een manier te vindend dat wanneer ik bijvoorbeeld 4 webservers heb, deze allemaal naar de eerst beschikbare Memcached server en of MySQL server kunnen connecten.

In de php.ini kan je het volgende instellen:

code:
1
2
session.save_handler = memcache
session.save_path="tcp://localhost:11211, tcp://192.168.0.2:11211"


Dit levert denk ik alleen een probleem op als je zoals ik het doe via een PHP script je sessies in Memcached zet en tevens MySQL als backend gebruikt hiervoor.

De volgende manier kan overigens voor het PHP script, echter hoe gaan we dan met MySQL om ?

code:
1
2
3
4
5
6
7
8
9
$MEMCACHE_SERVERS = array(
    "10.1.1.1", //web1
    "10.1.1.2", //web2
    "10.1.1.3", //web3 
); 
$memcache = new Memcache();
foreach($MEMCACHE_SERVERS as $server){
    $memcache->addServer ( $server ); 
}



Ik weet overigens niet of bovenstaand de manier is welke als web1 uitvalt direct naar web2 overstapt om de Memcached data daar weer vandaan te halen. Wellicht heb ik hier een functie voor nodig welke dit controleert ?

Al met al complex, en ja ik heb dit nodig om mijn sessies levend te houden. Sessies in Memcached alleen is verre van optie!

Any ideas ?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Ik weet overigens niet of bovenstaand de manier is welke als web1 uitvalt direct naar web2 overstapt om de Memcached data daar weer vandaan te halen. Wellicht heb ik hier een functie voor nodig welke dit controleert ?
Elk object in memcached staat maar op één server, zie http://code.google.com/p/memcached/wiki/NewConfiguringClient

Je zit waarschijnlijk weer het verkeerde probleem op te lossen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op maandag 20 februari 2012 @ 18:27:
[...]

Elk object in memcached staat maar op één server, zie http://code.google.com/p/memcached/wiki/NewConfiguringClient

Je zit waarschijnlijk weer het verkeerde probleem op te lossen.
Dat ligt echt maar aan je code hoor...

Lezen blijft echt een vak apart hier....

[ Voor 5% gewijzigd door Verwijderd op 20-02-2012 19:41 ]


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Verwijderd schreef op maandag 20 februari 2012 @ 19:40:
[...]


Dat ligt echt maar aan je code hoor...

Lezen blijft echt een vak apart hier....
Waarom reageer je zo debiel? Jij post code met de tekst 'ik weet niet of ...', ik kijk in de code van memcache/memcache_pool.c van PHP voor de specifieke implementatie en geef je een link over de werking. Daaruit kun je afleiden dat jij problemen krijgt met cache-invalidaties wanneer er een server uitvalt.

Daarnaast zeg ik dat je hele oplossing met memcached waarschijnlijk een heel verkeerde aanpak is.

Acties:
  • 0 Henk 'm!

  • pachacuti
  • Registratie: Januari 2002
  • Laatst online: 07-04 10:20
GlowMouse schreef op maandag 20 februari 2012 @ 20:11:
[...]

Daarnaast zeg ik dat je hele oplossing met memcached waarschijnlijk een heel verkeerde aanpak is.
Dit gevoel krijg ik ook bij het lezen van bovenstaande post.

Wat is het tijdverschil dat je hebt tussen data uit je MySQL te halen en data uit Memcached?
Welke queries wil je cachen?

Ik gebruik eigenlijk enkel Memcached of Redis voor zware Mysql-queries die je geregeld nodig hebt waar je zeker van weet dat de uitkomst altijd gelijk is te cachen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
GlowMouse schreef op maandag 20 februari 2012 @ 20:11:
[...]

Waarom reageer je zo debiel? Jij post code met de tekst 'ik weet niet of ...', ik kijk in de code van memcache/memcache_pool.c van PHP voor de specifieke implementatie en geef je een link over de werking. Daaruit kun je afleiden dat jij problemen krijgt met cache-invalidaties wanneer er een server uitvalt.

Daarnaast zeg ik dat je hele oplossing met memcached waarschijnlijk een heel verkeerde aanpak is.
Wellicht dezelfde waarom je met niet onderbouwde statements komt ?

Gelukkig heb ik het al opgelost en werkt het prima.

En waarom geen Redis/Cassandra of iets anders ? Inderdaad... omdat ik voldoende tests heb gedaan en de cijfers er niet om liegen... je moet average kijken en niet focussen op een activiteit dat het oplost.

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 10:03

Creepy

Tactical Espionage Splatterer

Kunnen we weer gewoon gaan communiceren i.p.v. direct op de man te spelen? Thanks....

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op maandag 20 februari 2012 @ 20:21:
Gelukkig heb ik het al opgelost en werkt het prima.
Ook onder hoge load met een servertje die (tijdelijk) uit is gevallen?
En waarom geen Redis/Cassandra of iets anders ? Inderdaad... omdat ik voldoende tests heb gedaan en de cijfers er niet om liegen... je moet average kijken en niet focussen op een activiteit dat het oplost.
Zou je wat cijfers kunnen posten? :p

Volgens mij moet je overigens juist naar peak kijken, als average al een probleem is dan is opschaling gewenst. Van de CAP stelling focus je met memcached waarschijnlijk op de verkeerde punten (CP ipv AP, hoewel de C niet opgaat als failover aan staat). Dat hoeft overigens niet te betekenen dat je niet een voldoende werkend systeem hebt.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Sinds er allerlei NoSQL-omgevingen zijn onstaan lijkt het heel vaak alsof 'men' van mening is dat MySQL dan blijkbaar niet meer voor die andere 99,9% van de situaties ruimschoots voldoende performance biedt...

Dat gezegd hebbende, memcached is inderdaad niet bedoeld om met een master-master opstelling te werken, in die zin dat gegevens dan over beide masters verspreid worden ipv op beide gerepliceerd. Met proxies als Moxi kan je daar evt omheen werken, maar dat is allemaal client-side en moet je dus wel consequent goed doen.

Wat me trouwens in dit geval ook verstandig lijkt, is af te stappen van de sessionhandler van PHP en/of een eigen te schrijven die PHP kan gebruiken. Op die manier kan je veel gecontroleerder je gegevens wegschrijven.

Oh en trouwens, dat er veel rechten mogelijk zijn, betekent dat ook dat er daadwerkelijk veel verschillende rechtencombinaties uitgedeeld zijn? Je hebt natuurlijk best kans dat het gros van je ACL's uniek is en daardoor zou je die evt los kunnen cachen en bij een gebruiker enkel nog naar de unieke ACL die voor hem van toepassing is verwijzen. Scheelt je weer in elke sessie de complete ACL herhalen en heb je wellicht zelfs memcached er niet meer voor nodig.
Pagina: 1