1. 消息队列
- 消息队列技术是分布式应用交换信息的一种技术,消息队列可驻留在内存或者磁盘上,队列存储消息知道它们被应用程序读走,通过消息队列,应用程序可独立地执行–它们不需要知道彼此的位置。
2. Kafka
Kafka 是一个消息系统,原先有LinkedIn公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于Zookeeper 协调的分布式消息系统,它的最大的特定就是可以实时的处理大量数据以满足各种需求场景。
Kafka 优点
1) 保证消息的先来后到,凡是进来的消息,立马打上标签(1、2、3、4)
2) 当消息被消费后,数据丢失
3) 分布式
4) 容量比较大,Kafka 容量取决于硬盘的大小
5) 数量的大小不会影响kafka 的性能
3. kafka特性
- 高吞吐量、低延迟
- kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分为多个partition,consumer group 对partition 进行 consume 操作
- 可扩展性
- kafka集群支持热扩展
- 持久性、可靠性
- 消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
- 容错性
- 运行集群中节点失败
- 高并发
- 支持数千个客户端同时读写
4. Kafka 使用场景
日志收集:
- 一个公司可以用kafka 手机各种服务的log,通过kafka以统一接口服务的方式开放给各种consumer
消息系统
- 解耦、生产者和消费者、缓存消息
运营指标
- kafka 也经常用来记录运营监控数据,包括手机各种分布式应用的数据,生产各种操作的集中反馈,比如报警和报告
用户活动跟踪:
- Kafka经常被用来记录web用户或者app用户的各种活动,如浏览网页、搜索、点击等活动,这些活动信息被各个服务器发布到kafka的topic中,然后订阅者通过订阅这些topic来做实时的监控分析,或者装载到hadoop、数据仓库中做离线分析和挖掘。
流式处理
- 比如 spark streaming 和 storm
时间源
5. Kafka 名词
Kafka Server(消息系统的中间件)
- 接收生产者产生的消息,接收消费者的订阅,将消费者交付给消费者处理
Producer(生产者)
- 用于生产消息
Consumer(消费者)
- 负责消费生产者消费的消息,多个消费者可以形成一个组
Partition(分区)
- 排列数据,通过Offset 偏移量进行排列,Offset 对分区数据进行记录,存在消息 的载体,相当于 Queue
Offset(偏移量)
- 对分区的数据进行记录
Zookeeper
- 相当于 RabbitMQ中 Exchange ,用于接收生产者的消息数据
Topic(主题)
- 对消息进行分类,一个类型一个主题,Kafka 集群能同时负责多个Topic 的分发
Broker(Kafka节点)
- 一个Kafka节点就是一个Broker,多个Broker可以组成一个Kafka 集群
Partition
- Topic 物理上的分组,一个Topic 可以分为多个Partition,每个Partition 是一个有序的队列
Message
- 每一条消息的主体
- Kafka 中发布的订阅对象是Topic,我们可以为每类数据创建一个Topic,把向Topic发布消息的客户端称为 Producer,从Topic 订阅消息的客户端称作为Consumer,Producers和Consumers 可以同时从 多个Topic 读写数据。一个Kafka 集群由一个或者多个Broker 服务器组成,它负责持久化和备份具体的kafka消息。
6. Zookeeper 和 Kafka关系
1) 什么是Zookeeper?
- Zookeeper 是一个分布式的、开放源码的分布式应用程序协调服务,,是Google的Chubby 一个开源的实现,分布式应用程序可以基于它实现统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等工作。
- 简单的来说,Zookeeper 是 kafka集群节点的管理工具
2)在基于Kafka的分布式消息队列,zookeeper 作用:
- broker 注册
- Topic注册
- Producer 负载均衡
- Consumer 负载均衡
- 维护Partition与Consumer的关系
- 记录消息消费的进度以及Consumer 注册等。
- 在Kafka 的设计中,选择了使用 Zookeeper 来进行所有Broker 的管理,体现在zookeeper 上会有一个专门用来进行Broker服务器列表记录的点。
- 位于 /brokers
- 每个Broker 服务器在启动时,都回到 Zookeeper上进行注册,也就是创建一个节点后写入IP,端口等信息,Broker 创建的是临时节点,所有的Broker 一旦上线或者下线,对应的Broker节点文件将会被删除,因此我们可以通过Zookeeper 上Broker 节点的变化来动态表示Broker 服务器的可用性,Kafka 的Topic也类似于这种方法。
3)zookeeper
- 键值对的,用来存放meta信息(原始数据,最底层的数据)还有watch发现机制
- 1.broken node registry :borken注册节点,会生成znode的临时节点保存信息
- 2.broken topic registry: 当一个zookeeper启动时会注册自己持有的topic和partition的信息
- 3.consumer and consumer group : 主要是用来做负载均衡
- 4.consumer id registry: 每个consumer都有唯一的id号,用来标记消费者的信息
- 5.consumer offset tracking 用来跟踪每个concumer消费的最大的offset
- 6.partition owner registry: 用来标记partition被那个consumer所消费
7. Kafka 工作原理
- 当Producer(生产者),当生产者产生数据消息,会先从集群内获取Ldader,然后Producer(生产者)将消息发送给Leader ,再由Leader 将消息写入本地文件中,然后followers 将消息写入本地后向Leader 发送ACK,最后Leader将收到副本的ACK后向Producer发送ACK。
- Producer 在 写入数据时,永远会找Leader,不会将数据直接写入 follower。
- Leader 真正用于工作的节点
- follower 是用于复制leader的信息,用于复制Leader的内容,作为备份
消息传输机制
- at most once 消息最多发送一次,无论成败,不再发送
- at least once 消息最少发送一次
8. 部署 Kafka 集群内
实验环境
Host | IP | |
Server-1 | 1.1.1.101 | JDK |
Server-2 | 1.1.1.102 | JDK |
Server-3 | 1.1.1.103 | JDK |
1) 首先部署 Zookeeper 集群
- kafka 依赖于zookeer 来保存集群的数据信息,从而保证系统的可用性
- JDK 环境可参考JAVA环境部署
- 安装Zookeeper
[root@localhost ~]# tar -zxf zookeeper-3.3.6.tar.gz -C /usr/src/
[root@localhost ~]# mv /usr/src/zookeeper-3.3.6/ /usr/local/zookeeper
[root@localhost ~]# cd /usr/local/zookeeper/conf/
# copy zookeeper 配置文件模板
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
- 修改 Zookeeper 配置文件
[root@localhost ~]# vim /usr/local/zookeeper/conf/zoo.cfg
tickTime=2000 # 节点之间发送心跳包的时间, 单位 毫秒
initLimit=10 # 新加入节点初始化的时间, 单位 个 10*2000
syncLimit=5 # 节点连接的超时等待时间
dataDir=/usr/local/zookeeper/data # 指定保存数据的目录
dataLogDir=/usr/local/zookeeper/datalog # 指定数据日志的目录
# the port at which the clients will connect
clientPort=2181 # 对外提供服务器的端口
server.1=1.1.1.101:2888:3888
server.2=1.1.1.102:2888:3888
server.3=1.1.1.103:2888:3888
# 节点名 = 节点IP地址:节点通信的端口:节点之间选取leader的端口
- 创建数据目录
- 因配置文件改动,指定了数据 存放位置以及 日志文件的存放路径,所以需要手动创建
[root@localhost ~]# mkdir /usr/local/zookeeper/data
[root@localhost ~]# mkdir /usr/local/zookeeper/datalog
- 指定节点标识(1、2、3)
- zookeeper 集群中的节点需要获取 myid 文件内容来标识当前节点,否则无法启动
[root@localhost ~]# echo 1 > /usr/local/zookeeper/data/myid # 指定节点标识
[root@localhost ~]# cat /usr/local/zookeeper/data/myid
1
- 为了方便,将本机程序传输过去
- 但是需要更改 另外 两台的节点标识
[root@localhost ~]# scp -r /usr/local/zookeeper/ root@1.1.1.102:/usr/local/
[root@localhost ~]# scp -r /usr/local/zookeeper/ root@1.1.1.103:/usr/local/
- 更改 Server-2 主机标识
[root@two ~]# echo 2 > /usr/local/zookeeper/data/myid
[root@two ~]# cat /usr/local/zookeeper/data/myid
2
- 更改 Server-3 主机标识
[root@three ~]# echo 3 > /usr/local/zookeeper/data/myid
[root@three ~]# cat /usr/local/zookeeper/data/myid
3
- 启动 zookeeper 服务
- start 启动 restart 重新启动 stop 停止 status 查看状态
# 创建软连接,使 启动命令可以在全局中使用
[root@localhost ~]# ln -s /usr/local/zookeeper/bin/* /usr/bin/
[root@localhost ~]# zkServer.sh start
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Starting zookeeper ... STARTED
- 查看Zookeeper 状态
- 只有三台 服务器,全部启动 zookeeper服务,才可以查看状态
- 当三台服务器,全部启动后,他们之间会自动选举出一个 loader ,其余的为 foolower(生成是随机的)
# server-1
[root@localhost zookeeper]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
# server-2
[root@two ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: leader
# server-3
[root@three ~]# zkServer.sh status
JMX enabled by default
Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg
Mode: follower
2) 部署 Kafka 集群
- 安装 kafka
[root@localhost ~]# tar -zxf kafka_2.11-1.0.1.tgz -C /usr/src/
[root@localhost ~]# mv /usr/src/kafka_2.11-1.0.1/ /usr/local/kafka
- 修改其配置文件
[root@localhost ~]# vim /usr/local/kafka/config/server.properties
21 broker.id=1 # 本机 节点标识,与 myid对应
31 listeners=PLAINTEXT://1.1.1.101:9092 # 监听 本地 ip与 端口
60 log.dirs=/usr/local/kafka/data # 指定日志文件的目录
103 log.retention.hours=168
104 message.max.byte=1024000 # 消息最大字节
105 default.replication.factor=2
106 replica.fetch.max.bytes=102400
126 zookeeper.connect=1.1.1.101:2181,1.1.1.102:2181,1.1.1.103:2181 # 指定 zookeeper群集内的节点服务器
107 num.rtition=1
- 常见日志文件的目录
[root@localhost ~]# mkdir /usr/local/kafka/data
- 部署另外两台 Kafka
- 使用 scp 命令,将文件传输过去,修改配置文件
[root@localhost ~]# scp -r /usr/local/kafka/ root@1.1.1.102:/usr/local/
[root@localhost ~]# scp -r /usr/local/kafka/ root@1.1.1.103:/usr/local/
- 修改 server-2 配置文件
- 只需要更改本机标识与监听地址
[root@two ~]# vim /usr/local/kafka/config/server.properties
broker.id=2
listeners=PLAINTEXT://1.1.1.102:9092
- 修改 server-3 配置文件
- 只需要更改本机标识与监听地址
[root@three ~]# vim /usr/local/kafka/config/server.properties
broker.id=2
listeners=PLAINTEXT://1.1.1.102:9092
- 启动Kafka 服务
[root@localhost ~]# cd /usr/local/kafka/bin
[root@localhost bin]# ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost bin]# netstat -anpt | grep 9092
[root@localhost ~]# cd /usr/local/kafka/bin
[root@localhost bin]# ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost bin]# netstat -anpt | grep 9092
[root@localhost ~]# cd /usr/local/kafka/bin
[root@localhost bin]# ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties
[root@localhost bin]# netstat -anpt | grep 9092
- 创建Topic 测试
- 使用该命令可创建一个队列
[root@localhost bin]# ./kafka-topics.sh --create --zookeeper 1.1.1.101:2181 --partitions 1 --replication-factor 2 -topic logs
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
[2020-02-11 19:02:30,208] WARN Connected to an old server; r-o mode will be unavailable (org.apache.zookeeper.ClientCnxnSocket)
Created topic "logs".
参数:
# create 创建
# zookeeper 使用哪一个 zookeeper
# -- partition 创建分区的个数
# -- replication-factor 2 指定分区别分的个数
# --toplic 主体名称
- 查看当前Topic
[root@localhost bin]# ./kafka-topics.sh --list --zookeeper 1.1.1.101:2181
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
[2020-02-11 19:02:42,645] WARN Connected to an old server; r-o mode will be unavailable (org.apache.zookeeper.ClientCnxnSocket)
logs
3) 模式生产者、消费者
- 模拟生产者
[root@localhost bin]# ./kafka-console-producer.sh --broker-list 1.1.1.102:9092 --topic logs
参数:
# --broker-list 1.1.1.102:9092 推送到那个节点上
- 模拟消费者
[root@two bin]# ./kafka-console-consumer.sh --zookeeper 1.1.1.101:2181 --topic logs --from-beginning
参数:
# --zookeeper 1.1.1.101:2181
# --from-beginning 从哪里读消息,从开始读消息
entCnxnSocket)
logs
## 3) 模式生产者、消费者
- 模拟生产者
```shell
[root@localhost bin]# ./kafka-console-producer.sh --broker-list 1.1.1.102:9092 --topic logs
参数:
# --broker-list 1.1.1.102:9092 推送到那个节点上
- 模拟消费者
[root@two bin]# ./kafka-console-consumer.sh --zookeeper 1.1.1.101:2181 --topic logs --from-beginning
参数:
# --zookeeper 1.1.1.101:2181
# --from-beginning 从哪里读消息,从开始读消息
- 这个时候,在生产者的阻塞状态下,输入任何内容,会显示在消费者阻塞界面的