Das Cluster-Master-Slave-Modell von Redis ist eine hochverfügbare Cluster-Architektur. Zu den Hauptinhalten dieses Kapitels gehören: Einrichten eines Hochverfügbarkeitsclusters, Verbinden des Clusters mit Jedis, Hinzufügen von Clusterknoten, Löschen von Clusterknoten sowie zusätzliche Konfigurationsanweisungen. (Empfohlen: Redis-Video-Tutorial)
Hochverfügbarkeits-Clusteraufbau
Cluster-Technologie ist eine relativ neue Technologie Mit der Cluster-Technologie können relativ hohe Leistungs-, Zuverlässigkeits- und Flexibilitätsgewinne bei geringeren Kosten erzielt werden, und die Aufgabenplanung ist die Kerntechnologie in Clustersystemen.
Redis unterstützt Cluster nach 3.0. Im Redis-Cluster sind 16384 Hash-Slots integriert. Redis ordnet Hash-Slots basierend auf der Anzahl der Knoten ungefähr gleichmäßig verschiedenen Knoten zu.
Alle Knoten sind miteinander verbunden (PING-PONG-Mechanismus). Wenn mehr als die Hälfte der Hosts denkt, dass ein bestimmter Host ausgefallen ist, ist der Host tatsächlich ausgefallen und der gesamte Cluster ist nicht verfügbar.
Wenn jedem Host im Cluster mehrere Slave-Maschinen zugewiesen sind. Wenn der Master-Rechner auflegt, kann der Slave-Rechner weiterhin normal arbeiten. Wenn jedoch mehr als die Hälfte der Hosts im Cluster ausfallen, ist der Cluster nicht verfügbar, unabhängig davon, ob Slave-Maschinen vorhanden sind oder nicht.
Vorbereitungen vor dem Erstellen
Erstellen einer Ruby-Umgebung
Das Redis-Cluster-Management-Tool redis-trib.rb hängt von der Ruby-Umgebung ab.
[root@itdragon ~]# yum install ruby [root@itdragon ~]# yum install rubygems [root@itdragon ~]# gem install redis [root@itdragon ~]# cd redis-4.0.2/src/ [root@itdragon src]# cp redis-trib.rb /usr/local/redis-4/bin/
Schritt 1: Installieren Sie die Ruby-Umgebung
Schritt 2: Installieren Sie das Gem-Paket (Gem wird zum Erweitern oder Ändern von Ruby-Anwendungen verwendet).
Schritt 3: Suchen Sie die Datei redis-trib.rb im Redis-Dekomprimierungsverzeichnis und kopieren Sie sie zur einfacheren Verwaltung in das Verzeichnis, in dem der Redis-Dienst gestartet wird.
Mögliche Probleme
1 Redis erfordert Ruby-Version >= 2.2.2, die Lösung ist wie folgt
2 Es gibt kein /usr/local/rvm/scripts/ rvm-Verzeichnis. Möglicherweise ist die Ausführung des vorherigen Schritts fehlgeschlagen.
[root@itdragon ~]# ruby --version ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux] [root@itdragon ~]# yum install curl [root@itdragon ~]# curl -L get.rvm.io | bash -s stable [root@itdragon ~]# source /usr/local/rvm/scripts/rvm [root@itdragon ~]# rvm list known [root@itdragon ~]# rvm install 2.3.3 [root@itdragon ~]# rvm use 2.3.3 [root@itdragon ~]# gem install redis
Bereiten Sie sechs Redis-Server vor.
Kopieren Sie die Redis genauso wie die Master-Slave-Replikationslogik .conf-Datei 6 Mal, und der Port liegt zwischen 6000 und 6005
[root@itdragon bin]# cp redis.conf redis6000.conf [root@itdragon bin]# vim redis6000.conf port xxxx #修改端口 cluster-enabled yes #打开注释,开启集群模式 cluster-config-file nodes-xxxx.conf #集群的配置文件 pidfile /var/run/redis_xxxx.pid #pidfile文件 logfile "xxxx.log" #日志文件 dbfilename dump_xxxx.rdb #rdb持久化文件 cluster-node-timeout 5000 #请求超时,单位毫秒 appendonly yes #开启aof持久化方式 [root@itdragon bin]# vim start-all.sh ./redis-server redis6000.conf ./redis-server redis6001.conf ./redis-server redis6002.conf ./redis-server redis6003.conf ./redis-server redis6004.conf ./redis-server redis6005.conf [root@itdragon bin]# chmod u+x start-all.sh [root@itdragon bin]# ./start-all.sh [root@itdragon bin]# ps aux | grep redis root 28001 0.0 0.9 145964 9696 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6000 [cluster] root 28003 0.0 0.9 145964 9696 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6001 [cluster] root 28008 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6002 [cluster] root 28013 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6003 [cluster] root 28018 0.1 0.9 145964 9652 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6004 [cluster] root 28023 0.0 0.9 145964 9656 ? Ssl 17:45 0:00 ./redis-server 112.74.83.71:6005 [cluster]
Schritt eins: Kopieren Sie sechs redis.conf und ändern Sie die relevanten Konfigurationen. Wenn Sie es als problematisch empfinden, können Sie die von mir konfigurierten Dateien verwenden ://github.com/ITDragonBlog/daydayup/tree/master /Redis/reids.conf
Schritt 2: Fügen Sie einen neuen Stapel von Redis-Dienstprogrammen hinzu und erhöhen Sie die Ausführungsberechtigungen
Schritt 3: Überprüfen Sie, ob die Sechs Redis-Dienste wurden erfolgreich gestartet
Master-Slave-Clusteraufbau
Cluster-Erstellungsbefehl: ./redis-trib.rb create erstellt einen Cluster , --replicas 1 weist jedem Host einen Slave zu, gefolgt von Die anderen Parameter sind der IP:Port des Redis-Dienstes. Geben Sie schließlich „Ja“ ein, um die empfohlene Konfiguration zu akzeptieren
[root@itdragon bin]# ./redis-trib.rb create --replicas 1 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 112.74.83.71:6003 112.74.83.71:6004 112.74.83.71:6005 >>> Creating cluster >>> Performing hash slots allocation on 6 nodes... Using 3 masters: 112.74.83.71:6000 112.74.83.71:6001 112.74.83.71:6002 Adding replica 112.74.83.71:6003 to 112.74.83.71:6000 Adding replica 112.74.83.71:6004 to 112.74.83.71:6001 Adding replica 112.74.83.71:6005 to 112.74.83.71:6002 ...... #省略 Can I set the above configuration? (type 'yes' to accept): yes ...... #省略 [OK] All nodes agree about slots configuration. >>> Check for open slots... >>> Check slots coverage... [OK] All 16384 slots covered. #有16384个可用的插槽提供服务说明搭建成功 [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6002 -c 112.74.83.71:6002> set testKey value -> Redirected to slot [5203] located at 112.74.83.71:6000 OK 112.74.83.71:6000> cluster info cluster_state:ok ...... 112.74.83.71:6000> cluster nodes 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383 13ddd4c1b8c00926f61aa6daaa7fd8d87ee97830 112.74.83.71:6005@16005 slave 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 0 1512035803720 6 connected a3bb22e04deec2fca653c606edf5b02b819f924f 112.74.83.71:6003@16003 slave 1d4779469053930f30162e89b6711d27a112b601 0 1512035802000 4 connected 1d4779469053930f30162e89b6711d27a112b601 112.74.83.71:6000@16000 myself,master - 0 1512035802000 1 connected 0-5460 a3b99cb5d22f5cbd293179e262f5eda931733c88 112.74.83.71:6001@16001 master - 0 1512035802719 2 connected 5461-10922 915a47afc4f9b94389676b4e14f78cba66be9e5d 112.74.83.71:6004@16004 slave a3b99cb5d22f5cbd293179e262f5eda931733c88 0 1512035801717 5 connected
Schritt 1: Erstellen Sie den Cluster./redis-trib.rb erstellen, wählen Sie „Ja“, um die empfohlene Konfiguration zu akzeptieren
Schritt 2: Geben Sie den Cluster-Client ein ./redis-cli -h beliebiger Host Host -p beliebiger Host-Port -c, -c bedeutet, Redis im Cluster-Modus zu verbinden
Schritt 3: Daten speichern
Schritt 4: Cluster-Informationen Cluster abfragen Statusinformationen
Schritt 5: Clusterknoteninformationen abfragen Hier gibt es eine Grube
Mögliche Probleme werden später eingeführt
Entschuldigung, die Clusterkonfigurationsdateiknoten. conf wird bereits von einem anderen Redis-Cluster-Knoten verwendet. Bitte stellen Sie sicher, dass verschiedene Knoten unterschiedliche Cluster-Konfigurationsdateien verwenden.
Es ist ganz klar, ändern Sie die Datei „cluster-config-file nodes.conf“, um doppelte Namen zu vermeiden. Oder löschen Sie die Datei und erstellen Sie den Cluster neu.
Clusterknoten Informationen zum Clusterknoten abfragen
Dies ist ein sehr wichtiger Befehl. Die Informationen, die uns wichtig sind, sind:
Erster Parameter: Knoten-ID
Zweiter Parameter: IP:PORT@TCP Hier gibt es eine Grube, Version vor jedis-2.9.0 analysiert @-Fehler
Dritter Parameter: Flag (Master, Slave, Myself, Fail...)
Der vierte Parameter: Wenn es sich um einen Slave handelt, ist es die Knoten-ID des Hosts
Die letzten beiden Parameter: der Verbindungsstatus und die Steckplatzposition.
Jedis-Verbindungscluster
Konfigurieren Sie zunächst die Firewall
[root@itdragon ~]# vim /etc/sysconfig/iptables -A INPUT -p tcp -m tcp --dport 6000 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6001 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6002 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6003 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6004 -j ACCEPT -A INPUT -p tcp -m tcp --dport 6005 -j ACCEPT [root@itdragon ~]# service iptables restart
Schließlich integrieren Sie den Spring
<!-- jedis集群版配置 --> <bean id="redisClient" class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${redis.host}"></constructor-arg> <constructor-arg name="port" value="6000" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${redis.host}"></constructor-arg> <constructor-arg name="port" value="6001" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${redis.host}"></constructor-arg> <constructor-arg name="port" value="6002" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${redis.host}"></constructor-arg> <constructor-arg name="port" value="6003" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${redis.host}"></constructor-arg> <constructor-arg name="port" value="6004" /> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="${redis.host}"></constructor-arg> <constructor-arg name="port" value="6005" /> </bean> </set> </constructor-arg> <constructor-arg name="poolConfig" ref="jedisPoolConfig" /> </bean> <bean id="jedisClientCluster" class="com.itdragon.service.impl.JedisClientCluster"></bean>
Unit Test
/** * 集群版测试 * 若提示以下类似的错误: * java.lang.NumberFormatException: For input string: "6002@16002" * 若安装的redis 版本大于4,则可能是jedis 的版本低了。选择 2.9.0 * 因为 cluster nodes 打印的信息中,4版本之前的是没有 @16002 tcp端口信息 * 0968ef8f5ca96681da4abaaf4ca556c2e6dd0242 112.74.83.71:6002@16002 master - 0 1512035804722 3 connected 10923-16383 */ @Test public void testJedisCluster() throws IOException { HashSet<HostAndPort> nodes = new HashSet<>(); nodes.add(new HostAndPort(HOST, 6000)); nodes.add(new HostAndPort(HOST, 6001)); nodes.add(new HostAndPort(HOST, 6002)); nodes.add(new HostAndPort(HOST, 6003)); nodes.add(new HostAndPort(HOST, 6004)); nodes.add(new HostAndPort(HOST, 6005)); JedisCluster cluster = new JedisCluster(nodes); cluster.set("cluster-key", "cluster-value"); System.out.println("集群测试 : " + cluster.get("cluster-key")); cluster.close(); }
Mögliche Probleme
java.lang.NumberFormatException: Für Eingabezeichenfolge: „6002@16002“
Wenn die Redis-Version höher als 4.0.0 ist, wird It Es wird empfohlen, jedis-2.9.0 oder höher zu verwenden.
Quellcode:
https://github.com/ITDragonBlog/daydayup/tree/master/Redis/ssm-redis
Clusterknotenbetrieb
Masterknoten hinzufügen
[root@itdragon bin]# cp redis6005.conf redis6006.conf [root@itdragon bin]# ./redis-server redis6006.conf [root@itdragon bin]# ./redis-trib.rb add-node 112.74.83.71:6006 112.74.83.71:6000 [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512115612162 0 connected # 没有分配槽 [root@itdragon bin]# ./redis-trib.rb reshard 112.74.83.71:6000 How many slots do you want to move (from 1 to 16384)? 500 What is the receiving node ID? 916d26e9638dc51e168f32969da11e19c875f48f Please enter all the source node IDs. Type 'all' to use all the nodes as source nodes for the hash slots. Type 'done' once you entered all the source nodes IDs. Source node #1:all Do you want to proceed with the proposed reshard plan (yes/no)? yes [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6006@16006 master - 0 1512116047897 7 connected 0-165 5461-5627 10923-11088
Schritt 1: Erstellen Sie einen neuen Host von redis6006.conf und starten Sie den Redis-Dienst
Schritt 2: Fügen Sie einen Hostknoten hinzu, Wenn „[OK] Neuer Knoten korrekt hinzugefügt“ gedruckt wird, bedeutet dies, dass das Hinzufügen erfolgreich war.
Schritt 3: Fragen Sie die Clusterknoteninformationen ab und stellen Sie fest, dass der Host von Port 6006 zwar hinzugefügt wurde, es aber keinen gibt Inhalt hinter dem Verbindungsstatus, d. h. es ist kein Slot zugewiesen
第四步:给6006端口主机分配槽,
第一个参数:需要移动槽的个数,
第二个参数:接受槽的节点ID,
第三个参数:输入"all"表示从所有原节点中获取槽,
第四个参数:输入"yes"开始移动槽到目标结点id
第五步:查询集群节点信息,发现6006端口的主机已经分配了槽
核心命令:
./redis-trib.rb add-node 新增主机ip:port 集群任意节点ip:port
./redis-trib.rb reshard 集群任意节点ip:port
可能存在的问题
[ERR] Sorry, can't connect to node 112.74.83.71:6006
说明:新增的主机必须要是启动状态。
添加从节点
[root@itdragon bin]# cp redis6006.conf redis6007.conf [root@itdragon bin]# vim redis6007.conf [root@itdragon bin]# ./redis-server redis6007.conf [root@itdragon bin]# ./redis-trib.rb add-node --slave --master-id 916d26e9638dc51e168f32969da11e19c875f48f 112.74.83.71:6007 112.74.83.71:6006 [root@itdragon bin]# ./redis-cli -h 112.74.83.71 -p 6000 cluster nodes 80315a4dee2d0fa46b8ac722962567fc903e797a 112.74.83.71:6007@16007 slave 916d26e9638dc51e168f32969da11e19c875f48f 0 1512117377000 7 connected
第一步:创建 redis6007.conf 的新主机,并启动Redis服务
第二步:新增从机节点,在原来的命令上多了 --slave --master-id 主节点ID
第三步:查询集群节点信息
删除结点
删除节点前,要确保该节点没有值,否则提示:is not empty! Reshard data away and try again. 若该节点有值,则需要把槽分配出去
./redis-trib.rb del-node 112.74.83.71:6006 916d26e9638dc51e168f32969da11e19c875f48f
配置文件补充
前几章Redis教程中介绍了以下配置
1 开启Redis 的守护进程 :daemonize yes
2 指定pid文件写入文件名 :pidfile /var/run/redis.pid
3 指定Redis 端口:port 6379
4 绑定的主机地址 :bind 127.0.0.1
5 Redis持久化默认开启压缩数据:rdbcompression yes
6 指定rdb文件名:dbfilename dump.rdb
7 指定rdb文件位置:dir ./
8 从机启动时,它会自动从master进行数据同步:slaveof < masterip> < masterport>
9 开启aof持久化方式:appendonly yes
10 指定aof文件名:appendfilename appendonly.aof
11 触发aof快照机制:appendfsync everysec (no/always)
本章节是Redis教程中的最后一章,把剩下的配置也一起说了吧
1 设置客户端连接超时时间,0表示关闭 :timeout 300
2 设置Redis日志级别,debug、verbose(默认)、notice、warning:loglevel verbose
3 设置数据库的数量:databases 1
4 设置Redis连接密码:requirepass foobared
5 设置同一时间最大客户端连接数,默认无限制:maxclients 128
6 指定Redis最大内存限制:maxmemory < bytes>
7 指定是否启用虚拟内存机制:vm-enabled no
8 指定虚拟内存文件路径:vm-swap-file /tmp/redis.swap
9 指定包含其它的配置文件:include /path/to/local.conf
更多redis知识请关注redis数据库教程栏目。
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in den Redis-Hochverfügbarkeitscluster. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!