Rumah > Artikel > pangkalan data > Mari kita bincangkan tentang cara GitHub menjadikan MySQL sangat tersedia
Github menggunakan pangkalan data MySQL sebagai stor data untuk semua transaksi bukangit
. Ketersediaan pangkalan data adalah penting untuk berfungsi dengan betul Github. Kedua-dua tapak web Github itu sendiri, API Github, perkhidmatan pengesahan, dll. semuanya perlu mengakses pangkalan data. Github menjalankan berbilang kluster pangkalan data untuk menyokong tugas perkhidmatan yang berbeza. Seni bina pangkalan data menggunakan struktur induk-hamba tradisional Satu nod (pangkalan data induk) dalam kluster menyokong akses tulis, dan nod yang tinggal (pangkalan data hamba) menyegerakkan perubahan kepada pangkalan data induk dan perkhidmatan baca sokongan.
Ketersediaan perpustakaan utama adalah penting. Setelah pangkalan data utama turun, kluster tidak akan dapat menyokong perkhidmatan penulisan data: sebarang data yang perlu disimpan tidak boleh ditulis ke pangkalan data untuk penyimpanan. Akibatnya, sebarang perubahan pada Github, seperti penyerahan kod, soalan, penciptaan pengguna, semakan kod, penciptaan gudang, dll., tidak dapat diselesaikan.
Untuk memastikan operasi normal perniagaan, kami sememangnya perlu mempunyai nod pangkalan data yang tersedia dalam kelompok yang menyokong penulisan. Pada masa yang sama, kita juga mesti dapat menemui nod pangkalan data perkhidmatan boleh tulis yang tersedia dengan cepat.
Maksudnya, dalam keadaan luar biasa, jika pangkalan data utama tidak berfungsi, kami mesti memastikan bahawa pangkalan data utama baharu boleh pergi ke dalam talian serta-merta ke perkhidmatan sokongan, dan memastikan nod lain dalam kluster dapat mengenal pasti dengan cepat pangkalan data utama baharu. Jumlah masa untuk pengesanan kesalahan, penghijrahan induk dan nod data lain dalam kelompok untuk mengenal pasti induk baharu membentuk jumlah masa gangguan perkhidmatan.
Artikel ini menerangkan ketersediaan tinggi MySQL GitHub dan penyelesaian penemuan perkhidmatan induk, yang membolehkan kami menjalankan operasi dengan pasti merentas pusat data, bertolak ansur dengan pengasingan pusat data dan memendekkan masa yang diperlukan untuk Masa Henti sekiranya berlaku kegagalan.
Penyelesaian yang diterangkan dalam artikel ini ialah versi diperbaik bagi penyelesaian ketersediaan tinggi Github sebelumnya. Seperti yang dinyatakan sebelum ini, strategi ketersediaan tinggi MySQL mesti menyesuaikan diri dengan perubahan perniagaan. Kami menjangkakan MySQL dan perkhidmatan lain di GitHub mempunyai penyelesaian yang sangat tersedia yang boleh mengatasi perubahan.
Apabila mereka bentuk penyelesaian sistem ketersediaan dan penemuan perkhidmatan yang tinggi, bermula daripada soalan berikut boleh membantu kami mencari penyelesaian yang sesuai dengan cepat:
Untuk menjelaskan isu di atas, mari kita lihat dahulu penyelesaian ketersediaan tinggi kami yang terdahulu dan sebab kami ingin memperbaikinya.
Dalam penyelesaian sebelumnya, penyelesaian teknikal berikut telah digunakan:
Pelanggan mencari nod induk dengan menghuraikan nama nod, seperti mysql-writer-1.github.net
, ke dalam alamat IP mayanya (VIP).
Oleh itu, dalam keadaan biasa, pelanggan boleh menyambung ke nod induk IP yang sepadan dengan menghuraikan nama nod.
Pertimbangkan topologi tiga pusat data:
Setelah pangkalan data utama tidak normal, salah satu pelayan replika data mesti dikemas kini kepada pelayan pangkalan data utama .
orchestrator
akan mengesan anomali, memilih pangkalan data induk baharu, dan kemudian menetapkan semula nama pangkalan data dan IP maya (VIP). Pelanggan itu sendiri tidak mengetahui perubahan pada perpustakaan utama Maklumat yang dimiliki klien hanyalah nama pustaka utama, jadi nama ini mesti boleh diselesaikan ke pelayan perpustakaan utama yang baharu. Pertimbangkan perkara berikut:
VIP perlu dirundingkan: IP maya dipegang oleh pangkalan data itu sendiri. Pelayan mesti menghantar permintaan ARP untuk menduduki atau melepaskan VIP. Sebelum pangkalan data baharu boleh memperuntukkan VIP baharu, pelayan lama mesti terlebih dahulu melepaskan VIP yang dipegangnya. Proses ini akan menyebabkan beberapa masalah luar biasa:
Apabila kami sebenarnya menyediakan VIP, VIP juga terikat dengan lokasi fizikal sebenar. Ini bergantung terutamanya pada tempat suis atau penghala berada. Oleh itu, kami hanya boleh menetapkan semula VIP pada pelayan tempatan yang sama. Khususnya, terdapat kes di mana kami tidak dapat menetapkan VIP kepada pelayan di pusat data lain dan mesti membuat perubahan DNS.
Keterbatasan ini sahaja sudah cukup untuk mendorong kami mencari penyelesaian baharu, tetapi berikut adalah perkara yang perlu dipertimbangkan:
Pelayan utama menggunakan pt-heartbeat
perkhidmatan untuk pergi ke suntikan diri Akses degupan jantung untuk pengukuran kependaman dan kawalan pendikit . Perkhidmatan mesti dimulakan pada pelayan induk baharu. Jika boleh, perkhidmatan pelayan utama lama akan ditutup apabila pelayan utama diganti.
Begitu juga, Pseudo-GTID diuruskan oleh pelayan itu sendiri. Ia perlu dimulakan pada tuan baru dan sebaik-baiknya dihentikan pada tuan lama.
Tuan baharu akan ditetapkan boleh ditulis. Jika boleh, tuan lama akan ditetapkan kepada read_only
(baca sahaja).
Langkah tambahan ini merupakan faktor dalam jumlah masa henti dan memperkenalkan gangguan dan geseran mereka sendiri.
Penyelesaian berfungsi, GitHub telah berjaya melakukan failover MySQL, tetapi kami ingin HA menambah baik dalam bidang berikut:
Strategi baharu boleh menambah baik, menyelesaikan atau mengoptimumkan masalah yang dinyatakan di atas. Komponen ketersediaan tinggi semasa adalah seperti berikut:
anycast
sebagai penghala rangkaian. Struktur baharu mengalih keluar VIP dan DNS. Sambil kami memperkenalkan lebih banyak komponen, kami dapat memisahkannya dan memudahkan tugasan yang berkaitan dan memudahkan untuk memanfaatkan penyelesaian yang boleh dipercayai dan stabil. Butiran di bawah.
Biasanya, aplikasi bersambung ke nod tulis melalui GLB/HAProxy.
Aplikasi tidak mengetahui identiti induk. Sebelum ini, nama digunakan. Contohnya, tuan cluster1
ialah mysql-writer-1.github.net
. Dalam struktur semasa, nama ini digantikan dengan anycast IP.
Dengan anycast
, nama digantikan dengan IP yang sama, tetapi trafik dihalakan oleh lokasi pelanggan. Khususnya, apabila pusat data mempunyai GLB, pengimbang beban ketersediaan tinggi digunakan dalam kotak yang berbeza. Trafik ke mysql-writer-1.github.net
dihalakan ke gugusan GLB di pusat data tempatan. Dengan cara ini semua pelanggan dilayan oleh proksi tempatan.
Gunakan GLB di atas HAProxy. HAProxy mempunyai kumpulan tulis : satu bagi setiap kelompok MySQL. Setiap kumpulan mempunyai perkhidmatan hujung belakang: nod induk kelompok. Semua kotak GLB/HAProxy di pusat data mempunyai kumpulan yang sama, yang bermaksud bahawa kumpulan ini sepadan dengan perkhidmatan bahagian belakang yang sama. Jadi jika aplikasi menjangkakan untuk menulis mysql-writer-1.github.net
, ia tidak kisah perkhidmatan GLB yang mana untuk disambungkan. Ia akan membawa kepada cluster1
nod induk sebenar.
Untuk aplikasi untuk menyambung ke GLB dan menemui perkhidmatan, tiada penemuan semula diperlukan. GLB bertanggungjawab untuk mengarahkan semua trafik ke destinasi yang betul.
Bagaimanakah GLB mengetahui perkhidmatan yang merupakan bahagian belakang, dan bagaimanakah ia memberitahu GLB tentang perubahan?
Konsul terkenal dengan penyelesaian penemuan perkhidmatan dan juga menyediakan perkhidmatan DNS. Walau bagaimanapun, dalam penyelesaian kami, kami menggunakannya sebagai kedai nilai kunci (KV) yang sangat tersedia.
Di kedai KV Consul, kami menulis identiti tuan kluster. Untuk setiap kluster, terdapat satu set entri KV yang menunjukkan peranti induk kluster fqdn
, port, ipv4, ipv6.
Setiap nod GLB/HAProxy menjalankan consul-template: perkhidmatan yang mendengar perubahan dalam data Konsul (dalam kes kami: perubahan dalam data induk kluster). consul-template
Jana fail konfigurasi yang sah dan boleh memuatkan semula HAProxy apabila konfigurasi berubah.
Oleh itu, setiap mesin GLB/HAProxy akan memerhatikan perubahan identiti induk oleh Konsul, kemudian ia akan mengkonfigurasi semula dirinya, menetapkan induk baharu sebagai entiti tunggal dalam kolam hujung belakang kluster dan memuat semula untuk mencerminkan perubahan ini.
Di GitHub, kami mempunyai persediaan Konsul dalam setiap pusat data dan setiap persediaan sangat tersedia. Walau bagaimanapun, tetapan ini adalah bebas antara satu sama lain. Mereka tidak menyalin antara satu sama lain dan tidak berkongsi sebarang data.
Bagaimanakah Konsul mengetahui tentang perubahan, dan bagaimana maklumat diedarkan ke seluruh DC?
Kami menjalankan persediaan orchestrator/raft
: orchestrator
nod berinteraksi antara satu sama lain melalui rakit komunikasi mekanisme. Setiap pusat data mempunyai satu atau dua orchestrator
nod.
orchestrator
bertanggungjawab untuk pengesanan kesalahan dan failover MySQL, serta menyampaikan perubahan daripada master kepada Consul. Failover dikendalikan oleh satu orchestrator/raft
nod ketua, tetapi mesej bahawa kluster kini mempunyai induk baharu disebarkan kepada semua raft
nod melalui mekanisme orchestrator
.
Apabila orchestrator
nod menerima mesej yang master telah berubah, mereka masing-masing berkomunikasi dengan persediaan Consul setempat: mereka masing-masing memanggil KV write. DC dengan berbilang orchestrator
proksi akan menulis berbilang masa (sama) kepada Konsul.
Sekiranya berlaku ranap induk:
orchestrator
Kegagalan pengesanan nod.orchestrator/raft
Nod pemimpin mula pulih, dan pelayan data dikemas kini sebagai induk. orchestrator/raft
Umumkan semua raft
nod subkluster telah bertukar induk. orchestrator/raft
menerima pemberitahuan perubahan nod pemimpin. Setiap ahli mereka mengemas kini tuan baharu ke kedai KV Consul
tempatan. consul-template
dan templat melihat perubahan dalam Consul
gedung KV dan mengkonfigurasi semula serta memuat semula HAProxy. Setiap komponen mempunyai tanggungjawab yang jelas, dan keseluruhan reka bentuk dipisahkan dan dipermudahkan. orchestrator
Tidak tahu tentang pengimbang beban. Consul
Tidak perlu tahu sumber mesej. Ejen hanya mementingkan Consul
. Pelanggan hanya mengambil berat tentang proksi.
Selain itu:
Untuk melindungi lalu lintas anda, kami mempunyai perkara berikut:
hard-stop-after
yang sangat pendek. Apabila ia memuatkan semula pelayan bahagian belakang baharu dalam kumpulan penulis, ia secara automatik menamatkan sebarang sambungan sedia ada ke pelayan induk lama. hard-stop-after
kami tidak memerlukan kerjasama pelanggan, yang mengurangkan situasi otak berpecah. Perlu diingat bahawa ini tidak ditutup dan beberapa masa berlalu sebelum kami menamatkan sambungan lama. Tetapi selepas satu ketika, kami berasa selesa dan tidak mengharapkan sebarang kejutan buruk. Kami akan menyelesaikan masalah tersebut dan meneruskan matlamat HA dalam bahagian berikut.
orchestrator
menggunakan pendekatan holistik untuk mengesan kerosakan dan oleh itu sangat boleh dipercayai. Kami mendapati tiada positif palsu: kami tidak mengalami kegagalan pramatang dan oleh itu tidak mengalami masa henti yang tidak perlu.
orchestrator/raft
Lebih lanjut menangani kes pengasingan rangkaian DC lengkap (aka DC pagar). Pengasingan rangkaian DC boleh menyebabkan kekeliruan: pelayan dalam DC itu boleh berkomunikasi antara satu sama lain. Adakah mereka diasingkan daripada rangkaian DC lain atau DC lain diasingkan daripada rangkaian?
Dalam persediaan orchestrator/raft
, nod ketua raft
ialah nod yang menjalankan failover. Pemimpin adalah nod yang mendapat sokongan majoriti (kuorum) kumpulan. Penggunaan nod penyelaras kami adalah sedemikian rupa sehingga tiada satu pusat data mempunyai majoriti, mana-mana pusat data n-1 akan melakukannya.
Dengan pengasingan lengkap rangkaian DC, orchestrator
nod dalam DC itu akan diputuskan sambungan daripada nod rakan sebaya dalam DC lain. Oleh itu, nod orchestrator
dalam DC terpencil tidak boleh menjadi ketua gugusan raft
. Jika mana-mana nod sedemikian menjadi ketua, ia akan berundur. Pemimpin baharu akan ditugaskan daripada mana-mana DC lain. Pemimpin ini akan disokong oleh semua DC lain yang boleh berkomunikasi antara satu sama lain.
Oleh itu, nod orchestrator
yang memberikan pesanan akan menjadi nod di luar pusat data pengasingan rangkaian. Jika terdapat induk dalam DC kendiri, orchestrator
akan memulakan failover, menggantikannya dengan pelayan daripada salah satu DC yang tersedia. Kami mengurangkan pengasingan DC dengan mewakilkan keputusan kepada kuorum dalam DC tidak terpencil.
Jumlah masa rehat boleh dikurangkan lagi dengan menerbitkan perubahan besar dengan lebih pantas. Bagaimana untuk mencapai ini?
Apabila orchestrator
memulakan failover, ia memerhati barisan pelayan yang tersedia untuk promosi. Memahami peraturan replikasi dan mematuhi petua dan had membolehkan anda membuat keputusan terpelajar tentang tindakan terbaik.
Mungkin diakui bahawa pelayan yang tersedia untuk promosi juga merupakan calon yang ideal, sebagai contoh: adalah peningkatan pilihan), dan
Ada kemungkinan pokok replikasi akan utuh sebelum pelayan GLB dimuat semula sepenuhnya, tetapi ia tidak diperlukan sepenuhnya. Pelayan sangat pandai menerima penulisan! orchestrator
Replikasi separa segerak
Konsistensi datang dengan kos: risiko ketersediaan. Jika tiada replika yang mengakui penerimaan perubahan, induk menghalang dan berhenti menulis. Nasib baik, terdapat konfigurasi tamat masa selepas itu induk boleh kembali kepada mod replikasi tak segerak, menjadikan penulisan tersedia semula.
Kami telah menetapkan tamat masa kepada nilai yang agak rendah: 500ms
. Ia memadai untuk menghantar perubahan daripada replika DC induk kepada replika DC tempatan dan juga kepada DC jauh. Dengan tamat masa ini, kita boleh melihat gelagat separa segerak yang sempurna (tiada sandaran kepada replikasi tak segerak) dan boleh menggunakan tempoh penyekatan yang sangat singkat sekiranya berlaku kegagalan pengakuan.
Kami mendayakan separa penyegerakan pada replika DC tempatan dan sekiranya tuannya mati, kami menjangkakan (walaupun tidak menguatkuasakan secara ketat) failover tanpa kerugian. Failover tanpa kerugian bagi kerosakan DC yang lengkap adalah mahal dan kami tidak menjangkakannya.
Semasa bereksperimen dengan tamat masa separa segerak, kami turut melihat tingkah laku yang memihak kepada kami: dalam kes kegagalan utama, kami dapat mempengaruhi identiti calon ideal . Dengan mendayakan separa segerak pada pelayan yang ditetapkan dan menandakannya sebagai pelayan calon, kami dapat mengurangkan masa henti keseluruhan dengan mempengaruhi hasil kegagalan. Dalam percubaan kami, kami mendapati bahawa kami sering mendapat calon ideal untuk mengiklan dengan cepat.
Daripada menguruskan permulaan/penutupan perkhidmatan pt-heart
pada hos yang dinaik taraf/diturun taraf, kami memilih untuk menjalankannya di mana-mana sahaja pada bila-bila masa . Ini memerlukan beberapa tampalan untuk membuat pt-heart menyesuaikan diri dengan situasi di mana pelayan bertukar ke sana ke mari read_only
(status baca sahaja) atau ranap sepenuhnya.
Dalam persediaan semasa kami, perkhidmatan pt-heart
dijalankan pada induk dan replika. Pada hos, mereka menjana acara degupan jantung. Pada replika, mereka mengenal pasti pelayan sebagai read_only
(baca sahaja) dan menyemak semula status mereka secara berkala. Sebaik sahaja pelayan dinaikkan untuk menguasai, pt-heart
pada pelayan itu mengenal pasti pelayan sebagai boleh ditulis dan mula menyuntik peristiwa degupan jantung.
Kami selanjutnya orkestra:
read_only
. Di samping semua pakar baharu, ini mengurangkan geseran. Guru yang baru dinaikkan pangkat pastinya masih hidup dan boleh diterima, jika tidak, kami tidak akan mempromosikannya. Oleh itu, masuk akal untuk membiarkan orchestrator
secara langsung bercakap tentang menukar msater yang harus digunakan untuk rangsangan.
Kami pengatur selanjutnya:
read_only
. Di samping semua pakar baharu, ini mengurangkan geseran. Guru yang baru dinaikkan pangkat pastinya masih hidup dan boleh diterima, jika tidak, kami tidak akan mempromosikannya. Oleh itu, masuk akal untuk orchestrator
menerapkan perubahan secara terus kepada msater yang dinaikkan pangkat.
Lapisan proksi menjadikan identiti pelayan induk tidak diketahui oleh aplikasi, tetapi ia juga menutup identiti pelayan induk daripada aplikasi. Apa yang dilihat terutamanya adalah sambungan yang datang dari lapisan proksi, dan kami kehilangan maklumat tentang asal sambungan sebenar.
Dengan pembangunan sistem teragih, kami masih berhadapan dengan senario yang tidak dapat dikendalikan.
Perlu diambil perhatian bahawa dalam senario pengasingan pusat data, dengan mengandaikan pelayan utama terletak di DC terpencil, aplikasi dalam DC itu masih boleh menulis ke pelayan utama. Ini boleh menyebabkan keadaan tidak konsisten sebaik sahaja rangkaian dipulihkan. Kami sedang berusaha untuk mengurangkan otak berpecah ini dengan melaksanakan STONITH DC yang boleh dipercayai yang sangat terpencil dari dalam. Seperti sebelum ini, ia akan mengambil sedikit masa sebelum sekolah utama dimusnahkan, dan mungkin terdapat satu tempoh singkat untuk memecahkan otak. Kos operasi untuk mengelakkan pecah otak adalah sangat tinggi.
Terdapat lebih banyak kes: menghentikan perkhidmatan konsul pada pengasingan separa DC; Kami tahu adalah mustahil untuk memasukkan semua kelemahan dalam sistem yang diedarkan seperti ini, jadi kami memberi tumpuan kepada kes yang paling penting.
Penyelaras/GLB/Konsul kami memberikan kami:
10 and 13 seconds
. 20 seconds
jumlah masa henti, dan dalam kes yang melampau sehingga 25 seconds
masa henti. Paradigma penemuan proses perniagaan/proksi/perkhidmatan menggunakan komponen yang terkenal dan dipercayai dalam seni bina yang dipisahkan, Ini menjadikannya lebih mudah untuk menggunakan, mengendalikan dan memerhati, dan setiap komponen boleh ditingkatkan atau diturunkan secara bebas. Kami sentiasa boleh menguji tetapan dan mencari penambahbaikan.
Alamat asal: https://github.blog/2018-06-20-mysql-high-availability-at-github/
Alamat terjemahan: https://learnku .com/mysql/t/36820
[Cadangan berkaitan: tutorial video mysql]
Atas ialah kandungan terperinci Mari kita bincangkan tentang cara GitHub menjadikan MySQL sangat tersedia. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!