Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data

Catetan. narjamahkeun.: Jaana Dogan mangrupakeun insinyur ngalaman di Google anu ayeuna keur dipake dina observability sahiji jasa produksi parusahaan ditulis dina Go. Dina artikel ieu, nu miboga popularitas hébat diantara panongton Inggris-diomongkeun, manehna dikumpulkeun dina 17 titik rinci teknis penting ngeunaan DBMSs (jeung kadang sistem disebarkeun sacara umum) nu mangpaat mertimbangkeun pikeun pamekar aplikasi badag / nuntut.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data

Seuseueurna sistem komputer ngalacak kaayaanana sareng, sasuai, peryogi sababaraha jinis sistem panyimpen data. Kuring ngumpulkeun pangaweruh ngeunaan basis data dina jangka waktu nu lila, sapanjang jalan nyieun kasalahan desain nu ngakibatkeun leungitna data jeung outages. Dina sistem anu ngolah jumlah inpormasi anu ageung, pangkalan data aya dina jantung arsitéktur sistem sareng janten unsur konci dina milih solusi anu optimal. Sanaos kanyataan yén perhatian caket kana padamelan pangkalan data, masalah anu diantisipasi ku pamekar aplikasi sering ngan ukur ujung gunung es. Dina séri tulisan ieu, kuring ngabagi sababaraha ideu anu bakal mangpaat pikeun pamekar anu henteu khusus dina widang ieu.

  1. Anjeun untung lamun 99,999% tina waktu jaringan teu ngabalukarkeun masalah.
  2. ACID hartosna seueur hal anu béda.
  3. Unggal database gaduh mékanisme sorangan pikeun mastikeun konsistensi sareng isolasi.
  4. Pameungpeuk optimis datang pikeun nyalametkeun nalika sesah ngajaga anu biasa.
  5. Aya anomali sanés salian bacaan anu kotor sareng leungitna data.
  6. Pangkalan data sareng pangguna henteu salawasna satuju kana tindakan.
  7. Sharding tingkat aplikasi bisa dipindahkeun ka luar aplikasi.
  8. Autoincrementing tiasa bahaya.
  9. Data basi tiasa mangpaat sareng henteu kedah dikonci.
  10. Distorsi anu has pikeun sagala sumber waktos.
  11. Tunda ngabogaan loba harti.
  12. Sarat kinerja kudu dievaluasi pikeun transaksi husus.
  13. transaksi Nested tiasa bahaya.
  14. Transaksi teu kedah dihijikeun sareng kaayaan aplikasi.
  15. Perencana pamundut tiasa nyarioskeun ka anjeun seueur ngeunaan pangkalan data.
  16. Migrasi online hese, tapi mungkin.
  17. Paningkatan anu signifikan dina pangkalan data nyababkeun paningkatan dina teu bisa diprediksi.

Abdi hoyong hatur Emmanuel Odeke, Rein Henrichs jeung nu lianna pikeun eupan balik maranéhanana dina versi saméméhna tina artikel ieu.

Anjeun untung lamun 99,999% tina waktu jaringan teu ngabalukarkeun masalah.

Patarosan tetep ngeunaan kumaha dipercaya téknologi jaringan modern sareng sabaraha sering sistem turun kusabab gagal jaringan. Inpormasi ngeunaan masalah ieu langka sareng panalungtikan sering didominasi ku organisasi ageung sareng jaringan khusus, alat sareng tanaga.

Kalayan tingkat kasadiaan 99,999% kanggo Spanner (database anu disebarkeun sacara global Google), Google nyatakeun yén ngan ukur 7,6% masalah anu patali jeung jaringan. Dina waktos anu sami, perusahaan nyauran jaringan khususna salaku "pilar utama" kasadiaan anu luhur. Pangajaran Bailis jeung Kingsbury, dilaksanakeun dina 2014, tangtangan salah sahiji "misconceptions ngeunaan komputasi disebarkeun", anu dirumuskeun Peter Deutsch dina 1994. Naha jaringan éta leres-leres dipercaya?

Panalitian komprehensif di luar perusahaan raksasa, dilakukeun pikeun Internét anu langkung lega, teu aya. Aya ogé teu cukup data ti pamaén utama ngeunaan naon perséntase masalah konsumén maranéhanana 'patali jaringan. Kami sadar ogé tina pareum dina tumpukan jaringan panyadia awan ageung anu tiasa ngirangan sakumpulan Internét salami sababaraha jam ngan ukur kusabab éta mangrupikeun acara profil luhur anu mangaruhan sajumlah ageung jalma sareng perusahaan. Pareuman jaringan tiasa nyababkeun masalah dina seueur kasus, sanaos henteu sadayana kasus éta dina sorotan. Klién jasa awan ogé henteu terang nanaon ngeunaan panyabab masalah. Upami aya kagagalan, ampir teu mungkin pikeun ngaitkeunana kana kasalahan jaringan di sisi panyadia ladénan. Pikeun aranjeunna, jasa pihak katilu nyaéta kotak hideung. Teu mungkin pikeun meunteun dampak tanpa janten panyadia jasa anu ageung.

Dibikeun naon anu dilaporkeun ku pamaén gedé ngeunaan sistemna, éta aman pikeun nyarios yén anjeun untung upami kasusah jaringan ngan ukur persentase leutik tina masalah downtime. Komunikasi jaringan masih kakurangan tina hal-hal biasa sapertos gagalna hardware, parobahan topologi, parobahan konfigurasi administratif, sareng pareum listrik. Anyar-anyar ieu, kuring reuwas pikeun diajar yén daptar masalah anu mungkin ditambah ngegel hiu (enya, anjeun uninga leres).

ACID hartosna seueur hal anu béda

Akronim ACID nangtung pikeun Atomicity, Consistency, Isolasi, Reliability. Sipat transaksi ieu dimaksudkeun pikeun mastikeun validitasna upami aya gagal, kasalahan, gagal hardware, jsb. Tanpa ACID atanapi skéma anu sami, éta bakal hésé pikeun pamekar aplikasi pikeun ngabédakeun naon tanggung jawabna sareng naon tanggung jawab pangkalan data. Kalolobaan database transactional relational nyobian janten ACID patuh, tapi pendekatan anyar kawas NoSQL geus naékna loba database tanpa transaksi ACID sabab mahal pikeun nerapkeun.

Nalika kuring mimiti asup kana industri, kalungguhan téknis kami nyarioskeun kumaha relevan konsép ACID. Janten adil, ACID dianggap pedaran kasar tinimbang standar palaksanaan ketat. Dinten ieu kuring manggihan eta lolobana mangpaat sabab raises a kategori husus tina masalah (jeung nyarankeun sauntuyan solusi mungkin).

Henteu unggal DBMS patuh kana ACID; Dina waktos anu sami, palaksanaan database anu ngadukung ACID ngartos set syarat anu béda. Salah sahiji alesan kunaon palaksanaan ACID teu pati jelas nyaéta kusabab seueur trade-off anu kedah dilakukeun pikeun ngalaksanakeun syarat ACID. Panyipta tiasa nampilkeun pangkalan datana salaku patuh ACID, tapi interpretasi kasus tepi tiasa béda-béda sacara dramatis, ogé mékanisme pikeun nanganan kajadian anu "teu dipikaresep". Sahenteuna, pamekar tiasa nampi pamahaman tingkat luhur ngeunaan seluk-beluk palaksanaan dasar pikeun meunangkeun pamahaman anu leres ngeunaan paripolah khusus sareng perdagangan desain.

Perdebatan ngeunaan naha MongoDB sasuai sareng sarat ACID diteruskeun sanajan saatos sékrési versi 4. MongoDB geus lila teu dirojong logging, sanajan sacara standar data ieu komitmen ka disk teu leuwih ti sakali unggal 60 detik. Bayangkeun skenario di handap ieu: hiji aplikasi ngirimkeun dua tulisan (w1 sareng w2). MongoDB suksés nyimpen w1, tapi w2 leungit kusabab kagagalan hardware.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data
Diagram anu ngagambarkeun skénario. MongoDB ngadat sateuacan tiasa nyerat data kana disk

Komitmen kana disk mangrupikeun prosés anu mahal. Ku ngahindarkeun commits sering, pamekar ngaronjatkeun kinerja rekaman di expense of reliabilitas. MongoDB ayeuna ngadukung logging, tapi tulisan kotor masih tiasa mangaruhan integritas data sabab log direbut unggal 100ms sacara standar. Nyaéta, skenario anu sami masih mungkin pikeun log sareng parobihan anu dipidangkeun dina éta, sanaos résiko langkung handap.

Unggal database gaduh konsistensi sareng mékanisme isolasi sorangan

Tina sarat ACID, konsistensi sareng isolasi gaduh jumlah anu paling ageung tina palaksanaan anu béda-béda sabab rentang trade-off langkung lega. Perlu disebatkeun yén konsistensi sareng isolasi mangrupikeun fungsi anu mahal. Éta peryogi koordinasi sareng ningkatkeun persaingan pikeun konsistensi data. Pajeulitna masalah naek sacara signifikan nalika perlu skala database horisontal sakuliah sababaraha puseur data (utamana lamun aranjeunna lokasina di wewengkon géografis béda). Ngahontal tingkat konsistensi anu luhur pisan hésé, sabab ogé ngirangan kasadiaan sareng ningkatkeun segmentasi jaringan. Pikeun katerangan anu langkung umum ngeunaan fenomena ieu, kuring mamatahan anjeun ningali Téoréma CAP. Éta ogé sia ​​noting yén aplikasi tiasa ngadamel sajumlah leutik inconsistency, sarta programer bisa ngarti nuances masalah cukup ogé pikeun nerapkeun logika tambahan dina aplikasi pikeun nanganan inconsistency tanpa ngandelkeun beurat kana database pikeun nanganan eta.

DBMSs mindeng nyadiakeun tingkat béda tina isolasi. Pamekar aplikasi tiasa milih anu paling efektif dumasar kana karesepna. isolasi low ngamungkinkeun pikeun ngaronjat speed, tapi ogé ngaronjatkeun résiko hiji lomba data. insulasi tinggi ngurangan probabiliti ieu, tapi slows turun gawé sarta bisa ngakibatkeun kompetisi, nu bakal ngakibatkeun rem misalna dina dasar nu gagal dimimitian.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data
Tinjauan model konkurensi anu aya sareng hubungan antara aranjeunna

Standar SQL ngahartikeun ngan opat tingkat isolasi, sanajan dina téori jeung prakték aya loba deui. Jepson.io nawarkeun tinjauan alus teuing tina model concurrency aya. Contona, Google Spanner ngajamin serializability éksternal kalawan singkronisasi jam, sarta sanajan ieu lapisan isolasi stricter, teu dihartikeun dina lapisan isolasi baku.

Standar SQL nyebatkeun tingkat isolasi di handap ieu:

  • Serialisable (paling stringent tur mahal): palaksanaan Serializable boga pangaruh anu sarua sakumaha sababaraha palaksanaan urus sequential. Palaksanaan sequential hartina unggal transaksi saterusna dimimitian ngan sanggeus hiji saméméhna geus réngsé. Ieu kudu dicatet yén tingkat Serialisable mindeng dilaksanakeun sakumaha disebut isolasi snapshot (contona, dina Oracle) alatan béda interpretasi, sanajan isolasi snapshot sorangan teu digambarkeun dina standar SQL.
  • Bacaan anu tiasa diulang: rékaman Uncommitted dina transaksi ayeuna sadia pikeun transaksi ayeuna, tapi parobahan dijieun ku transaksi séjén (kayaning baris anyar) teu katingali.
  • Baca komitmen: Data uncommitted teu sadia pikeun transaksi. Dina hal ieu, transaksi ngan bisa ningali data komitmen, sarta phantom dibaca bisa lumangsung. Lamun urus inserts sarta commits baris anyar, urus ayeuna bakal tiasa ningali aranjeunna nalika queried.
  • Baca henteu komitmen (tingkat sahenteuna ketat tur mahal): Bacaan kotor diwenangkeun, transaksi bisa ningali parobahan uncommitted dijieun ku transaksi séjén. Dina prakték, tingkat ieu bisa jadi mangpaat pikeun perkiraan kasar, kayaning queries COUNT(*) dina méja.

Tingkat Serialisable ngaminimalkeun résiko balapan data, sedengkeun anu paling mahal pikeun diimplementasikeun sareng nyababkeun beban kompetitif anu paling luhur dina sistem. Tingkat isolasi anu sanés langkung gampang dilaksanakeun, tapi ningkatkeun kamungkinan balapan data. Sababaraha DBMS ngamungkinkeun anjeun nyetél tingkat isolasi khusus, anu sanés gaduh kahoyong anu kuat sareng henteu sadayana tingkat dirojong.

Rojongan pikeun tingkat isolasi sering diémbarkeun dina DBMS anu dipasihkeun, tapi ngan ukur panilitian anu ati-ati ngeunaan paripolahna tiasa ngungkabkeun naon anu sabenerna lumangsung.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data
Tinjauan anomali konkurensi dina tingkat isolasi anu béda pikeun DBMS anu béda

Martin Kleppmann dina proyék na pertapaan Ngabandingkeun tingkat isolasi béda, ceramah ngeunaan anomali concurrency, sarta naha database téh bisa taat ka tingkat isolasi nu tangtu. Panaliti Kleppmann nunjukkeun kumaha bédana pamekar database mikir ngeunaan tingkat isolasi.

Pameungpeuk optimis datang pikeun nyalametkeun nalika sesah ngajaga anu biasa.

Meungpeuk tiasa mahal pisan, sanés ngan ukur ningkatkeun persaingan dina pangkalan data, tapi ogé kusabab éta meryogikeun server aplikasi pikeun terus nyambung ka pangkalan data. Segmentasi jaringan tiasa ngagedekeun kaayaan ngonci ekslusif sareng ngakibatkeun deadlocks anu hese pikeun ngaidentipikasi sareng ngabéréskeun. Dina kasus dimana ngonci ekslusif teu cocog, ngonci optimistis mantuan.

Konci optimis nya éta métode nu nalika maca senar, éta merhatikeun versi na, checksum, atawa waktu modifikasi panungtungan. Ieu ngamungkinkeun anjeun pikeun mastikeun yén teu aya parobahan versi atom sateuacan ngarobih éntri:

UPDATE products
SET name = 'Telegraph receiver', version = 2
WHERE id = 1 AND version = 1

Dina hal ieu, ngamutahirkeun tabel products moal dilumangsungkeun lamun operasi sejen saméméhna dijieun parobahan baris ieu. Upami teu aya operasi sanés anu dilakukeun dina baris ieu, parobihan pikeun hiji baris bakal kajantenan sareng urang tiasa nyarios yén pembaruan éta suksés.

Aya anomali sanés salian bacaan anu kotor sareng leungitna data

Lamun datang ka konsistensi data, fokus kana potensi kaayaan lomba nu bisa ngakibatkeun maca kotor jeung leungitna data. Nanging, anomali data henteu eureun di dinya.

Salah sahiji conto anomali sapertos nyaéta ngarékam distorsi (nulis miring). Distorsi hese dideteksi sabab biasana henteu dipilarian sacara aktip. Éta sanés kusabab bacaan anu kotor atanapi kaleungitan data, tapi kusabab palanggaran konstrain logis anu disimpen dina data.

Salaku conto, hayu urang nganggap aplikasi ngawaskeun anu meryogikeun hiji operator pikeun nelepon unggal waktos:

BEGIN tx1;                      BEGIN tx2;
SELECT COUNT(*)
FROM operators
WHERE oncall = true;
0                               SELECT COUNT(*)
                                FROM operators
                                WHERE oncall = TRUE;
                                0
UPDATE operators                UPDATE operators
SET oncall = TRUE               SET oncall = TRUE
WHERE userId = 4;               WHERE userId = 2;
COMMIT tx1;                     COMMIT tx2;

Dina kaayaan di luhur, rékaman korupsi bakal lumangsung lamun duanana transaksi anu hasil komitmen. Sanaos henteu aya bacaan anu kotor atanapi kaleungitan data, integritas data dikompromi: ayeuna dua jalma dianggap on-telepon dina waktos anu sami.

Isolasi Serializable, desain skéma, atanapi konstrain database tiasa ngabantosan ngaleungitkeun korupsi tulisan. Pamekar kedah tiasa ngaidentipikasi anomali sapertos nalika pangwangunan pikeun ngahindarkeunana dina produksi. Dina waktos anu sami, ngarékam distorsi sesah pisan milarian dina dasar kode. Utamana dina sistem badag, nalika tim ngembangkeun béda jawab ngalaksanakeun fungsi dumasar kana tabel sarua jeung teu satuju kana specifics aksés data.

Pangkalan data sareng pangguna henteu salawasna satuju kana naon anu kudu dilakukeun

Salah sahiji fitur konci database nyaéta jaminan urutan palaksanaan, tapi urutan ieu sorangan bisa jadi teu transparan pikeun pamekar software. Basis data ngaéksekusi transaksi dina urutan aranjeunna nampi, teu dina urutan programer maksudna. Urutan transaksi hese diprediksi, khususna dina sistem paralel anu sarat pisan.

Salila pangwangunan, utamana nalika gawé bareng perpustakaan non-blocking, gaya goréng jeung readability low bisa ngabalukarkeun pamaké yakin yén transaksi anu dieksekusi sequentially, lamun dina kanyataanana maranéhna bisa datang dina database dina urutan nanaon.

Dina glance kahiji, dina program di handap, T1 jeung T2 disebut sequentially, tapi lamun fungsi ieu non-blocking jeung geura mulangkeun hasil dina bentuk. jangji, teras urutan sauran bakal ditangtukeun ku momen nalika aranjeunna asup kana pangkalan data:

result1 = T1 () // hasil nyata jangji
hasil2 = T2()

Lamun atomicity diperlukeun (nyaéta, boh sakabéh operasi kudu réngsé atawa aborted) jeung urusan urutan, lajeng operasi T1 jeung T2 kudu dipigawé dina urus tunggal.

Sharding tingkat aplikasi bisa dipindahkeun ka luar aplikasi

Sharding mangrupikeun metode ngabagi database sacara horisontal. Sababaraha basis data tiasa sacara otomatis ngabagi data sacara horisontal, sedengkeun anu sanésna henteu tiasa, atanapi henteu saé pisan. Nalika arsiték data / pamekar tiasa ngaduga persis kumaha data bakal diaksés, maranéhna bisa nyieun partisi horizontal dina spasi pamaké tinimbang delegating karya ieu database. Proses ieu disebut "sharding tingkat aplikasi" (Sharding tingkat aplikasi).

Hanjakal, ngaran ieu mindeng nyieun misconception yén sharding hirup di layanan aplikasi. Kanyataanna, éta bisa dilaksanakeun salaku lapisan misah di hareup database. Gumantung kana kamekaran data sareng iterations skéma, syarat sharding tiasa janten pajeulit. Sababaraha strategi tiasa nyandak kauntungan tina kamampuan pikeun ngulang tanpa kedah nyebarkeun deui server aplikasi.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data
Conto arsitektur dimana server aplikasi dipisahkeun tina layanan sharding

Mindahkeun sharding kana layanan misah expands kamampuhan pikeun ngagunakeun strategi sharding béda tanpa perlu redeploy aplikasi. Laju mangrupikeun conto sistem sharding sapertos di tingkat aplikasi. Vitess nyadiakeun sharding horizontal pikeun MySQL sarta ngidinan klien pikeun nyambung ka eta via protokol MySQL. Sistemna ngabagi-bagi data kana titik-titik MySQL anu béda-béda anu teu terang nanaon ngeunaan masing-masing.

Autoincrementing tiasa bahaya

AUTOINCREMENT mangrupikeun cara umum pikeun ngahasilkeun konci primér. Aya sering kasus nalika database dipaké salaku generator ID, sarta database ngandung tabel dirancang pikeun ngahasilkeun identifiers. Aya sababaraha alesan kunaon ngahasilkeun konci primér nganggo paningkatan otomatis jauh tina idéal:

  • Dina database anu disebarkeun, paningkatan otomatis mangrupikeun masalah anu serius. Pikeun ngahasilkeun ID, konci global diperlukeun. Gantina, Anjeun bisa ngahasilkeun UUID: ieu teu merlukeun interaksi antara titik database béda. Otomatis-incrementing kalawan konci bisa ngakibatkeun contention tur nyata ngurangan kinerja on inserts dina situasi disebarkeun. Sababaraha DBMSs (contona, MySQL) bisa jadi merlukeun konfigurasi husus sarta perhatian leuwih ati mun leres ngatur réplikasi master-master. Tur éta gampang nyieun kasalahan nalika ngonpigurasikeun, nu bakal ngakibatkeun ngarekam gagal.
  • Sababaraha basis data gaduh algoritma ngabagi dumasar kana konci primér. ID padeukeut bisa ngakibatkeun unpredictable hot spot jeung ngaronjat beban dina sababaraha partitions bari batur tetep dianggurkeun.
  • Konci primér nyaéta cara panggancangna pikeun ngaksés hiji baris dina pangkalan data. Kalayan cara anu langkung saé pikeun ngaidentipikasi rékaman, ID sequential tiasa ngaktipkeun kolom anu paling penting dina tabel janten kolom anu teu aya gunana anu pinuh ku nilai anu teu aya gunana. Ku alatan éta, sabisana, mangga pilih konci primér unik tur alam global (misalna ngaran pamaké).

Sateuacan mutuskeun pendekatan, pertimbangkeun dampak ID na UUID naékkeun otomatis dina indéks, partisi, sareng sharding.

Data bulukan tiasa mangpaat tur teu merlukeun ngonci

Multiversion Concurrency Control (MVCC) implements loba sarat konsistensi anu sakeudeung dibahas di luhur. Sababaraha basis data (Contona, Postgres, Spanner) ngagunakeun MVCC pikeun "eupan" transaksi jeung snapshots-versi heubeul tina database. Transaksi snapshot ogé tiasa sérial pikeun mastikeun konsistensi. Lamun maca tina snapshot heubeul, data luntur dibaca.

Maca data anu rada basi tiasa mangpaat, contona, nalika ngahasilkeun analytics tina data atanapi ngitung nilai agrégat perkiraan.

Kauntungan kahiji tina gawé bareng data warisan nyaéta low latency (utamana lamun database disebarkeun sakuliah géografi béda). Anu kadua nyaéta yén transaksi ngan ukur dibaca henteu dikonci. Ieu kaunggulan signifikan pikeun aplikasi nu maca pisan, salami aranjeunna tiasa ngadamel data bulukan.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data
Pangladén aplikasi maca data tina réplika lokal anu tos 5 detik, sanaos versi pangénggalna sayogi di sisi sanés Samudra Pasifik.

DBMS sacara otomatis ngabersihkeun versi anu langkung lami sareng, dina sababaraha kasus, ngamungkinkeun anjeun ngalakukeun ieu upami dipénta. Contona, Postgres ngamungkinkeun pamaké pikeun ngalakukeun VACUUM kana pamundut, sarta ogé périodik ngalakukeun operasi ieu otomatis. Spanner ngajalankeun tukang sampah pikeun ngaleungitkeun jepretan anu langkung lami ti sajam.

Sakur sumber waktos tunduk kana distorsi

Rahasia anu paling dijaga dina élmu komputer nyaéta yén sadaya API timing bohong. Nyatana, mesin kami henteu terang waktos ayeuna. Komputer ngandung kristal kuarsa anu ngahasilkeun geter anu dianggo pikeun ngajaga waktos. Sanajan kitu, aranjeunna teu cukup akurat tur bisa jadi payun / lag balik waktu pasti. shift bisa ngahontal 20 detik per poé. Ku alatan éta, waktu dina komputer urang kudu périodik nyingkronkeun jeung hiji jaringan.

NTP server dipaké pikeun sinkronisasi, tapi prosés sinkronisasi sorangan tunduk kana jaringan reureuh. Malah nyingkronkeun sareng server NTP dina pusat data anu sami butuh sababaraha waktos. Éta jelas yén damel sareng server NTP umum tiasa nyababkeun distorsi anu langkung ageung.

Jam atom jeung counterparts GPS maranéhanana leuwih hadé pikeun nangtukeun waktu ayeuna, tapi aranjeunna mahal sarta merlukeun setup kompléks, ngarah teu bisa dipasang dina unggal mobil. Kusabab ieu, puseur data ngagunakeun pendekatan tiered. Jam atom jeung/atawa GPS nembongkeun waktu pasti, sanggeus éta disiarkeun ka mesin séjén ngaliwatan server sekundér. Ieu ngandung harti yén unggal mesin bakal ngalaman offset tangtu ti waktu pasti.

Kaayaan ieu diperparah ku kanyataan yén aplikasi sareng pangkalan data sering aya dina mesin anu béda (upami henteu di pusat data anu béda). Ku kituna, waktu bakal béda teu ukur dina titik DB disebarkeun sakuliah mesin béda. Éta ogé bakal béda dina server aplikasi.

Google TrueTime nyokot pendekatan lengkep beda. Seuseueurna jalma yakin yén kamajuan Google dina arah ieu dijelaskeun ku transisi banal kana jam atom sareng GPS, tapi ieu ngan ukur bagian tina gambar anu ageung. Ieu kumaha TrueTime jalanna:

  • TrueTime ngagunakeun dua sumber anu béda: GPS sareng jam atom. Jam ieu gaduh modeu gagal anu teu aya hubunganana. [tingali kaca 5 pikeun detil di dieu - kira-kira. tarjamah.), ku kituna pamakéan gabungan maranéhna ngaronjatkeun reliabiliti.
  • TrueTime gaduh API anu teu biasa. Éta ngabalikeun waktos salaku interval kalayan kasalahan pangukuran sareng kateupastian diwangun kana éta. Momen saleresna dina waktosna aya di antara wates luhur sareng handap interval. Spanner, pangkalan data anu disebarkeun Google, ngan ukur ngantosan dugi ka aman pikeun nyarios yén waktos ayeuna teu aya jangkauan. Metoda ieu ngenalkeun sababaraha latency kana sistem, khususna upami kateupastian dina master tinggi, tapi mastikeun kabeneran sanajan dina kaayaan anu disebarkeun sacara global.

Langkung seueur pamekar kedah terang ieu ngeunaan pangkalan data
Komponén Spanner ngagunakeun TrueTime, dimana TT.now () mulih interval, jadi Spanner saukur saré nepi ka titik dimana eta bisa yakin yén waktu ayeuna geus kaliwat titik nu tangtu.

Ngurangan akurasi dina nangtukeun waktos ayeuna hartosna paningkatan dina durasi operasi Spanner sareng panurunan dina pagelaran. Éta pisan sababna naha hal anu penting pikeun ngajaga akurasi pangluhurna mungkin sanajan teu mungkin pikeun ménta arloji lengkep akurat.

Tunda ngabogaan loba harti

Lamun nanya ka belasan ahli ngeunaan naon reureuh téh, Anjeun meureun bakal meunang jawaban béda. Dina DBMS latency mindeng disebut "database latency" na béda ti naon anu katarima ku klien. Kanyataan yén klien nu observes jumlah reureuh jaringan jeung reureuh database. Kamampuhan pikeun ngasingkeun jinis latency penting nalika nga-debug masalah anu ngembang. Nalika ngumpulkeun sareng ningalikeun métrik, sok cobian perhatikeun dua jinis éta.

Sarat kinerja kudu dievaluasi pikeun transaksi husus

Kadang-kadang karakteristik kinerja DBMS sareng watesanana ditangtukeun dina hal nyerat/baca throughput sareng latency. Ieu nyadiakeun gambaran umum tina parameter sistem konci, tapi lamun evaluating kinerja DBMS anyar, pendekatan leuwih komprehensif pikeun misah evaluate operasi kritis (pikeun unggal query jeung/atawa transaksi). conto:

  • Tulis throughput sareng latency nalika nyelapkeun baris anyar kana tabel X (kalayan 50 juta jajar) kalayan konstrain anu ditangtukeun sareng padding baris dina tabel anu aya hubunganana.
  • Tunda dina mintonkeun réréncangan réréncangan tina pangguna anu tangtu nalika jumlah réréncangan rata-rata 500.
  • Latency dina retrieving 100 luhur entri tina sajarah pamaké lamun pamaké nuturkeun 500 pamaké séjén kalawan X éntri per jam.

Evaluasi sareng ékspérimén tiasa kalebet kasus kritis sapertos kitu dugi ka anjeun yakin yén pangkalan data nyumponan sarat kinerja. Aturan anu sami ogé nyandak ngarecahna ieu nalika ngumpulkeun métrik latency sareng nangtukeun SLO.

Waspada kardinalitas anu luhur nalika ngumpulkeun métrik pikeun unggal operasi. Anggo log, koléksi acara, atanapi lacak anu disebarkeun pikeun kéngingkeun data debugging kakuatan tinggi. Dina artikel "Hoyong Debug Latency?» anjeun tiasa familiarize diri sareng metodologi debug debug.

transaksi Nested tiasa bahaya

Henteu unggal DBMS ngadukung transaksi nested, tapi nalika aranjeunna ngalakukeun, transaksi sapertos kitu tiasa nyababkeun kasalahan anu teu kaduga anu henteu gampang dideteksi (nyaéta, kedah écés yén aya sababaraha anomali).

Anjeun tiasa ngahindarkeun ngagunakeun transaksi anu disarangkeun nganggo perpustakaan klien anu tiasa ngadeteksi sareng ngalangkunganana. Lamun transaksi nested teu bisa ditinggalkeun, jaga husus dina palaksanaan maranéhna pikeun nyingkahan kaayaan teu kaduga dimana transaksi réngsé teu kahaja aborted alatan leuwih nested.

transaksi encapsulating dina lapisan béda bisa ngakibatkeun transaksi nested kaduga, sarta ti sudut pandang readability kode, éta bisa nyieun hésé ngarti maksud pangarang urang. Tingali kana program di handap ieu:

with newTransaction():
   Accounts.create("609-543-222")
   with newTransaction():
       Accounts.create("775-988-322")
       throw Rollback();

Naon anu bakal kaluaran tina kode di luhur? Bakal gulung deui duanana transaksi, atawa ngan hiji batin? Naon anu lumangsung lamun urang ngandelkeun sababaraha lapisan perpustakaan nu encapsulate kreasi transaksi keur urang? Naha urang tiasa ngaidentipikasi sareng ningkatkeun kasus sapertos kitu?

Bayangkeun lapisan data kalayan sababaraha operasi (contona. newAccount) geus dilaksanakeun dina transaksi sorangan. Naon anu lumangsung upami anjeun ngajalankeunana salaku bagian tina logika bisnis tingkat luhur anu dijalankeun dina transaksi sorangan? Naon anu bakal janten isolasi sareng konsistensi dina hal ieu?

function newAccount(id string) {
  with newTransaction():
      Accounts.create(id)
}

Tinimbang neangan jawaban kana patarosan sajajalan sapertos, eta leuwih hade ulah transaksi nested. Barina ogé, lapisan data anjeun bisa kalayan gampang ngalakukeun operasi tingkat luhur tanpa nyieun transaksi sorangan. Sajaba ti éta, logika bisnis sorangan sanggup initiating transaksi, ngajalankeun operasi di dinya, committing atanapi aborting urus.

function newAccount(id string) {
   Accounts.create(id)
}
// In main application:
with newTransaction():
   // Read some data from database for configuration.
   // Generate an ID from the ID service.
   Accounts.create(id)
   Uploads.create(id) // create upload queue for the user.

Transaksi teu kedah dihijikeun sareng kaayaan aplikasi

Kadang-kadang pikabitaeun ngagunakeun kaayaan aplikasi dina transaksi pikeun ngarobih nilai-nilai anu tangtu atanapi parameter pamundut tweak. Nuansa kritis anu kedah dipertimbangkeun nyaéta wengkuan aplikasi anu leres. Klién sering ngamimitian deui transaksi nalika aya masalah jaringan. Lamun urus lajeng gumantung kana kaayaan nu keur dirobah ku sababaraha prosés séjén, eta bisa milih nilai salah gumantung kana kamungkinan hiji lomba data. Transaksi kedah mertimbangkeun résiko kaayaan lomba data dina aplikasi.

var seq int64
with newTransaction():
    newSeq := atomic.Increment(&seq)
    Entries.query(newSeq)
    // Other operations...

Transaksi di luhur bakal nambahan jumlah sekuen unggal waktos dieksekusi, henteu paduli hasil ahir. Upami komitmen gagal kusabab masalah jaringan, pamundut bakal dieksekusi kalayan nomer sekuen anu béda nalika anjeun cobian deui.

Perencana pamundut tiasa nyarioskeun ka anjeun seueur ngeunaan pangkalan data

Planners query nangtukeun kumaha query bakal dieksekusi dina database a. Éta ogé nganalisis requests sarta ngaoptimalkeun aranjeunna saméméh ngirim aranjeunna. Nu Ngarencana ngan bisa nyadiakeun sababaraha perkiraan mungkin dumasar kana sinyal dina pembuangan maranéhanana. Contona, naon métode pilarian pangalusna pikeun query handap?

SELECT * FROM articles where author = "rakyll" order by title;

Hasilna tiasa dicandak ku dua cara:

  • Pinuh tabel scan: Anjeun tiasa ningali unggal éntri dina tabel sarta balik artikel kalawan ngaran pangarang cocog, lajeng mesen aranjeunna.
  • Indéks scan: Anjeun tiasa make indéks pikeun manggihan ID cocog, meunang barisan maranéhanana, lajeng mesen aranjeunna.

Tugas Nu Ngarencana query nyaéta pikeun nangtukeun strategi mana anu pangsaéna. Éta patut mertimbangkeun yén planner query ngan ukur gaduh kamampuan prediksi anu terbatas. Ieu bisa ngakibatkeun kaputusan goréng. DBA atanapi pamekar tiasa nganggo aranjeunna pikeun ngadiagnosis sareng nyempurnakeun patarosan anu kirang kinerja. Versi anyar DBMS bisa ngonpigurasikeun planners query, sarta timer diagnosis bisa mantuan nalika ngamutahirkeun database lamun versi anyar ngakibatkeun masalah kinerja. Log pamundut lambat, laporan masalah latency, atanapi statistik waktos palaksanaan tiasa ngabantosan ngaidentipikasi patarosan anu peryogi optimasi.

Sababaraha métrik anu disayogikeun ku pangrencana query tiasa aya gangguan (utamana nalika ngira-ngira latency atanapi waktos CPU). Tambahan anu hadé pikeun penjadwal nyaéta alat pikeun ngalacak sareng ngalacak jalur palaksanaan. Aranjeunna ngamungkinkeun anjeun pikeun ngaidentipikasi masalah sapertos kitu (sayangna, henteu sadayana DBMS nyayogikeun alat sapertos kitu).

Migrasi online hese tapi mungkin

Migrasi online, migrasi langsung, atawa migrasi real-time hartina pindah ti hiji database ka nu sejen tanpa downtime atawa korupsi data. Migrasi langsung langkung gampang dilaksanakeun upami transisi lumangsung dina DBMS/mesin anu sami. Kaayaan janten langkung pajeulit nalika anjeun kedah ngalih ka DBMS énggal kalayan syarat kinerja sareng skéma anu béda.

Aya model migrasi online anu béda. Ieu salah sahijina:

  • Aktipkeun entri ganda dina duanana database. Basis data anyar dina tahap ieu henteu gaduh sadayana data, tapi ngan ukur nampi data pangénggalna. Sakali anjeun yakin ieu, anjeun tiasa ngaléngkah ka lengkah salajengna.
  • Aktipkeun maca tina duanana database.
  • Konpigurasikeun sistem supados maca sareng nyerat dilakukeun utamina dina pangkalan data énggal.
  • Ngeureunkeun nulis kana database heubeul bari nuluykeun maca data ti dinya. Dina tahap ieu, databés anyar masih teu aya sababaraha data. Éta kudu disalin ti database heubeul.
  • Basis data heubeul ngan ukur dibaca. Nyalin data leungit tina database heubeul ka nu anyar. Saatos migrasi parantos réngsé, pindahkeun jalur ka pangkalan data énggal, sareng ngeureunkeun anu lami sareng ngahapus tina sistem.

Kanggo inpo tambahan, kuring nyarankeun ngahubungan artikel, anu rinci ngeunaan strategi migrasi Stripe dumasar kana modél ieu.

Paningkatan anu signifikan dina pangkalan data nyababkeun paningkatan dina teu bisa diprediksi

Tumuwuhna database ngabalukarkeun masalah unpredictable pakait sareng skala na. Beuki urang terang ngeunaan struktur internal database, langkung saé urang tiasa ngaduga kumaha skalana. Sanajan kitu, sababaraha moments masih teu mungkin foresee.
Nalika dasarna tumbuh, asumsi sareng ekspektasi sateuacana ngeunaan volume data sareng syarat rubakpita jaringan tiasa janten tinggaleun jaman. Ieu nalika patarosan timbul ngeunaan perombakan desain utama, perbaikan operasional skala ageung, panyebaran ulang, atanapi migrasi ka DBMS sanés pikeun ngahindarkeun poténsial masalah.

Tapi ulah nganggap yén pangaweruh alus teuing tina struktur internal tina database aya - hijina hal anu diperlukeun. Skala anyar bakal mawa sareng aranjeunna kanyahoan anyar. titik nyeri unpredictable, distribusi data henteu rata, rubakpita kaduga jeung masalah hardware, lalulintas kantos-ngaronjatkeun sarta bagéan jaringan anyar bakal maksakeun anjeun rethink pendekatan database anjeun, model data, modél deployment, sarta ukuran database.

...

Nalika kuring mimiti mikir ngeunaan nyebarkeun tulisan ieu, parantos aya lima item deui dina daptar asli kuring. Lajeng sumping jumlah badag gagasan anyar ngeunaan naon deui nu bisa katutupan. Ku alatan éta, artikel némpél dina masalah sahenteuna atra anu merlukeun perhatian maksimum. Nanging, ieu sanés hartosna yén topikna parantos béak sareng kuring moal deui uih deui kana bahan anu bakal datang sareng moal ngarobih kana anu ayeuna.

PS

Baca ogé dina blog urang:

sumber: www.habr.com

Tambahkeun komentar