Newsgroup: it.comp.os.linux.sys
Titolo: MySQL HA e bilanciamento

Ciao,
secondo voi, qual'è il metodo migliore per creare un
cluster ad almeno 4 nodi MySQL senza fare la canonica
suddivisione in master-slave?
Ho la necessità di bilanciare in maniera trasparente
sia le query in scrittura, sia le query in lettura, su
uno dei nodi del cluster stesso.
Con mysql-cluster si fa, ma gira tutto in ram ed in caso
di molti database (centinaia di giga) diventerebbe ingestibile.
MySQL proxy e la duplicazione potrebbe essere una soluzione, ma mi pare 
una vaccata. Potrei fare 4 nodi mysql non sincronizzati tra loro, due
nodi mysql-proxy in HA (no bilanciamento) che una volta ricevuta la
query, se in scrittura, la sparano a tutti i membri del cluster, se in
lettura sorteggiano un membro a caso e la eseguono li.
Alternative? Mettere mano al codice client (ovvero il PHP) non è 
applicabile. Forzare i clienti a mettere mano al codice non è 
applicabile, ovvero, i clienti devono poter installare wordpress
in maniera trasparente facendo puntare la configurazione ad un
server ben preciso.
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 
http://www.howtoforge.com/loadbalanced_mysql_cluster_debian
Ehm, mi autocito:
"Con mysql-cluster si fa, ma gira tutto in ram ed in caso
di molti database (centinaia di giga) diventerebbe ingestibile."
;)
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito č di fare il possibile per la


 server ben preciso.
 
no, appunto, questo lo risolvi con mysql-proxy che avevi menzionato ...
guarda che se ti interessa esiste un altro prodotto: sqlrelay
(*) "Both servers have to execute all write statements, whether the
write statements come directly from clients or come via replication."
-- 
Wikipedia Admin: "wikipedia non è un blog"
Iosif Stalin: "i compagni hanno scambiato il partito per un circolo di
discussione"

 guarda che se ti interessa esiste un altro prodotto: sqlrelay
In merito a quest'ultimo, avrei una domande:
- come caspita si fa a configurare sqlrelay in modo da permettere
la connessione a 5 server ma con sopra centinaia di database?
Stano dalla documentazione, sqlrelay apre le connessioni verso
un singolo database e lo ruota attorno ai server disponibili, ma io
ho un numero di database superiore a 800 da bilanciare in maniera
trasparente.

 trasparente.
Ora ho capito meglio, però, così' su due piedi non ti so rispondere :)


 la scrittura.
Pensandoci bene, hai ragione.
Però, sempre pensandoci bene, potrei anche evitare di bilanciare le
scritture.
Se, ad esempio, facessi un cluster a 5-6-7 nodi, di cui 1 in master,
potrei benissimo
corazzare all'inverosimile il master, biprocessore quad o
quadriprocessore quad, 32GB
etc etc, e tenere tutti gli altri nodi più leggerini.
MA:
in scrittura mysql blocca la tabella, scrive e la sblocca. durante il
lock nessuno legge.
se la tabella è carica di query in scrittura, si accodano le letture.
Ora, se metto in piedi un replica master-slave, il lock sarà propagato
su tutto il cluster,
visto che mysql scrive quasi in contemporanea su tutto il cluster.
Idem con mysql proxy
in duplicazione query.
Ergo: posso creare un cluster per aumentare il carico sostenibile
dalla infrastruttura (anzichè
avere un server con 100 database, avrò 10 server con 100 database ma
bilanciati un po qui
ed un po li), ma non potrò mai bilanciare la singola tabella visto che
se uno dei nodi scrive,
anche tutti gli altri scrivono. Capisci il ragionamento?
Quindi, come caspita si fa? Se una insert blocca potenzialmente tutto
il cluster, figuriamoci
cosa succede se mi ritrovo a gestire centinaia di migliaia di insert
al secondo come in un
circuito payperclick o scambio banner con calcolo statistiche (come un
paio che gestisco)

 "unexpected behaviour" non ben precistai ... mah...
Non serve utilizzare i symlink, in quanto il parametro ibdata permette l'uso 
di path assoluti per definire la posizione dei datafile innodb. Detto 
questo, forte anche di recenti esperienze lavorative, torno a ribadire che 
MySQL fa letteralmente schifo :)
Enrico

la connessione a 5 server ma con sopra centinaia di database?
      <instance id="gandalf" port="6603" socket="/tmp/gandalf.sock"
	dbase="mysql"
	connections="1500" maxconnections="1500"
	maxqueuelength="0" growby="1" ttl="60" endofsession="commit"
	sessiontimeout="600" runasuser="nobody" runasgroup="nobody"
	cursors="5" authtier="listener" handoff="pass"
	deniedips=""
	allowedips=""
	debug="none"
	maxquerysize="65536"
	maxstringbindvaluelength="4000"
	maxlobbindvaluelength="71680"
	idleclienttimeout="-1">
      <users>
      	<user user="user" password="password"/>
      </users>
      <connections>
         <connection connectionid="srv_1_db_1"
 string="user=user_db_1;password=pass_db_1;db=db_1;host=srv_1"
		metric="srv_1_thews"/>
         <connection connectionid="srv_1_db_2"
 string="user=user_db_2;password=pass_db_2;db=db_2;host=srv_1"
		metric="srv_1_thews"/>
	...
         <connection connectionid="srv_2_db_1"
 string="user=user_db_1;password=pass_db_1;db=db_1;host=srv_2"
		metric="srv_2_thews"/>
	...
      </connections>
</instance>
Si puo' scrivere un piccolo script che legga il database di server e DB
<grin> e generi <connections />.
Leonardo
-- 
Enough, enough!  But, stranger, ere we part,
Glancing farewell to each nefarious bier,
This warning would I beg you take to heart:
There is an end to e'en the worst career!

 lavorative, torno a ribadire che MySQL fa letteralmente schifo :)
Adesso si prega di spiegare come si potrebbe affrontare con successo
tale problema con Oracle, Postgres, DB2 o Firebird. Vediamo un po'.
Ricordo che il problema posto inizialmente era: distribuire il carico
delle insert e non rilasciare i soliti stucchevoli commenti :-)


 <grin> e generi <connections />.
E ma io non ho le password, username e password li settano gli utenti

 delle insert e non rilasciare i soliti stucchevoli commenti :-)
Lo so, ma visto e considerato quanto mi sta facendo penare ultimamente 
MySQL, non ho potuto fare a meno di esternare quel commento (che, per 
inciso, non c'entra nulla con il problema esternato dall'OP, visto che si 
riferisce ad una casistica decisamente differente) :)
Enrico

 replica multimaster e dalla replica sincrona tra i nodi)
ma serio? "la distribuzione delle insert è data dalla replica
multimaster" (che su mysql esiste dal 2007, ma che non risolve questo
problema)? Ma hai letto il thread per caso?


             multimaster e dalla replica sincrona tra i nodi)
Lo dici perchè l'hai fatto (nel qual caso voglio tutti i dettagli e i
problemi implementativi) o per bibliografia?
Perchè conosco una discreta quantità di fan sfegatati di PG (e per
alcune tipologie di utilizzo in particolare ci metto anche me stesso
medesimo), ma la gestione delle repliche (men che meno multimaster) non
è decisamente tra le superiorità che adducono a loro sostegno.
-- 
Paranoia is a disease unto itself. And may I add: the person standing
next to you may not be who they appear to be, so take precaution.
-----------------------------------------------------------------------------
http://bofhskull.wordpress.com/

 
ma poi guarda che innodb_datafile_path accetta una lista di valori
separati da virgola, e ogni valore corrisponde a un datafile.
Io non l'ho mai usato, però sembra quello. Ma ripeto: non c'è evidenza
che funzioni con le partizioni....


 è decisamente tra le superiorità che adducono a loro sostegno.
Beh, tieni presente che con PostgreSQL 9 le cose in tal senso dovrebbero 
essere cambiate, e in meglio
Enrico

 che funzioni con le partizioni....
L'ho usato e fa quello che dice di fare. Per il partizionamento, non saprei 
dirti nemmeno io in quanto da noi non e` stato piu` utilizzato
Enrico