0×01 Kata Pengantar
Redis ialah pangkalan data Nilai Kunci jenis log sumber terbuka yang ditulis dalam bahasa ANSI C, menyokong rangkaian, boleh berasaskan memori dan berterusan serta menyediakan API dalam berbilang bahasa.
Kini, data perniagaan Internet berkembang pada kadar yang lebih pantas, dan jenis data menjadi semakin banyak, yang mengemukakan keperluan yang lebih tinggi untuk kelajuan dan keupayaan pemprosesan data. Redis ialah pangkalan data bukan perkaitan dalam ingatan sumber terbuka yang membawa pengalaman yang mengganggu kepada pembangun. Direka dari awal hingga akhir dengan mengambil kira prestasi tinggi, Redis ialah pangkalan data NoSQL terpantas yang tersedia hari ini.
Sambil mempertimbangkan prestasi tinggi, ketersediaan tinggi juga merupakan pertimbangan penting. Internet menyediakan perkhidmatan tanpa gangguan 7×24 dan Failover pada kelajuan terpantas semasa kegagalan, yang boleh membawa kerugian minimum kepada perusahaan.
Jadi, apakah seni bina ketersediaan tinggi dalam aplikasi praktikal? Apakah kebaikan dan keburukan antara seni bina? Bagaimana kita harus memilih? Apakah beberapa amalan terbaik?
0×02 Prinsip Sentinel
Sebelum menerangkan penyelesaian ketersediaan tinggi Redis, mari kita lihat dahulu prinsip Redis Sentinel.
- Kluster Sentinel menemui induk melalui fail konfigurasi yang diberikan dan memantau induk apabila ia bermula. Dapatkan semua pelayan hamba di bawah pelayan ini dengan menghantar maklumat maklumat kepada tuan.
- Kluster Sentinel menghantar maklumat helo (sekali sesaat) kepada pelayan induk dan hamba yang dipantau melalui sambungan arahan Maklumat ini termasuk IP, port, id, dsb. Sentinel sendiri, untuk mengumumkan kewujudannya kepada Sentinel lain.
- Kluster Sentinel menerima maklumat helo yang dihantar oleh Sentinel lain melalui sambungan langganan untuk menemui Sentinel lain yang memantau pelayan induk yang sama akan membuat sambungan arahan antara satu sama lain untuk komunikasi, kerana sudah ada pelayan tuan-hamba yang menghantar dan menerima helo Tiada langganan; sambungan dibuat antara Sentinel dan Sentinel.
- Kluster Sentinel menggunakan perintah ping untuk mengesan status tika itu Jika tiada balasan dalam masa yang ditentukan (turun selepas milisaat) atau balasan yang salah dikembalikan, tika itu dinilai sebagai di luar talian.
- Apabila suis failover aktif/siap sedia dicetuskan, failover tidak akan meneruskan serta-merta Ia juga memerlukan kebenaran majoriti Sentinel dalam Sentinel sebelum failover boleh dijalankan, iaitu, Sentinel yang melakukan failover akan dapatkan kebenaran kuorum Sentinels yang ditetapkan Selepas berjaya, Masukkan keadaan ODOWN. Sebagai contoh, jika 2 korum dikonfigurasikan antara 5 Penjaga, failover akan dilaksanakan apabila 2 Penjaga menganggap bahawa tuan sudah mati.
- Sentinel menghantar arahan SLAVEOF NO ONE kepada hamba yang dipilih sebagai tuan. Jika keutamaan adalah sama, semak subskrip replikasi, mana-mana yang menerima lebih banyak data replikasi daripada induk akan diletakkan pada kedudukan pertama. Jika keutamaan dan indeks adalah sama, yang mempunyai ID proses yang lebih kecil akan dipilih.
- Selepas Sentinel diberi kuasa, ia akan memperoleh nombor versi konfigurasi terkini (zaman konfigurasi) induk yang gagal Apabila pelaksanaan failover selesai, nombor versi ini akan digunakan untuk konfigurasi terkini dan memberitahu orang lain melalui siaran Sentinel, Sentinel lain. kemas kini konfigurasi induk yang sepadan.
1 hingga 3 ialah mekanisme penemuan automatik:
- Hantar arahan info kepada induk yang dipantau setiap 10 saat dan dapatkan maklumat induk semasa berdasarkan balasan.
- Hantar arahan PING ke semua pelayan redis, termasuk Sentinel, pada kekerapan 1 saat dan tentukan sama ada pelayan dalam talian melalui balasan.
- Hantar mesej maklumat induk Sentinel semasa kepada semua pelayan induk dan hamba yang dipantau pada kekerapan 2 saat.
4 ialah mekanisme pengesanan, 5 dan 6 ialah mekanisme failover, dan 7 ialah mekanisme konfigurasi kemas kini. [1]
0×03 Redis seni bina ketersediaan tinggi
Setelah menerangkan prinsip Redis Sentinel, mari terangkan Seni bina ketersediaan tinggi Redis yang biasa digunakan.
- Kluster Redis Sentinel + DNS intranet + skrip tersuai
- Kluster Redis Sentinel + VIP + Skrip Tersuai
- Enkapsulasi klien untuk menyambung terus ke port Redis Sentinel
- JedisSentinelPool, sesuai untuk Java
- PHP dibungkus sendiri berdasarkan phpredis
- Kluster Redis Sentinel + Keepalived/Haproxy
- Redis M/S + Keepalived
- Kluster Redis
- Twemproxy
- Codis
Berikut akan diterangkan satu persatu dengan gambar dan teks.
3.1 Kluster Sentinel Redis + DNS Intranet + Skrip Tersuai
Gambar di atas adalah penyelesaian yang telah digunakan dalam persekitaran dalam talian. Lapisan bawah ialah gugusan Redis Sentinel, yang bertindak sebagai ejen untuk induk dan hamba Redis Bahagian Web menyambung ke DNS intranet untuk menyediakan perkhidmatan. DNS Intranet diperuntukkan mengikut peraturan tertentu, seperti xxxx.redis.cache/queue.port.xxx.xxx Segmen pertama menunjukkan singkatan perniagaan, segmen kedua menunjukkan bahawa ini ialah nama domain intranet Redis dan. segmen ketiga Mewakili jenis Redis, cache mewakili cache, baris gilir mewakili baris gilir, segmen keempat mewakili port Redis, dan segmen kelima dan keenam mewakili nama domain utama intranet.
Apabila nod induk gagal, seperti kegagalan mesin, kegagalan nod Redis atau kebolehcapaian rangkaian, kelompok Sentinel akan memanggil skrip terkonfigurasi client-reconfig-script untuk mengubah suai nama domain intranet port yang sepadan. Nama domain intranet port yang sepadan menghala ke nod induk Redis baharu.
Kelebihan:
- Pensuisan peringkat kedua, selesaikan keseluruhan operasi pensuisan dalam masa 10s
- Penyesuaian skrip dan seni bina boleh dikawal
- Telus kepada aplikasi, bahagian hadapan tidak perlu risau tentang perubahan di bahagian belakang
Keburukan:
- Kos penyelenggaraan adalah tinggi sedikit Adalah disyorkan untuk melabur dalam lebih daripada 3 mesin untuk kelompok Redis Sentinel
- Bergantung pada DNS, terdapat kelewatan resolusi
- Perkhidmatan mod Sentinel tidak akan tersedia untuk tempoh masa yang singkat
- Penyelesaian ini tidak boleh digunakan jika perkhidmatan itu diakses melalui rangkaian luaran
3.2 Redis Sentinel Cluster + VIP + Skrip Tersuai
Pelan ini sedikit berbeza daripada yang sebelumnya. Penyelesaian pertama menggunakan DNS intranet, dan penyelesaian kedua menggantikan DNS intranet dengan IP maya. Lapisan bawah ialah kelompok Redis Sentinel, yang bertindak sebagai ejen untuk tuan dan hamba Redis, dan bahagian Web menyediakan perkhidmatan melalui VIP. Apabila menggunakan Redis master-slave, anda perlu mengikat IP maya ke nod induk Redis semasa. Apabila nod induk gagal, seperti kegagalan mesin, kegagalan nod Redis atau kebolehcapaian rangkaian, gugusan Sentinel akan memanggil skrip yang dikonfigurasikan oleh client-reconfig-script untuk mengapungkan VIP ke nod induk baharu.
Kelebihan:
- Pensuisan peringkat kedua, selesaikan keseluruhan operasi pensuisan dalam masa 5s
- Penyesuaian skrip dan seni bina boleh dikawal
- Telus kepada aplikasi, bahagian hadapan tidak perlu risau tentang perubahan di bahagian belakang
Keburukan:
- Kos penyelenggaraan adalah tinggi sedikit Adalah disyorkan untuk melabur dalam lebih daripada 3 mesin untuk kelompok Redis Sentinel
- Menggunakan VIP meningkatkan kos penyelenggaraan dan risiko IP huru-hara
- Perkhidmatan mod Sentinel tidak akan tersedia untuk tempoh masa yang singkat
3.3 Bungkus pelanggan untuk menyambung terus ke port Redis Sentinel
一部の企業は外部ネットワーク経由でのみ Redis にアクセスできるため、上記の 2 つのソリューションのどちらも利用できないため、このソリューションが派生しました。 Web は、クライアントを使用して Redis Sentinel クラスターのいずれかにあるマシンの特定のポートに接続し、このポートを通じて現在のマスター ノードを取得し、実際の Redis マスター ノードに接続して、対応するセールスマン操作を実行します。 Redis Sentinel ポートと Redis マスター ノードの両方にオープン アクセスが必要であることに注意することが重要です。フロントエンド ビジネスが Java を使用している場合は、JedisSentinelPool を再利用できます。フロントエンド ビジネスが PHP を使用している場合は、phpredis に基づいて二次カプセル化を実行できます。
利点:
- サービスは障害を迅速に検出します
- DBAのメンテナンスコストが低い
短所:
- クライアントサポート Sentinel に依存します
- Sentinel サーバーと Redis ノードにはオープン アクセスが必要です
- アプリケーションに侵入する
3.4 Redis Sentinel クラスター + Keepalived/Haproxy
最下層は Redis Sentinel クラスターで、Redis マスターとスレーブのエージェントとして機能し、Web 側は VIP を通じてサービスを提供します。マシン障害、Redis ノード障害、ネットワーク到達不能など、マスター ノードに障害が発生した場合、Redis 間の切り替えは Redis Sentinel の内部メカニズムによって保証され、VIP 切り替えは Keepalived によって保証されます。
利点:
短所:
- 維持費が高い
- 分裂した脳を持つ
- センチネルモードサービスは短期間利用できなくなります
3.5 Redis M/S + Keepalived
このソリューションは Redis Sentinel を使用しません。このソリューションでは、ネイティブのマスター/スレーブと Keepalived を使用し、Redis のマスター/スレーブ間の切り替えにはカスタム スクリプトが必要です。
利点:
- 数秒で切り替え
- アプリケーションに対して透過的
- 導入が簡単でメンテナンスコストが低い
短所:
- 切り替え機能を実装するにはスクリプトが必要です
- 分裂した脳を持つ
3.6 Redis クラスター
出典: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster
Redis 3.0.0 は 2 年以上前の 2015 年 4 月 2 日に正式にリリースされました。 Redis クラスターは P2P モードを採用しており、非集中型です。キーを 16384 個のスロットに分割し、各インスタンスがスロットの一部を担当します。クライアントが対応するデータを要求した場合、インスタンス スロットに対応するデータが存在しない場合、インスタンスは対応するインスタンスに転送されます。さらに、Redis クラスターは、Gossip プロトコルを通じてノード情報を同期します。
利点:
- コンポーネントはオールインボックスで、導入が簡単でマシンリソースを節約できます
- パフォーマンスはプロキシモードよりも優れています
- スロット移行中に自動フェイルオーバーとデータが利用可能
- 公式ネイティブ クラスター ソリューション、保証されたアップデートとサポート
短所:
- アーキテクチャは比較的新しく、ベストプラクティスはほとんどありません
- マルチキー操作のサポートは制限されています(ドライバーはカーブを通過して国を救うことができます)
- パフォーマンスを向上させるために、クライアントはルーティング テーブル情報をキャッシュする必要があります
- ノードの検出とリシャード操作は十分に自動化されていません
3.7 トゥエンプロキシ
出典: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster
複数の同型 Twemproxy (同じ構成) が同時に動作し、クライアントのリクエストを受け入れ、ハッシュ アルゴリズムに従って対応する Redis に転送します。
Twemproxy ソリューションは比較的成熟しています。私たちのチームはこのソリューションを長い間使用してきましたが、その効果はあまり満足のいくものではありません。一方で、位置決めの問題はより困難であり、他方では、ノードの自動削除のサポートはあまり親切ではありません。
利点:
- 開発が簡単で、アプリケーションに対してほぼ透過的です
- 長い歴史と成熟したソリューション
短所:
- プロキシはパフォーマンスに影響します
- LVS と Twemproxy にはノードのパフォーマンスのボトルネックがあります
- Redisの拡張がとても面倒
- Twitter は内部でのこのソリューションの使用を放棄しており、新しいアーキテクチャはオープンソースではありません
3.8 コディス
出典: https://github.com/CodisLabs/codis
Codis は Wandoujia によるオープンソース製品であり、多くのコンポーネントが含まれています。その中には、ZooKeeper がルーティング テーブルとプロキシ ノードのメタデータを保存し、Codis-Config を使用するための Web インターフェイスを備えた統合管理ツールです。プロキシは、Redis プロトコルと互換性のあるステートレス プロキシです。Codis-Redis は、Redis 2.8 バージョンに基づいた二次開発であり、データ移行を容易にするスロット サポートを追加しています。
利点:
開発が簡単で、アプリケーションに対してほぼ透過的です-
パフォーマンスは Twemproxy より優れています-
グラフィカルインターフェース、簡単な拡張、便利な操作とメンテナンスを備えています-
短所:
プロキシは依然としてパフォーマンスに影響します-
コンポーネントが多すぎるため、多くのマシンリソースが必要になります-
Redisのコードが修正されており、公式と同期できなくなり、新機能のフォローが遅れています-
開発チームはRedis変換に基づいてreborndbを推進する準備をしています-
0×04 ベストプラクティス
いわゆるベスト プラクティスは、特定のシナリオに最も適したプラクティスです。
主に以下のプランをおすすめします
Redis Sentinel クラスター + イントラネット DNS + カスタム スクリプト-
Redis Sentinel クラスター + VIP + カスタム スクリプト-
以下は実戦でのベストプラクティスをまとめたものです:
Redis Sentinel クラスターは 5 台以上のマシンを使用することをお勧めします-
さまざまな大企業は、Redis Sentinel クラスターを使用して、ビジネス内のすべてのポートをプロキシできます-
さまざまなビジネスに応じて Redis ポート範囲を分割します-
拡張を容易にするためにカスタム スクリプトを Python で実装することをお勧めします-
カスタム スクリプトは、現在のセンチネルの役割を決定するために注意する必要があります-
カスタム スクリプトのパラメータを渡します:
- カスタム スクリプトでは、マシンを操作するためにリモート SSH が必要です。SSH 接続を繰り返し確立して時間を費やすことを避けるために、paramiko ライブラリを使用することをお勧めします。
SSH 接続を高速化するには、次の 2 つのパラメータをオフにすることをお勧めします
-
DNS を使用しない
GSSAPI認証番号-
-
WeChat または電子メールでアラートを受け取った場合は、メインプロセスのブロックを避けるためにプロセスをフォークすることをお勧めします-
自動切り替えとフェイルオーバー、すべての操作が 15 秒以内に完了することをお勧めします
- 0×05まとめ
-
このイベントでは、Redis の高可用性の必要性、Sentinel の原則、Redis の高可用性の共通アーキテクチャ、および実際の戦闘プロセスでまとめられたベスト プラクティスについて説明しました。フォローアップ コミュニケーションが必要な場合は、読者の役に立つことを願っています。私を WeChat (
Wentasy) に追加するか、dbarobinwen@gmail.com
にメールを送信してください。
添付のPPTダウンロード: https://github.com/dbarobin/slides
ビデオ再生: Redis 高可用性アーキテクチャのベスト プラクティス
0×06 ありがとう
丁寧に企画してくださったTingyunとOperation and Maintenance Gangに感謝します。そして、大雨にもかかわらずこのイベントに参加しに来てくれた皆さんに感謝します。この共有は IT の第一人者によってビデオに録画されました。IT の第一人者の技術サポートに感謝します。
0×07 参照
[1] jyzhou (2016-06-12)。Redis のレプリケーション、Sentinel の構築と原理の説明。http://www.cnblogs.com/zhoujinyi/p/5570024.html から取得。
Atas ialah kandungan terperinci Redis amalan ketersediaan tinggi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!