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消息。

kafka消息队列转发 kafka做消息队列_zookeeper


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 工作原理

kafka消息队列转发 kafka做消息队列_kafka消息队列转发_02

  • 当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		从哪里读消息,从开始读消息
  • 这个时候,在生产者的阻塞状态下,输入任何内容,会显示在消费者阻塞界面的