Atunci când se analizează utilizarea de script-uri NoSQL, cum ar fi stocarea de perechi cheie-valoare pare că MySQL este mai de preferat în termeni de performanță, ușurința de utilizare și stabilitate. MySQL - este un sistem solid, cu o abundență de materiale online, care acoperă toate subiectele, de la operațiile de bază și analiza erorilor de replicare și modele de utilizare diferite. Acest lucru oferă un avantaj față de MySQL mai tineri NoSQL-sisteme care nu au o astfel de experiență.
In ultimii ani, NoSQL-sistem a devenit tendința dominantă. Mulți dezvoltatori vedea NoSQL-sisteme, cum ar fi MongoDB. Cassandra, Redis sau Hadoop, cea mai bună opțiune pentru a construi aplicații lor, considerându-le o familie de produse, care invalidează sistemul SQL vechi.
În acest articol, vom explica de ce, în opinia noastră, de a folosi MySQL pentru a stoca perechi cheie-valoare sunt mai bune decât NoSQL-sisteme de cele mai specializate, și oferă instrucțiuni pentru utilizarea MySQL.
Definirea site-ului Wix
Când actualizați site-ul cu modelul tradițional normalizat, avem nevoie de a utiliza tranzacția pentru a actualiza mai multe tabele pentru a asigura integritatea datelor (rețineți că tranzacția utilizează un sistem de blocare la nivelul bazei de date, care împiedică înregistrarea simultană, și, uneori, citirea din tabelele implicate). Continuând să lucreze cu un astfel de model, este foarte probabil să ajungă la tipul de serie cheie în fiecare tabel, indicele și cheie externă în tabelul de rute URL.
Cu toate acestea, modelarea de date pe baza unei scheme de normalizată este plină de un număr de complicații:
• Blocarea restricționează accesul la masă, astfel încât acesta poate limita capacitatea noastră pentru volume mari de date;
• obiectul de citire necesită câteva interogări SQL (4 în cazul nostru), sau utilizarea ÎNSCRIEȚI - și acest lucru afectează, de asemenea, timpul de întârziere;
• Tasta SERIAL atribut necesită încuietori, care limitează din nou performanța de scriere.
Aceste probleme limitează lățimea de bandă și paralelismul de interogări pe care le putem furniza MySQL (sau orice alt SQL de sistem). Din cauza acestor deficiențe, precum și în virtutea faptului că aceasta este, în esență, o pereche de chei-valoare, mulți dezvoltatori preferă să se uite-NoSQL soluție care oferă o performanță mai bună și paralelismul, chiar și la costul de stabilitate, integritate și disponibilitate.
Wix am constatat că MySQL, dacă este folosit în mod creativ ca un magazin de perechi cheie-valoare, pot lucra mai bine decât MySQL cu un model normalizat de date (de mai sus), și mai bine decât majoritatea sistemelor, NoSQL. Sistemul nostru actual oferă astfel de parametri capacitate de scalare, paralelizare cererilor, timpul de întârziere, ceea ce ar fi făcut cinste oricărui sistem NoSQL. Iată câteva detalii ale sistemului nostru:
• Setarea activă a trei centre de date (activ-activ-activ);
• capacitate de circa 200 000 RPM;
• tabel de rute are un volum de aproximativ 100 de milioane de discuri, 10 GB de spațiu pe disc;
• masa de site-uri are aproximativ 100 de milioane de discuri, 200 GB de spațiu pe hard disk;
• Citire latență medie - (. De fapt, 0,2-0,3 ms într-un singur centru de date) 1,0-1,5 milisecunde.
Rețineți că ordinea de 1,0 ms intarziere. Este considerat o performanță impresionantă în majoritatea sistemelor bazate pe perechi cheie-valoare, inclusiv ambele sisteme bazate pe cloud și sisteme open source. Și am realizat acest lucru folosind MySQL (simplu, așa cum se crede în mod obișnuit, SQL-sistem).
Aici este o diagramă pe care le folosim:
Toate câmpurile care nu sunt utilizate ca termeni de căutare au fost îndoite în câmpul de tip o singură pată de cerneală (câmp de text site_data). Acesta include tabele de sub-obj, precum și orice domeniu al tabelei obiect. Rețineți că nu utilizați tipul de serie cheie, în loc să folosim un câmp de tip VARCHAR (50), care conține variabile create de utilizator GUID (mai mult pe acest lucru în secțiunea următoare).
Mai jos vom folosi cerere, are lățime mare de bandă și latență scăzută:
Există mai întâi o cerere este făcută la masa de rute cu un index unic, interogarea ar trebui să se întoarcă doar o singură valoare. Apoi examinăm site-uri de pe cheia primară, încă o dată în căutarea aceeași valoare. Sintaxa imbricate vă permite să proceseze atât SQL-interogare într-un singur apel la baza de date.
Rezultatul este prezentat mai sus necesită aproximativ 1 ms. o performanță constantă sub trafic mare și frecvență mare de actualizări. Actualizări polutranzaktsionnye, chiar și fără utilizarea unei tranzacții. Acest lucru este posibil datorită faptului că vom introduce întregul site o singură comandă INSERT și până când vom introduce rute de date sarcina, cererile nu va detecta. Adică, atunci când introducem primele date despre site-ul, și apoi pe căile, suntem încrezători în integritatea datelor lor, chiar și în situații limită, în timp ce datele noastre din tabel nu sunt site-uri conexe.
Pentru instrucțiuni privind utilizarea MySQL ca sistem NoSQL-
Folosind experiența acumulată în exemplul de mai sus (și în alte cazuri similare de practica Wix), am dezvoltat o scurtă listă de recomandări pentru utilizarea MySQL ca sisteme NoSQL.
Cel mai important lucru de reținut atunci când se utilizează MySQL ca NoSQL-sistem - este de a evita blocarea la nivel de interogare complexe de bază și.
• Nu utilizați tranzacții care implică blocarea. În schimb, utilizați tranzacția în anexă;
• Nu utilizați tastele de tip serial. Aceste chei implică blocarea și complică tip configurație activă activă;
• Folosiți chei unice de către clienți. Noi folosim GUID.
Optimizarea structurii lecturii, să acorde o atenție la câteva recomandări suplimentare:
• Nu efectuați normalizare;
• Dacă există un câmp - ar trebui să fie indexat. În cazul în care câmpul pentru indicele nu are nevoie să-l stoca într-un câmp de tip BLOB / TEXT (ca JSON sau XML);
• Nu folosiți chei străine;
• proiectare structura dvs., astfel încât, la cerere, poate fi citit un număr de separat,
• Nu folosiți instrucțiunea ALTER TABLE. Aceste comenzi implică blocarea și perioadele de incapacitate temporară de muncă. În schimb, utilizați transferul de date de migrare live.
Când solicitați date:
• să verificați înregistrările de pe cheia primară sau index;
• Nu folosiți JOIN;
• Nu utilizați funcții de agregare;
• executați funcția de testare (BI, cercetarea datelor) pe replici, și nu pe baza capului.
Intenționăm să scrie un alt articol în cazul în care să-mi spui mai multe despre transferul de vii Migrații de date și tranzacțiile prin intermediul aplicației.
Vă puteți gândi în moduri noi
Poate că aceasta este cea mai importantă concluzie a acestui articol. Este minunat - de a utiliza MySQL ca NoSQL-sistem, care nu este modul în care a fost proiectat. După cum se arată în acest articol, un exemplu este utilizarea de MySQL pentru utilizare cu perechi cheie-valoare în loc de o special pentru acest NoSQL-sisteme. Wix am ales MySQL pentru a lucra cu perechi cheie-valoare (și nu numai), din cauza usor de folosit, este ușor de gestionat, și este un ecosistem mare. Ca un bonus, acesta oferă performanța de întârziere, debitul și paralelizare, poate superioară majorității NoSQL-sisteme.
Șef proiectant arhitect software pentru a crea un site Wix.
Yoav Abraham