Docker 部署單機版 Pulsar 和集群架構(gòu) Redis(開發(fā)神器)的方法
現(xiàn)在互聯(lián)網(wǎng)的技術(shù)架構(gòu)中,不斷出現(xiàn)各種各樣的中間件,例如 MQ、Redis、Zookeeper,這些中間件在部署的時候一般都是以主從架構(gòu)或者集群的架構(gòu)來部署,公司一般都會在開發(fā)環(huán)境、測試環(huán)境和生產(chǎn)環(huán)境各部署一套。
當我們開發(fā)的時候,一般就會連著開發(fā)環(huán)境。但是呢,一般公司的開發(fā)環(huán)境都只能在內(nèi)網(wǎng)使用,當我們回家了,除非公司提供有 VPN,不然就沒辦法使用了。有時候我們是有VPN了,但是開發(fā)起來還是很不方便。例如我們現(xiàn)在的 MQ 中間件使用的是 Pulsar,但是 Pulsar 的 tenant 和 namespace 都是不能自動創(chuàng)建的,所以平時開發(fā)起來非常的不方便,只能每次需要時都找一遍 DBA。
所以,一般我們都會在本地自己部署一套,但是自己部署有下面的兩個難點:
中間件有自己的實現(xiàn)語言,例如 RabbitMQ,當我們部署 RabbitMQ 時,首先要安裝好 Erlang 語言。部署集群架構(gòu)會耗費大量的系統(tǒng)資源,導(dǎo)致本來資源就吃緊的筆記本更加卡頓,開發(fā)起來非常的不爽。
二、Docker:Docker 可以完美地解決上面的問題,并且讓部署變得極其的簡單。下面以我自己用到的中間件為例子。
A、Pulsar:
上面提到,Pulsar 的租戶是不能自動創(chuàng)建的,命名空間也是不能自動創(chuàng)建的,如果我們要使用,只能找到負責這塊的同事幫忙創(chuàng)建了。而我最近做的功能:廣播中心和會員導(dǎo)出都使用到 Pulsar,但是不想麻煩同事,而且我經(jīng)常會在家里干活,所以最后直接到官網(wǎng)上面,找了本地如何部署。
官網(wǎng)介紹了多種部署方式:有利用壓縮包的,Docker的,Kubernetes的。當然了,有 Docker 的部署方式,我們必須使用 Docker 的部署方式,反正拉取一個鏡像啟動一個容器就直接搞定了,相當?shù)姆奖恪?/p>
下面上命令:
docker run -it -d -p 6650:6650 -p 8080:8080 -v data -v conf --name=mypulsar apachepulsar/pulsar:2.6.1 bin/pulsar standalone
命令是非常的簡單:將 pulsar 的 6650和8080端口號開放出來,并綁定到宿主機對應(yīng)的端口號,這樣我們能直接訪問宿主機 ip:port 就能訪問到容器。接著,將 Pulsar 的 data 和 conf 掛載到宿主機中,這樣數(shù)據(jù)就不會丟失了。接著利用 pulsar standalone 命令啟動一個單機版的 Pulsar。
接著,不管我們是需要創(chuàng)建租戶或者命名空間,直接進入容器中創(chuàng)建即可。進入容器:
docker exec -it mypulsar /bin/bash
關(guān)于tenant 和 namespace 的增刪改查命令:
## 1 租戶#查看有哪些租戶(public 是系統(tǒng)默認的租戶)pulsar-admin tenants list##創(chuàng)建租戶pulsar-admin tenants create my-tenant#刪除租戶pulsar-admin tenants delete my-tenant## 2 命名空間#查看指定租戶下邊的命名空間pulsar-admin namespaces list my-tenant#創(chuàng)建指定租戶命名空間pulsar-admin namespaces create my-tenant/my-namespace#刪除指定租戶命名空間pulsar-admin namespaces delete my-tenant/my-namespace
B、Redis:
Redis 一般我們生產(chǎn)的架構(gòu)都是使用 Cluster 的,但是如果是自己部署一套集群的 Redis,是相當?shù)穆闊郧拔易约阂矊戇^文章:Linux 部署 Redis 集群
如果使用 Docker 的話,會非常的簡單。
1 自定義網(wǎng)絡(luò)1.1 創(chuàng)建 Redis 的專屬網(wǎng)絡(luò)
Redis 集群的各個節(jié)點公用一個專屬網(wǎng)絡(luò),節(jié)點間就可以互相訪問了,而避免了每個節(jié)點之間都要用 --link 去做網(wǎng)絡(luò)互通。
docker network create 命令創(chuàng)建的網(wǎng)絡(luò)默認是 bridge 模式。
winfun@localhost ~ % docker network create redis-net --subnet 172.26.0.0/165001355940f43474d59f5cb2d78e4e9eeb0a9827e53d8f9e5b55e7d3c5285a09winfun@localhost ~ % docker network listNETWORK ID NAME DRIVER SCOPE4d88d473e947 bridge bridge local79a915fafbb5 host host localf56e362d3c68 none null local5001355940f4 redis-net bridge localwinfun@localhost ~ %
1.2 查看自定義網(wǎng)絡(luò)詳情
我們可以利用命令 docker network inspect redis-net 來查看自定義網(wǎng)絡(luò)的詳情,可以看到現(xiàn)在網(wǎng)絡(luò)里面是沒有容器的。
winfun@localhost mydata % docker network inspect redis-net[ { 'Name': 'redis-net', 'Id': 'aed8340bbf8ab86cedc1d990eb7612854ba2b0bd4eae0f978ff95eadc3dbcf65', 'Created': '2020-10-22T08:46:55.695434Z', 'Scope': 'local', 'Driver': 'bridge', 'EnableIPv6': false, 'IPAM': { 'Driver': 'default', 'Options': {}, 'Config': [ { 'Subnet': '172.26.0.0/16' } ] }, 'Internal': false, 'Attachable': false, 'Ingress': false, 'ConfigFrom': { 'Network': '' }, 'ConfigOnly': false, 'Containers': {}, 'Options': {}, 'Labels': {} }]2 開始部署
2.1 創(chuàng)建六個Redis節(jié)點的配置
for port in $(seq 1 6); do mkdir -p /Users/winfun/mydata/redis/node-${port}/conftouch /Users/winfun/mydata/redis/node-${port}/conf/redis.confcat << EOF >/Users/winfun/mydata/redis/node-${port}/conf/redis.confport 6379bind 0.0.0.0cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000cluster-announce-ip 172.26.0.1${port}cluster-announce-port 6379cluster-announce-bus-port 16379appendonly yesEOFdone
2.2 啟動容器
for port in $(seq 1 6); do docker run -p 637${port}:6379 -p 1637${port}:16379 --name redis-${port} -v /Users/winfun/mydata/redis/node-${port}/data:/data -v /Users/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.confdone
2.3 查看啟動成功的6個容器
winfun@localhost mydata % docker ps | grep redised5972e988e8 redis:5.0.9-alpine3.11 'docker-entrypoint.s…' 11 seconds ago Up 10 seconds 0.0.0.0:6376->6379/tcp, 0.0.0.0:16376->16379/tcp redis-661cd467bc803 redis:5.0.9-alpine3.11 'docker-entrypoint.s…' 12 seconds ago Up 11 seconds 0.0.0.0:6375->6379/tcp, 0.0.0.0:16375->16379/tcp redis-5113943ba6586 redis:5.0.9-alpine3.11 'docker-entrypoint.s…' 12 seconds ago Up 11 seconds 0.0.0.0:6374->6379/tcp, 0.0.0.0:16374->16379/tcp redis-45fc3c838851c redis:5.0.9-alpine3.11 'docker-entrypoint.s…' 13 seconds ago Up 12 seconds 0.0.0.0:6373->6379/tcp, 0.0.0.0:16373->16379/tcp redis-3f7d4430f752b redis:5.0.9-alpine3.11 'docker-entrypoint.s…' 13 seconds ago Up 12 seconds 0.0.0.0:6372->6379/tcp, 0.0.0.0:16372->16379/tcp redis-2bd3e4a593427 redis:5.0.9-alpine3.11 'docker-entrypoint.s…' 14 seconds ago Up 13 seconds 0.0.0.0:6371->6379/tcp, 0.0.0.0:16371->16379/tcp redis-13 再查看網(wǎng)絡(luò)
3.1 查看網(wǎng)絡(luò)中的容器
我們上面啟動容器時,都指定使用 redis-net 網(wǎng)絡(luò),所以我們可以先看看 redis-net 網(wǎng)絡(luò)的信息:我們可以看到 “Containers”包含了我們啟動的6個容器,也就是6個redis 節(jié)點。
winfun@localhost mydata % docker network inspect redis-net[ { 'Name': 'redis-net', 'Id': 'aed8340bbf8ab86cedc1d990eb7612854ba2b0bd4eae0f978ff95eadc3dbcf65', 'Created': '2020-10-22T08:46:55.695434Z', 'Scope': 'local', 'Driver': 'bridge', 'EnableIPv6': false, 'IPAM': { 'Driver': 'default', 'Options': {}, 'Config': [ { 'Subnet': '172.26.0.0/16' } ] }, 'Internal': false, 'Attachable': false, 'Ingress': false, 'ConfigFrom': { 'Network': '' }, 'ConfigOnly': false, 'Containers': { '113943ba6586a4ac21d1c068b0535d5b4ef37da50141d648d30dab47eb47d3af': { 'Name': 'redis-4', 'EndpointID': '3fe3b4655f39f90ee4daf384254d3f7548cddd19c384e0a26edb6a32545e5b30', 'MacAddress': '02:42:ac:1a:00:0e', 'IPv4Address': '172.26.0.14/16', 'IPv6Address': '' }, '5fc3c838851c0ca2f629457bc3551135567b4e9fb155943711e07a91ebe9827f': { 'Name': 'redis-3', 'EndpointID': 'edd826ca267714bea6bfddd8c5d6a5f3c71c50bd50381751ec40e9f8e8160dce', 'MacAddress': '02:42:ac:1a:00:0d', 'IPv4Address': '172.26.0.13/16', 'IPv6Address': '' }, '61cd467bc8030c4db9a4404b718c5c927869bed71609bec91e17ff0da705ae26': { 'Name': 'redis-5', 'EndpointID': '7612c44ab2479ab62341eba2e30ab26f4c523ccbe1aa357fc8b7c17a368dba61', 'MacAddress': '02:42:ac:1a:00:0f', 'IPv4Address': '172.26.0.15/16', 'IPv6Address': '' }, 'bd3e4a593427aab4750358330014422500755552c8b470f0fd7c1e88221db984': { 'Name': 'redis-1', 'EndpointID': '400153b712859c5c17d99708586f30013bb28236ba0dead516cf3d01ea071909', 'MacAddress': '02:42:ac:1a:00:0b', 'IPv4Address': '172.26.0.11/16', 'IPv6Address': '' }, 'ed5972e988e8301179249f6f9e82c8f9bb4ed801213fe49af9d3f31cbbe00db7': { 'Name': 'redis-6', 'EndpointID': 'b525b7bbdd0b0150f66b87d55e0a8f1208e113e7d1d421d1a0cca73dbb0c1e47', 'MacAddress': '02:42:ac:1a:00:10', 'IPv4Address': '172.26.0.16/16', 'IPv6Address': '' }, 'f7d4430f752b5485c5a90f0dc6d1d9a826d782284b1badbd203c12353191bc57': { 'Name': 'redis-2', 'EndpointID': 'cbdc77cecda1c8d80f566bcc3113f37c1a7983190dbd7ac2e9a56f6b7e4fb21f', 'MacAddress': '02:42:ac:1a:00:0c', 'IPv4Address': '172.26.0.12/16', 'IPv6Address': '' } }, 'Options': {}, 'Labels': {} }]
3.2 查看容器間是否能網(wǎng)絡(luò)互通
我們還可以嘗試利用 redis-1 來對 redis-2 執(zhí)行 ping 命令,看看網(wǎng)絡(luò)是否可以互通:
winfun@localhost mydata % docker exec -it redis-1 ping redis-2PING redis-2 (172.26.0.12): 56 data bytes64 bytes from 172.26.0.12: seq=0 ttl=64 time=0.136 ms64 bytes from 172.26.0.12: seq=1 ttl=64 time=0.190 ms64 bytes from 172.26.0.12: seq=2 ttl=64 time=0.483 ms^C--- redis-2 ping statistics ---3 packets transmitted, 3 packets received, 0% packet lossround-trip min/avg/max = 0.136/0.269/0.483 ms4 創(chuàng)建集群
4.1 利用 redis-cli 命令創(chuàng)建集群:
winfun@localhost conf % docker exec -it redis-1 /bin/bashOCI runtime exec failed: exec failed: container_linux.go:349: starting container process caused 'exec: '/bin/bash': stat /bin/bash: no such file or directory': unknown# 只能使用sh,redis 的鏡像沒有 bashwinfun@localhost mydata % docker exec -it redis-1 /bin/sh/data # cd /usr/local/bin//usr/local/bin # redis-cli --cluster create 172.26.0.11:6379 172.26.0.12:6379 172.26.0.13:6379 172.26.0.14:6379 172.26.0.15:6379 172.26.0.16:6379 --cluster-replicas 1 >>> Performing hash slots allocation on 6 nodes...Master[0] -> Slots 0 - 5460Master[1] -> Slots 5461 - 10922Master[2] -> Slots 10923 - 16383Adding replica 172.26.0.15:6379 to 172.26.0.11:6379Adding replica 172.26.0.16:6379 to 172.26.0.12:6379Adding replica 172.26.0.14:6379 to 172.26.0.13:6379M: 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379 slots:[0-5460] (5461 slots) masterM: 43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379 slots:[5461-10922] (5462 slots) masterM: 1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379 slots:[10923-16383] (5461 slots) masterS: 92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379 replicates 1e504dc62b7ccc426d513983ca061d1657532fb6S: 7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379 replicates 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82S: 203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379 replicates 43e173849bed74f5bd389f9b272ecf0399ae448fCan I set the above configuration? (type ’yes’ to accept): yes>>> Nodes configuration updated>>> Assign a different config epoch to each node>>> Sending CLUSTER MEET messages to join the clusterWaiting for the cluster to join...>>> Performing Cluster Check (using node 172.26.0.11:6379)M: 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379 slots:[0-5460] (5461 slots) master 1 additional replica(s)S: 92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379 slots: (0 slots) slave replicates 1e504dc62b7ccc426d513983ca061d1657532fb6S: 203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379 slots: (0 slots) slave replicates 43e173849bed74f5bd389f9b272ecf0399ae448fM: 1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379 slots:[10923-16383] (5461 slots) master 1 additional replica(s)S: 7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379 slots: (0 slots) slave replicates 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82M: 43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379 slots:[5461-10922] (5462 slots) master 1 additional replica(s)[OK] All nodes agree about slots configuration.>>> Check for open slots...>>> Check slots coverage...[OK] All 16384 slots covered.
4.2 利用 redis-cli 連接當前節(jié)點,查看集群信息:
/usr/local/bin # redis-cli -c127.0.0.1:6379> cluster infocluster_state:okcluster_slots_assigned:16384cluster_slots_ok:16384cluster_slots_pfail:0cluster_slots_fail:0cluster_known_nodes:6cluster_size:3cluster_current_epoch:6cluster_my_epoch:1cluster_stats_messages_ping_sent:91cluster_stats_messages_pong_sent:95cluster_stats_messages_sent:186cluster_stats_messages_ping_received:90cluster_stats_messages_pong_received:91cluster_stats_messages_meet_received:5cluster_stats_messages_received:186
4.3 嘗試增加一個key
# 設(shè)置一個key,返回提示這個key分配到槽[12539],對應(yīng)的是節(jié)點 redis-3[192.168.0.13]127.0.0.1:6379> set key hello-> Redirected to slot [12539] located at 172.26.0.13:6379OK# 并且會將 redis-cli 切換到節(jié)點 redis-3[172.26.0.13]172.26.0.13:6379>
5 測試
至此,應(yīng)該可以說,我們已經(jīng)成功利用 Docker 在本地部署了一套 Redis 集群。那么接下來,我們會直接在代碼中測試這Redis 是否可以使用。
/** * 測試Redis集群 * @author winfun * @date 2020/10/21 5:48 下午 **/public class TestCluster { public static void main(String[] args) throws Exception{ Set<HostAndPort> nodes = new HashSet<>(3); nodes.add(new HostAndPort('127.0.0.1',6371)); nodes.add(new HostAndPort('127.0.0.1',6372)); nodes.add(new HostAndPort('127.0.0.1',6373)); JedisCluster cluster = new JedisCluster(nodes); String value = cluster.get('key'); System.out.println('get: key is key,value is '+value); String result = cluster.set('key2','hello world'); System.out.println('set: key is key2,result is '+result); cluster.close(); }}
但是結(jié)果是不如意的,返回的是一個異常:
從這里可以猜測到,估計是沒法連接到我們在 Docker 中部署的 Redis 集群。所以在下次調(diào)試的時候,我就看看 JedisCluster 拿到的集群節(jié)點的信息是怎么樣的。如下圖:
我們可以看到,即使我們給 JedisCluster 配置的寫的是本地 IP 和映射好的 Port。
但是沒想到,JedisCluster 自己又拿里一遍集群的元數(shù)據(jù),此時候的節(jié)點的IP都是自定義網(wǎng)絡(luò) redis-net 分配的子網(wǎng)了,宿主機可能就走不通了(關(guān)于這個問題,我們可以考慮使用 host 類型的自定義網(wǎng)絡(luò))。
6 應(yīng)用也部署到自定義網(wǎng)絡(luò)中
那么怎么測試呢?
我下面將自己編寫一個簡單的 SpringBoot 項目,然后利用 Dockerfile 根據(jù)項目生成的 jar 包構(gòu)建成一個鏡像,然后利用 Docker 部署起來,并且將部署后的容器加入到自定義網(wǎng)絡(luò) redis-net 中,最后進行測試。
6.1 創(chuàng)建 SpringBoot 項目
配置如下:
6.1.1 pom.xml:
主要引入了 web 和 redis 的 starter。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency>
6.1.2 項目的 application.properties :
server.port=8080# 這里我們也可以直接寫容器名,因為應(yīng)用會部署到 Redis 集群的同一個網(wǎng)絡(luò)中。#spring.redis.cluster.nodes=redis-1:6379,redis-2:6379,redis-3:6379spring.redis.cluster.nodes=172.26.0.11:6379,172.26.0.12:6379,172.26.0.13:6379
6.1.3 Controller如下:
/** * RedisCluster 測試 * @author winfun * @date 2020/10/22 3:19 下午 **/@RequestMapping('/redisCluster')@RestControllerpublic class RedisClusterController { @Autowired private StringRedisTemplate redisTemplate; /*** * String:根據(jù) key 獲取 value * @author winfun * @param key key * @return {@link String } **/ @GetMapping('/get/{key}') public String get(@PathVariable('key') String key){ return redisTemplate.opsForValue().get(key); } /*** * String:設(shè)置 key/value 對 * @author winfun * @param key key * @param value value * @return {@link String } **/ @GetMapping('/set/{key}/{value}') public String set(@PathVariable('key') String key,@PathVariable('value') String value){ redisTemplate.opsForValue().set(key,value); return 'success'; }}
6.2 將項目打包并生成鏡像
6.2.1 將項目打包成 Jar 包
mvn clean package
6.2.2 生成鏡像
編寫 Dockerfile 文件:
FROM java:8MAINTAINER winfun# jar 名稱為項目打包后的 jarADD redis-cluster-test-0.0.1-SNAPSHOT.jar app.jarEXPOSE 8080ENTRYPOINT ['java','-jar','app.jar']
接著去到 Dockerfile 當前目錄,執(zhí)行下面命令:
winfun@localhost redis-cluster-test % docker build -t winfun/rediscluster . Sending build context to Docker daemon 25.84MBStep 1/5 : FROM java:88: Pulling from library/java5040bd298390: Pull complete fce5728aad85: Pull complete 76610ec20bf5: Pull complete 60170fec2151: Pull complete e98f73de8f0d: Pull complete 11f7af24ed9c: Pull complete 49e2d6393f32: Pull complete bb9cdec9c7f3: Pull complete Digest: sha256:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9dStatus: Downloaded newer image for java:8 ---> d23bdf5b1b1bStep 2/5 : MAINTAINER winfun ---> Running in a99086ed7e68Removing intermediate container a99086ed7e68 ---> f713578122fcStep 3/5 : ADD redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar ---> 12ca98d789b8Step 4/5 : EXPOSE 8080 ---> Running in 833a06f2dd32Removing intermediate container 833a06f2dd32 ---> 82f4e078510dStep 5/5 : ENTRYPOINT ['java','-jar','app.jar'] ---> Running in 517a1ea7f138Removing intermediate container 517a1ea7f138 ---> ed8a66ef4eb9Successfully built ed8a66ef4eb9Successfully tagged winfun/rediscluster:latest
6.3 啟動容器,進行測試
6.3.1 啟動容器,并將容器加入上面創(chuàng)建的自定義網(wǎng)絡(luò) redis-net
構(gòu)建后,我們可以利用 docker ps 命令看看我們的鏡像:
winfun@localhost ~ % docker images | grep redisclusterwinfun/rediscluster latest ed8a66ef4eb9 52 minutes ago 669MB
利用 docker run 命令運行此鏡像啟動一個容器:
winfun@localhost ~ % docker run -it -d -p 8787:8080 --name myrediscluster winfun/rediscluster705998330f7e6941f5f96d187050d29c4a59f1b16348ebeb5ab0dbc6a1cd63e1
利用 docker network connect 將這個容器加入到上面的自定義網(wǎng)絡(luò) redis-net 中:
winfun@localhost ~ % docker network connect redis-net myrediscluster
當我們再查看自定義網(wǎng)絡(luò) redis-net 的詳情,我們可以在 Containers 中找到 myrediscluster 這個容器,并且還給這個容器分配了自定義網(wǎng)絡(luò) redis-net 的一個 IP 地址。如下圖:
6.3.2 我們此時可以直接到瀏覽器調(diào)用 RedisClusterController的接口:
設(shè)置一個 key/value:
根據(jù)key獲取value:
從上面可以看到,已經(jīng)完全沒問題了。
但是呢,這樣我們每次測接口,都需要重新構(gòu)建鏡像然后部署。
6.4 bridge 和 host 模式
我們都知道,上面我們創(chuàng)建的自定義網(wǎng)絡(luò) redis-net 的模式是橋接模式,也就是 bridge。
他的最大特點是將 Docker 中容器的網(wǎng)絡(luò)和宿主機隔離開來,容器的IP和宿主機的IP是不通的,所以在上面利用 JedisCluster 來操作 Redis 集群時,當 JedisCluster 獲取到集群的節(jié)點信息是 Docker 中容器的 IP 時,是訪問不通的。
所以解決這個問題,其實我們可以利用 host 模式,它的原理其實就是容器共享宿主機的網(wǎng)絡(luò)環(huán)境。這樣的話,JedisCluster 訪問 Redis 集群應(yīng)該就沒問題了。
對,就是應(yīng)該,因為我自己嘗試了很多遍 host 模式下的 Redis 集群部署,部署和利用 redis-cli 命令操作都是沒問題的。但是,當利用 JedisCluster 訪問集群時,連集群節(jié)點的信息都沒拿到!!
所以需要大家自己去嘗試一下,具體可參考下面的文章:https://www.cnblogs.com/niceyoo/p/13011626.html
7 最后到此,我相信大家都體驗了一波 Docker 的強大。在開發(fā)時利用好,簡直就是開發(fā)的神器。可以在本地利用最少的系統(tǒng)資源,輕松地去搭建一套完整的開發(fā)環(huán)境,包括各種中間件。
到此這篇關(guān)于Docker 部署單機版 Pulsar 和集群架構(gòu) Redis(開發(fā)神器)的文章就介紹到這了,更多相關(guān)Docker 部署Redis集群內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. IntelliJ IDEA設(shè)置默認瀏覽器的方法2. idea設(shè)置提示不區(qū)分大小寫的方法3. HTTP協(xié)議常用的請求頭和響應(yīng)頭響應(yīng)詳解說明(學習)4. IntelliJ IDEA創(chuàng)建web項目的方法5. VMware中如何安裝Ubuntu6. docker容器調(diào)用yum報錯的解決辦法7. .NET SkiaSharp 生成二維碼驗證碼及指定區(qū)域截取方法實現(xiàn)8. CentOS郵件服務(wù)器搭建系列—— POP / IMAP 服務(wù)器的構(gòu)建( Dovecot )9. css代碼優(yōu)化的12個技巧10. django創(chuàng)建css文件夾的具體方法
