mboost-dp1

replikering med php


Gå til bund
Gravatar #1 - buchi
30. aug. 2011 20:43
Davs, jeg står i den situation, at jeg gerne ville arbejde lidt med replikering. Men jeg kan simpelthen ikke finde ud af hvordan det skal implementeres i php. i mysql er det relativt let.

Det jeg gerne vil, er at redirecte læse operationer ("SELECT") til en database, og skrive operationer ("UPDATE, INSERT, DELETE") til en anden. Det skal ske igennem PHP.

Er der nogen af er der ved noget om det? :)

Jeg vil gerne gøre det på en måde, der ligger et niveau under php, så jeg kan bruge den samme resource descriptor til begge operationer, hvis det er muligt? :)
Gravatar #2 - Windcape
30. aug. 2011 21:01
Hvorfor overhovedet gøre det med PHP, hvis du ikke vil gøre det med PHP alligevel?

Men det lyder som at du bare skal åbne to connections, én til read, og en til write. Og så passe en sql-connection med til dine queries (du har ikke sagt hvilket database API du benytter, og PHP har altså ret mange!)
Gravatar #3 - zin
31. aug. 2011 00:56
#1: Umiddelbart byder PostgreSQL, MySQL og alle større database-varianter på en form for replikering, så det er nok relevant at vide.
Gravatar #4 - buchi
31. aug. 2011 21:23
jeg har vist nævn det var MySQL ;) og igen. Der er ikke databasen jeg vil have hjælp til at sætte op til replikering. Jeg vil gerne vide, hvordan jeg kan implementere det i PHP, så jeg skriver til en DB, og læser fra en anden.

Jeg bruger PDO til at håndtere databaser :)

Problemet med 2 databaseforbindelser er, at jeg tilføjer et niveau af kompleksitet til applikationen, der er unødvendigt.

Alternativt kunne jeg parse queryen i mit database interface, før jeg udfører den.
Jeg vil dog helst, at driveren selv kan, hvis det er muligt :)
Gravatar #5 - zin
1. sep. 2011 00:05
#4: Logisk set skal du, hvis du vil have replikering, have to dataforbindelser, for at sende data til to DB'ere.
Alternativt skal DB'erne gøre det selv eller du skal gøre det til en tredje "klient" (eller server eller interface) der gør det for dig (som så, alligevel, skal have to dataforbindelser).
Jeg er ikke nogen PHP nørd, men jeg kan ikke forestille mig en driver på en eller anden magisk vis i stand til at skrive data til to forskellige DB-servere uden at lave to dataforbindelser. :-)
Selv når du har DB'en til at lave replikeringer kræver det, at de har en dataforbindelse åben. :-)
Gravatar #6 - arne_v
1. sep. 2011 00:49
#1 & 4

Du er nødt til at have 2 forskellige database connections for at bruge 2 forskellige database servere.

Du er nødt til at have 2 forskellige database connection strings for at få forskellig opførsel for de 2 connections.

Så er spørgsmålet reduceret til hvor valget mellem de 2 skal foretages.

Jeg ville vælge forskellige klasser til update og read. Og lade et lidt højere niveau lave valget via valg mellem disse klasser.

Det er umuligt at analysere alt for hvorvidt det er en update eller en read (man kan ikke se på et SP kald om det er det ene eller andet).

Der bør aldrig være tvivl om i et givet sted i kodn hvorvidt man vil lave en update eller en read.
Gravatar #7 - arne_v
1. sep. 2011 01:01
#6

Det var faktisk nemt. Nu kommer vi til de egentlige problemer.

:-)

A) transaction isolation

Du får problemer med at opnå repeatable read og serializable i den konfig.

B) cache konsistens

Enten skal de to database klasser dele cache eller så skal cache flytte et niveau højere op.

C) failover

Las os antage i det følgende 3 noder S1, S2 og S3.

1 master og N slave som 1 update og N read er tricky

update->S1, read->S2 og S3

S1 ned => update->S2, read->S3

S2 ned => update->S1, read->S3

Det ligner noget ret komplekst applikations logik.

1 master og N slave som 1 update og N+1 read er en lille smule nemmere

updates skal sendes til master

reads skal sendes til en node som er oppe

Men det skal nok stadig være applikations logik. Jeg mener ikke at der er nogle af PHP's mangle MySQL extensions der understøtter failover i selve extension via flere servere i connection string (jeg kan dog tage fejl - jeg er ikke nogen ørn til PHP).



Gå til top

Opret dig som bruger i dag

Det er gratis, og du binder dig ikke til noget.

Når du er oprettet som bruger, får du adgang til en lang række af sidens andre muligheder, såsom at udforme siden efter eget ønske og deltage i diskussionerne.

Opret Bruger Login