Artikel ini membawakan anda pengetahuan yang berkaitan tentang sentinel ketersediaan tinggi dalam Redis, termasuk isu yang berkaitan dengan seni bina fungsi, penggunaan dan konfigurasi saya harap ia akan membantu semua orang.
Pembelajaran yang disyorkan: Tutorial video Redis
Ciri teras Sentinel ialah failover automatik nod induk. Berikut ialah perihalan fungsi Sentinel dalam dokumen rasmi Redis:
#redis-6379.conf port 6379 daemonize yes logfile "6379.log" dbfilename "dump-6379.rdb" #redis-6380.conf port 6380 daemonize yes logfile "6380.log" dbfilename "dump-6380.rdb" slaveof 192.168.92.128 6379 #redis-6381.conf port 6381 daemonize yes logfile "6381.log" dbfilename "dump-6381.rdb" slaveof 192.168.92.128 6379
redis-server redis-6379.conf redis-server redis-6380.conf redis-server redis-6381.conf
#sentinel-26379.conf port 26379 daemonize yes logfile "26379.log" sentinel monitor mymaster 192.168.92.128 6379 2
哨兵节点的启动有两种方式,二者作用是完全相同的:其中,sentinel monitor mymaster 192.168.92.128 6379 2 配置的含义是:该哨兵节点监控192.168.92.128:6379这个主节点,该主节点的名称是mymaster,最后的2的含义与主节点的故障判定有关:至少需要2个哨兵节点同意,才能判定主节点故障并进行故障转移。
redis-sentinel sentinel-26379.conf redis-server sentinel-26379.conf --sentinel
3. 总结
按照上述方式配置和启动之后,整个哨兵系统就启动完毕了。可以通过redis-cli连接哨兵节点进行验证
哨兵系统的搭建过程,有几点需要注意:
(1)哨兵系统中的主从节点,与普通的主从节点并没有什么区别,故障发现和转移是由哨兵来控制和完成的。
(2)哨兵节点本质上是redis节点。
(3)每个哨兵节点,只需要配置监控主节点,便可以自动发现其他的哨兵节点和从节点。
(4)在哨兵节点启动和故障转移阶段,各个节点的配置文件会被重写(config rewrite)。
上一小节演示了哨兵的两大作用:监控和自动故障转移,本小节则结合客户端演示哨兵的另外两个作用:配置提供者和通知。
在介绍客户端的原理之前,先以Java客户端Jedis为例,演示一下使用方法:下面代码可以连接我们刚刚搭建的哨兵系统,并进行各种读写操作(代码中只演示如何连接哨兵,异常处理、资源关闭等未考虑)。
public static void testSentinel() throws Exception { String masterName = "mymaster"; Set<String> sentinels = new HashSet<>(); sentinels.add("192.168.92.128:26379"); sentinels.add("192.168.92.128:26380"); sentinels.add("192.168.92.128:26381"); JedisSentinelPool pool = new JedisSentinelPool(masterName, sentinels); //初始化过程做了很多工作 Jedis jedis = pool.getResource(); jedis.set("key1", "value1"); pool.close(); }
在整个过程中,我们的代码不需要显式的指定主节点的地址,就可以连接到主节点;代码中对故障转移没有任何体现,就可以在哨兵完成故障转移后自动的切换主节点。之所以可以做到这一点,是因为在JedisSentinelPool的构造器中,进行了相关的工作;主要包括以下两点:
(1)遍历哨兵节点,获取主节点信息:遍历哨兵节点,通过其中一个哨兵节点+masterName获得主节点的信息;该功能是通过调用哨兵节点的sentinel get-master-addr-by-name命令实现,该命令示例如下:
一旦获得主节点信息,停止遍历(因此一般来说遍历到第一个哨兵节点,循环就停止了)。
(2)增加对哨兵的监听:这样当发生故障转移时,客户端便可以收到哨兵的通知,从而完成主节点的切换。具体做法是:利用redis提供的发布订阅功能,为每一个哨兵节点开启一个单独的线程,订阅哨兵节点的+switch-master频道,当收到消息时,重新初始化连接池。
通过客户端原理的介绍,可以加深对哨兵功能的理解:
(1)配置提供者:客户端可以通过哨兵节点+masterName获取主节点信息,在这里哨兵起到的作用就是配置提供者。
需要注意的是,哨兵只是配置提供者,而不是代理。二者的区别在于:如果是配置提供者,客户端在通过哨兵获得主节点信息后,会直接建立到主节点的连接,后续的请求(如set/get)会直接发向主节点;如果是代理,客户端的每一次请求都会发向哨兵,哨兵再通过主节点处理请求。
举一个例子可以很好的理解哨兵的作用是配置提供者,而不是代理。在前面部署的哨兵系统中,将哨兵节点的配置文件进行如下修改:
sentinel monitor mymaster 192.168.92.128 6379 2 改为 sentinel monitor mymaster 127.0.0.1 6379 2
(2)通知:哨兵节点在故障转移完成后,会将新的主节点信息发送给客户端,以便客户端及时切换主节点。然后,将前述客户端代码在局域网的另外一台机器上运行,会发现客户端无法连接主节点;这是因为哨兵作为配置提供者,客户端通过它查询到主节点的地址为127.0.0.1:6379,客户端会向127.0.0.1:6379建立redis连接,自然无法连接。如果哨兵是代理,这个问题就不会出现了。
前面介绍了哨兵部署、使用的基本方法,本部分介绍哨兵实现的基本原理。
Sebagai nod redis berjalan dalam mod khas, nod sentinel menyokong perintah yang berbeza daripada nod redis biasa. Dalam operasi dan penyelenggaraan, kami boleh bertanya atau mengubah suai sistem Sentinel melalui arahan ini, tetapi yang lebih penting, agar sistem Sentinel melaksanakan pelbagai fungsi seperti penemuan kesalahan dan kegagalan, ia tidak dapat dipisahkan daripada komunikasi antara nod Sentinel, dan komunikasi adalah sangat Kebanyakan ini dicapai melalui arahan yang disokong oleh nod sentinel. Berikut menerangkan arahan utama yang disokong oleh nod sentinel.
(1) Pertanyaan asas: Melalui arahan ini, anda boleh menanyakan topologi, maklumat nod, maklumat konfigurasi, dll. sistem Sentinel.
(2) Tambah/buang pemantauan nod induk
pantau sentinel mymaster2 192.168.92.128 16379 2: Fungsinya adalah sama seperti fungsi monitor sentinel dalam fail konfigurasi apabila menggunakan nod sentinel, dan tidak akan diterangkan secara terperinci
sentinel remove mymaster2: Batalkan pemantauan ke atas nod induk mymaster2 oleh nod sentinel semasa
(3) Failover paksa
failover sentinel mymaster: Perintah ini boleh memaksa failover tuan saya , Walaupun nod induk semasa berjalan dengan baik, contohnya, jika mesin di mana nod induk semasa berada hampir dihapuskan, anda boleh menggunakan perintah failover untuk melakukan failover terlebih dahulu.
Mengenai prinsip pengawalan, kuncinya ialah memahami konsep berikut.
(1) Tugas berjadual: Setiap nod sentinel mengekalkan 3 tugas berjadual. Fungsi tugas berjadual adalah seperti berikut: dapatkan struktur induk-hamba terkini dengan menghantar arahan info ke nod induk-hamba mendapatkan maklumat nod sentinel lain melalui fungsi penerbitan dan langgan dengan menghantar ping; arahan kepada nod lain untuk menentukan sama ada ia berada di luar talian.
(2) Luar talian subjektif: Dalam tugas pengesanan degupan jantung yang dijadualkan, jika nod lain tidak membalas untuk tempoh masa tertentu, nod sentinel akan secara subjektif di luar talian. Seperti namanya, subjektif luar talian bermaksud bahawa nod sentinel "secara subjektif" menilai luar talian;
(3) Objektif luar talian: Selepas nod sentinel secara subjektif log keluar dari nod induk, ia akan bertanya nod sentinel lain tentang status nod induk melalui arahan sentinel is-master-down-by-addr; jika ia dinilai Apabila bilangan sentinel yang pergi ke luar talian pada nod induk mencapai nilai tertentu, nod induk akan secara objektif dibawa ke luar talian.
Adalah penting untuk ambil perhatian bahawa objektif luar talian adalah konsep hanya untuk nod induk jika nod hamba dan nod sentinel gagal, selepas berada di luar talian secara subjektif oleh sentinel, tidak akan ada objektif luar talian berikutnya; operasi talian dan failover.
(4) Pilih nod sentinel ketua: Apabila nod induk dinilai sebagai luar talian secara objektif, setiap nod sentinel akan berunding untuk memilih nod sentinel ketua, dan nod ketua akan Melakukan operasi failover.
Semua sentinel yang memantau nod induk boleh dipilih sebagai ketua Algoritma yang digunakan dalam pilihan raya ialah algoritma Raft adalah pertama datang, dilayan dahulu: iaitu, dalam satu pusingan pemilihan, Sentinel A Hantar permohonan untuk menjadi ketua kepada B. Jika B tidak bersetuju dengan sentinel lain, ia akan bersetuju untuk A menjadi ketua. Proses pemilihan khusus tidak akan diterangkan secara terperinci di sini Secara umumnya, proses pemilihan sentinel adalah sangat cepat Sesiapa yang menyelesaikan objektif secara luar talian secara amnya akan menjadi ketua.
(5) Failover: Sentinel ketua yang dipilih memulakan operasi failover, yang boleh dibahagikan secara kasar kepada 3 langkah:
(1) sentinel monitor {masterName} {masterIp} {masterPort} {quorum}
Monitor sentinel ialah konfigurasi teras sentinel Ia telah diterangkan sebelum ini semasa menggunakan nod sentinel Antaranya: masterName menentukan nama nod induk, masterIp dan masterPort menentukan alamat nod induk, dan kuorum ialah sentinel. menentukan objektif luar talian nod induk ambang kuantiti: Apabila bilangan sentinel yang menentukan bahawa nod induk berada di luar talian mencapai kuorum, nod induk akan berada di luar talian secara objektif. Nilai yang disyorkan ialah separuh daripada bilangan pengawal ditambah 1.
(2) sentinel turun-selepas-milisaat {masterName} {masa}
sentinel turun-selepas-milisaat berkaitan dengan pertimbangan subjektif luar talian: sentinel menggunakan perintah ping untuk melaksanakan degupan jantung pada Pengesanan nod lain, jika nod lain tidak membalas selepas masa yang dikonfigurasikan oleh turun-selepas-milisaat, Sentinel akan secara subjektif membawanya ke luar talian. Konfigurasi ini sah untuk penentuan luar talian subjektif nod induk, nod hamba dan nod sentinel.
Nilai lalai bagi turun-selepas-milisaat ialah 30000, iaitu 30s; ia boleh dilaraskan mengikut persekitaran rangkaian dan keperluan aplikasi yang berbeza: semakin besar nilainya, semakin longgar pertimbangan subjektif luar talian, kelebihannya; adalah salah pertimbangan Kemungkinan kecil, tetapi kelemahannya ialah masa untuk penemuan kesalahan dan failover akan menjadi lebih lama, dan masa menunggu pelanggan juga akan menjadi lebih lama. Sebagai contoh, jika aplikasi mempunyai keperluan ketersediaan yang tinggi, nilai boleh dikurangkan dengan sewajarnya untuk menyelesaikan pemindahan secepat mungkin apabila kegagalan berlaku jika persekitaran rangkaian agak lemah, ambang boleh ditingkatkan dengan sewajarnya untuk mengelakkan kesilapan yang kerap berlaku;
(3) sentinel parallel-syncs {masterName} {number}
sentinel parallel-syncs berkaitan dengan replikasi nod hamba selepas failover: ia menyatakan bahawa setiap kali ia dimulakan untuk nod induk baharu Bilangan nod hamba untuk operasi replikasi. Sebagai contoh, anggap bahawa selepas suis nod induk selesai, 3 nod hamba ingin memulakan replikasi ke nod induk baharu jika selari-segerak=1, nod hamba akan mula mereplikasi satu demi satu jika selari-segerak=3; kemudian 3 nod hamba Nod akan mula mereplikasi bersama.
Semakin besar nilai penyegerakan selari, semakin cepat nod hamba menyelesaikan replikasi, tetapi semakin besar tekanan pada beban rangkaian dan beban cakera keras nod induk ia harus ditetapkan mengikut kepada keadaan sebenar. Contohnya, jika beban pada nod induk adalah rendah dan nod hamba mempunyai keperluan ketersediaan perkhidmatan yang tinggi, anda boleh meningkatkan nilai penyegerakan selari dengan sewajarnya. Nilai lalai untuk penyegerakan selari ialah 1.
(4) sentinel failover-timeout {masterName} {time}
sentinel failover-timeout adalah berkaitan dengan penghakiman failover timeout, tetapi parameter ini tidak digunakan untuk menilai tamat masa keseluruhan fasa failover , tetapi tamat masa beberapa sub-peringkatnya, contohnya, jika masa untuk nod induk mempromosikan nod hamba melebihi masa, atau masa untuk nod hamba memulakan operasi replikasi kepada induk baharu. nod (tidak termasuk masa untuk menyalin data) melebihi tamat masa, ia akan menyebabkan tamat masa failover gagal.
Nilai lalai failover-timeout ialah 180000, iaitu 180s jika tamat masa, nilai akan menjadi dua kali ganda nilai asal pada masa akan datang.
(5) Selain parameter di atas, terdapat beberapa parameter lain, seperti parameter yang berkaitan dengan pengesahan keselamatan, yang tidak akan diperkenalkan di sini.
(1) Bilangan nod sentinel harus lebih daripada satu, ia meningkatkan redundansi nod sentinel dan mengelakkan sentinel itu sendiri menjadi tinggi. - kesesakan ketersediaan; sebaliknya, ia mengurangkan bilangan nod sentinel. Tambahan pula, nod sentinel yang berbeza ini harus digunakan pada mesin fizikal yang berbeza.
(2) Bilangan nod sentinel hendaklah nombor ganjil untuk memudahkan pengawal membuat "keputusan" melalui pengundian: keputusan mengenai pemilihan pemimpin, keputusan di luar talian objektif, dsb.
(3) Konfigurasi setiap nod sentinel harus konsisten, termasuk perkakasan, parameter, dsb. di samping itu, semua nod harus menggunakan ntp atau perkhidmatan yang serupa untuk memastikan masa yang tepat dan konsisten.
(4) Pembekal konfigurasi Sentinel dan fungsi klien pemberitahuan memerlukan sokongan pelanggan, seperti Jedis yang dinyatakan di atas jika perpustakaan yang digunakan oleh pembangun tidak memberikan sokongan yang sepadan, pembangun mungkin perlu Melaksanakannya sendiri.
(5) Apabila nod dalam sistem Sentinel digunakan dalam docker (atau perisian lain yang mungkin melakukan pemetaan port), perhatian khusus harus diberikan kepada fakta bahawa pemetaan port boleh menyebabkan sistem Sentinel tidak berfungsi dengan betul, kerana kerja Sentinel adalah berdasarkan Komunikasi dengan nod lain, dan pemetaan port docker boleh menyebabkan Sentinel tidak dapat menyambung ke nod lain. Sebagai contoh, penemuan antara satu sama lain oleh sentinel bergantung pada IP dan port yang mereka isytiharkan kepada dunia luar Jika sentinel A digunakan dalam docker dengan pemetaan port, sentinel lain tidak boleh menyambung ke A menggunakan port yang diisytiharkan oleh A.
Artikel ini mula-mula memperkenalkan peranan Sentinel: pemantauan, failover, pembekal konfigurasi dan pemberitahuan, kemudian ia menerangkan kaedah penggunaan sistem Sentinel dan mengakses sistem Sentinel melalui kaedah klien; kemudian menerangkan secara ringkas prinsip asas pelaksanaan sentinel dan akhirnya memberikan beberapa cadangan tentang amalan sentinel.
Berdasarkan replikasi tuan-hamba, Sentinel memperkenalkan failover automatik nod induk, meningkatkan lagi ketersediaan Redis yang tinggi, bagaimanapun, kelemahan Sentinel juga jelas: Sentinel tidak boleh melakukan kegagalan automatik nod hamba senario pemisahan baca-tulis, kegagalan nod hamba akan menyebabkan perkhidmatan baca tidak tersedia, memerlukan kami melakukan operasi pemantauan dan penukaran tambahan pada nod hamba.
Selain itu, Sentinel masih belum menyelesaikan masalah bahawa operasi tulis tidak boleh diseimbangkan beban dan kapasiti storan dihadkan oleh satu mesin penyelesaian kepada masalah ini memerlukan penggunaan kluster, yang akan saya perkenalkan; artikel kemudian.
Pembelajaran yang disyorkan: "Tutorial video Redis", "Soalan dan jawapan temuduga redis terkini 2022"
Atas ialah kandungan terperinci Sentinel Ketersediaan Tinggi Pembelajaran Lanjutan Redis (Perkongsian Ringkasan). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!