0×01 Vorwort
Redis ist eine Open-Source-Schlüsselwertdatenbank vom Protokolltyp, die in der ANSI-C-Sprache geschrieben ist, Netzwerke unterstützt, speicherbasiert und persistent sein kann und APIs in mehreren Sprachen bereitstellt.
Heutzutage wachsen Internet-Geschäftsdaten schneller und die Datentypen werden immer zahlreicher, was höhere Anforderungen an die Geschwindigkeit und Fähigkeiten der Datenverarbeitung stellt. Redis ist eine nicht relationale Open-Source-In-Memory-Datenbank, die Entwicklern ein disruptives Erlebnis bietet. Redis wurde von Anfang bis Ende mit Blick auf hohe Leistung entwickelt und ist die schnellste heute verfügbare NoSQL-Datenbank.
Neben der hohen Leistung ist auch die hohe Verfügbarkeit ein wichtiger Gesichtspunkt. Das Internet bietet 7x24 ununterbrochenen Service und Failover mit der höchsten Geschwindigkeit bei einem Ausfall, was zu minimalen Verlusten für das Unternehmen führen kann.
Was sind also die Hochverfügbarkeitsarchitekturen in praktischen Anwendungen? Welche Vor- und Nachteile gibt es zwischen den Architekturen? Wie sollen wir wählen? Was sind einige Best Practices?
0×02 Sentinel-Prinzip
Bevor wir die Hochverfügbarkeitslösung von Redis erläutern, werfen wir zunächst einen Blick auf dasRedis Sentinel-Prinzip.
- Der Sentinel-Cluster erkennt den Master über die angegebene Konfigurationsdatei und überwacht den Master beim Start. Erhalten Sie alle Slave-Server unter diesem Server, indem Sie Informationsinformationen an den Master senden.
- Der Sentinel-Cluster sendet über Befehlsverbindungen Hallo-Informationen (einmal pro Sekunde) an die überwachten Master- und Slave-Server. Diese Informationen umfassen die eigene IP, den Port, die ID usw. des Sentinel, um seine Existenz anderen Sentinels mitzuteilen.
- Der Sentinel-Cluster empfängt Hallo-Informationen, die von anderen Sentinels über Abonnementverbindungen gesendet werden, um andere Sentinels zu erkennen, die denselben Master-Cluster überwachen, und erstellt Befehlsverbindungen untereinander für die Kommunikation, da es bereits Master-Slave-Server gibt, die Hallo senden und empfangen. Kein Abonnement Es wird eine Verbindung zwischen Sentinel und Sentinel als Informationsvermittler hergestellt.
- Der Sentinel-Cluster verwendet den Ping-Befehl, um den Status der Instanz zu erkennen. Wenn innerhalb der angegebenen Zeit (Down-After-Millisekunden) keine Antwort erfolgt oder eine falsche Antwort zurückgegeben wird, wird die Instanz als offline eingestuft.
- Wenn die Failover-Aktiv/Standby-Umschaltung ausgelöst wird, wird das Failover nicht sofort fortgesetzt. Es ist außerdem die Autorisierung der meisten Sentinels im Sentinel erforderlich, bevor das Failover durchgeführt werden kann Erhalten Sie die Genehmigung der benannten Quorum-Sentinels. Geben Sie nach Erfolg den ODOWN-Status ein. Wenn beispielsweise 2 Quoren unter 5 Sentinels konfiguriert sind, wird ein Failover ausgeführt, wenn die 2 Sentinels glauben, dass der Master tot ist.
- Sentinel sendet den Befehl SLAVEOF NO ONE an den als Master ausgewählten Slave. Voraussetzung für die Auswahl des Slaves ist, dass Sentinel die Slaves zunächst nach ihrer Priorität sortiert. Wenn die Prioritäten gleich sind, überprüfen Sie das Replikationssubskript. Dasjenige, das mehr Replikationsdaten vom Master erhält, wird zuerst eingestuft. Wenn Priorität und Index gleich sind, wird derjenige mit der kleineren Prozess-ID ausgewählt.
- Nachdem Sentinel autorisiert wurde, erhält es die neueste Konfigurationsversionsnummer (config-epoch) des ausgefallenen Masters. Wenn die Failover-Ausführung abgeschlossen ist, wird diese Versionsnummer für die neueste Konfiguration verwendet und andere Sentinel über Broadcast benachrichtigt Aktualisieren Sie die Konfiguration des entsprechenden Masters.
1 bis 3 sind automatische Erkennungsmechanismen:
- Senden Sie alle 10 Sekunden den Info-Befehl an den überwachten Master und erhalten Sie anhand der Antwort die aktuellen Master-Informationen.
- Senden Sie PING-Befehle mit einer Frequenz von 1 Sekunde an alle Redis-Server, einschließlich Sentinel, und ermitteln Sie anhand der Antwort, ob der Server online ist.
- Senden Sie aktuelle Sentinel-Master-Informationsnachrichten im Abstand von 2 Sekunden an alle überwachten Master- und Slave-Server.
4 ist der Erkennungsmechanismus, 5 und 6 sind Failover-Mechanismen und 7 ist der Update-Konfigurationsmechanismus. [1]
0×03 Redis Hochverfügbarkeitsarchitektur
Nachdem wir das Prinzip von Redis Sentinel erklärt haben, erklären wir nun die häufig verwendeteRedis-Hochverfügbarkeitsarchitektur.
- Redis Sentinel Cluster + Intranet-DNS + benutzerdefiniertes Skript
- Redis Sentinel Cluster + VIP + benutzerdefiniertes Skript
- Kapseln Sie den Client, um eine direkte Verbindung zum Redis Sentinel-Port herzustellen
- JedisSentinelPool, geeignet für Java
- PHP ist selbstverpackt basierend auf phpredis
- Redis Sentinel Cluster + Keepalived/Haproxy
- Redis M/S + Keepalived
- Redis-Cluster
- Twemproxy
- Codis
Als nächstes erklären wir es einzeln mit Bildern und Text.
3.1 Redis Sentinel Cluster + Intranet-DNS + benutzerdefiniertes Skript
Das Bild oben ist eine Lösung, die in der Online-Umgebung angewendet wurde. Die unterste Ebene ist der Redis Sentinel-Cluster, der als Agent für den Redis-Master und -Slave fungiert. Die Webseite stellt eine Verbindung zum Intranet-DNS her, um Dienste bereitzustellen. Intranet-DNS wird nach bestimmten Regeln zugewiesen, z. B.xxxx.redis.cache/queue.port.xxx.xxxDas erste Segment gibt die Geschäftsabkürzung an und das zweite Segment gibt an, dass dies der Fall ist Redis-Intranet-Domänenname, das dritte Segment stellt den Redis-Typ dar, Cache stellt den Cache dar, Warteschlange stellt die Warteschlange dar, das vierte Segment stellt den Redis-Port dar und das fünfte und sechste Segment stellen den Haupt-Intranet-Domänennamen dar.
Wenn der Masterknoten ausfällt, beispielsweise aufgrund eines Maschinenausfalls, eines Redis-Knotenausfalls oder einer Nichterreichbarkeit des Netzwerks, ruft der Sentinel-Cluster dasclient-reconfig-scriptkonfigurierte Skript auf, um den Intranetdomänennamen zu ändern den entsprechenden Port. Der Intranet-Domänenname des entsprechenden Ports verweist auf den neuen Redis-Masterknoten.
Vorteile:
- Schalten der zweiten Ebene, schließen Sie den gesamten Schaltvorgang innerhalb von 10 Sekunden ab
- Maßgeschneiderte Skripte, kontrollierbare Architektur
- Transparent für die Anwendung, das Frontend muss sich nicht um Änderungen im Backend kümmern
Nachteile:
- Die Wartungskosten sind etwas hoch, es wird empfohlen, in mehr als 3 Maschinen für den Redis Sentinel-Cluster zu investieren
- Abhängig vom DNS, es gibt eine Verzögerung bei der Auflösung
- Der Sentinel-Modus-Dienst wird für kurze Zeit nicht verfügbar sein
- Diese Lösung kann nicht verwendet werden, wenn auf Dienste über das externe Netzwerk zugegriffen wird
3.2 Redis Sentinel Cluster + VIP + benutzerdefiniertes Skript
Dieser Plan unterscheidet sich geringfügig vom vorherigen. Die erste Lösung verwendet das Intranet-DNS und die zweite Lösung ersetzt das Intranet-DNS durch eine virtuelle IP. Die unterste Ebene ist der Redis Sentinel-Cluster, der als Agent für Redis-Master und -Slave fungiert, und die Webseite stellt Dienste über VIP bereit. Bei der Bereitstellung von Redis-Master-Slave müssen Sie die virtuelle IP an den aktuellen Redis-Masterknoten binden. Wenn der Masterknoten ausfällt, beispielsweise aufgrund eines Maschinenausfalls, eines Redis-Knotenfehlers oder einer Nichterreichbarkeit des Netzwerks, ruft der Sentinel-Cluster das konfigurierte Skriptclient-reconfig-scriptauf, um den VIP auf den neuen Masterknoten zu verschieben.
Vorteile:
- Umschalten der zweiten Ebene, schließen Sie den gesamten Umschaltvorgang innerhalb von 5 Sekunden ab
- Maßgeschneiderte Skripte, kontrollierbare Architektur
- Transparent für die Anwendung, das Frontend muss sich nicht um Änderungen im Backend kümmern
Nachteile:
- Die Wartungskosten sind etwas hoch, es wird empfohlen, in mehr als 3 Maschinen für den Redis Sentinel-Cluster zu investieren
- Die Verwendung von VIP erhöht die Wartungskosten und birgt das Risiko von IP-Verwechslungen
- Der Sentinel-Modus-Dienst wird für kurze Zeit nicht verfügbar sein
3.3 Kapselung des Clients zur direkten Verbindung mit dem Redis Sentinel-Port
部分业务只能通过外网访问 Redis,上述两种方案均不可用,于是衍生出了这种方案。Web 使用客户端连接其中一台 Redis Sentinel 集群中的一台机器的某个端口,然后通过这个端口获取到当前的主节点,然后再连接到真实的 Redis 主节点进行相应的业务员操作。需要注意的是,Redis Sentinel 端口和 Redis 主节点均需要开放访问权限。如果前端业务使用 Java,有 JedisSentinelPool 可以复用;如果前端业务使用 PHP,可以在 phpredis 的基础上做二次封装。
优点:
缺点:
- 依赖客户端支持 Sentinel
- Sentinel 服务器和 Redis 节点需要开放访问权限
- 对应用有侵入性
3.4 Redis Sentinel 集群 + Keepalived/Haproxy
底层是 Redis Sentinel 集群,代理着 Redis 主从,Web 端通过 VIP 提供服务。当主节点发生故障,比如机器故障、Redis 节点故障或者网络不可达,Redis 之间的切换通过 Redis Sentinel 内部机制保障,VIP 切换通过 Keepalived 保障。
优点:
缺点:
- 维护成本高
- 存在脑裂
- Sentinel 模式存在短时间的服务不可用
3.5 Redis M/S + Keepalived
此方案没有使用到 Redis Sentinel。此方案使用了原生的主从和 Keepalived,VIP 切换通过 Keepalived 保障,Redis 主从之间的切换需要自定义脚本实现。
优点:
缺点:
3.6 Redis Cluster
From: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster
Redis 3.0.0 在 2015 年 4 月 2 日正式发布,距今已有两年多的时间。Redis 集群采用 P2P 模式,无中心化。把 key 分成 16384 个 slot,每个实例负责一部分 slot。客户端请求对应的数据,若该实例 slot 没有对应的数据,该实例会转发给对应的实例。另外,Redis 集群通过 Gossip 协议同步节点信息。
优点:
- 组件 all-in-box,部署简单,节约机器资源
- 性能比 proxy 模式好
- 自动故障转移、Slot 迁移中数据可用
- 官方原生集群方案,更新与支持有保障
缺点:
- 架构比较新,最佳实践较少
- 多键操作支持有限(驱动可以曲线救国)
- 为了性能提升,客户端需要缓存路由表信息
- 节点发现、reshard 操作不够自动化
3.7 Twemproxy
Daripada: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster
Berbilang Twemproxy isomorfik (konfigurasi yang sama) berfungsi pada masa yang sama, menerima permintaan pelanggan dan memajukannya ke Redis yang sepadan mengikut algoritma cincang.
Penyelesaian Twemproxy agak matang Pasukan kami telah menggunakan penyelesaian ini untuk masa yang lama, tetapi kesannya tidak begitu memuaskan. Di satu pihak, masalah kedudukan lebih sukar, dan sebaliknya, sokongannya untuk menghapuskan nod secara automatik tidak begitu mesra.
Kelebihan:
- Mudah dibangunkan dan hampir telus kepada aplikasi
- Sejarah panjang dan penyelesaian matang
Keburukan:
- Proksi menjejaskan prestasi
- LVS dan Twemproxy akan mempunyai kesesakan prestasi nod
- Peluasan Redis sangat menyusahkan
- Twitter telah meninggalkan penggunaan penyelesaian ini secara dalaman, dan seni bina baharu bukan sumber terbuka
3.8 Codis
Daripada: https://github.com/CodisLabs/codis
Codis ialah produk sumber terbuka oleh Wandoujia dan melibatkan banyak komponen Antaranya, ZooKeeper menyimpan jadual penghalaan dan metadata nod proksi, dan mengedarkan perintah Codis-Config ialah alat pengurusan bersepadu dengan antara muka Web untuk digunakan; Proksi ialah Proksi tanpa negara yang serasi dengan protokol Redis; Codis-Redis ialah pembangunan sekunder berdasarkan versi Redis 2.8, menambah sokongan slot untuk memudahkan pemindahan data.
Kelebihan:
- Mudah dibangunkan dan hampir telus kepada aplikasi
- Prestasi lebih baik daripada Twemproxy
- Mempunyai antara muka grafik, pengembangan yang mudah dan operasi dan penyelenggaraan yang mudah
Keburukan:
- Proksi masih menjejaskan prestasi
- Terlalu banyak komponen, memerlukan banyak sumber mesin
- Kod Redis telah diubah suai, mengakibatkan ketidakupayaan untuk menyegerakkan dengan rasmi, dan susulan ciri baharu adalah perlahan
- Pasukan pembangunan sedang bersedia untuk mempromosikan reborndb berdasarkan transformasi Redis
0×04 Amalan Terbaik
Apa yang dipanggil amalan terbaik ialah amalan yang paling sesuai untuk senario tertentu.
Kami terutamanya mengesyorkan pelan berikut:
- Kluster Redis Sentinel + DNS intranet + skrip tersuai
- Kluster Redis Sentinel + VIP + Skrip Tersuai
Berikut adalah amalan terbaik yang diringkaskan semasa pertempuran sebenar:
- Kluster Redis Sentinel disyorkan untuk menggunakan >= 5 mesin
- Perniagaan besar yang berbeza boleh menggunakan kluster Redis Sentinel untuk memproksi semua port di bawah perniagaan
- Bahagikan julat pelabuhan Redis mengikut perniagaan yang berbeza
- Skrip tersuai disyorkan untuk dilaksanakan dalam Python untuk pengembangan mudah
- Skrip tersuai perlu diberi perhatian untuk menentukan peranan Sentinel semasa
- Luluskan parameter skrip tersuai:
Skrip tersuai memerlukan ssh jauh untuk mengendalikan mesin Adalah disyorkan untuk menggunakan perpustakaan
paramiko
- untuk mengelakkan sambungan SSH berulang kali dan memakan masa.Untuk mempercepatkan sambungan SSH, disyorkan untuk mematikan dua parameter berikut
- UseDNS no
Jika anda menerima makluman melalui WeChat atau e-mel, adalah disyorkan untuk menghentikan proses untuk mengelak daripada menyekat proses utama
- Penukaran dan failover automatik, adalah disyorkan agar semua operasi selesai dalam masa 15s
0×05 Ringkasan
Acara ini berkongsi keperluan ketersediaan tinggi Redis, prinsip Sentinel, seni bina umum ketersediaan tinggi Redis dan amalan terbaik yang diringkaskan dalam proses pertempuran sebenar Saya harap ia akan membantu pembaca Jika anda memerlukan komunikasi susulan. anda boleh menambahkan saya WeChat (
Wentasy
), atau hantar e-mel ke:dbarobinwen@gmail.comMuat turun PPT dilampirkan: https://github.com/dbarobin/slides
Main Balik Video: Amalan Terbaik untuk Seni Bina Ketersediaan Tinggi Redis
0×06 Terima kasih
Terima kasih kepada Tingyun dan Geng Operasi dan Penyelenggaraan atas penganjuran mereka yang berhati-hati, dan terima kasih kepada semua yang datang untuk menyertai acara ini walaupun hujan lebat. Perkongsian ini telah dirakamkan oleh guru IT, dan saya ingin mengucapkan terima kasih kepada guru IT atas sokongan teknikalnya.
0×07 Rujukan
[1] jyzhou (2016-06-12)。Redis のレプリケーション、Sentinel の構築と原理の説明。http://www.cnblogs.com/zhoujinyi/p/5570024.html から取得。
Das obige ist der detaillierte Inhalt vonRedis-Hochverfügbarkeitspraxis. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!