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: 指定端口映射,格式为:主机(宿主)端口:容器端口 -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有效时间。
下面是工作图:
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结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。
Zookeeper节点数据操作流程
注:
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命令了
- docker pull wurstmeister/zookeeper // zookeeper
- 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的相关术语以及之间的关系: 上图中一个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
- docker pull wurstmeister/kafka
- 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
- 启动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 容器时间同步虚拟机的时间
- -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 ---------------------------------------------------- 容器时区改为上海
PS: 这里可能会报错误: kafka docker启动时报could not be established. Broker may not be available 这里可以解决 方案是把原有的 容器删除调然后从新启动一个新的容器并且:
将启动命令中的KAFKA_ADVERTISED_LISTENERS=PLAINTEXT值修改为localhost如下: -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
Portainer
Portainer一款Docker可视化管理面板 Portainer 只是一个工具,这里就不详细介绍了!
- systemctl start docker 系统自动启动docker
- systemctl enable docker 关闭自动启动
- 创建Portainer文件夹
mkdir -p /data/portainer/data /data/portainer/public 进入Portainer文件夹 cd /data/portainer - 下载汉化文件
wget https://labx.me/dl/4nat/public.zip - 解压汉化
unzip public.zip - 安装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
如果拉汉化文件拉不下来可以来下载我提供的文件
|