![]() |
Har en massa trevliga community-funktioner på Sockerdricka men de kräver en sjujäkla massa av databasservern så nu när det är lite över 500 samtidigt inloggade användare så kämpar den för sitt liv den stackaren. Jag tänkte då naturligtvis replikera databasen och enklast vore att ha flera masters eftersom varje sidvisning kräver ett antal SELECT och kör minst en UPDATE och/eller INSERT.
Allt var frid och fröjd och jag skulle just beställa ytterligare en maskin när jag kom att tänka på att jag i alla tabeller använder mig av auto-increment-kolumner för primärnycklar. Om en master gör en INSERT i messages-tabellen till exempel och den andra gör det samtidigt så kommer det finnas två meddelanden med samma PK och båda servrarna kommer att kasta BAD_PRIMARY_KEY när de exekverar den andras INSERT. Är det någon som löst det här problemet? Jag har boken High Performance MySQL och författarna föreslår ett antal sätt att lösa problemet men de kräver alla ett oerhört jobb i att ändra hur skripten använder primärnycklar. |
Jag vet inte hur replikeringen ser ut i senare versioner (säg 4.1 här), men du borde bara ha två saker att välja mellan. Antingen ha en master som tar hand om alla inserts och en massa slavar, då slipper du problemen med autoincrement. Det är när du ska ha INSERT och UPDATEs spridda på flera servrar som det strular till sig. Då är det ett måste att ha någon slags funktion som håller reda på högsta id oavsett vilken server som vill sätta in raden i tabellen.
Om det är någon som vet mer så dela gärna med er, är intresserad av sådan lösning också. Har aldrig hittat något vettigt på nätet angående detta. |
Om ni har en handler för alla sql-frågor så borde det inte vara en alltför avancerad historia att tex köra ett regexp på frågorna för att ta reda på vad som är en INSERT/UPDATE och köra dom mot en server medans andra frågor går mot en annan server (och då kan ni juh redan där ha någon slags round-robin för att sprida frågorna mellan olika select-servrar).
|
Vad har du för hårdvara nu? 500 inloggade samtidigt låter inte så farligt. Jag känner till ett community som också kör MySQL och har 5000 samtidigt inloggade och klarar sig med dual opteron. Visst, det är en krallig burk men nu har den siten 10 gånger fler samtidigt aktiva besökare och efter en snabb titt på Sockerdricka så ser den inte så farligt tung ut heller.
Edit: Helt utan erfarenhet av replikerade databaser kommer jag och tänka på en lösning. Låt den ena mastern insert:a jämna auto increment-värden och den andra ojämna. Jag tror inte det finns inställning för att göra det automatiskt i MySQL dock, så du måste kontrollera detta manuelt vilket iofs kan bli tungt... En annan lösning vore att skapa en till primary key av typen bool. Defautlvärdet får vara 0 på ena servern och 1 på andra. Efter lite snabbt grubblande låter det hyssat fungerande i mitt huvud. Förmodligen en dum idé ändå =) |
Citat:
|
Jag håller med om att 500 samtidigt inloggade användare inte låter speciellt mycket. För de 500 lär ju knappast accessa databasen exakt samtidigt.
Innan jag viftade med lastbalanseringsplakatet skulle jag nog: 1) KOlla över att all DB access (select, insert, delete, update) är optimerad. Finns de rätta indexen etc. 2) Sedan handlar det om att kika på vad som görs. Låses tabeller när det inte behövs osv. Går det att göra de "slöa" sakerna på ett bättre sätt. Du kanske redan gjort detta och kommit fram till att visst koden är dålig ut prestandasynpunkt och det kostar för mycket at skriva om saker så de är snällare mot databasen. Och även om vi tittar på ett mer generellt fall så är det ju så att förr eller senare vill man ju kanske lastbalansera. Fast då kanske inte MySql bör vara ett förstahandsval. |
Citat:
|
Citat:
|
Citat:
Citat:
Citat:
Citat:
Jag skulle mycket uppskatta hjälp med problemet jag har, dvs att replikera över flera masters men ändå använda auto_increment. |
Detta är ett välldigt intressant ämne men även komplicerat tyvär.
Är själv intresserad av replication men inte pga performance utan vill istället ha hög availability och det är ju inget direkt problem om man jämför med ditt. Har läst http://dev.mysql.com/doc/mysql/en/Replication_FAQ.html och har inte hittat något som svarar på din fråga men hittada detta. Citat:
|
Alla tider är GMT +2. Klockan är nu 09:06. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson