Verstehen und erstellen Sie einen Redis-Cluster von Grund auf
Einige Entwickler verwenden Redis nur in ihren Anwendungen, z. B. zum Zwischenspeichern von Datenergebnissen. Und jetzt gibt es viele gute Redis-Client-Tools (Redisson), die grundsätzlich eine beträchtliche Anzahl von Funktionen ausführen können, ohne auf den Redis-Befehl zu achten. Daher wird den folgenden Themen möglicherweise nicht genügend Aufmerksamkeit geschenkt:
Wie kann man sich von einer Katastrophe erholen? Das heißt, wenn es ein Problem mit einem bestimmten Redis-Knoten gibt, wie kann die hohe Verfügbarkeit des Dienstes sichergestellt werden?
Wie kann man ihn horizontal erweitern? Wie kann das Leistungsproblem eines einzelnen Redis gelöst werden, wenn die Datenmenge besonders groß ist?
Wie viele Maschinen werden mindestens im Cluster benötigt? Oder mit welchen Technologien und Tools werden Cluster aus mehreren Redis-Knoten aufgebaut
?
Wie erholt man sich von einer Katastrophe?
Redis bietet einen Master-Slave-Hot-Standby-Mechanismus. Die Daten des Master-Servers werden mit dem Slave-Server synchronisiert. Der Status des Master-Servers wird in Echtzeit über Sentinel überwacht und ist für die Auswahl des Master-Servers verantwortlich . Wenn eine Anomalie beim Hauptserver festgestellt wird, wird der Hauptserver gemäß einem bestimmten Algorithmus neu gewählt, der Problemserver aus der verfügbaren Liste entfernt und der Client schließlich benachrichtigt. Der Master-Slave ist eine Eins-zu-Viele-Baumstruktur, wie unten gezeigt:
Sentinel
Sentinel ist der Chinese Name von Sentinel: Ein von Redis erstelltes Hochverfügbarkeits-Architekturtool ist selbst ein unabhängiger Prozess und kann mehr als einen Redis-Cluster gleichzeitig überwachen.
Sentinel-Cluster
Aus Gründen der Hochverfügbarkeit muss Sentinel selbst auch Clustering unterstützen. Wenn es nur einen Sentinel gibt, gibt es einen einzigen Problempunkt.
Sentinel-Entscheidung
Sentinels verfügen über eine Mengenkonfiguration, die nur durchgeführt wird, wenn wie viele Sentinels der Meinung sind, dass ein bestimmter Master-Dienst gleichzeitig nicht verfügbar ist. Beispielsweise gibt es insgesamt 5 Sentinels. Wenn die drei Sentinels glauben, dass der Dienst nicht verfügbar ist, entscheiden sie sich für einen Master-Slave-Wechsel. Dadurch können fehlerhafte Wechsel vermieden und die Wechselkosten gesenkt werden, z. B. bei plötzlichen Netzwerkanomalien.
Wie kann man horizontal expandieren?
Ob Redis oder andere Datenbankprodukte: Wenn die Datenkapazität eines einzelnen Knotens eine bestimmte Obergrenze erreicht, wird die Fähigkeit, Dienste für die Außenwelt bereitzustellen, immer schwächer. Redis stellt in höheren Versionen redis-trib.rb zur Implementierung von Clusterfunktionen zur Verfügung. Sie können auch das Drittanbieter-Tool twemproxy verwenden.
Dezentralisierung, jeder Knoten ist gleich
Der Redis-Cluster ist nicht auf Zentralisierung ausgelegt, wodurch Probleme wie ein einzelner Punkt im zentralen Knoten vermieden werden können. Jeder Knoten kann den Status des gesamten Clusters erfassen, und jeder mit ihm verbundene Knoten kann auf alle Schlüssel zugreifen, genau wie Redis mit einem einzelnen Knoten.
Cluster-Schemadiagramm
Ich habe es nach meinem eigenen Verständnis gezeichnet. Bitte weisen Sie darauf hin, wenn es ein Missverständnis gibt.
Die Beziehung zwischen Schlüssel und Redis-Knoten
Hasy Solt wird vorgestellt, was auf Chinesisch als Hash-Slot verstanden wird. Insgesamt sind es 16384. Der von uns betriebene Schlüssel verwendet den Modulo-Algorithmus, um zu bestätigen, auf welchen Steckplatz der Schlüssel fällt.
HASH_SLOT = CRC16(key) mod 16384
Es besteht eine bestimmte Beziehung zwischen dem Hash-Slot und dem Knoten, sodass wir den Schlüssel einem bestimmten Redis-Knoten zuweisen können.
Die detaillierte Beziehung kann erneut untersucht werden. Beispielsweise ist Knoten A für Hash-Slots mit den Nummern 0-5000 verantwortlich, Knoten B ist für 5001-1000 verantwortlich.
Erstellen Sie Schritt für Schritt
Beginnen Sie mit dem Aufbau eines Clusters mit drei Mastern und drei Slaves. Das System ist Ubuntu und es wird das von Redis bereitgestellte Cluster-Tool redis-trib.rb verwendet.
Installieren Sie das neueste Redis
Erstellen Sie das Verzeichnis redis_cluster und erstellen Sie 6 Verzeichnisse von 7000 bis 7005
Kopieren Sie redis.conf im Redis-Verzeichnis in die 6 über Medium erstellten Verzeichnisse
分别修改redis.conf文件,对6个文件做类似的修改。
port 7000 //端口7000 bind 127.0.0.1 //默认ip为127.0.0.1 需要改为其他节点机器可访问的ip daemonize yes //后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000 cluster-enabled yes //开启集群 cluster-config-file nodes_7000.conf //集群的配置 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置
bind需要注意的就是需要配置为其它机器可以访问的ip,否则无论是创建集群还是客户端连接都会有问题。
启动6个redis
redis-server redis_cluster/7000/redis.conf redis-server redis_cluster/7001/redis.conf redis-server redis_cluster/7002/redis.conf redis-server redis_cluster/7003/redis.conf redis-server redis_cluster/7004/redis.conf redis-server redis_cluster/7005/redis.conf
创建集群
redis的src目录下有个redis-trib.rb,将它复制到/usr/local/bin中,然后执行如下脚本:
redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
--replicas后面的1代表从服务器的个数,上面可以理解为前面3个为主服务器,后面三个分别做为从服务器,即三对主从。
执行过程中会遇到提示需要安装ruby,安装完成之后又会提示安装 gem redis。
安装gem redis,折腾了好久,最终发现是因为在国内访问不了某些网站导致通过apt-get install安装不成功,最后通过下载源码的方式安装成功。
再次执行创建集群的脚本,出现如下提示:
输入yes,继续
最少需要多少个主服务器?
可能是基于某些约定,集群约定只有当可用节点数大于半数以上时才具备对外提供服务的能力。首先数量一定是奇数,其实必须大于1,所以最少的主服务器数量为3。
测试集群
连接客户端,由于我的所有节点都是在本地,所以不需要输入ip,但需要加-c的参数。redis-cli -c -p 7000
连接成功后,增加一个key
set mykey 123
有一行提示语,指向到端口7002,这说明虽然我们连接的是7000的实例,但通过hash算法最终会将key分配到7002的实例上。
再连接7005端口查询下key,测试下是否任意一个实例都可以查询到key
get mykey
显示指向到端口7002
更多redis知识请关注redis数据库教程栏目。
Das obige ist der detaillierte Inhalt vonDetaillierte grafische Erläuterung der Redis-Hochverfügbarkeitslösung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!