Sorry voor de wazige titel, maar dit lijkt me het probleem aardig goed te beschrijven.
Ik werk sinds een paar maanden bij een webshop hier in nederland. Ik werk hier als programmeur, maar serveronderhoud etc behoort ook tot mijn taken. Ik zal even de huidige situatie uitleggen en dan de problemen omschrijven die we tegenkomen.
Huidige hardware:
-1 db server in colo
-1 webserver in colo
-1 webserver lokaal
Huidige software:
-MySQL 4.1 op de DB server
-OS op alle servers is Debian
-Verder redelijk standaard config op de servers (Apache/PHP), maar dit is ook niet verschrikkelijk boeiend...
Huidige gebruik:
-lokaal 50 gebruikers (in het magazijn zijn de zwaarste gebruikers(20 mensen))
-via colo op drukke momenten minimaal 400 gelijktijdige bezoekers
-minimaal 250 orders per dag
Huidige database:
-Het hele bedrijf draait op 1 database met ongeveer 60 tabellen (bij export een .sql bestand van 800MB)
-Heel veel producten (bijna 30.000)
Website(s):
-Website (in PHP) voor de klanten, waar bestellingen kunnen worden gedaan e.d.
-Backoffice (webbased in PHP) voor de werknemers, hier gebeurt eigenlijk alles, inscannen van binnengekomen producten/verzamelen van bestellingen/verkoop dingen, eigenlijk alles wat er binnen het bedrijf gebeurt, gaat via de backoffice. Voor de nieuwsgierigen, het is een volledig eigen ontwikkeld product (zowel website als backoffice)
Draaiende scripts e.d.:
-Er draaien een aantal onderhoudsscripts die gemiste inserts en dergelijke alsnog uitvoeren, evenals een paar andere dingen (deze draaien elke 5 minuten).
-Backups, deze draaien elke 2 uur, zodat we relatief weinig orders missen mocht het mis gaan. Dit merk je redelijk goed op de website en in de backoffice. Duurt ongeveer 2 á 3 minuten en dan is de snelheid weer terug.
Onze problemen:
-Snelheidsproblemen(!!), vooral in de backoffice
-We willen graag meerdere database servers, maar hoe?
Snelheidsproblemen uitgebreid:
-Vooral in de backoffice is het vaak traag, het is al een stuk sneller sinds we alle queries van zowel de backoffice en de public website hebben herschreven (joins gebruikt/indexing verandert/queries samengevoegd, geloof het of niet, maar sommige queries zijn van 20 seconden naar 0.2 seconden gegaan, uiteraard met dezelfde resultaten
). Voor zover we kunnen nagaan heeft het probleem dat er nu nog bestaat te maken met table locking. Vooral in het magazijn gebeuren heel erg veel schrijfbewerkingen op de database (inserts/updates), en deze moeten nu regelmatig op elkaar wachten! De hele database is wel in MyISAM formaat, daarom wordt de hele tabel ook gelocked. We hebben zitten denken om over te schakelen naar InnoDB omdat deze werkt door middel van row locking en ook nog eens transaction ondersteuning heeft. Het enige probleem is dat we bang zijn voor deadlocks, hoe vaak komt dit in de praktijk voor? Wat adviseren jullie om dit snelheidsprobleem op te lossen? Ook vermoeden we dat, omdat al die data over dat ene internetlijntje naar de database server moet, dit ook een deel van de traagheid kan zijn.
Meerdere database servers uitgebreid:
-Omdat we nu maar 1 database server hebben, hebben we een probleem als deze eruit zou klappen. Het hele bedrijf is er afhankelijk van en klapt deze eruit dan ligt het hele bedrijf dus plat! Dit is geen optie, tevens denken wij dat dit ook een deel van ons snelheidsprobleem is.
Ons plan was om colocated een master erbij te hangen en zo master-master te gaan draaien. Later bedachten we ons dat master-master-master misschien nog beter is (circular replication) maar dan 2 DB servers colocated en 1 DB server lokaal. Dit levert uiteraard ook weer een raar probleem op als onze lokale internetverbinding eruit klapt, de circel is verbroken en replication werkt niet meer!
Toen het volgende plan: master-master-slave, master in colo, slave in colo (*geconfigureerd als backup master die het over kan nemen als de colo master eruit klapt) en master lokaal. Als de replication tussen 2 masters wordt verbroken zou dit in theorie automatisch weer rechtgetrokken moeten worden als de verbinding weer hersteld is. Hoe werkt dit in de praktijk? Heeft iemand hier ervaring mee?
Een ander idee van mijn kant is de database helemaal overhoop trekken en opdelen in een losse catalogus database (op 1 of 2 slaves in colo, die de data van een master lokaal krijgen, op de public website heb je op dit deel van de database namelijk toch geen schrijfbewerkingen (niet van de bezoekers/klanten) en een update elke 5 minuten is genoeg), en een losse order/klanten/voorraad/etc database (dit in master-master, 1 in colo en 1 lokaal, omdat je op dit deel van de database van beide kanten schrijfbewerkingen hebt.). Dit is programmeertechnisch wel weer gigantisch veel werk, maarja, als dit de oplossing blijkt dan moet dat maar! Zijn er nog andere manieren om meerdere database servers te plaatsen en data overal hetzelfde te laten zijn? Zou een lokale database server echt veel uitmaken kwa snelheid?
Hebben jullie nog ideeën om onze problemen te laten verdwijnen? Laat ze alstjeblieft weten! Ik zal jullie ook op de hoogte houden van de vorderingen en keuzes van onze kant, zodat het voor iedereen leerzaam kan zijn!
Ik werk sinds een paar maanden bij een webshop hier in nederland. Ik werk hier als programmeur, maar serveronderhoud etc behoort ook tot mijn taken. Ik zal even de huidige situatie uitleggen en dan de problemen omschrijven die we tegenkomen.
Huidige hardware:
-1 db server in colo
-1 webserver in colo
-1 webserver lokaal
Huidige software:
-MySQL 4.1 op de DB server
-OS op alle servers is Debian
-Verder redelijk standaard config op de servers (Apache/PHP), maar dit is ook niet verschrikkelijk boeiend...
Huidige gebruik:
-lokaal 50 gebruikers (in het magazijn zijn de zwaarste gebruikers(20 mensen))
-via colo op drukke momenten minimaal 400 gelijktijdige bezoekers
-minimaal 250 orders per dag
Huidige database:
-Het hele bedrijf draait op 1 database met ongeveer 60 tabellen (bij export een .sql bestand van 800MB)
-Heel veel producten (bijna 30.000)
Website(s):
-Website (in PHP) voor de klanten, waar bestellingen kunnen worden gedaan e.d.
-Backoffice (webbased in PHP) voor de werknemers, hier gebeurt eigenlijk alles, inscannen van binnengekomen producten/verzamelen van bestellingen/verkoop dingen, eigenlijk alles wat er binnen het bedrijf gebeurt, gaat via de backoffice. Voor de nieuwsgierigen, het is een volledig eigen ontwikkeld product (zowel website als backoffice)
Draaiende scripts e.d.:
-Er draaien een aantal onderhoudsscripts die gemiste inserts en dergelijke alsnog uitvoeren, evenals een paar andere dingen (deze draaien elke 5 minuten).
-Backups, deze draaien elke 2 uur, zodat we relatief weinig orders missen mocht het mis gaan. Dit merk je redelijk goed op de website en in de backoffice. Duurt ongeveer 2 á 3 minuten en dan is de snelheid weer terug.
Onze problemen:
-Snelheidsproblemen(!!), vooral in de backoffice
-We willen graag meerdere database servers, maar hoe?
Snelheidsproblemen uitgebreid:
-Vooral in de backoffice is het vaak traag, het is al een stuk sneller sinds we alle queries van zowel de backoffice en de public website hebben herschreven (joins gebruikt/indexing verandert/queries samengevoegd, geloof het of niet, maar sommige queries zijn van 20 seconden naar 0.2 seconden gegaan, uiteraard met dezelfde resultaten
Meerdere database servers uitgebreid:
-Omdat we nu maar 1 database server hebben, hebben we een probleem als deze eruit zou klappen. Het hele bedrijf is er afhankelijk van en klapt deze eruit dan ligt het hele bedrijf dus plat! Dit is geen optie, tevens denken wij dat dit ook een deel van ons snelheidsprobleem is.
Ons plan was om colocated een master erbij te hangen en zo master-master te gaan draaien. Later bedachten we ons dat master-master-master misschien nog beter is (circular replication) maar dan 2 DB servers colocated en 1 DB server lokaal. Dit levert uiteraard ook weer een raar probleem op als onze lokale internetverbinding eruit klapt, de circel is verbroken en replication werkt niet meer!
Toen het volgende plan: master-master-slave, master in colo, slave in colo (*geconfigureerd als backup master die het over kan nemen als de colo master eruit klapt) en master lokaal. Als de replication tussen 2 masters wordt verbroken zou dit in theorie automatisch weer rechtgetrokken moeten worden als de verbinding weer hersteld is. Hoe werkt dit in de praktijk? Heeft iemand hier ervaring mee?
Een ander idee van mijn kant is de database helemaal overhoop trekken en opdelen in een losse catalogus database (op 1 of 2 slaves in colo, die de data van een master lokaal krijgen, op de public website heb je op dit deel van de database namelijk toch geen schrijfbewerkingen (niet van de bezoekers/klanten) en een update elke 5 minuten is genoeg), en een losse order/klanten/voorraad/etc database (dit in master-master, 1 in colo en 1 lokaal, omdat je op dit deel van de database van beide kanten schrijfbewerkingen hebt.). Dit is programmeertechnisch wel weer gigantisch veel werk, maarja, als dit de oplossing blijkt dan moet dat maar! Zijn er nog andere manieren om meerdere database servers te plaatsen en data overal hetzelfde te laten zijn? Zou een lokale database server echt veel uitmaken kwa snelheid?
Hebben jullie nog ideeën om onze problemen te laten verdwijnen? Laat ze alstjeblieft weten! Ik zal jullie ook op de hoogte houden van de vorderingen en keuzes van onze kant, zodat het voor iedereen leerzaam kan zijn!
[ Voor 2% gewijzigd door GertW op 15-11-2007 11:27 . Reden: Stonden wat dingetjes verkeerd ]