Untuk mencapai Ketersediaan Tinggi (HA) dalam Redis, dua kaedah berikut digunakan:
Replikasi data induk-hamba.
Gunakan sentinel untuk memantau operasi nod data Sebaik sahaja terdapat masalah dengan nod induk, perkhidmatan akan diteruskan dari bahagian atas nod hamba.
Replikasi data redis antara nod induk dan hamba boleh dibahagikan kepada replikasi penuh dan replikasi separa.
Salinan penuh dilaksanakan menggunakan arahan snyc Prosesnya ialah:
Dari Pelayan menghantar arahan penyegerakan ke pelayan utama.
Selepas menerima arahan penyegerakan, pelayan utama memanggil arahan bgsave untuk menjana fail ***rdb, dan menyegerakkan fail ini ke pelayan hamba, supaya selepas pelayan hamba dimuatkan fail rdb, Status akan sama seperti apabila pelayan utama melaksanakan arahan bgsave.
Pelayan induk menyegerakkan arahan tulis yang disimpan dalam penimbal arahan kepada pelayan hamba dan pelayan hamba melaksanakan arahan ini, supaya status pelayan hamba adalah konsisten dengan semasa status pelayan induk.
Masalah utama dengan fungsi salinan penuh versi lama ialah apabila pelayan hamba diputuskan sambungan dan disambung semula, walaupun sudah ada beberapa data pada pelayan hamba, salinan penuh masih diperlukan. Kecekapan ini sangat rendah, jadi versi baharu Redis telah membuat penambahbaikan dalam bahagian ini.
Versi terkini Redis menggunakan perintah psync untuk menggantikan arahan penyegerakan Perintah psync bukan sahaja boleh dicapai penyegerakan penuh, tetapi juga penyegerakan separa .
Kedua-dua pihak yang melakukan replikasi, pelayan tuan dan hamba, akan mengekalkan offset replikasi masing-masing:
Setiap kali pelayan induk menyegerakkan N bait data ke pelayan hamba, ia akan mengubah suai replikasinya sendiri mengimbangi +N.
Setiap kali pelayan hamba menyegerakkan N bait data daripada pelayan induk, ia akan mengubah suai offset +N replikasinya sendiri.
Pelayan utama secara dalaman mengekalkan baris gilir pertama masuk dahulu keluar dengan panjang tetap sebagai penimbal tunggakan replikasi, yang lalai kepada Saiz ialah 1MB.
Apabila pelayan induk melakukan penyebaran arahan, ia bukan sahaja akan menyegerakkan arahan tulis ke pelayan hamba, tetapi juga menulis arahan tulis kepada penimbal tunggakan replikasi.
Setiap pelayan Redis mempunyai ID berjalannya dijana secara automatik oleh pelayan apabila ia dimulakan ID Dihantar ke pelayan hamba, dan pelayan hamba akan menyimpan ID berjalan pelayan induk.
Apabila menyegerakkan selepas pelayan hamba Redis diputuskan sambungan dan disambungkan semula, kemajuan penyegerakan dinilai berdasarkan ID yang sedang dijalankan:
Jika pelayan induk yang menjalankan ID disimpan pada pelayan hamba Jika ia konsisten dengan ID semasa pelayan utama semasa, pelayan utama yang diputuskan dan disambung semula kali ini adalah dianggap sebagai pelayan utama yang direplikasi sebelum ini, dan pelayan utama boleh terus mencuba operasi penyegerakan separa.
Jika tidak, jika pelayan utama yang menjalankan ID berbeza antara dua sebelum dan selepas, proses penyegerakan penuh dianggap selesai.
Dengan persediaan sebelumnya, mari kita mula menganalisis proses arahan psync:
Jika pelayan hamba tidak mereplikasi mana-mana pelayan induk sebelum ini, atau perintah hamba tidak pernah dilaksanakan sebelum ini, pelayan hamba akan menghantar perintah psync ke pelayan induk untuk meminta pelayan induk menyegerakkan data sepenuhnya .
Jika tidak, jika pelayan hamba telah menyegerakkan beberapa data sebelum ini, maka pelayan hamba menghantar perintah
Selepas pelayan utama menerima arahan pync dalam dua kes pertama, tiga kemungkinan berikut akan berlaku:
Pelayan utama kembali + fullresync < Balasan
Jika pelayan induk bertindak balas dengan +teruskan, ini bermakna pelayan induk dan pelayan hamba sedang melaksanakan operasi penyegerakan data separa dan data yang hilang daripada pelayan hamba boleh disegerakkan.
Jika pelayan utama bertindak balas dengan -err, ini bermakna versi pelayan utama adalah lebih rendah daripada 2.8 dan arahan psync tidak dapat dikenali Pada masa ini, pelayan hamba akan menghantar a perintah penyegerakan ke pelayan utama dan laksanakan jumlah lengkap data segerak.
Redis menggunakan mekanisme sentinel untuk mencapai ketersediaan tinggi (HA) prinsip kerjanya ialah:
Redis menggunakan set nod sentinel untuk memantau ketersediaan perkhidmatan redis tuan-hamba.
Setelah nod induk Redis didapati gagal, nod sentinel akan dipilih sebagai ketua.
Sentinel*** kemudian memilih nod Redis daripada nod Redis hamba yang tinggal sebagai nod Redis utama baharu untuk berkhidmat kepada pihak luar.
Di atas membahagikan nod Redis kepada dua kategori:
Nod sentinel: Bertanggungjawab untuk memantau operasi nod.
Nod data: nod Redis yang biasanya melayani permintaan pelanggan, dibahagikan kepada tuan dan hamba.
Di atas adalah proses umum Proses ini perlu menyelesaikan masalah berikut:
Bagaimana untuk memantau nod data Redis?
Bagaimana untuk menentukan sama ada nod data Redis tidak sah?
Bagaimana untuk memilih nod *** sentinel?
Apakah asas nod sentinel untuk memilih nod Redis primer baharu?
Jom jawab soalan ini satu persatu.
Nod sentinel memantau ketersediaan perkhidmatan nod data Redis melalui tiga tugas pemantauan berjadual.
Setiap 10 saat, setiap nod sentinel akan menghantar arahan info kepada nod data Redis induk dan hamba untuk mendapatkan maklumat topologi baharu.
Maklumat topologi Redis termasuk:
Peranan nod ini: tuan atau hamba.
Alamat dan maklumat port nod tuan dan hamba.
Dengan cara ini, nod sentinel secara automatik boleh mendapatkan maklumat nod hamba daripada arahan info, jadi maklumat nod hamba yang ditambahkan kemudian boleh dikesan secara automatik tanpa konfigurasi eksplisit.
Setiap 2 saat, setiap nod sentinel akan menyegerakkan dirinya ke saluran __sentinel__:hello nod data Redis untuk mendapatkan induk maklumat nod dan maklumat nod sentinel semasa Memandangkan nod sentinel lain juga telah melanggan saluran ini, operasi ini sebenarnya boleh bertukar maklumat tentang nod induk dan nod sentinel antara nod sentinel.
Operasi ini sebenarnya mencapai dua perkara: * Menemui nod sentinel baharu: Jika nod sentinel baharu bercantum, maklumat nod sentinel baharu disimpan pada masa ini dan sambungan kemudiannya diwujudkan dengan nod sentinel . Tulis semula dengan cara berikut: * Tukar maklumat status nod induk supaya kita boleh menentukan secara objektif sama ada nod induk berada di luar talian nanti.
Setiap 1 saat, setiap nod sentinel menghantar arahan ping kepada nod data induk dan hamba serta nod sentinel lain untuk pengesanan degupan jantung. Pengesanan degupan jantung ini adalah asas untuk pertimbangan subjektif seterusnya bahawa nod data berada di luar talian.
Tiga ketiga daripada tiga tugas pemantauan di atas Mengesan tugasan degupan jantung, jika tiada balasan yang sah diterima selepas dikonfigurasikan turun-selepas-milisaat, nod data dianggap "secara subjektif di luar talian (sdown)".
Mengapa ia dipanggil "luar talian subjektif"? Kerana dalam sistem yang diedarkan, terdapat beberapa mesin yang berfungsi bersama, pelbagai situasi mungkin berlaku dalam rangkaian Pertimbangan satu nod sahaja tidak mencukupi untuk menganggap bahawa nod data adalah di luar talian. Ini memerlukan proses "luar talian objektif". .
Apabila nod sentinel berfikir bahawa nod induk secara subjektif di luar talian, nod sentinel perlu melepasi "sentinel is-master-down-by addr " perintah Tanya nod sentinel lain sama ada nod induk berada di luar talian. Jika lebih separuh daripada nod sentinel menjawab bahawa nod itu berada di luar talian, nod induk dianggap sebagai "luar talian secara objektif".
Apabila nod induk secara objektif di luar talian, nod sentinel perlu dipilih sebagai sentinel*** untuk melengkapkan pemilihan seterusnya kerja nod induk.
Idea umum pilihan raya ini ialah:
Setiap nod sentinel digunakan untuk menjadi nod sentinel dengan menghantar "sentinel is-master-down-by addr " perintah kepada nod sentinel lain. sentinel***.
Apabila setiap nod sentinel menerima arahan "sentinel is-master-down-by addr", ia hanya dibenarkan untuk mengundi nod *** ditolak.
Jika nod sentinel menerima lebih separuh daripada undi kelulusan, ia menjadi sentinel***.
Jika pengawal*** tidak dipilih dalam tempoh masa tertentu dalam tiga langkah pertama, pilihan raya seterusnya akan bermula semula.
Seperti yang anda lihat, proses pemilihan ini hampir sama dengan proses pemilihan pemimpin secara rakit.
Antara nod hamba Redis yang tinggal, pilih nod induk baharu dalam susunan berikut:
Tapis nod data "tidak sihat": seperti nod hamba yang secara subjektif di luar talian atau terputus, nod yang tidak bertindak balas kepada arahan ping nod sentinel dalam masa lima saat dan nod hamba yang terputus hubungan dengan nod induk.
Jika terdapat nod hamba dengan keutamaan hamba (keutamaan nod hamba) ***, kembalikan nod jika tidak, teruskan laksanakan proses seterusnya.
Pilih nod hamba dengan salinan offset ***, yang bermaksud bahawa data pada nod hamba ini adalah yang paling lengkap Jika ia wujud, ia akan kembali jika ia tidak wujud dan teruskan dengan proses seterusnya.
Pada ketika ini, status semua nod hamba yang tinggal adalah sama, pilih nod hamba dengan runid terkecil.
Selepas memilih nod induk baharu, proses *** diperlukan untuk menjadikan nod itu baharu Nod induk:
Sentinel*** mengeluarkan arahan "slaveof no one" kepada nod hamba yang dipilih dalam langkah sebelumnya untuk menjadikan nod ini sebagai nod induk.
Sentinel*** menghantar arahan kepada nod hamba yang tinggal untuk menjadikannya nod hamba nod induk baharu.
Set nod sentinel akan mengemas kini nod induk asal kepada nod hamba, dan apabila ia pulih, ia akan diarahkan untuk menyalin data nod induk baharu.
Atas ialah kandungan terperinci Apakah dua penyelesaian pelaksanaan untuk ketersediaan tinggi Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!