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 的部署方式,反正拉取一个镜像启动一个容器就直接搞定了,相当的方便。
下面上命令:
命令是非常的简单:将 pulsar 的 6650和8080端口号开放出来,并绑定到宿主机对应的端口号,这样我们能直接访问宿主机 ip:port 就能访问到容器。接着,将 pulsar 的 data 和 conf 挂载到宿主机中,这样数据就不会丢失了。接着利用 pulsar standalone 命令启动一个单机版的 pulsar。
接着,不管我们是需要创建租户或者命名空间,直接进入容器中创建即可。
进入容器:
关于tenant 和 namespace 的增删改查命令:
b、redis:
redis 一般我们生产的架构都是使用 cluster 的,但是如果是自己部署一套集群的 redis,是相当的麻烦,以前我自己也写过文章:linux 部署 redis 集群
如果使用 docker 的话,会非常的简单。
1 自定义网络
1.1 创建 redis 的专属网络
redis 集群的各个节点公用一个专属网络,节点间就可以互相访问了,而避免了每个节点之间都要用 --link 去做网络互通。
docker network create 命令创建的网络默认是 bridge 模式。
1.2 查看自定义网络详情
我们可以利用命令 docker network inspect redis-net 来查看自定义网络的详情,可以看到现在网络里面是没有容器的。
2 开始部署
2.1 创建六个redis节点的配置
2.2 启动容器
2.3 查看启动成功的6个容器
3 再查看网络
3.1 查看网络中的容器
我们上面启动容器时,都指定使用 redis-net 网络,所以我们可以先看看 redis-net 网络的信息:
我们可以看到 “containers”包含了我们启动的6个容器,也就是6个redis 节点。
3.2 查看容器间是否能网络互通
我们还可以尝试利用 redis-1 来对 redis-2 执行 ping 命令,看看网络是否可以互通:
4 创建集群
4.1 利用 redis-cli 命令创建集群:
4.2 利用 redis-cli 连接当前节点,查看集群信息:
4.3 尝试增加一个key
5 测试
至此,应该可以说,我们已经成功利用 docker 在本地部署了一套 redis 集群。
那么接下来,我们会直接在代码中测试这redis 是否可以使用。
但是结果是不如意的,返回的是一个异常:
从这里可以猜测到,估计是没法连接到我们在 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。
6.1.2 项目的 application.properties :
6.1.3 controller如下:
6.2 将项目打包并生成镜像
6.2.1 将项目打包成 jar 包
6.2.2 生成镜像
编写 dockerfile 文件:
接着去到 dockerfile 当前目录,执行下面命令:
6.3 启动容器,进行测试
6.3.1 启动容器,并将容器加入上面创建的自定义网络 redis-net
构建后,我们可以利用 docker ps
命令看看我们的镜像:
利用 docker run
命令运行此镜像启动一个容器:
利用 docker network connect
将这个容器加入到上面的自定义网络 redis-net 中:
当我们再查看自定义网络 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 访问集群时,连集群节点的信息都没拿到!!
所以需要大家自己去尝试一下,具体可参考下面的文章:
7 最后
到此,我相信大家都体验了一波 docker 的强大。在开发时利用好,简直就是开发的神器。可以在本地利用最少的系统资源,轻松地去搭建一套完整的开发环境,包括各种中间件。
到此这篇关于docker 部署单机版 pulsar 和集群架构 redis(开发神器)的文章就介绍到这了,更多相关docker 部署redis集群内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
上一篇: 怎样玩转Python
下一篇: 粒子系统优化:Mesh模式下的优化策略