Visa ett inlägg
Oläst 2016-05-30, 12:39 #27
Jim_Westergrens avatar
Jim_Westergren Jim_Westergren är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: May 2005
Inlägg: 1 058
Jim_Westergren Jim_Westergren är inte uppkopplad
Har WN som tidsfördriv
Jim_Westergrens avatar
 
Reg.datum: May 2005
Inlägg: 1 058
Tänkte skriva lite om de senaste äventyren jag haft med Domainstats uteckling. Finns en del som är intresserade av att läsa hur det går. Jag sitter även just nu själv så även kul att dela med sig.

Servern började gå på knäna och jag visste att det var mysql. Load låg konstant på ca 10 och queries köades upp hela tiden, sajten var riktigt seg, och då hade jag ändå stängt av alla cronjobben (datainsamling, crawling). Databasen var en compressed innodb på ca 100 GB. Den största tabellen med länkarna var över 50 GB med ca 550 miljoner rader. Även med perfekta index så hjälpte det inte, alla queries som rörde den tabellen var seg. Snitttiden för Googlebot att hämta URLer blev som värst 18 sekunder.
Det andra stora problemet var att det endast fanns 40 GB kvar innan hårddisken skulle ta slut och jag vet att jag vill ju crawla och spara mycket mer länkar, kanske tiodubbelt så mycket.

Fast besluten att lösa detta så studerade jag en massa andra olika NoSQL databaslösningar och fastnade till slut för mongodb och cassandra. Jag måste välja en av dessa och jag läste väldigt mycket på nätet om dessa 2 lösningar. Jag anlitade även en del personer genom upwork men det gick inte så bra så jag beslöt mig för att fixa det själv istället.

Jag valde till slut cassandra eftersom det finns en hel del fall där startups flyttar från mongodb till cassandra men jag har aldrig stött på någon som gjort det omvända. Cassandra verkar även mycket bättre när det handlar om intensivt med writes vilket det är i mitt fall.

Jag beställde den dedikerade servern #2 (EX51-SSD hos Hetzer) och fick den installerad i samma datacenter. Installation av Cassandra var rätt enkelt förutom lite klydd gällande rätt version av java. Däremot att få PHP drivern installerad var ett jävelskap som tog rätt många timmar att lösa. Installation enligt instruktionerna går inte utan blir konflikt med någon dependency gällande libuv osv ... men jag löste det till slut. Jag hade helst velat ha PHP 7 såklart men det fick jag skippa eftersom det inte gick med drivern.

Jag flyttade sedan ca 3 miljoner filer från server 1 till server 2 med hjälp av tar och rsync (favicons, printscreens och cache-filer) och ändrade om mysql så att php på server 2 kopplar till mysql på server 1. Ändrade sedan om i DNS och det fungerade felfritt i stort sett direkt (förutom en miss att php måste äga filerna och inte root men det var snabbt ändrat).

Nu på server 1 fanns det bara mysql och inget annat. Steg 1 klart. Server 2 hade nu ingen load alls och server 1 gick fortfarande på knäna men det gick minimalt bättre, nåja.

Steg 2: Skriv om PHP så att inga MySQL joins görs mot de stora tabellerna. Cassandra stödjer inte heller joins.
Detta blev klart och load gick ner en hel del. Detta steg gick faktiskt smidigt.

Steg 3 flytta den största tabellen till cassandra. När du skapar tabellen så är det väldigt viktigt att klura ut hur din nyckel ska se och detta var lite knepigt. Här rekommenderar jag att man testar och verkligen är säker innan man tar nästa steg. Mycket bra info här http://stackoverflow.com/a/24953331/1554653. Jag kom fram till 1 primärnyckel med 2 klusternycklar som bästa val för min tabell.

Steg 4, importera data från MySQL till Cassandra. Här skrev jag ett enkelt skript i PHP som loopar och insertar. Till en början gjorde jag ca 4000 inserts per sekund men ökade sedan till ca 12 000 vilka var inga problem alls för Cassandra - flaskhalsen var selecten från mysql. Tänk dock på att 12 000 per sekund = ca 13 timmar non-stop för 550 miljoner rader. Min laptop fick vara igång och köra under natten.

Sista steget var att sedan ändra i PHP så att den data som nu finns i cassandra selectas därifrån och det var faktiskt lätt.

Jag droppade sedan den 50 GB stora tabellen och startade om mysql.

Jag har nu åter aktiverat cron-jobben och load är nu:

server 1 (mysql): 2,4
server 2 (php, cassandra, filer): 0,3

Och snitthämtningstid för Googlebot har gått ner till ca 5 sekunder.

Detta är grymt bra. En annan sak som förvånar mig är att dels är cassandra blixtsnabb och dels så använder den mycket mindre utrymme på disk än vad compressed innodb gjorde - ca hälvten och då har jag ändå replication 1.

Nästa steg är att flytta över andra tabeller från mysql till cassandra men det blir lite svårare och de är inte alls lika stora så det är ett senare projekt.

Jag vill kunna crawla och spara tillräckligt mycket länkar för att kunna skapa min egen länksiffra likt trustflow eller liknande och det känns nu möjligt att kunna göra detta vilket känns jättebra.
Jim_Westergren är inte uppkopplad   Svara med citatSvara med citat