So stellen Sie eigenständigen Pulsar und geclustertes Redis mit Docker bereit (Entwicklungsartefakt)

So stellen Sie eigenständigen Pulsar und geclustertes Redis mit Docker bereit (Entwicklungsartefakt)

1. Einleitung:

In der aktuellen Internet-Technologiearchitektur tauchen immer wieder verschiedene Middlewares auf, wie etwa MQ, Redis und Zookeeper. Diese Middlewares werden im Allgemeinen in einer Master-Slave-Architektur oder einer Cluster-Architektur eingesetzt. Unternehmen setzen im Allgemeinen jeweils einen Satz in der Entwicklungsumgebung, der Testumgebung und der Produktionsumgebung ein.

Wenn wir entwickeln, stellen wir normalerweise eine Verbindung zur Entwicklungsumgebung her. Die Entwicklungsumgebung eines allgemeinen Unternehmens kann jedoch nur im Intranet verwendet werden. Wenn wir nach Hause gehen, können wir sie nicht verwenden, es sei denn, das Unternehmen stellt ein VPN zur Verfügung. Manchmal haben wir ein VPN, aber die Entwicklung ist trotzdem umständlich. Beispielsweise verwendet unsere aktuelle MQ-Middleware Pulsar, aber der Tenant und der Namespace von Pulsar können nicht automatisch erstellt werden, sodass die Entwicklung im täglichen Leben sehr umständlich ist und wir jedes Mal, wenn wir ihn brauchen, nur einen DBA finden können.

Daher stellen wir normalerweise eine Reihe von Servern lokal bereit. Wenn wir sie jedoch selbst bereitstellen, gibt es zwei Schwierigkeiten:

Middleware verfügt über eine eigene Implementierungssprache, beispielsweise RabbitMQ. Wenn wir RabbitMQ bereitstellen, müssen wir zuerst die Sprache Erlang installieren. Der Einsatz einer Clusterarchitektur verbraucht eine Menge Systemressourcen, wodurch Laptops mit ohnehin eingeschränkten Ressourcen noch langsamer werden und die Entwicklung sehr unangenehm wird.

2. Docker:

Docker kann die oben genannten Probleme perfekt lösen und die Bereitstellung äußerst einfach machen. Nachfolgend sehen Sie ein Beispiel der Middleware, die ich selbst verwende.

A. Pulsar:

Wie oben erwähnt, können Pulsar-Mandanten und -Namespaces nicht automatisch erstellt werden. Wenn wir sie verwenden möchten, können wir nur den zuständigen Kollegen finden, der uns bei der Erstellung hilft. Die Funktionen, an denen ich kürzlich gearbeitet habe: Broadcast Center und Mitgliederexport verwenden beide Pulsar, aber ich wollte meine Kollegen nicht belästigen und arbeite oft zu Hause, also ging ich direkt auf die offizielle Website, um herauszufinden, wie ich es lokal bereitstellen kann.

Die offizielle Website stellt verschiedene Bereitstellungsmethoden vor: die Verwendung komprimierter Pakete, Docker und Kubernetes. Natürlich gibt es die Docker-Bereitstellungsmethode, und wir müssen die Docker-Bereitstellungsmethode verwenden. Wie auch immer, wir können einfach ein Image abrufen und einen Container starten, was ziemlich praktisch ist.

Der folgende Befehl:

docker run -it -d -p 6650:6650 -p 8080:8080 -v data -v conf --name=mypulsar apachepulsar/pulsar:2.6.1 bin/pulsar standalone

Der Befehl ist sehr einfach: Öffnen Sie die Portnummern 6650 und 8080 von Pulsar und binden Sie sie an die entsprechenden Portnummern des Hostcomputers, sodass wir direkt auf die IP:Port des Hostcomputers zugreifen können, um auf den Container zuzugreifen. Mounten Sie als Nächstes die Daten und die Konfiguration von Pulsar auf dem Host, damit die Daten nicht verloren gehen. Verwenden Sie dann den Befehl „pulsar standalone“, um eine eigenständige Version von Pulsar zu starten.

Unabhängig davon, ob wir einen Mandanten oder einen Namespace erstellen müssen, können wir als Nächstes direkt den Container aufrufen, um ihn zu erstellen.
Geben Sie den Container ein:

docker exec -it mypulsar /bin/bash

Über die Befehle zum Hinzufügen, Löschen, Ändern und Überprüfen von Mandanten und Namespaces:

## 1 Mandant# Überprüfen Sie, welche Mandanten vorhanden sind (öffentlich ist der Standardmandant des Systems)
Liste der Pulsar-Admin-Mieter
##Mandanten erstellen pulsar-admin Mieter erstellen my-tenant
#Mandanten löschen pulsar-admin Mieter löschen my-tenant
## 2 Namespace#Zeigen Sie den Namespace unter dem angegebenen Mandanten an. Pulsar-Admin Namespaces-Liste My-Tenant
#Erstellen Sie einen angegebenen Tenant-Namespace pulsar-admin namespaces create my-tenant/my-namespace
#Löschen Sie den angegebenen Tenant-Namespace pulsar-admin namespaces delete my-tenant/my-namespace

B. Redis:

Redis Im Allgemeinen verwendet die von uns erstellte Architektur Cluster, aber wenn Sie selbst einen Redis-Cluster bereitstellen, ist dies ziemlich problematisch. Ich habe bereits einen Artikel geschrieben: Redis-Cluster unter Linux bereitstellen

Wenn Sie Docker verwenden, ist es ganz einfach.

1 Benutzerdefiniertes Netzwerk

1.1 Erstellen Sie ein dediziertes Netzwerk für Redis

Jeder Knoten im Redis-Cluster teilt sich ein dediziertes Netzwerk, sodass die Knoten aufeinander zugreifen können und die Verwendung von --link für die Netzwerkkommunikation zwischen den einzelnen Knoten nicht erforderlich ist.

Das mit dem Befehl „Docker Network Create“ erstellte Netzwerk befindet sich standardmäßig im Bridge-Modus.

winfun@localhost ~ % Docker-Netzwerk erstellen Redis-Net --Subnetz 172.26.0.0/16
5001355940f43474d59f5cb2d78e4e9eeb0a9827e53d8f9e5b55e7d3c5285a09
winfun@localhost ~ % Docker-Netzwerkliste
NETZWERK-ID-NAME TREIBER-UMFANG
4d88d473e947 Brücke Brücke lokal
79a915fafbb5 Gastgeber Gastgeber lokal
f56e362d3c68 keine null lokal
5001355940f4 Redis-Net-Brücke lokal
winfun@localhost ~ %

1.2 Benutzerdefinierte Netzwerkdetails anzeigen

Mit dem Befehl „Docker Network Inspection Redis-net“ können wir die Details des benutzerdefinierten Netzwerks anzeigen. Dabei sehen wir, dass sich derzeit keine Container im Netzwerk befinden.

winfun@localhost mydata % Docker-Netzwerk überprüfen Redis-Net
[
 {
 "Name": "redis-net",
 "ID": "aed8340bbf8ab86cedc1d990eb7612854ba2b0bd4eae0f978ff95eadc3dbcf65",
 "Erstellt": "2020-10-22T08:46:55.695434Z",
 "Geltungsbereich": "lokal",
 "Treiber": "Brücke",
 "EnableIPv6": false,
 "IPAM": {
 "Treiber": "Standard",
 "Optionen": {},
 "Konfiguration": [
 {
  "Subnetz": "172.26.0.0/16"
 }
 ]
 },
 "Intern": false,
 "Anfügbar": false,
 "Ingress": falsch,
 "Konfiguration von": {
 "Netzwerk": ""
 },
 "ConfigOnly": falsch,
 "Container": {},
 "Optionen": {},
 "Beschriftungen": {}
 }
]

2 Bereitstellung starten

2.1 Erstellen Sie sechs Redis-Knotenkonfigurationen

für Port in $(seq 1 6); \
Tun \
mkdir -p /Benutzer/winfun/mydata/redis/node-${port}/conf
berühren Sie /Benutzer/winfun/mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/Benutzer/winfun/mydata/redis/node-${port}/conf/redis.conf
Port 6379
binden 0.0.0.0
Clusterfähig ja
Cluster-Konfigurationsdatei nodes.conf
Cluster-Knoten-Timeout 5000
Cluster-Ankündigungs-IP 172.26.0.1${Port}
Cluster-Ankündigungs-Port 6379
Cluster-Ankündigung-Bus-Port 16379
nur anhängen ja
Ende der Laufzeit
Erledigt

2.2 Starten Sie den Container

für Port in $(seq 1 6); \
Tun \
docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} \
-v /Benutzer/winfun/mydata/redis/node-${port}/data:/data \
-v /Benutzer/winfun/mydata/redis/node-${port}/conf/redis.conf:/etc/redis/redis.conf \
-d --net redis-net --ip 172.26.0.1${port} redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
Erledigt

2.3 Zeigen Sie die 6 Container an, die erfolgreich gestartet wurden

winfun@localhost meineDaten % Docker ps | grep redis
ed5972e988e8 redis:5.0.9-alpine3.11 "docker-entrypoint.s..." vor 11 Sekunden. Vor 10 Sekunden aktiv. 0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp redis-6
61cd467bc803 redis:5.0.9-alpine3.11 „docker-entrypoint.s …“ vor 12 Sekunden. Vor 11 Sekunden aktiv. 0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp redis-5
113943ba6586 redis:5.0.9-alpine3.11 „docker-entrypoint.s …“ vor 12 Sekunden. Vor 11 Sekunden aktiv. 0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp redis-4
5fc3c838851c redis:5.0.9-alpine3.11 "docker-entrypoint.s..." vor 13 Sekunden. Vor 12 Sekunden aktiv. 0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp redis-3
f7d4430f752b redis:5.0.9-alpine3.11 „docker-entrypoint.s …“ vor 13 Sekunden. Vor 12 Sekunden aktiv. 0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp redis-2
bd3e4a593427 redis:5.0.9-alpine3.11 „docker-entrypoint.s …“ vor 14 Sekunden. Vor 13 Sekunden aktiv. 0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp redis-1

3 Überprüfen Sie das Netzwerk erneut

3.1 Container im Netzwerk anzeigen

Als wir den Container oben gestartet haben, haben wir die Verwendung des Redis-Net-Netzwerks angegeben. Daher können wir uns zunächst die Informationen des Redis-Net-Netzwerks ansehen:
Wir können sehen, dass „Container“ die 6 Container enthält, die wir gestartet haben, also 6 Redis-Knoten.

winfun@localhost mydata % Docker-Netzwerk überprüfen Redis-Net
[
 {
 "Name": "redis-net",
 "ID": "aed8340bbf8ab86cedc1d990eb7612854ba2b0bd4eae0f978ff95eadc3dbcf65",
 "Erstellt": "2020-10-22T08:46:55.695434Z",
 "Geltungsbereich": "lokal",
 "Treiber": "Brücke",
 "EnableIPv6": false,
 "IPAM": {
 "Treiber": "Standard",
 "Optionen": {},
 "Konfiguration": [
 {
  "Subnetz": "172.26.0.0/16"
 }
 ]
 },
 "Intern": false,
 "Anfügbar": false,
 "Ingress": falsch,
 "Konfiguration von": {
 "Netzwerk": ""
 },
 "ConfigOnly": falsch,
 "Container": {
 "113943ba6586a4ac21d1c068b0535d5b4ef37da50141d648d30dab47eb47d3af": {
 "Name": "redis-4",
 "EndpointID": "3fe3b4655f39f90ee4daf384254d3f7548cddd19c384e0a26edb6a32545e5b30",
 "MacAdresse": "02:42:ac:1a:00:0e",
 "IPv4Adresse": "172.26.0.14/16",
 "IPv6Adresse": ""
 },
 "5fc3c838851c0ca2f629457bc3551135567b4e9fb155943711e07a91ebe9827f": {
 "Name": "redis-3",
 "EndpointID": "edd826ca267714bea6bfddd8c5d6a5f3c71c50bd50381751ec40e9f8e8160dce",
 "MacAdresse": "02:42:ac:1a:00:0d",
 "IPv4Adresse": "172.26.0.13/16",
 "IPv6Adresse": ""
 },
 "61cd467bc8030c4db9a4404b718c5c927869bed71609bec91e17ff0da705ae26": {
 "Name": "redis-5",
 "EndpointID": "7612c44ab2479ab62341eba2e30ab26f4c523ccbe1aa357fc8b7c17a368dba61",
 "MacAdresse": "02:42:ac:1a:00:0f",
 "IPv4Adresse": "172.26.0.15/16",
 "IPv6Adresse": ""
 },
 "bd3e4a593427aab4750358330014422500755552c8b470f0fd7c1e88221db984": {
 "Name": "redis-1",
 "EndpointID": "400153b712859c5c17d99708586f30013bb28236ba0dead516cf3d01ea071909",
 "MacAdresse": "02:42:ac:1a:00:0b",
 "IPv4Adresse": "172.26.0.11/16",
 "IPv6Adresse": ""
 },
 "ed5972e988e8301179249f6f9e82c8f9bb4ed801213fe49af9d3f31cbbe00db7": {
 "Name": "redis-6",
 "EndpointID": "b525b7bbdd0b0150f66b87d55e0a8f1208e113e7d1d421d1a0cca73dbb0c1e47",
 "MacAdresse": "02:42:ac:1a:00:10",
 "IPv4Adresse": "172.26.0.16/16",
 "IPv6Adresse": ""
 },
 "f7d4430f752b5485c5a90f0dc6d1d9a826d782284b1badbd203c12353191bc57": {
 "Name": "redis-2",
 "EndpointID": "cbdc77cecda1c8d80f566bcc3113f37c1a7983190dbd7ac2e9a56f6b7e4fb21f",
 "MacAdresse": "02:42:ac:1a:00:0c",
 "IPv4Adresse": "172.26.0.12/16",
 "IPv6Adresse": ""
 }
 },
 "Optionen": {},
 "Beschriftungen": {}
 }
]

3.2 Prüfen, ob die Container miteinander kommunizieren können

Wir können auch versuchen, mit redis-1 den Ping-Befehl auf redis-2 auszuführen, um zu sehen, ob das Netzwerk miteinander kommunizieren kann:

winfun@localhost meineDaten % docker exec -it redis-1 ping redis-2
PING redis-2 (172.26.0.12): 56 Datenbytes
64 Bytes von 172.26.0.12: seq=0 ttl=64 Zeit=0,136 ms
64 Bytes von 172.26.0.12: seq=1 ttl=64 Zeit=0,190 ms
64 Bytes von 172.26.0.12: seq=2 ttl=64 Zeit=0,483 ms
^C
--- Redis-2-Ping-Statistiken ---
3 Pakete gesendet, 3 Pakete empfangen, 0 % Paketverlust
Hin- und Rückfahrt min./durchschnittlich/max. = 0,136/0,269/0,483 ms

4 Erstellen eines Clusters

4.1 Verwenden Sie den Befehl redis-cli, um einen Cluster zu erstellen:

winfun@localhost conf % docker exec -it redis-1 /bin/bash
OCI-Laufzeit-Exec fehlgeschlagen: Exec fehlgeschlagen: container_linux.go:349: Starten des Containerprozesses verursachte „exec: \"/bin/bash\": stat /bin/bash: keine solche Datei oder kein solches Verzeichnis": unbekannt
# Es kann nur sh verwendet werden, das Redis-Image hat kein Bash
winfun@localhost meineDaten % docker exec -it redis-1 /bin/sh
/data # cd /usr/local/bin/
/usr/local/bin # redis-cli --cluster erstellen 172.26.0.11:6379 172.26.0.12:6379 17
2.26.0.13:6379 172.26.0.14:6379 172.26.0.15:6379 172.26.0.16:6379 --cluster-repl
icas 1 
>>> Hash-Slot-Zuweisung auf 6 Knoten wird durchgeführt …
Master[0] -> Steckplätze 0 - 5460
Master[1] -> Steckplätze 5461 - 10922
Master[2] -> Plätze 10923 - 16383
Replikat 172.26.0.15:6379 zu 172.26.0.11:6379 hinzufügen
Replikat 172.26.0.16:6379 zu 172.26.0.12:6379 hinzufügen
Replikat 172.26.0.14:6379 zu 172.26.0.13:6379 hinzufügen
M: 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379
 Steckplätze:[0-5460] (5461 Steckplätze) Master
M: 43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379
 Steckplätze:[5461-10922] (5462 Steckplätze) Master
M: 1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379
 Steckplätze:[10923-16383] (5461 Steckplätze) Master
S: 92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379
 Replikate 1e504dc62b7ccc426d513983ca061d1657532fb6
S: 7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379
 Replikate 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82
S: 203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379
 Replikate 43e173849bed74f5bd389f9b272ecf0399ae448f
Kann ich die obige Konfiguration festlegen? (Geben Sie „Ja“ ein, um zu akzeptieren): ja
>>> Knotenkonfiguration aktualisiert
>>> Jedem Knoten eine andere Konfigurationsepoche zuweisen
>>> Senden von CLUSTER MEET-Nachrichten zum Beitritt zum Cluster
Warten auf den Beitritt zum Cluster
...
>>> Clusterprüfung durchführen (mit Knoten 172.26.0.11:6379)
M: 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379
 Steckplätze:[0-5460] (5461 Steckplätze) Master
 1 zusätzliche Replik(en)
S: 92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379
 Steckplätze: (0 Steckplätze) Slave
 Replikate 1e504dc62b7ccc426d513983ca061d1657532fb6
S: 203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379
 Steckplätze: (0 Steckplätze) Slave
 Replikate 43e173849bed74f5bd389f9b272ecf0399ae448f
M: 1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379
 Steckplätze:[10923-16383] (5461 Steckplätze) Master
 1 zusätzliche Replik(en)
S: 7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379
 Steckplätze: (0 Steckplätze) Slave
 Replikate 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82
M: 43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379
 Steckplätze:[5461-10922] (5462 Steckplätze) Master
 1 zusätzliche Replik(en)
[OK] Alle Knoten stimmen der Slot-Konfiguration zu.
>>> Nach freien Plätzen suchen...
>>> Slot-Abdeckung prüfen...
[OK] Alle 16384 Slots abgedeckt.

4.2 Verwenden Sie redis-cli, um eine Verbindung zum aktuellen Knoten herzustellen und die Clusterinformationen anzuzeigen:

/usr/local/bin # redis-cli -c
127.0.0.1:6379> Cluster-Informationen
cluster_state: ok
Zugewiesene Clusterslots: 16384
cluster_slots_ok:16384
cluster_slots_pfail:0
Fehler bei Clusterslots: 0
Bekannte Clusterknoten: 6
Clustergröße: 3
cluster_current_epoch:6
cluster_meine_Epoche:1
cluster_stats_messages_ping_sent:91
cluster_stats_messages_pong_sent:95
cluster_stats_messages_sent:186
cluster_stats_messages_ping_received:90
cluster_stats_messages_pong_received:91
cluster_stats_messages_meet_received:5
cluster_stats_messages_received:186

4.3 Versuchen Sie, einen Schlüssel hinzuzufügen

# Legen Sie einen Schlüssel fest und geben Sie eine Eingabeaufforderung zurück, dass dieser Schlüssel dem Steckplatz [12539] zugewiesen ist, entsprechend dem Knoten Redis-3 [192.168.0.13].
127.0.0.1:6379> Schlüssel setzen hallo
-> Umgeleitet zum Slot [12539] bei 172.26.0.13:6379
OK
# Und redis-cli wechselt zum Knoten redis-3[172.26.0.13]
172.26.0.13:6379>

5 Testen

An diesem Punkt können wir sagen, dass wir erfolgreich einen Redis-Cluster lokal mit Docker bereitgestellt haben.
Als nächstes testen wir, ob Redis direkt im Code verwendet werden kann.

/**
 * Redis-Cluster testen * @author winfun
 * @date 21.10.2020 17:48 Uhr**/
öffentliche Klasse TestCluster {

 öffentliche statische void main(String[] args) wirft Exception{

 Setze<HostAndPort> Knoten = neues HashSet<>(3);
 nodes.add(neuer HostAndPort("127.0.0.1",6371));
 nodes.add(neuer HostAndPort("127.0.0.1",6372));
 nodes.add(neuer HostAndPort("127.0.0.1",6373));

 JedisCluster-Cluster = neuer JedisCluster(Knoten);
 Zeichenfolgenwert = cluster.get("Schlüssel");
 System.out.println("get: Schlüssel ist Schlüssel, Wert ist "+Wert);
 String-Ergebnis = cluster.set("key2","Hallo Welt");
 System.out.println("set: Schlüssel ist Schlüssel2, Ergebnis ist "+Ergebnis);
 cluster.schließen();
 }
}

Das Ergebnis ist jedoch nicht zufriedenstellend und es wird eine Ausnahme zurückgegeben:

Daraus können wir schließen, dass es wahrscheinlich unmöglich ist, eine Verbindung zu dem Redis-Cluster herzustellen, den wir in Docker bereitgestellt haben.
Daher werde ich beim nächsten Debuggen prüfen, welche Informationen JedisCluster über die Clusterknoten erhält.
Wie unten dargestellt:

Wir können das auch sehen, wenn wir JedisCluster mit der lokalen IP und dem zugeordneten Port konfigurieren.

Doch unerwartet ruft JedisCluster selbst die Cluster-Metadaten erneut ab. Zu diesem Zeitpunkt sind die IP-Adressen der Knoten alle vom benutzerdefinierten Netzwerk Redis-Net zugewiesenen Subnetze, und der Hostcomputer ist möglicherweise nicht zugänglich (für dieses Problem können wir die Verwendung eines benutzerdefinierten Netzwerks vom Typ Host in Betracht ziehen).

6 Anwendungen werden auch in benutzerdefinierten Netzwerken bereitgestellt

Wie testen Sie es also?

Ich werde ein einfaches SpringBoot-Projekt schreiben, dann Dockerfile verwenden, um ein Image basierend auf dem vom Projekt generierten JAR-Paket zu erstellen, es dann mit Docker bereitstellen und den bereitgestellten Container zum benutzerdefinierten Netzwerk Redis-Net hinzufügen und es schließlich testen.

6.1 Erstellen Sie ein SpringBoot-Projekt

Die Konfiguration ist wie folgt:

6.1.1 pom.xml:

Hauptsächlich wurden die Web- und Redis-Starter eingeführt.

<Abhängigkeit>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
</Abhängigkeit>
<Abhängigkeit>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
</Abhängigkeit>

6.1.2 Projektanwendung.Eigenschaften:

server.port=8080
# Wir können den Containernamen hier auch direkt schreiben, da die Anwendung im selben Netzwerk wie der Redis-Cluster bereitgestellt wird.
#spring.redis.cluster.nodes=redis-1:6379,redis-2:6379,redis-3:6379
spring.redis.cluster.nodes=172.26.0.11:6379,172.26.0.12:6379,172.26.0.13:6379

6.1.3 Verantwortlicher ist die:

/**
 * RedisCluster-Test * @author winfun
 * @date 22.10.2020 15:19 Uhr**/
@RequestMapping("/redisCluster")
@RestController
öffentliche Klasse RedisClusterController {

 @Autowired
 privates StringRedisTemplate redisTemplate;

 /***
 * String: Wert entsprechend dem Schlüssel abrufen
 * @Autor winfun
 * @param Schlüssel Schlüssel
 * @return {@link String }
 **/
 @GetMapping("/get/{key}")
 öffentliche Zeichenfolge get(@PathVariable("Schlüssel") Zeichenfolge Schlüssel){
 gibt redisTemplate.opsForValue().get(Schlüssel) zurück;
 }

 /***
 * String: Schlüssel/Wert-Paar festlegen * @author winfun
 * @param Schlüssel Schlüssel
 	 * @param Wert Wert
 * @return {@link String }
 **/
 @GetMapping("/set/{Schlüssel}/{Wert}")
 öffentliche Zeichenfolge festlegen (@PathVariable("Schlüssel") Zeichenfolgenschlüssel,@PathVariable("Wert") Zeichenfolgenwert) {
 redisTemplate.opsForValue().set(Schlüssel,Wert);
 gebe "Erfolg" zurück;
 }
}

6.2 Projekt packen und Image generieren

6.2.1 Verpacken des Projekts in ein Jar-Paket

mvn clean-Paket

6.2.2 Bild erzeugen

Schreiben Sie die Dockerfile-Datei:

VON java:8
WARTUNGSBEARBEITER winfun

#jar-Name ist das mit dem Projekt gepackte Jar
HINZUFÜGEN redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
EINSTIEGSPUNKT ["java","-jar","app.jar"]

Gehen Sie dann in das aktuelle Verzeichnis der Dockerfile und führen Sie den folgenden Befehl aus:

winfun@localhost redis-cluster-test % docker build -t winfun/rediscluster . 
Senden des Build-Kontexts an den Docker-Daemon 25,84 MB
Schritt 1/5: FROM java:8
8: Aus Bibliothek/Java ziehen
5040bd298390: Ziehen abgeschlossen 
fce5728aad85: Pull abgeschlossen 
76610ec20bf5: Ziehen abgeschlossen 
60170fec2151: Ziehen abgeschlossen 
e98f73de8f0d: Ziehen abgeschlossen 
11f7af24ed9c: Ziehen abgeschlossen 
49e2d6393f32: Ziehen abgeschlossen 
bb9cdec9c7f3: Ziehen abgeschlossen 
Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Neueres Image für Java:8 heruntergeladen
 ---> d23bdf5b1b1b
Schritt 2/5: MAINTAINER winfun
 ---> Wird ausgeführt in a99086ed7e68
Zwischenbehälter entfernen a99086ed7e68
 ---> f713578122fc
Schritt 3/5: ADD redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar
 ---> 12ca98d789b8
Schritt 4/5: 8080 freilegen
 ---> Wird ausgeführt in 833a06f2dd32
Zwischenbehälter entfernen 833a06f2dd32
 ---> 82f4e078510d
Schritt 5/5: ENTRYPOINT ["java","-jar","app.jar"]
 ---> Wird ausgeführt in 517a1ea7f138
Zwischenbehälter entfernen 517a1ea7f138
 ---> ed8a66ef4eb9
Erfolgreich erstellt ed8a66ef4eb9
Erfolgreich getaggt mit winfun/rediscluster:latest

6.3 Container starten und testen

6.3.1 Starten Sie den Container und fügen Sie ihn dem oben erstellten benutzerdefinierten Netzwerk redis-net hinzu

Nach dem Erstellen können wir den Befehl docker ps verwenden, um unser Image anzuzeigen:

winfun@localhost ~ % Docker-Bilder | grep rediscluster
winfun/rediscluster latest ed8a66ef4eb9 vor 52 Minuten 669 MB

Verwenden Sie den Befehl docker run , um dieses Image auszuführen und einen Container zu starten:

winfun@localhost ~ % docker run -it -d -p 8787:8080 --name myrediscluster winfun/rediscluster
705998330f7e6941f5f96d187050d29c4a59f1b16348ebeb5ab0dbc6a1cd63e1

Verwenden Sie docker network connect , um diesen Container zum oben stehenden benutzerdefinierten Netzwerk Redis-Net hinzuzufügen:

winfun@localhost ~ % Docker-Netzwerk verbinden Redis-Net Myrediscluster

Wenn wir uns die Details des benutzerdefinierten Netzwerks Redis-Net ansehen, können wir den Container Myrediscluster in den Containern finden und diesem Container ist eine IP-Adresse des benutzerdefinierten Netzwerks Redis-Net zugewiesen.
Wie unten dargestellt:

6.3.2 An diesem Punkt können wir die RedisClusterController-Schnittstelle direkt im Browser aufrufen:

Legen Sie einen Schlüssel/Wert fest:

Wert nach Schlüssel abrufen:

Wie Sie oben sehen können, gibt es absolut kein Problem.

Allerdings müssen wir bei jedem Test der Schnittstelle das Image neu erstellen und dann bereitstellen.

6.4 Bridge- und Host-Modi

Wir alle wissen, dass der Modus des benutzerdefinierten Netzwerks Redis-Net, das wir oben erstellt haben, der Bridge-Modus ist, also Bridge.

Seine größte Funktion besteht darin, das Netzwerk des Containers in Docker vom Hostcomputer zu isolieren. Die IP des Containers und die IP des Hostcomputers sind nicht zugänglich. Wenn JedisCluster zum Betreiben des Redis-Clusters verwendet wird, ist es daher nicht zugänglich, wenn JedisCluster die Knoteninformationen des Clusters als IP des Containers in Docker erhält.

Um dieses Problem zu lösen, können wir tatsächlich den Hostmodus verwenden. Sein Prinzip besteht darin, dass der Container die Netzwerkumgebung des Hostcomputers gemeinsam nutzt. In diesem Fall sollte es für JedisCluster kein Problem sein, auf den Redis-Cluster zuzugreifen.

Ja, das sollte es, da ich viele Male versucht habe, den Redis-Cluster im Hostmodus bereitzustellen, und bei der Bereitstellung und dem Betrieb mit dem Befehl „redis-cli“ keine Probleme aufgetreten sind. Wenn Sie jedoch JedisCluster zum Zugriff auf den Cluster verwenden, werden nicht einmal die Informationen zu den Clusterknoten abgerufen! !

Sie müssen es also selbst ausprobieren. Weitere Einzelheiten finden Sie im folgenden Artikel:
Implementierung der Clusterkonstruktion im Docker Redis5.0-Cluster

7. Zuletzt

Ich glaube, mittlerweile hat jeder die Leistungsfähigkeit von Docker erlebt. Bei richtiger Verwendung während der Entwicklung ist es einfach eine Zauberwaffe für die Entwicklung. Sie können problemlos lokal eine vollständige Entwicklungsumgebung einschließlich verschiedener Middleware mit minimalen Systemressourcen erstellen.

Dies ist das Ende dieses Artikels über die Docker-Bereitstellung der eigenständigen Pulsar- und Clusterarchitektur Redis (Entwicklungsartefakt). Weitere relevante Inhalte zur Docker-Bereitstellung des Redis-Clusters finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Analyse des Prozesses zum Aufbau einer Clusterumgebung mit Apache und Tomcat
  • Erstellen Sie einen Cluster mit Apache und Tomcat (Lastausgleich)
  • Detaillierter Prozess zum Erstellen und Bereitstellen eines Apache Pulsar-Clusters

<<:  MySQL-Komplettabsturz: Detaillierte Erklärung der Abfragefilterbedingungen

>>:  JS 4 super praktische Tipps zur Verbesserung der Entwicklungseffizienz

Artikel empfehlen

Implementierung des iview-Berechtigungsmanagements

Inhaltsverzeichnis iview-admin2.0 integrierte Ber...

Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.22

Installation und Konfiguration von MySQL8.0.22 (s...

Befehlscodebeispiele für die Installation und Konfiguration von Docker

Docker-Installation Installieren von Abhängigkeit...

Erfahren Sie, wie Sie ein Vue-Projekt mit Docker bereitstellen

1.Schreiben Sie davor: Als leichtgewichtige Virtu...

HTML-Tutorial: Sortierte Listen

<br />Originaltext: http://andymao.com/andy/...

Detaillierte Erklärung der Concat-bezogenen Funktionen in MySQL

1. concat()-Funktion Funktion: Mehrere Zeichenfol...

Tastenkombinationsvorgang für SQL Server-Kommentare

Batchkommentare in SQL Server Batch-Annotation St...

Was Sie beim Schreiben selbstschließender XHTML-Tags beachten sollten

Das img-Tag in XHTML sollte wie folgt geschrieben...

Detaillierte Erklärung zur Verwendung des Basis-Tags in HTML

In requireJS gibt es eine Eigenschaft namens base...

Perfekte Lösung zur vertikalen Zentrierung von Formelementen

Code kopieren Der Code lautet wie folgt: <!DOC...

Zusammenfassung der grundlegenden Verwendung von JS-Arrays

Vorwort Arrays sind eine spezielle Art von Objekt...