Docker搭建kafka和zookpeer练手案例

Docker搭建kafka和zookpeer

  • Docker
  • zookpeer
  • kafka
    • Kafka中的术语解释
      • 4.1 概述
      • 4.2 broker
      • 4.3 Topic
      • 4.3 Partition
      • 4.4 Producer
      • 4.5 Consumer
      • 4.6 Consumer Group
      • 4.7 Leader
      • 4.8 Follower
      • 4.9 docker安装kafka
  • 搭建管理面板cmak
  • Portainer

Docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。其他本人就不多介绍了!!
其中常见命令有:

命令 解释
docker ps 查看当前运行容器 -a 查看所有容器
docker images 查看镜像
docker start/stop/restart 启动、停止、 重启
docker kill 杀死进程
docker pull 拉取镜像
docker search 搜索镜像
docker save 保存容器或者镜像
docker import 导出镜像
docker exec 进入容器 -it 加上容器id
docker run 启动镜像 并形成容器
docker port 指定的容器的端口映射

例如: docker exec -it 775c7c9ee1e1 /bin/bash 进入容器

这里详细讲解一下doker run :
语法 :docker run [OPTIONS] IMAGE [COMMAND] [ARG…]

-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
ps:例如:8080:8080<前面是宿主机端口,后面才是容器端口(容器端口可以重复,因为不在同一网段,docker会自动给各个容器分配不同网段)>
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
–name=“nginx-lb”: 为容器指定一个名称;
–dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致;
–dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致;
-h “mars”: 指定容器的hostname;
-e username=“ritchie”: 设置环境变量;
–env-file=[]: 从指定文件读入环境变量;
–cpuset=“0-2” or --cpuset=“0,1,2”: 绑定容器到指定CPU运行;
-m :设置容器使用内存最大值;
–net=“bridge”: 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
–link=[]: 添加链接到另一个容器;
–expose=[]: 开放一个端口或一组端口;

zookpeer

ZooKeeper 是一个集中式服务,用于维护配置信息、命名、提供分布式同步和提供组服务。所有这些类型的服务都以某种形式被分布式应用所使用。每次实现这些服务时,都会有大量的工作要去修复不可避免的bug和竞赛条件。由于实现这类服务的困难,应用程序最初通常会吝啬它们,这使得它们在变化面前变得脆弱,难以管理。即使做得正确,这些服务的不同实现也会导致应用部署时的管理复杂性。

ZooKeeper 的目标是将这些不同服务的精髓提炼成一个非常简单的接口,以实现集中式的协调服务。服务本身是分布式的,并且高度可靠。共识、群组管理和存在协议将由服务来实现,这样应用程序就不需要自己去实现它们。这些应用的具体用途将包括Zoo Keeper的具体组件和应用的具体约定的混合物。ZooKeeper Recipes 展示了如何使用这个简单的服务来构建更强大的抽象。

Zookeeper工作流程-Leader

1 .恢复数据;
2 .维持与Learner的心跳,接收Learner请求并判断Learner的请求消息类型;
3.Learner的消息类型主要有PING消息、REQUEST消息、ACK消息、REVALIDATE消息,根据不同的消息类型,进行不同的处理。
PING 消息是指Learner的心跳信息;
REQUEST消息是Follower发送的提议信息,包括写请求及同步请求;
ACK消息是Follower的对提议的回复,超过半数的Follower通过,则commit该提议;
REVALIDATE消息是用来延长SESSION有效时间。

下面是工作图:
Docker搭建kafka和zookpeer练手案例_第1张图片

Zookeeper工作流程-Follower

Follower主要有四个功能:

1.向Leader发送请求(PING消息、REQUEST消息、ACK消息、REVALIDATE消息);
2.接收Leader消息并进行处理;
3.接收Client的请求,如果为写请求,发送给Leader进行投票;
4.返回Client结果。

Follower的消息循环处理如下几种来自Leader的消息:

1 .PING消息: 心跳消息; ‘
2 .PROPOSAL消息:Leader发起的提案,要求Follower投票;
3.COMMIT消息:服务器端最新一次提案的信息;
4 .UPTODATE消息:表明同步完成;
5.REVALIDATE消息:根据Leader的REVALIDATE结果,关闭待revalidate的session还是允许其接受消息;
6.SYNC消息:返回SYNC结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。

Docker搭建kafka和zookpeer练手案例_第2张图片

Zookeeper节点数据操作流程

Docker搭建kafka和zookpeer练手案例_第3张图片
注:

1.在Client向Follwer发出一个写的请求

2.Follwer把请求发送给Leader

3.Leader接收到以后开始发起投票并通知Follwer进行投票

4.Follwer把投票结果发送给Leader

5.Leader将结果汇总后如果需要写入,则开始写入同时把写入操作通知给Leader,然后commit;

6.Follwer把请求结果返回给Client

Zookeeper设计目的

1.最终一致性:client不论连接到哪个Server,展示给它都是同一个视图,这是zookeeper最重要的性能。
2.可靠性:具有简单、健壮、良好的性能,如果消息被到一台服务器接受,那么它将被所有的服务器接受。
3.实时性:Zookeeper保证客户端将在一个时间间隔范围内获得服务器的更新信息,或者服务器失效的信息。但由于网络延时等原因,Zookeeper不能保证两个客户端能同时得到刚更新的数据,如果需要最新数据,应该在读数据之前调用sync()接口。

4.等待无关(wait-free):慢的或者失效的client不得干预快速的client的请求,使得每个client都能有效的等待。
5.原子性:更新只能成功或者失败,没有中间状态。
6.顺序性:包括全局有序和偏序两种:全局有序是指如果在一台服务器上消息a在消息b前发布,则在所有Server上消息a都将在消息b前被发布;偏序是指如果一个消息b在消息a后被同一个发送者发布,a必将排在b前面。
差距还很大,努力吧少年~

好了,以上就是本人参考部分资料得出的结果,接下来开始操作docker命令了

  1. docker pull wurstmeister/zookeeper // zookeeper
  2. docker run -d --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper

kafka

Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。

主要应用场景是:日志收集系统和消息系统。

Kafka主要设计目标如下:

以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
同时支持离线数据处理和实时数据处理。

一个消息系统负责将数据从一个应用传递到另外一个应用,应用只需关注于数据,无需关注数据在两个或多个应用间是如何传递的。分布式消息传递基于可靠的消息队列,在客户端应用和消息系统之间异步传递消息。有两种主要的消息传递模式:点对点传递模式、发布-订阅模式。大部分的消息系统选用发布-订阅模式。Kafka就是一种发布-订阅模式。

Kafka中的术语解释

4.1 概述

在深入理解Kafka之前,先介绍一下Kafka中的术语。下图展示了Kafka的相关术语以及之间的关系:
Docker搭建kafka和zookpeer练手案例_第4张图片
上图中一个topic配置了3个partition。Partition1有两个offset:0和1。Partition2有4个offset。Partition3有1个offset。副本的id和副本所在的机器的id恰好相同。

如果一个topic的副本数为3,那么Kafka将在集群中为每个partition创建3个相同的副本。集群中的每个broker存储一个或多个partition。多个producer和consumer可同时生产和消费数据。

4.2 broker

Kafka 集群包含一个或多个服务器,服务器节点称为broker。

broker存储topic的数据。如果某topic有N个partition,集群有N个broker,那么每个broker存储该topic的一个partition。

如果某topic有N个partition,集群有(N+M)个broker,那么其中有N个broker存储该topic的一个partition,剩下的M个broker不存储该topic的partition数据。

如果某topic有N个partition,集群中broker数目少于N个,那么一个broker存储该topic的一个或多个partition。在实际生产环境中,尽量避免这种情况的发生,这种情况容易导致Kafka集群数据不均衡。

4.3 Topic

每条发布到Kafka集群的消息都有一个类别,这个类别被称为Topic。(物理上不同Topic的消息分开存储,逻辑上一个Topic的消息虽然保存于一个或多个broker上但用户只需指定消息的Topic即可生产或消费数据而不必关心数据存于何处)

类似于数据库的表名

4.3 Partition

topic中的数据分割为一个或多个partition。每个topic至少有一个partition。每个partition中的数据使用多个segment文件存储。partition中的数据是有序的,不同partition间的数据丢失了数据的顺序。如果topic有多个partition,消费数据时就不能保证数据的顺序。在需要严格保证消息的消费顺序的场景下,需要将partition数目设为1。

4.4 Producer

生产者即数据的发布者,该角色将消息发布到Kafka的topic中。broker接收到生产者发送的消息后,broker将该消息追加到当前用于追加数据的segment文件中。生产者发送的消息,存储到一个partition中,生产者也可以指定数据存储的partition。

4.5 Consumer

消费者可以从broker中读取数据。消费者可以消费多个topic中的数据。

4.6 Consumer Group

每个Consumer属于一个特定的Consumer Group(可为每个Consumer指定group name,若不指定group name则属于默认的group)。

4.7 Leader

每个partition有多个副本,其中有且仅有一个作为Leader,Leader是当前负责数据的读写的partition。

4.8 Follower

Follower跟随Leader,所有写请求都通过Leader路由,数据变更会广播给所有Follower,Follower与Leader保持数据同步。如果Leader失效,则从Follower中选举出一个新的Leader。当Follower与Leader挂掉、卡住或者同步太慢,leader会把这个follower从“in sync replicas”(ISR)列表中删除,重新创建一个Follower。

4.9 docker安装kafka

  1. docker pull wurstmeister/kafka
  2. docker run -d --name kafka_Test -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=172.17.0.3:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
    如果上述不行可以使用:
    docker run -d --name kafka_IP --net docker-Kibana --ip 172.19.10.30 -p 9092:9092 -e KAFKA_BROKER_ID=1 -e KAFKA_auto_create_topics_enable=true -e KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" -e KAFKA_ZOOKEEPER_CONNECT=《宿主机外网的IP》:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://《宿主机外网的IP》:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
  3. 启动kafka命令讲解
    -e KAFKA_BROKER_ID=0 在kafka集群中,每个kafka都有一个BROKER_ID来区分自己
    -e KAFKA_ZOOKEEPER_CONNECT=192.168.155.56:2181/kafka 配置zookeeper管理kafka的路径192.168.155.56:2181/kafka
    -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.155.56:9092 把kafka的地址端口注册给zookeeper
    -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 配置kafka的监听端口
    -v /etc/localtime:/etc/localtime 容器时间同步虚拟机的时间

  1. -e KAFKA_ZOOKEEPER_CONNECT=<这里换成你的zookeeper地址和端口>
    -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://<这里换成你的kafka地址和端口>
    -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -e TZ=“Asia/Shanghai” wurstmeister/kafka
    变量 ------------------------------- -------------------- 描述
    KAFKA_BROKER_ID --------------------------- kafka集群中每个kafka都有一个BROKER_ID来区分自己
    KAFKA_ADVERTISED_LISTENERS-------- kafka的地址和端口,用于向zookeeper注册
    KAFKA_ZOOKEEPER_CONNECT ---------- zookeeper地址
    KAFKA_LISTENERS ---------------------------- kafka监听端口
    TZ ---------------------------------------------------- 容器时区改为上海
    -e KAFKA_auto_create_topics_enable=true 开启默认创建主题
    -e KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" 设置kafka运行的大小
    例如:docker run -d --name kafka_IPS --net docker-Kibana --ip 172.19.10.30 -p 9092:9092 -e KAFKA_BROKER_ID=1 -e KAFKA_auto_create_topics_enable=true -e KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" -e KAFKA_ZOOKEEPER_CONNECT=172.19.10.20:2181 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://宿主机外网IP:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka

这里里要注意的是: 我将 KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://外网Ip:9092 而不是本地的localhost 原因是我需要搭建kafka的管理界面,这个改成外网是需要让管理界面可以链接KAFKA 其次我将 KAFKA_ZOOKEEPER_CONNECT=172.17.0.3:2181/kafka 的 /kafka 去除了 也是为了方便链接管理面板,但是注意的是去除优化这2个点可能会报以下错
1. zookeeper找不到kafka
2. kafka docker启动时报could not be established. Broker may not be available
*

关于《could not be established. Broker may not be available》 这里可以解决 方案是把原有的 容器删除调然后从新启动一个新的容器并且:

将启动命令中的KAFKA_ADVERTISED_LISTENERS=PLAINTEXT值修改为localhost如下:
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092

搭建完成后咱们来创建一个主题,发送一条消息试试,测试一下咱们是否搭建成功

先创建一个主题
bin/kafka-topics.sh --create --zookeeper 39.103.165.87:2181/kafka --replication-factor 1 --partitions 1 --topic mykafka
这里注意:–create --zookeeper 《你自己的宿主机的Ip》:2181/kafka 尾部需要加上/kafka才行
如果上述不行,可以使用:bin/kafka-topics.sh --bootstrap-server 《容器名称或者宿主机Ip》:9092 --create --topic testPartitions11 --partitions 4 --replication-factor 1
举个例子:bin/kafka-topics.sh --bootstrap-server hadoop102:9092 --create --topic testPartitions11 --partitions 4 --replication-factor 1
发送消息
bin/kafka-console-producer.sh --broker-list 192.168.58.132:9092 --topic mykafka
注意: --broker-list 《你宿主机ip》:9092
接受(消费)一条消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.58.132:9092 --topic mykafka --from-beginning
注意: --bootstrap-server 《你宿主机的ip》:9092

Docker搭建kafka和zookpeer练手案例_第5张图片

Docker搭建kafka和zookpeer练手案例_第6张图片

搭建管理面板cmak

cmak:是KAFKA集群管理的比较好的一个web管理面板工具,
好了废话不多说了现在开使:

1.拉取镜像
docker pull vimagick/cmak
2.启动容器
docker run -p 9000:9000 -e ZK_HOSTS=“192.168.58.132:2181” --name docker_cmak -d vimagick/cmak
注意:我的机子由于9000端口要被后面的Portainer 给占用,所以我指定了我的容器ip并更改了映射端口
我的例子:docker run -p 9999:9000 --net docker-Kibana --ip 172.19.10.40 -e ZK_HOSTS="《你宿主机的IP》:2181" --name cmake -d vimagick/cmak
3.坐等启动成功!

Docker搭建kafka和zookpeer练手案例_第7张图片
此外本人推荐一个kafka管理Ui 《kafka-map》,一下是docker搭建命令

docker run -d -p 8080:8080 -v /opt/kafka-map/data:/usr/local/kafka-map/data -e DEFAULT_USERNAME=admin -e DEFAULT_PASSWORD=admin --name kafka-map --restart always dushixiang/kafka-map:latest

Portainer

Portainer一款Docker可视化管理面板
Portainer 只是一个工具,这里就不详细介绍了!

  1. systemctl start docker 系统自动启动docker
  2. systemctl enable docker 关闭自动启动

  1. 创建Portainer文件夹
    mkdir -p /data/portainer/data /data/portainer/public
    进入Portainer文件夹
    cd /data/portainer
  2. 下载汉化文件
    wget https://labx.me/dl/4nat/public.zip
  3. 解压汉化
    unzip public.zip
  4. 安装Portainer
    docker run -d --restart=always --name portainer -p 9000:9000
    -v /var/run/docker.sock:/var/run/docker.sock
    -v /data/portainer/data:/data
    -v /data/portainer/public:/public portainer/portainer:latest
    命令解析: 上面的 -v 是挂载文件目录 是将docker里的容器所对应的文件挂载在对应的物理机目录文件下
    mkdir -p /data/portainer/data /data/portainer/public
    cd /data/portainer
    wget https://labx.me/dl/4nat/public.zip
    unzip public.zip
    docker run -d --restart=always --name portainer -p 9000:9000
    -v /var/run/docker.sock:/var/run/docker.sock -v /data/portainer/data:/data
    -v /data/portainer/public:/public portainer/portainer:latest

如果拉汉化文件拉不下来可以来下载我提供的文件

总结一下我的docker命令:

1.拉取镜像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
docker pull vimagick/cmak
2.启动容器
zookeeper : docker run -d --name zookeeper_IP --net docker-Kibana --ip 172.19.10.20 -p 2181:2181 -v /etc/localtime:/etc/localtime wurstmeister/zookeeper
kafka: docker run -d --name kafka_IP --net docker-Kibana --ip 172.19.10.30 -p 9092:9092 -e KAFKA_BROKER_ID=1 -e KAFKA_auto_create_topics_enable=true -e KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" -e KAFKA_ZOOKEEPER_CONNECT=172.19.10.20:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
cmak: docker run -p 9999:9000 --net docker-Kibana --ip 172.19.10.40 -e ZK_HOSTS="《宿主机ip》:2181" --name cmake -d vimagick/cmak

好了感谢花费时间研读,喜欢的朋友,可以加我的死鱼群,希望慢慢带起群活跃,群:947405150

你可能感兴趣的:(My服务器搭建,docker,kafka)