Rumah > Artikel > pangkalan data > Apakah kluster? Mengapa Kluster diperlukan di Redis?
Apakah Kluster? Mengapa Kluster diperlukan di Redis? Artikel ini akan membawa anda untuk mengetahui lebih lanjut tentang kluster dan bercakap tentang jumlah data yang boleh disokong oleh kluster. Saya harap ia akan membantu anda!
Artikel ini akan memberikan pembongkaran yang mendalam tentang pelbagai aspek kluster seperti nod, penetapan slot, pelaksanaan perintah, pemecahan semula, stereng, failover, mesej, dll. [Cadangan berkaitan: Tutorial video Redis]
Tujuannya adalah untuk menguasai apa itu Kluster? Prinsip perpecahan kluster, prinsip data kedudukan pelanggan, failover, pemilihan induk, senario yang hendak digunakan Kluster, cara menggunakan kluster... [toc]
65 Abang: Abang Ma, sejak saya menggunakan Kluster Sentinel yang anda nyatakan untuk merealisasikan failover automatik, saya akhirnya Anda boleh bergembiralah dengan teman wanita anda tanpa perlu risau tentang Redis terhempas larut malam.
Tetapi baru-baru ini saya menghadapi masalah yang teruk Redis perlu menyimpan 8 juta pasangan nilai kunci, yang menduduki 20 GB memori.
Saya menggunakan hos memori 32G untuk penggunaan, tetapi tindak balas Redis kadangkala sangat perlahan. Saya menggunakan arahan INFO untuk menyemak penunjuk latest_fork_usec (fork terkini mengambil masa) dan mendapati ia sangat tinggi.
Terutamanya disebabkan oleh mekanisme kegigihan RDB Redis akan Membatalkan proses anak untuk menyelesaikan operasi kegigihan RDB. Masa yang diambil untuk pelaksanaan garpu adalah berkaitan secara positif dengan jumlah data Redis.
Apabila Fork dilaksanakan, ia akan menyekat utas utama Disebabkan jumlah data yang banyak, utas utama disekat terlalu lama, jadi Redis bertindak balas dengan perlahan.
65 Saudara: Dengan pengembangan skala perniagaan, jumlah data semakin besar dan lebih besar. Sukar untuk mengembangkan perkakasan satu contoh apabila menaik taraf seni bina tuan-hamba, dan menyimpan sejumlah besar data akan menyebabkan tindak balas yang perlahan Adakah terdapat sebarang cara untuk menyelesaikannya?
Untuk menyimpan sejumlah besar data, selain menggunakan hos memori yang besar, kami juga boleh menggunakan gugusan penghirisan. Seperti kata pepatah, "Apa yang semua orang tambahkan menjadikan api lebih cerah jika satu mesin tidak dapat menyimpan semua data, maka beberapa mesin mesti berkongsinya."
Menggunakan Redis Cluster terutamanya menyelesaikan pelbagai masalah kelambatan yang disebabkan oleh storan data yang besar, dan juga memudahkan pengembangan mendatar.
Kedua-dua penyelesaian sepadan dengan dua penyelesaian pengembangan untuk peningkatan dalam data Redis: pengembangan menegak (meningkatkan skala) dan pengembangan mendatar (mengecilkan skala).
Sebagai contoh, jika anda memerlukan sumber pelayan dengan 24 GB memori dan 150 GB cakera, terdapat dua pilihan:
Dalam kes berjuta-juta, apabila skala pengguna ialah berpuluh-puluh juta, gugusan penghirisan Redis boleh skala mendatar akan menjadi pilihan yang sangat baik.
65 Abang: Apakah kelebihan dan kekurangan kedua-dua pilihan ini?
Kluster Redis ialah penyelesaian pangkalan data teragih Kluster menguruskan data melalui sharding (amalan "membahagikan dan menakluki pemikiran"), dan menyediakan keupayaan replikasi dan failover. .
Bahagikan data kepada 16384 slot, dan setiap nod bertanggungjawab untuk sebahagian daripada slot. Maklumat slot disimpan dalam setiap nod.
Ia terpencar Seperti yang ditunjukkan dalam rajah, kluster terdiri daripada tiga nod Redis Setiap nod bertanggungjawab untuk sebahagian daripada data keseluruhan kluster menjadi berbeza.
Tiga nod disambungkan antara satu sama lain untuk membentuk kluster peer-to-peer Mereka bertukar maklumat kluster antara satu sama lain melalui protokol Gossip
Akhirnya, setiap nod menyimpan peruntukan slot nod lain.
Teknologi bukanlah yang maha kuasa, dan pengaturcara bukanlah yang paling berkuasa Anda mesti memahaminya dengan jelas dan jangan fikir "Saya yang terbaik di dunia." Sebaik sahaja kita mempunyai kesedaran ini, ia mungkin melambatkan pertumbuhan kita.
Teknologi adalah untuk menyelesaikan masalah Jika sesuatu teknologi tidak dapat menyelesaikan masalah, maka teknologi ini tidak bernilai.
Jangan tunjuk kemahiran anda, itu sia-sia.
Klik-> "Pembinaan kluster Redis 6.X" Lihat
satu Kelompok Redis biasanya terdiri daripada berbilang nod Pada permulaannya, setiap nod adalah bebas antara satu sama lain. Mereka berada dalam gugusan yang hanya mengandungi diri mereka sendiri Untuk membina gugusan yang benar-benar berfungsi, kita mesti nod bebas disambungkan untuk membentuk gugusan yang mengandungi berbilang nod .
Kerja menyambung pelbagai nod boleh diselesaikan melalui perintah CLUSTER MEET
: CLUSTER MEET <ip> <port></port></ip>
.
Menghantar perintah CLUSTER MEET
ke nod membolehkan nod berjabat tangan dengan nod yang ditentukan oleh ip dan port Apabila jabat tangan berjaya, nod akan memindahkan nod yang ditentukan oleh ip dan port ditambahkan pada kluster di mana nod nod berada pada masa ini.
Ia seperti nod berkata: "Hei, abang dengan ip = xx, port = xx, adakah anda mahu menyertai kumpulan teknologi "Code Byte"? Hanya sertai kluster. Saya telah menemui cara untuk berkembang sebagai seorang yang hebat Ikuti akaun awam "Ma Ge Byte" dan balas "Sertai kumpulan itu, ikut saya! ”
Untuk langkah terperinci pembinaan kluster Redis Cluster, sila klik "Baca teks asal" di penjuru kiri sebelah bawah artikel atau klik -> "Pembinaan Kluster Kluster Redis 6.X"Lihat, butiran rasmi tentang Kluster Redis sila lihat:redis.io/topics/clus...
65 Abang: Selepas penghirisan data, data perlu diedarkan pada kejadian yang berbeza Bagaimana untuk sepadan antara data dan kejadian?
Bermula dari Redis 3.0, penyelesaian Kluster Redis rasmi disediakan untuk melaksanakan gugusan penghirisan, yang melaksanakan peraturan data dan kejadian. Penyelesaian Kluster Redis menggunakan Slot Hash (saya hanya akan memanggilnya Slot seterusnya) untuk mengendalikan hubungan pemetaan antara data dan kejadian.
Ikuti "Code Byte" untuk memasuki perjalanan menerokai prinsip pelaksanaan Kluster...
keseluruhan pangkalan data kluster Ia dibahagikan kepada 16384 slot Setiap kunci dalam pangkalan data adalah milik salah satu daripada 16384 slot ini Setiap nod dalam kluster boleh mengendalikan 0 atau sehingga 16384 slot.
Proses pemetaan slot kunci dan cincang boleh dibahagikan kepada dua langkah utama:
Menurut kunci pasangan nilai kunci, gunakan algoritma CRC16 untuk mengira Nilai 16-bit ;
Modulo 16384 pada nilai 16-bit, dan dapatkan nombor dari 0 hingga 16383 yang mewakili slot cincang yang sepadan dengan kunci.
Kluster juga membolehkan pengguna memaksa kunci untuk digantung dalam slot tertentu Dengan membenamkan tag teg dalam rentetan kunci, ini boleh memaksa kunci untuk digantung dalam slot yang sama dengan tag. Slot di mana ia berada.
65 Abang: Bagaimanakah slot cincang dipetakan kepada tika Redis?
Dicipta melalui dalam sampel gugusan penempatancluster create
, Redis akan mengedarkan 16384 slot cincang secara automatik pada contoh gugusan, seperti nod N, pada setiap nod Bilangan slot cincang = 16384 / N.
Selain itu, tiga nod 7000, 7001 dan 7002 boleh disambungkan kepada gugusan melalui perintah CLUSTER MEET
, tetapi gugusan itu masih di luar talian kerana tiada satu pun daripada tiga kejadian memproses sebarang alur.
Anda boleh menggunakan perintah cluster addslots
untuk menentukan bilangan slot cincang pada setiap kejadian.
65 Abang: Kenapa awak perlu merumuskannya secara manual?
Dia yang boleh melakukannya harus melakukan lebih banyak kerja Konfigurasi contoh Redis yang ditambahkan pada kluster adalah berbeza mesin berkuasa menyokong lebih banyak.
Untuk sekumpulan tiga kejadian, peruntukkan slot cincang kepada setiap tika melalui arahan berikut: 实例 1
bertanggungjawab untuk 0 ~ 5460 slot cincang, 实例 2
bertanggungjawab untuk 5461~10922 slot cincang, 实例 3
Bertanggungjawab untuk slot cincang 10923 ~ 16383.
redis-cli -h 172.16.19.1 –p 6379 cluster addslots 0,5460 redis-cli -h 172.16.19.2 –p 6379 cluster addslots 5461,10922 redis-cli -h 172.16.19.3 –p 6379 cluster addslots 10923,16383
Hubungan pemetaan antara data pasangan nilai kunci, slot cincang dan kejadian Redis adalah seperti berikut:
Kod kunci kunci Redis- pasangan nilai Selepas pengiraan CRC16, jumlah bilangan slot cincang 16394 diambil modulo, dan hasil modulus masing-masing dipetakan kepada contoh 1 dan contoh 2.
Ingat, bahawa gugusan Redis boleh berfungsi seperti biasa hanya apabila semua 16384 slot diperuntukkan sepenuhnya.
65 Abang: Bagaimanakah kluster Redis mencapai ketersediaan tinggi? Adakah Tuan dan Hamba masih terpisah daripada membaca dan menulis?
Induk digunakan untuk memproses slot dan nod Hamba menyegerakkan data nod induk melalui kaedah "Penyegerakan data seni bina induk-hamba Redis ".
Apabila Master berada di luar talian, Slave terus memproses permintaan bagi pihak nod Master. Tiada pemisahan baca-tulis antara nod induk dan hamba, dan Hamba hanya digunakan sebagai sandaran ketersediaan tinggi untuk kegagalan Master.
Kluster Redis boleh menyediakan beberapa nod hamba untuk setiap nod induk Apabila satu nod induk gagal, gugusan akan secara automatik mempromosikan salah satu nod hamba kepada nod induk.
Jika nod induk tidak mempunyai nod hamba, maka apabila ia gagal, gugusan akan tidak tersedia sepenuhnya.
Walau bagaimanapun, Redis juga menyediakan parameter cluster-require-full-coverage
yang membenarkan beberapa nod gagal dan nod lain boleh terus menyediakan akses luaran.
Sebagai contoh, jika nod induk 7000 turun, hamba 7003 menjadi nod induk dan terus menyediakan perkhidmatan. Apabila nod luar talian 7000 kembali dalam talian, ia akan menjadi nod hamba 70003 semasa.
Hanya kerana nod berpendapat bahawa nod tertentu terputus sambungan tidak bermakna semua nod menganggapnya terputus. Hanya apabila kebanyakan nod yang bertanggungjawab untuk memproses slot menentukan bahawa nod berada di luar talian, kluster akan menganggap bahawa nod perlu melakukan suis induk-hamba. Nod kluster Redis menggunakan protokol65 Abang: Dalam "Ketersediaan Tinggi Redis: Prinsip Kluster Sentinel" Saya tahu bahawa Sentinel menukar pangkalan data utama secara automatik melalui pemantauan, pemberitahuan pelanggan melaksanakan failover automatik.
Cluster
untuk menyiarkan status dan perubahan dalam pengetahuan mereka tentang keseluruhan kluster. Contohnya, jika nod mendapati bahawa nod tertentu hilang (PFail), ia akan menyiarkan maklumat ini ke seluruh kluster dan nod lain juga boleh menerima maklumat sambungan yang hilang ini. Gossip
, anda boleh membaca artikel oleh Saudara Wukong: "Gossip
Pencerobohan virus, semuanya bergantung pada pengedaran"
Apabila seorang Hamba mendapati bahawa nod induknya telah memasuki keadaan luar talian, nod hamba akan mula gagal di atas nod induk luar talian.
Pilih nod daripada senarai nod Master dan nod Slave luar talian untuk menjadi nod induk baharu.
Nod induk baharu akan membatalkan semua penetapan slot kepada nod induk luar talian dan menetapkan slot ini kepada dirinya sendiri.
Nod induk baharu menyiarkan mesej PONG kepada gugusan Mesej PONG ini membenarkan nod lain dalam gugusan untuk mengetahui dengan segera bahawa nod ini telah berubah daripada nod hamba kepada nod induk. dan ini Nod induk telah mengambil alih slot yang asalnya dikendalikan oleh nod luar talian.
Nod induk baharu mula menerima permintaan arahan yang berkaitan dengan slot pemprosesan dan failover selesai.
65 Abang: Bagaimanakah nod induk baharu dipilih?
Epok konfigurasi 1 gugusan ialah pembilang kendiri dengan nilai awal 0 dan akan ditetapkan kepada 1 setiap kali failover dilakukan.
Nod hamba yang mengesan bahawa nod induk berada di luar talian menyiarkan mesej CLUSTERMSG_TYPE_FAILOVER_AUTH_REQUEST
kepada gugusan, memerlukan semua nod induk yang menerima mesej ini dan mempunyai hak mengundi untuk mengundi hamba ini nod .
Nod induk ini belum lagi mengundi nod hamba yang lain, maka nod induk akan mengembalikan mesej CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK
kepada nod hamba yang meminta undian, menunjukkan bahawa nod induk ini menyokong hamba nod untuk menjadi nod induk baharu.
Semua nod hamba yang mengambil bahagian dalam pilihan raya akan menerima mesej CLUSTERMSG_TYPE_FAILOVER_AUTH_ACK
Jika undian yang dikumpul >= (N/2) 1 menyokong, maka nod hamba akan dipilih sebagai. nod induk baharu.
Jika tiada nod hamba dapat mengumpul undi sokongan yang mencukupi dalam era konfigurasi, gugusan memasuki era konfigurasi baharu dan pemilihan diadakan semula sehingga induk baharu dipilih sehingga nod.
Sama seperti Sentinel, kedua-duanya dilaksanakan berdasarkan algoritma Raft Prosesnya adalah seperti yang ditunjukkan dalam rajah:
65 Saudara, izinkan saya menguji anda: "Penyelesaian Redis Cluster memperuntukkan pasangan nilai kunci kepada kejadian yang berbeza melalui slot cincang. Proses ini memerlukan pengiraan CRC pada kunci pasangan nilai kunci dan memetakannya ke modulo contoh jumlah slot cincang Jika jadual digunakan untuk merekodkan secara langsung surat-menyurat antara pasangan nilai kunci dan contoh (contohnya , pasangan kunci-nilai 1 adalah dalam contoh 2). lakukan ini? ”
Jika rekod jadual global digunakan, jika hubungan antara pasangan nilai kunci dan kejadian berubah (pembahagian semula, penambahan atau pemadaman contoh), jadual perlu diubah suai. Jika ia adalah operasi satu-benang, semua operasi mesti bersiri dan prestasi akan menjadi terlalu perlahan.
Berbilang benang melibatkan penguncian Selain itu, jika jumlah data pasangan nilai kunci adalah sangat besar, ruang storan yang diperlukan untuk menyimpan data jadual hubungan antara pasangan nilai kunci dan kejadian juga akan menjadi. sangat besar.
Bagi pengiraan slot cincang, walaupun hubungan antara slot cincang dan masa contoh mesti direkodkan, bilangan slot cincang adalah jauh lebih kecil, hanya 16384, dan overhed adalah sangat kecil.
65 Saudara: Bagaimanakah klien menentukan contoh data yang diakses diedarkan?
Tokok Redis akan menghantar maklumat slot cincangnya kepada kejadian lain dalam kelompok melalui protokol Gossip, merealisasikan penyebaran maklumat peruntukan slot cincang.
Dengan cara ini, setiap tika dalam kelompok mempunyai maklumat perhubungan pemetaan antara semua slot cincang dan tika.
Apabila menghiris data, kunci dikira sebagai nilai melalui CRC16 dan kemudian modulo 16384 untuk mendapatkan Slot yang sepadan Tugas pengiraan ini boleh dilakukan pada klien semasa menghantar permintaan.
Walau bagaimanapun, selepas mengesan slot, anda perlu mencari lebih jauh contoh Redis di mana slot itu berada.
Apabila pelanggan menyambung ke mana-mana kejadian, tika itu bertindak balas kepada pelanggan dengan hubungan pemetaan antara slot cincang dan tika itu, dan pelanggan menyimpan cache slot cincang dan maklumat pemetaan tika secara setempat.
Apabila pelanggan membuat permintaan, slot cincang yang sepadan dengan kunci akan dikira, maklumat pemetaan contoh slot cincang dalam cache tempatan digunakan untuk mencari contoh di mana data terletak, dan kemudian permintaan dihantar ke contoh yang sepadan.
65 Brother: Hubungan pemetaan antara slot cincang dan kejadian diedarkan semula disebabkan kejadian baharu atau pengimbangan beban. Apakah yang perlu saya lakukan sekiranya peruntukan berubah?
集群中的实例通过 Gossip 协议互相传递消息获取最新的哈希槽分配信息,但是,客户端无法感知。
Redis Cluster 提供了重定向机制:客户端将请求发送到实例上,这个实例没有相应的数据,该 Redis 实例会告诉客户端将请求发送到其他的实例上。
65 哥:Redis 如何告知客户端重定向访问新实例呢?
分为两种情况:MOVED 错误、ASK 错误。
MOVED 错误(负载均衡,数据已经迁移到其他实例上):当客户端将一个键值对操作请求发送给某个实例,而这个键所在的槽并非由自己负责的时候,该实例会返回一个 MOVED 错误指引转向正在负责该槽的节点。
GET 公众号:码哥字节 (error) MOVED 16330 172.17.18.2:6379
该响应表示客户端请求的键值对所在的哈希槽 16330 迁移到了 172.17.18.2 这个实例上,端口是 6379。这样客户端就与 172.17.18.2:6379 建立连接,并发送 GET 请求。
同时,客户端还会更新本地缓存,将该 slot 与 Redis 实例对应关系更新正确。
65 哥:如果某个 slot 的数据比较多,部分迁移到新实例,还有一部分没有迁移咋办?
如果请求的 key 在当前节点找到就直接执行命令,否则时候就需要 ASK 错误响应了,槽部分迁移未完成的情况下,如果需要访问的 key 所在 Slot 正在从从 实例 1 迁移到 实例 2,实例 1 会返回客户端一条 ASK 报错信息:客户端请求的 key 所在的哈希槽正在迁移到实例 2 上,你先给实例 2 发送一个 ASKING 命令,接着发发送操作命令。
GET 公众号:码哥字节 (error) ASK 16330 172.17.18.2:6379
比如客户端请求定位到 key = 「公众号:码哥字节」的槽 16330 在实例 172.17.18.1 上,节点 1 如果找得到就直接执行命令,否则响应 ASK 错误信息,并指引客户端转向正在迁移的目标节点 172.17.18.2。
注意:ASK 错误指令并不会更新客户端缓存的哈希槽分配信息。
所以客户端再次请求 Slot 16330 的数据,还是会先给 172.17.18.1
实例发送请求,只不过节点会响应 ASK 命令让客户端给新实例发送一次请求。
MOVED
指令则更新客户端本地缓存,让后续指令都发往新实例。
65 哥:有了 Redis Cluster,再也不怕大数据量了,我可以无限水平拓展么?
答案是否定的,Redis 官方给的 Redis Cluster 的规模上线是 1000 个实例。
65 哥:到底是什么限制了集群规模呢?
关键在于实例间的通信开销,Cluster 集群中的每个实例都保存所有哈希槽与实例对应关系信息(Slot 映射到节点的表),以及自身的状态信息。
在集群之间每个实例通过 Gossip
协议传播节点的数据,Gossip
协议工作原理大概如下:
PING
消息发送给挑选出来的实例,用于检测实例状态以及交换彼此的信息。 PING
消息中封装了发送者自身的状态信息、部分其他实例的状态信息、Slot 与实例映射表信息。PING
消息后,响应 PONG
消息,消息包含的信息跟 PING
消息一样。集群之间通过 Gossip
协议可以在一段时间之后每个实例都能获取其他所有实例的状态信息。
所以在有新节点加入,节点故障,Slot 映射变更都可以通过 PING
,PONG
的消息传播完成集群状态在每个实例的传播同步。
发送的消息结构是 clusterMsgDataGossip
结构体组成:
typedef struct { char nodename[CLUSTER_NAMELEN]; //40字节 uint32_t ping_sent; //4字节 uint32_t pong_received; //4字节 char ip[NET_IP_STR_LEN]; //46字节 uint16_t port; //2字节 uint16_t cport; //2字节 uint16_t flags; //2字节 uint32_t notused1; //4字节 } clusterMsgDataGossip;
所以每个实例发送一个 Gossip
消息,就需要发送 104 字节。如果集群是 1000 个实例,那么每个实例发送一个 PING
消息则会占用 大约 10KB。
除此之外,实例间在传播 Slot 映射表的时候,每个消息还包含了 一个长度为 16384 bit 的 Bitmap
。
Setiap bit sepadan dengan Slot Jika nilai = 1, ini bermakna Slot ini tergolong dalam contoh semasa ini menduduki 2KB, jadi mesej PING
adalah kira-kira 12KB.
PONG
adalah sama dengan mesej PING
Jumlah dua mesej yang dihantar dan dikembalikan ialah 24 KB. Apabila saiz kluster meningkat, lebih banyak mesej degupan jantung akan menduduki lebar jalur komunikasi rangkaian kluster dan mengurangkan daya pemprosesan kluster.
65 Abang: Abang Ma, kekerapan menghantar mesej PING juga akan mempengaruhi lebar jalur kelompok, bukan?
Selepas tika Kluster Redis dimulakan, 5 tika akan dipilih secara rawak daripada senarai tika tempatan setiap saat secara lalai, dan kemudian satu daripada 5 tika itu akan ditemui yang belum menerima mesej PING untuk masa yang paling lama, dan hantar mesej PING ke contoh.
65 Abang: Pilih 5 secara rawak, tetapi tiada jaminan bahawa tika yang dipilih akan menjadi tika yang paling lama tidak menerima komunikasi PING dalam keseluruhan gugusan mesej itu, mengakibatkan kluster yang mereka kekalkan Maklumat telah tamat tempoh lama dahulu, apakah yang perlu saya lakukan?
Ini ialah soalan yang baik Redis Cluster akan mengimbas senarai tika setempat setiap 100 ms Apabila tika ditemui, masa terakhir menerima mesej PONG
ialah > >. Kemudian segera hantar mesej cluster-node-timeout / 2
kepada kejadian ini untuk mengemas kini maklumat status kelompok nod ini. PING
PING
PONG
setiap 100 ms Ini ialah kekerapan tugas pengesanan berkala lalai bagi tika Redis, dan kami tidak akan mengubahnya dengan mudah. cluster-node-timeout / 2
: masa degupan jantung dalam kelompok untuk menentukan sama ada tika itu rosak, lalainya ialah 15 S. cluster-node-timeout
untuk mengelakkan terlalu banyak mesej degupan jantung yang menduduki lebar jalur kelompok, laraskan kepada 20 saat atau 30 saat, supaya cluster-node-timeout
tamat masa penerimaan mesej akan dikurangkan. PONG
untuk mengesan kegagalan, yang akan menjejaskan perkhidmatan biasa kelompok itu. pelaksanaan Failover automatik cluster-node-timeout
, tetapi apabila jumlah data terlalu besar, ia mengambil masa terlalu lama untuk menjana RDB. Apabila Fork dilaksanakan, utas utama akan disekat Oleh kerana jumlah data yang banyak, utas utama akan disekat terlalu lama, jadi Redis bertindak balas dengan perlahan.
Gossip
Atas ialah kandungan terperinci Apakah kluster? Mengapa Kluster diperlukan di Redis?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!