0×01 서문
Redis는 ANSI C 언어로 작성된 오픈소스 로그형 Key-Value 데이터베이스로, 네트워크를 지원하고, 메모리 기반 및 영속성이 가능하며, 다국어 API를 제공합니다.
요즘 인터넷 비즈니스 데이터는 빠른 속도로 증가하고 데이터 유형이 점점 더 풍부해지면서 데이터 처리 속도와 성능에 대한 요구 사항도 높아집니다. Redis는 개발자에게 파괴적인 경험을 선사하는 오픈 소스 인메모리 비관계형 데이터베이스입니다. 처음부터 끝까지 고성능을 염두에 두고 설계된 Redis는 현재 사용 가능한 가장 빠른 NoSQL 데이터베이스입니다.
고성능을 고려하는 동시에 고가용성 역시 매우 중요한 고려 사항입니다. 인터넷은 7×24 무중단 서비스와 장애 시 가장 빠른 속도의 Failover를 제공하여 기업의 손실을 최소화할 수 있습니다.
그렇다면 실제 애플리케이션에는 어떤 고가용성 아키텍처가 있을까요? 아키텍처 간의 장단점은 무엇입니까? 우리는 어떻게 선택해야 합니까? 모범 사례에는 어떤 것이 있나요?
0×02 센티넬 원리
Redis 고가용성 솔루션을 설명하기 전에 먼저 Redis Sentinel 원칙을 살펴보겠습니다.
- Sentinel 클러스터는 지정된 구성 파일을 통해 마스터를 검색하고 마스터가 시작되면 모니터링합니다. 정보 정보를 마스터에 전송하여 이 서버 아래의 모든 슬레이브 서버를 얻습니다.
- Sentinel 클러스터는 명령 연결을 통해 모니터링되는 마스터 및 슬레이브 서버에 Hello 정보(초당 1회)를 보냅니다. 이 정보에는 Sentinel 자신의 IP, 포트, ID 등이 포함되어 다른 Sentinel에게 자신의 존재를 알립니다.
- Sentinel 클러스터는 구독 연결을 통해 다른 Sentinel이 보낸 hello 정보를 수신하여 동일한 마스터 서버를 모니터링하는 다른 Sentinel을 검색합니다. 이미 마스터-슬레이브 서버가 발신자이므로 클러스터는 통신을 위해 서로 명령 연결을 생성합니다. Sentinel과 hello 정보를 수신하는 중개자 간에 구독 연결이 생성됩니다.
- Sentinel 클러스터는 ping 명령을 사용하여 인스턴스 상태를 감지합니다. 지정된 시간(다운 후 밀리초) 내에 응답이 없거나 잘못된 응답이 반환되면 인스턴스가 오프라인으로 판단됩니다.
- 장애 조치 활성/대기 전환이 실행되면 장애 조치가 즉시 진행되지 않습니다. 즉, 장애 조치를 수행하기 전에 Sentinel에 있는 대부분의 Sentinel이 승인을 받아야 합니다. 지정된 쿼럼 센티널의 승인을 얻고, 성공 후 ODOWN 상태로 들어갑니다. 예를 들어 5개의 Sentinel 중 2개의 Quorum을 구성한 경우 2개의 Sentinel이 Master가 죽었다고 판단하면 Failover가 실행됩니다.
- Sentinel은 마스터로 선택된 슬레이브에게 SLAVEOF NO ONE 명령을 보냅니다. 슬레이브를 선택하는 조건은 Sentinel이 먼저 우선 순위에 따라 슬레이브를 정렬하는 것입니다. 우선순위가 동일한 경우 복제 첨자를 확인하여 마스터로부터 더 많은 복제 데이터를 수신하는 쪽이 먼저 순위가 지정됩니다. 우선순위와 인덱스가 동일하면 프로세스 ID가 작은 프로세스가 선택됩니다.
- Sentinel이 인증된 후 실패한 마스터의 최신 구성 버전 번호(config-epoch)를 가져옵니다. 장애 조치 실행이 완료되면 이 버전 번호가 브로드캐스트를 통해 최신 구성에 사용됩니다. 양식과 다른 Sentinel은 해당 마스터의 구성을 업데이트합니다.
1~3은 자동 검색 메커니즘입니다.
- 10초마다 모니터링되는 마스터에 info 명령을 보내고 응답을 기반으로 현재 마스터 정보를 가져옵니다.
- Sentinel을 포함한 모든 Redis 서버에 1초 간격으로 PING 명령을 보내고 응답을 통해 서버가 온라인 상태인지 확인합니다.
- 현재 Sentinel 마스터 정보 메시지를 모니터링되는 모든 마스터 및 슬레이브 서버에 2초 간격으로 보냅니다.
4는 감지 메커니즘, 5와 6은 장애 조치 메커니즘, 7은 업데이트 구성 메커니즘입니다. [1]
0×03 Redis 고가용성 아키텍처
Redis Sentinel의 원리를 설명한 후 일반적으로 사용되는 Redis 고가용성 아키텍처에 대해 설명하겠습니다.
- Redis 센티널 클러스터 + 인트라넷 DNS + 사용자 정의 스크립트
- Redis Sentinel 클러스터 + VIP + 사용자 정의 스크립트
- Redis Sentinel 포트에 직접 연결하도록 클라이언트를 캡슐화합니다.
- JedisSentinelPool, Java에 적합
- PHP는 phpredis를 기반으로 자체 패키지되어 있습니다
- Redis 센티널 클러스터 + Keepalived/Haproxy
- Redis M/S + Keepalived
- Redis 클러스터
- 트웸프록시
- 코디스
다음으로 사진과 글로 하나씩 설명드리겠습니다.
3.1 Redis Sentinel 클러스터 + 인트라넷 DNS + 사용자 정의 스크립트
위 사진은 온라인 환경에 적용된 솔루션입니다. 맨 아래 계층은 Redis 마스터 및 슬레이브의 에이전트 역할을 하는 Redis Sentinel 클러스터입니다. 웹 측은 인트라넷 DNS에 연결하여 서비스를 제공합니다. 인트라넷 DNS는 xxxx.redis.cache/queue.port.xxx.xxx과 같은 특정 규칙에 따라 할당됩니다. 첫 번째 세그먼트는 비즈니스 약어를 나타내고 두 번째 세그먼트는 이것이임을 나타냅니다. Redis 인트라넷 도메인 이름, 세 번째 세그먼트는 Redis 유형, 캐시는 캐시, queue는 큐, 네 번째 세그먼트는 Redis 포트, 다섯 번째와 여섯 번째 세그먼트는 기본 인트라넷 도메인 이름을 나타냅니다.
기계 오류, Redis 노드 오류 또는 네트워크 연결 불가 등으로 마스터 노드에 오류가 발생하면 Sentinel 클러스터는 client-reconfig-script 구성된 스크립트를 호출하여 인트라넷 도메인 이름을 수정합니다. 해당 포트. 해당 포트의 인트라넷 도메인 이름은 새 Redis 마스터 노드를 가리킵니다.
장점:
- 2단계 스위칭, 10초 안에 전체 스위칭 작업 완료
- 맞춤형 스크립트, 제어 가능한 아키텍처
- 애플리케이션에 투명하기 때문에 프런트엔드는 백엔드의 변경을 걱정할 필요가 없습니다
단점:
- 유지관리 비용이 조금 높으므로 Redis Sentinel 클러스터에는 3대 이상의 머신에 투자하는 것이 좋습니다
- DNS에 따라 해결 지연이 있습니다
- 센티넬 모드 서비스가 잠시 중단됩니다
- 외부 네트워크를 통해 서비스에 접속할 때는 해당 솔루션을 사용할 수 없습니다
3.2 Redis Sentinel 클러스터 + VIP + 사용자 정의 스크립트
이번 계획은 이전 계획과 조금 다릅니다. 첫 번째 솔루션은 인트라넷 DNS를 사용하고, 두 번째 솔루션은 인트라넷 DNS를 가상 IP로 대체합니다. 맨 아래 계층은 Redis 마스터와 슬레이브의 에이전트 역할을 하는 Redis Sentinel 클러스터이며, 웹 측은 VIP를 통해 서비스를 제공합니다. Redis 마스터-슬레이브를 배포할 때 가상 IP를 현재 Redis 마스터 노드에 바인딩해야 합니다. 기계 오류, Redis 노드 오류 또는 네트워크 연결 불가 등 마스터 노드에 오류가 발생하면 Sentinel 클러스터는 client-reconfig-script 구성된 스크립트를 호출하여 VIP를 새 마스터 노드로 이동시킵니다.
장점:
- 2단계 스위칭, 5초 안에 전체 스위칭 작업 완료
- 맞춤형 스크립트, 제어 가능한 아키텍처
- 애플리케이션에 투명하기 때문에 프런트엔드는 백엔드의 변경을 걱정할 필요가 없습니다
단점:
- 유지관리 비용이 조금 높으므로 Redis Sentinel 클러스터에는 3대 이상의 머신에 투자하는 것이 좋습니다
- VIP를 사용하면 유지 관리 비용이 증가하고 IP 혼란 위험이 증가합니다
- 센티넬 모드 서비스가 잠시 중단됩니다
3.3 클라이언트를 Redis Sentinel 포트에 직접 연결하도록 캡슐화
Einige Unternehmen können nur über das externe Netzwerk auf Redis zugreifen. Keine der beiden oben genannten Lösungen ist verfügbar, daher wurde diese Lösung abgeleitet. Web verwendet den Client, um eine Verbindung zu einem bestimmten Port einer Maschine in einem der Redis Sentinel-Cluster herzustellen, ruft dann über diesen Port den aktuellen Masterknoten ab und stellt dann eine Verbindung zum echten Redis-Masterknoten her, um entsprechende Verkäufervorgänge auszuführen. Es ist wichtig zu beachten, dass sowohl der Redis Sentinel-Port als auch der Redis-Masterknoten offenen Zugriff erfordern. Wenn das Front-End-Unternehmen Java verwendet, kann JedisSentinelPool wiederverwendet werden. Wenn das Front-End-Unternehmen PHP verwendet, kann die sekundäre Kapselung auf Basis von PHPREDIS erfolgen.
Vorteile:
- Diensterkennungsfehler rechtzeitig
- DBA niedrige Wartungskosten
Nachteile:
- Abhängig vom Kundensupport Sentinel
- Sentinel-Server und Redis-Knoten erfordern Open-Access-Berechtigungen
- Aufdringlich in die Anwendung
3.4 Redis Sentinel Cluster + Keepalived/Haproxy
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. Wenn der Masterknoten ausfällt, beispielsweise aufgrund eines Maschinenausfalls, eines Redis-Knotenausfalls oder einer Nichterreichbarkeit des Netzwerks, wird die Umschaltung zwischen Redis durch den internen Mechanismus von Redis Sentinel und die VIP-Umschaltung durch Keepalived garantiert.
Vorteile:
- Zweite Schaltung
- Transparent für die Anwendung
Nachteile:
- Hohe Wartungskosten
- Es gibt ein gespaltenes Gehirn
- Der Sentinel-Modus-Dienst wird für kurze Zeit nicht verfügbar sein
3.5 Redis M/S + Keepalived
Diese Lösung verwendet Redis Sentinel nicht. Diese Lösung verwendet native Master-Slave- und Keepalived-VIP-Umschaltungen. Für die Umschaltung zwischen Redis-Master-Slave sind benutzerdefinierte Skripte erforderlich.
Vorteile:
- Zweite Schaltung
- Transparent für die Anwendung
- Einfache Bereitstellung und geringe Wartungskosten
Nachteile:
- Skript zur Implementierung der Schaltfunktion erforderlich
- Es gibt ein gespaltenes Gehirn
3.6 Redis-Cluster
Von: http://intro2libsys.com/focused-redis-topics/day-one/intro-redis-cluster
Redis 3.0.0 wurde am 2. April 2015, also vor mehr als zwei Jahren, offiziell veröffentlicht. Der Redis-Cluster verwendet den P2P-Modus und ist nicht zentralisiert. Teilen Sie den Schlüssel in 16384 Slots auf, und jede Instanz ist für einen Teil der Slots verantwortlich. Der Client fordert die entsprechenden Daten an. Wenn der Instanz-Slot keine entsprechenden Daten hat, wird die Instanz an die entsprechende Instanz weitergeleitet. Darüber hinaus synchronisiert der Redis-Cluster Knoteninformationen über das Gossip-Protokoll.
Vorteile:
- Die Komponenten sind komplett im Lieferumfang enthalten, einfach bereitzustellen und schonen Maschinenressourcen.
- Leistung ist besser als im Proxy-Modus
- Automatisches Failover, Daten während der Slot-Migration verfügbar
- Offizielle native Cluster-Lösung, Updates und Support garantiert
Nachteile:
- Die Architektur ist relativ neu und es gibt nur wenige Best Practices
- Eingeschränkte Unterstützung für Mehrtastenbedienung (der Fahrer kann das Land speichern)
- Um die Leistung zu verbessern, muss der Client Routing-Tabelleninformationen zwischenspeichern
- Knotenerkennung und Reshard-Vorgänge sind nicht ausreichend automatisiert
3.7 Twemproxy
Von: http://engineering.bloomreach.com/the-evolution-of-fault-tolerant-redis-cluster
Mehrere isomorphe Twemproxy (gleiche Konfiguration) arbeiten gleichzeitig, akzeptieren Client-Anfragen und leiten diese gemäß dem Hash-Algorithmus an die entsprechenden Redis weiter.
Die Twemproxy-Lösung ist relativ ausgereift, aber die Wirkung ist nicht sehr zufriedenstellend. Einerseits ist das Positionierungsproblem schwieriger, andererseits ist die Unterstützung für die automatische Eliminierung von Knoten nicht sehr freundlich.
Vorteile:
- Einfach zu entwickeln und nahezu transparent für die Anwendung
- Lange Geschichte, ausgereifte Lösungen
Nachteile:
- Proxy beeinflusst die Leistung
- LVS und Twemproxy werden Leistungsengpässe bei den Knoten haben
- Redis-Erweiterung ist sehr mühsam
- Twitter hat die Verwendung dieser Lösung intern aufgegeben und die neue Architektur ist nicht Open Source
3.8 Codis
Von: https://github.com/CodisLabs/codis
Codis ist ein Open-Source-Produkt von Wandoujia und umfasst viele Komponenten. Darunter speichert ZooKeeper Routing-Tabellen und Agentenknoten-Metadaten und verteilt Codis-Config-Befehle ; Codis-Proxy ist ein zustandsloser Proxy, der mit dem Redis-Protokoll kompatibel ist; Codis-Redis ist eine sekundäre Entwicklung, die auf der Redis 2.8-Version basiert und Slot-Unterstützung hinzufügt, um die Datenmigration zu erleichtern.
Vorteile:
- Einfach zu entwickeln und nahezu transparent für die Anwendung
- Leistung ist besser als Twemproxy
- Verfügt über eine grafische Oberfläche, einfache Erweiterung sowie bequeme Bedienung und Wartung
Nachteile:
- Proxy beeinträchtigt immer noch die Leistung
- Es gibt zu viele Komponenten und erfordert viele Maschinenressourcen
- Der Redis-Code wurde geändert, was dazu führt, dass keine Synchronisierung mit dem offiziellen Code möglich ist und die Nachverfolgung neuer Funktionen langsam ist
- Das Entwicklungsteam bereitet die Förderung von „reborndb“ basierend auf der Redis-Transformation vor
0×04 Best Practices
Die sogenannten Best Practices sind Praktiken, die für bestimmte Szenarien am besten geeignet sind.
empfiehlt hauptsächlich die folgenden Pläne:
- Redis Sentinel Cluster + Intranet-DNS + benutzerdefiniertes Skript
- Redis Sentinel Cluster + VIP + benutzerdefiniertes Skript
Im Folgenden sind die Best Practices während des tatsächlichen Kampfes zusammengefasst:
- Es wird empfohlen, im Redis Sentinel-Cluster >= 5 Maschinen zu verwenden
- Verschiedene große Unternehmen können einen Redis Sentinel-Cluster verwenden, um alle Ports unter dem Unternehmen zu vertreten
- Teilen Sie das Redis-Port-Sortiment nach verschiedenen Unternehmen auf
- Es wird empfohlen, Python zu verwenden, um benutzerdefinierte Skripte für eine einfache Erweiterung zu implementieren
- Benutzerdefinierte Skripte müssen beachtet werden, um die aktuelle Sentinel-Rolle zu bestimmen
- Benutzerdefinierte Skript-Eingabeparameter:
Benutzerdefinierte Skripte erfordern Remote-SSH, um die Maschine zu betreiben. Es wird empfohlen, die
paramiko- -Bibliothek zu verwenden, um den wiederholten Aufbau von SSH-Verbindungen und den Zeitaufwand zu vermeiden.
Um die SSH-Verbindung zu beschleunigen, wird empfohlen, die folgenden beiden Parameter zu deaktivieren
- DNS-Nr. verwendenWechat- oder E-Mail-Benachrichtigungen, es wird empfohlen, einen Prozess zu forken, um eine Blockierung des Hauptprozesses zu vermeiden
- Automatische Umschaltung und Failover, es wird empfohlen, alle Vorgänge innerhalb von 15 Sekunden abzuschließen
-
0×05 Zusammenfassung
Diese Veranstaltung teilte die Notwendigkeit der Redis-Hochverfügbarkeit, das Sentinel-Prinzip, die gemeinsame Architektur der Redis-Hochverfügbarkeit und die Best Practices, die im tatsächlichen Kampfprozess zusammengefasst sind. Ich hoffe, dass dies für die Leser hilfreich sein wird. Um die Kommunikation zu verbessern, können Sie meinen WeChat hinzufügen (
Wentasy
) oder eine E-Mail senden an: dbarobinwen@gmail.com
Angehängter PPT-Download: https://github.com/dbarobin/slides
Videowiedergabe: Best Practices für die Redis-Hochverfügbarkeitsarchitektur
0×06 Danksagung
Vielen Dank an Tingyun und Operation and Maintenance Gang für ihre sorgfältige Organisation und vielen Dank an alle, die dem starken Regen getrotzt haben, um an dieser Veranstaltung teilzunehmen. Dieser Austausch wurde vom IT-Guru auf Video aufgezeichnet, und ich möchte dem IT-Guru für seine technische Unterstützung danken.
0×07 Referenz
[1] jyzhou (2016-06-12). Abgerufen von http://www.cnblogs.com/zhoujinyi/p/5570024.
위 내용은 Redis 고가용성 실습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!