Docker 部署单机版 Pulsar 和集群架构 Redis(开发神器)的方法

一、前言:

现在互联网的技术架构中,不断出现各种各样的中间件,例如 MQ、Redis、Zookeeper,这些中间件在部署的时候一般都是以主从架构或者集群的架构来部署,公司一般都会在开发环境、测试环境和生产环境各部署一套。

当我们开发的时候,一般就会连着开发环境。但是呢,一般公司的开发环境都只能在内网使用,当我们回家了,除非公司提供有 VPN,不然就没办法使用了。有时候我们是有VPN了,但是开发起来还是很不方便。例如我们现在的 MQ 中间件使用的是 Pulsar,但是 Pulsar 的 tenant 和 namespace 都是不能自动创建的,所以平时开发起来非常的不方便,只能每次需要时都找一遍 DBA。

所以,一般我们都会在本地自己部署一套,但是自己部署有下面的两个难点:

中间件有自己的实现语言,例如 RabbitMQ,当我们部署 RabbitMQ 时,首先要安装好 Erlang 语言。部署集群架构会耗费大量的系统资源,导致本来资源就吃紧的笔记本更加卡顿,开发起来非常的不爽。

二、Docker:

Docker 可以完美地解决上面的问题,并且让部署变得极其的简单。下面以我自己用到的中间件为例子。

A、Pulsar:

上面提到,Pulsar 的租户是不能自动创建的,命名空间也是不能自动创建的,如果我们要使用,只能找到负责这块的同事帮忙创建了。而我最近做的功能:广播中心和会员导出都使用到 Pulsar,但是不想麻烦同事,而且我经常会在家里干活,所以
最后直接到官网上面,找了本地如何部署

官网介绍了多种部署方式:有利用压缩包的,Docker的,Kubernetes的。当然了,有 Docker 的部署方式,我们必须使用 Docker 的部署方式,反正拉取一个镜像启动一个容器就直接搞定了,相当的方便。

下面上命令:

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端口号开放出来,并绑定到宿主机对应的端口号,这样我们能直接访问宿主机 ip:port 就能访问到容器。接着,将 Pulsar 的 data 和 conf 挂载到宿主机中,这样数据就不会丢失了。接着利用 pulsar standalone 命令启动一个单机版的 Pulsar。

接着,不管我们是需要创建租户或者命名空间,直接进入容器中创建即可。
进入容器:

docker exec -it mypulsar /bin/bash

关于tenant 和 namespace 的增删改查命令:

## 1 租户
#查看有哪些租户(public 是系统默认的租户)
pulsar-admin tenants list
##创建租户
pulsar-admin tenants create my-tenant
#删除租户
pulsar-admin tenants delete my-tenant
## 2 命名空间
#查看指定租户下边的命名空间
pulsar-admin namespaces list my-tenant
#创建指定租户命名空间
pulsar-admin namespaces create my-tenant/my-namespace
#删除指定租户命名空间
pulsar-admin namespaces delete my-tenant/my-namespace

B、Redis:

Redis 一般我们生产的架构都是使用 Cluster 的,但是如果是自己部署一套集群的 Redis,是相当的麻烦,以前我自己也写过文章:Linux 部署 Redis 集群

如果使用 Docker 的话,会非常的简单。

1 自定义网络

1.1 创建 Redis 的专属网络

Redis 集群的各个节点公用一个专属网络,节点间就可以互相访问了,而避免了每个节点之间都要用 --link 去做网络互通。

docker network create 命令创建的网络默认是 bridge 模式。

winfun@localhost ~ % docker network create redis-net --subnet 172.26.0.0/16
5001355940f43474d59f5cb2d78e4e9eeb0a9827e53d8f9e5b55e7d3c5285a09
winfun@localhost ~ % docker network list
NETWORK ID  NAME  DRIVER  SCOPE
4d88d473e947 bridge  bridge  local
79a915fafbb5 host  host  local
f56e362d3c68 none  null  local
5001355940f4 redis-net  bridge  local
winfun@localhost ~ % 

1.2 查看自定义网络详情

我们可以利用命令 docker network inspect redis-net 来查看自定义网络的详情,可以看到现在网络里面是没有容器的。

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 创建六个Redis节点的配置

for port in $(seq 1 6); \
do \
mkdir -p /Users/winfun/mydata/redis/node-${port}/conf
touch /Users/winfun/mydata/redis/node-${port}/conf/redis.conf
cat << EOF >/Users/winfun/mydata/redis/node-${port}/conf/redis.conf
port 6379
bind 0.0.0.0
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 172.26.0.1${port}
cluster-announce-port 6379
cluster-announce-bus-port 16379
appendonly yes
EOF
done

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.conf
done

2.3 查看启动成功的6个容器

winfun@localhost mydata % docker ps | grep redis
ed5972e988e8 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-6
61cd467bc803 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-5
113943ba6586 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-4
5fc3c838851c 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-3
f7d4430f752b 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-2
bd3e4a593427 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-1

3 再查看网络

3.1 查看网络中的容器

我们上面启动容器时,都指定使用 redis-net 网络,所以我们可以先看看 redis-net 网络的信息:
我们可以看到 “Containers”包含了我们启动的6个容器,也就是6个redis 节点。

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 查看容器间是否能网络互通

我们还可以尝试利用 redis-1 来对 redis-2 执行 ping 命令,看看网络是否可以互通:

winfun@localhost mydata % docker exec -it redis-1 ping redis-2
PING redis-2 (172.26.0.12): 56 data bytes
64 bytes from 172.26.0.12: seq=0 ttl=64 time=0.136 ms
64 bytes from 172.26.0.12: seq=1 ttl=64 time=0.190 ms
64 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 loss
round-trip min/avg/max = 0.136/0.269/0.483 ms

4 创建集群

4.1 利用 redis-cli 命令创建集群:

winfun@localhost conf % docker exec -it redis-1 /bin/bash
OCI 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 的镜像没有 bash
winfun@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 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
>>> Performing hash slots allocation on 6 nodes...
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383
Adding replica 172.26.0.15:6379 to 172.26.0.11:6379
Adding replica 172.26.0.16:6379 to 172.26.0.12:6379
Adding replica 172.26.0.14:6379 to 172.26.0.13:6379
M: 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82 172.26.0.11:6379
 slots:[0-5460] (5461 slots) master
M: 43e173849bed74f5bd389f9b272ecf0399ae448f 172.26.0.12:6379
 slots:[5461-10922] (5462 slots) master
M: 1e504dc62b7ccc426d513983ca061d1657532fb6 172.26.0.13:6379
 slots:[10923-16383] (5461 slots) master
S: 92b95f18226903349fb860262d2fe6932d5a8dc2 172.26.0.14:6379
 replicates 1e504dc62b7ccc426d513983ca061d1657532fb6
S: 7e5116ba9ee7bb70a68f4277efcbbbb3dcfd18af 172.26.0.15:6379
 replicates 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82
S: 203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379
 replicates 43e173849bed74f5bd389f9b272ecf0399ae448f
Can 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 cluster
Waiting 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 1e504dc62b7ccc426d513983ca061d1657532fb6
S: 203e3e33b9f4233b58028289d0ad2dd56e7dfe45 172.26.0.16:6379
 slots: (0 slots) slave
 replicates 43e173849bed74f5bd389f9b272ecf0399ae448f
M: 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 6de9e9eef91dbae773d8ee1d629c87e1e7e19b82
M: 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 连接当前节点,查看集群信息:

/usr/local/bin # redis-cli -c
127.0.0.1:6379> cluster info
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3
cluster_current_epoch:6
cluster_my_epoch: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 尝试增加一个key

# 设置一个key,返回提示这个key分配到槽[12539],对应的是节点 redis-3[192.168.0.13]
127.0.0.1:6379> set key hello
-> Redirected to slot [12539] located at 172.26.0.13:6379
OK
# 并且会将 redis-cli 切换到节点 redis-3[172.26.0.13]
172.26.0.13:6379>

5 测试

至此,应该可以说,我们已经成功利用 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();
 }
}

但是结果是不如意的,返回的是一个异常:

从这里可以猜测到,估计是没法连接到我们在 Docker 中部署的 Redis 集群。
所以在下次调试的时候,我就看看 JedisCluster 拿到的集群节点的信息是怎么样的。
如下图:

我们可以看到,即使我们给 JedisCluster 配置的写的是本地 IP 和映射好的 Port。

但是没想到,JedisCluster 自己又拿里一遍集群的元数据,此时候的节点的IP都是自定义网络 redis-net 分配的子网了,宿主机可能就走不通了(关于这个问题,我们可以考虑使用 host 类型的自定义网络)。

6 应用也部署到自定义网络中

那么怎么测试呢?

我下面将自己编写一个简单的 SpringBoot 项目,然后利用 Dockerfile 根据项目生成的 jar 包构建成一个镜像,然后利用 Docker 部署起来,并且将部署后的容器加入到自定义网络 redis-net 中,最后进行测试。

6.1 创建 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
# 这里我们也可以直接写容器名,因为应用会部署到 Redis 集群的同一个网络中。
#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 Controller如下:

/**
 * RedisCluster 测试
 * @author winfun
 * @date 2020/10/22 3:19 下午
 **/
@RequestMapping("/redisCluster")
@RestController
public class RedisClusterController {

 @Autowired
 private StringRedisTemplate redisTemplate;

 /***
 * String:根据 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:设置 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:8
MAINTAINER winfun

# jar 名称为项目打包后的 jar
ADD redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java","-jar","app.jar"]

接着去到 Dockerfile 当前目录,执行下面命令:

winfun@localhost redis-cluster-test % docker build -t winfun/rediscluster .
Sending build context to Docker daemon 25.84MB
Step 1/5 : FROM java:8
8: Pulling from library/java
5040bd298390: 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:c1ff613e8ba25833d2e1940da0940c3824f03f802c449f3d1815a66b7f8c0e9d
Status: Downloaded newer image for java:8
 ---> d23bdf5b1b1b
Step 2/5 : MAINTAINER winfun
 ---> Running in a99086ed7e68
Removing intermediate container a99086ed7e68
 ---> f713578122fc
Step 3/5 : ADD redis-cluster-test-0.0.1-SNAPSHOT.jar app.jar
 ---> 12ca98d789b8
Step 4/5 : EXPOSE 8080
 ---> Running in 833a06f2dd32
Removing intermediate container 833a06f2dd32
 ---> 82f4e078510d
Step 5/5 : ENTRYPOINT ["java","-jar","app.jar"]
 ---> Running in 517a1ea7f138
Removing intermediate container 517a1ea7f138
 ---> ed8a66ef4eb9
Successfully built ed8a66ef4eb9
Successfully tagged winfun/rediscluster:latest

6.3 启动容器,进行测试

6.3.1 启动容器,并将容器加入上面创建的自定义网络 redis-net

构建后,我们可以利用 docker ps 命令看看我们的镜像:

winfun@localhost ~ % docker images | grep rediscluster
winfun/rediscluster latest  ed8a66ef4eb9 52 minutes ago 669MB

利用 docker run 命令运行此镜像启动一个容器:

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

利用 docker network connect 将这个容器加入到上面的自定义网络 redis-net 中:

winfun@localhost ~ % docker network connect redis-net myrediscluster

当我们再查看自定义网络 redis-net 的详情,我们可以在 Containers 中找到 myrediscluster 这个容器,并且还给这个容器分配了自定义网络 redis-net 的一个 IP 地址。
如下图:

6.3.2 我们此时可以直接到浏览器调用 RedisClusterController的接口:

设置一个 key/value:

根据key获取value:

从上面可以看到,已经完全没问题了。

但是呢,这样我们每次测接口,都需要重新构建镜像然后部署。

6.4 bridge 和 host 模式

我们都知道,上面我们创建的自定义网络 redis-net 的模式是桥接模式,也就是 bridge。

他的最大特点是将 Docker 中容器的网络和宿主机隔离开来,容器的IP和宿主机的IP是不通的,所以在上面利用 JedisCluster 来操作 Redis 集群时,当 JedisCluster 获取到集群的节点信息是 Docker 中容器的 IP 时,是访问不通的。

所以解决这个问题,其实我们可以利用 host 模式,它的原理其实就是容器共享宿主机的网络环境。这样的话,JedisCluster 访问 Redis 集群应该就没问题了。

对,就是应该,因为我自己尝试了很多遍 host 模式下的 Redis 集群部署,部署和利用 redis-cli 命令操作都是没问题的。但是,当利用 JedisCluster 访问集群时,连集群节点的信息都没拿到!!

所以需要大家自己去尝试一下,具体可参考下面的文章:
https://www.cnblogs.com/niceyoo/p/13011626.html

7 最后

到此,我相信大家都体验了一波 Docker 的强大。在开发时利用好,简直就是开发的神器。可以在本地利用最少的系统资源,轻松地去搭建一套完整的开发环境,包括各种中间件。

到此这篇关于Docker 部署单机版 Pulsar 和集群架构 Redis(开发神器)的文章就介绍到这了,更多相关Docker 部署Redis集群内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • docker redis5.0 cluster集群搭建的实现

    系统环境:ubuntu16.04LTS 本文是使用 6 个 docker 容器搭建单机集群测试,实际环境如果是多台,可对应修改容器数量.端口号和集群 ip 地址,每台机器都按下面步骤同样操作即可. 拉取redis官方镜像 docker pull redis:5.0 创建配置文件和数据目录 创建目录 mkdir ~/redis_cluster cd ~/redis_cluster 新建一个模板文件sudo vim redis_cluster.tmpl,填入如下内容: # redis端口 port

  • 详解docker搭建redis集群的环境搭建

    本文介绍了docker搭建redis集群的环境搭建,分享给大家,废话不多说,具体如下: 下载镜像 docker pull redis 准备配置文件 mkdir /home/docker/redis/ wget https://raw.githubusercontent.com/antirez/redis/3.0/redis.conf -O /home/docker/redis/redis.conf cd /home/docker/redis/ sed -i 's/# slaveof <maste

  • Docker快速搭建Redis集群的方法示例

    什么是Redis集群 Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能. 节点 一个Redis集群通常由多个节点(node)组成,在刚开始的时候,每个节点都是相互独立的,它们都处于一个只包含自己的集群当中,要组建一个真正可工作的集群,我们必须将各个独立的节点连接起来,构成一个包含多个节点的集群. 集群配置 配置文件 下载配置文件:https://raw.githubusercontent.com/antirez/redis

  • 基于docker搭建redis-sentinel集群的方法示例

    1.概述 Redis 集群可以在一组 redis 节点之间实现高可用性和 sharding.在集群中会有 1 个 master 和多个 slave 节点.当 master 节点失效时,应选举出一个 slave 节点作为新的 master.然而 Redis 本身(包括它的很多客户端)没有实现自动故障发现并进行主备切换的能力,需要外部的监控方案来实现自动故障恢复. Redis Sentinel 是官方推荐的高可用性解决方案.它是 Redis 集群的监控管理工具,可以提供节点监控.通知.自动故障恢复和

  • Docker 部署单机版 Pulsar 和集群架构 Redis(开发神器)的方法

    一.前言: 现在互联网的技术架构中,不断出现各种各样的中间件,例如 MQ.Redis.Zookeeper,这些中间件在部署的时候一般都是以主从架构或者集群的架构来部署,公司一般都会在开发环境.测试环境和生产环境各部署一套. 当我们开发的时候,一般就会连着开发环境.但是呢,一般公司的开发环境都只能在内网使用,当我们回家了,除非公司提供有 VPN,不然就没办法使用了.有时候我们是有VPN了,但是开发起来还是很不方便.例如我们现在的 MQ 中间件使用的是 Pulsar,但是 Pulsar 的 tena

  • 关于Rancher部署并导入K8S集群的问题

    Rancher 的部署可以有三种架构: 高可用 Kubernetes 安装: 建议使用 Kubernetes 程序包管理器 Helm 在专用的 Kubernetes 集群上安装 Rancher.在 RKE 集群中,需要使用三个节点以实现高可用性.在 K3s 集群(轻量级kubernetes)中,仅需要两个节点即可. 单节点 Kubernetes 安装: 另一个选择是在 Kubernetes 集群上使用 Helm 安装 Rancher,仅在集群中使用单个节点.虽然在这种情况下的 Rancher S

  • 使用Docker Swarm搭建分布式爬虫集群的方法示例

    在爬虫开发过程中,你肯定遇到过需要把爬虫部署在多个服务器上面的情况.此时你是怎么操作的呢?逐一SSH登录每个服务器,使用git拉下代码,然后运行?代码修改了,于是又要一个服务器一个服务器登录上去依次更新? 有时候爬虫只需要在一个服务器上面运行,有时候需要在200个服务器上面运行.你是怎么快速切换的呢?一个服务器一个服务器登录上去开关?或者聪明一点,在Redis里面设置一个可以修改的标记,只有标记对应的服务器上面的爬虫运行? A爬虫已经在所有服务器上面部署了,现在又做了一个B爬虫,你是不是又得依次

  • docker-compose部署zk+kafka+storm集群的实现

    集群部署总览 172.22.12.20 172.22.12.21 172.22.12.22 172.22.12.23 172.22.12.24 zoo1:2181 zoo2:2182 zoo3:2183 zkui:9090 (admin/manager) kafka1:9092 kafka2:9092 kafka3:9092 kafdrop:9000 influxdb:8086 grafana:3000 (admin/chanhu) storm-nimbus1 storm-nimbus2 sto

  • Java Rabbitmq中四种集群架构的区别详解

    目录 主备模式 远程模式 镜像模式 多活模式 Federation插件 总结 Rabbitmq 四种集群架构 1. 主备模式 2. 远程模式3. 镜像模式  4. 多活模式 主备模式 主备模式: warren 兔子窝 一个主.一个备方案 主节点如果挂了 从节点提供服务 和Activemq 利用zk 做主/备一样 主备模式 ----------------------->HaProxy 配置 listen rabbitmq_cluster bind 0.0.0.0:5682 # 配置tcp 模式

  • 在CentOS中部署多节点Citus集群的详细步骤

    前言 本文主要介绍了关于CentOS中部署多节点Citus集群的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 1.在所有节点执行以下步骤 Step 01 添加Citus Repostory # Add Citus repository for package manager curl https://install.citusdata.com/community/rpm.sh | sudo bash Step 02 安装Citus并且初始化DB # install

  • Docker微服务的ETCD集群搭建教程详解

    目录 etcd的特性 Etcd构建自身高可用集群主要有三种形式 本次搭建的基础环境 1.将服务器挨个添加进集群 2.将服务器统一添加进集群 etcd api接口 服务注册与发现 etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现.etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性.Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的

  • Docker搭建RabbitMq的普通集群和镜像集群的详细操作

    目录 一.搭建RabbitMq的运行环境 1.通过search查询rabbitmq镜像 2.通过pull拉取rabbitmq的官方最新镜像 3.创建容器 4.启动管理页面 5.设置erlang cookie 二.普通模式 三.镜像模式 普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构.交换器结构.vhost等.消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法消费消息,如果做了消息持久化,那么得等

  • Quartz集群原理以及配置应用的方法详解

    1.Quartz任务调度的基本实现原理 Quartz是OpenSymphony开源组织在任务调度领域的一个开源项目,完全基于Java实现.作为一个优秀的开源调度框架,Quartz具有以下特点: (1)强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求: (2)灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式: (3)分布式和集群能力,Terracotta收购后在原来功能基础上作了进一步提升.本文将对该部分相加阐述. 1.1 Quartz 核心元素

  • Spark 集群执行任务失败的故障处理方法

    引言 昨天(2023-02-22)开始发现公司 Spark 集群上出现一些任务执行时间过长最后失败,具体表现包括: 大量执行失败的 Task,最终任务也是失败的 在 Spark Master 管理界面上看到任务的 Driver 地址不是真实 IP 地址,而是一个叫做“host.containers.internal”的主机名: Spark 的 worker 节点上能观察到在不停的创建 Java 进程,然后进程瞬间就结束了: 进入 worker 节点的日志目录查看日志内容,发现异常信息为连接 “h

随机推荐