一:kafka
官方网站:http://kafka.apache.org
kafka被称为下一代分布式消息系统,由scla和java编写,是非营利性组织ASF(Apache Software Foundation,简称ASF)基金会中的一个开源项目,比如HTTPServer、Hadoop、ActiveMQ、Tomcat等开源软件都属于Apache基金会的开源软件,类似的消息系统还有RabbitMQ、ActiveMQ、ZeroMQ
Kafka用于构建实时数据管道和流应用程序。它具有水平可伸缩性,容错性,快速性,可在数千家公司中投入生产
1.1:常用的消息队列对比:
kafka最主要的优势是其具备分布式性能、并结合zookeeper可以动态扩容,kakfa是一种高吞吐量的分布式发布订阅信息系统
ActiveMQ | RabbitMQ | Kafka | |
---|---|---|---|
所属社区/公司 | Apache | Mozilla Public LIcense | Apache/Linkedln |
开发语言 | Java | Erlang | Java |
支持的协议 | OpenWire、Stomp、Rest、XMPP、AMQP | AMQP | 仿AMQP |
事务 | 支持 | 不支持 | 不支持 |
集群 | 支持 | 支持 | 支持 |
负载均衡 | 支持 | 支持 | 支持 |
动态扩容 | 不支持 | 不支持 | 支持(zk) |
1.2:kafka优势:
kafka通过O(1)的磁盘数据结构提供消息持久化,这种结构对于即时数以TB的消息存储也能够保持长时间的稳定性能
高吞吐量: 即使是非常普遍的硬件Kafka也可以支持每秒数百万的消息
支持通过Kafka服务器分区消息。
支持Hadoop并行数据加载。
O(1)就是最低的时空复杂度了,也就是耗时/耗空间的输入数据大小无关,无论输入数据增大多少倍,耗时/耗空间都不变,哈希算法就是典型的O(1)时间复杂度,无论数据规模多大,都可以在一次计算后找到目标
1.3:kafka角色:
Broker: Kafka集群包含一个或多个服务器,这种服务器被称为broker
Topic:每条发布到Kafka集群的消息都有一个类别,这个类别称为topic,(物理上不同topic的消息分开存储在不同的文件夹,逻辑上一个topic的消息虽然保存于一个或多个broker上但用户只需要指定消息的topic即可生产或消费数据而不必关心数据存于何处),topic在逻辑上对record(记录、日志)进行分组保存,消费者需要订阅相应的topic才能消费topic中的消息。
Partition:是物理上的概念,每个topic包含一个或多个partition,创建topic时可指定parition数量,每个partition对应于一个文件夹,该文件夹下存储该partition的数据和索引文件,为了实现数据的高可用,比如将分区0的数据分散到不同的kafka节点,每一个分区都有一个broker作为leader和一个broker作为follower。
分区的优势(分区因子为3):
一:实现存储空间的横向扩容,即将多个kafka服务器的空间结合利用
二:提升性能,多服务读写
三:实现高可用,分区leader分布在不同的kafka服务器,比如分区0的leader为服务器A,则服务器B和服务器C为A的follower,而分区1的leader为服务器B,则服务器A和C为服务器B的follower,而分区2的leader为C,则服务器A和B为C的follower。
Producer:负责发布消息到Kafka broker。
Consumer:消费消息,每个consumer属于一个特定的consuer group(可为每个consumer指定group name,若不指定group name则属于默认的group),使用consumer high level API时,同一topic的一条消息只能被同一个consumer group内的一个consumer消费,但多个consumer group 可同时消费这一消息。
1.4:kafka部署
http://kafka.apache.org/quickstart
部署三台服务的高可用kafka环境
部署环境
Server1:172.16.10.22
Server2:172.16.10.23
Server3:172.16.10.24
1.4.1:版本选择:
http://kafka.apache.org/downloads
1.4.2:各节点部署kafka:
1.4.2.1:kafka节点1:
broker.id=1 #每个broker在集群中的唯一标识,正整数
listeners=PLAINTEXT://172.16.10.22:9092#监听地址
log.dirs=/data/kafka/logs #kafka用于保存数据的目录,所有的消息都会存储在该目录中
num.partitions=1 #设置创建新的topic默认分区数量
log.retention.hours=168 #设置kafka中消息保留时间,默认为168小时及7天
zookeeper.connect=172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 #指定连接的zk的地址,zk中存储了broker的元数据信息
zookeeper.connection.timeout.ms=6000 #设置连接zookeeper的超时时间,默认为6秒钟
1.4.2.2:kafka2节点
broker.id=2 #每个broker在集群中的唯一标识,正整数
listeners=PLAINTEXT://172.16.10.22:9092#监听地址
log.dirs=/data/kafka/logs #kafka用于保存数据的目录,所有的消息都会存储在该目录中
num.partitions=1 #设置创建新的topic默认分区数量
log.retention.hours=168 #设置kafka中消息保留时间,默认为168小时及7天
zookeeper.connect=172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 #指定连接的zk的地址,zk中存储了broker的元数据信息
zookeeper.connection.timeout.ms=6000 #设置连接zookeeper的超时时间,默认为6秒钟
1.4.2.3:kafka3节点
broker.id=3 #每个broker在集群中的唯一标识,正整数
listeners=PLAINTEXT://172.16.10.22:9092#监听地址
log.dirs=/data/kafka/logs #kafka用于保存数据的目录,所有的消息都会存储在该目录中
num.partitions=1 #设置创建新的topic默认分区数量
log.retention.hours=168 #设置kafka中消息保留时间,默认为168小时及7天
zookeeper.connect=172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 #指定连接的zk的地址,zk中存储了broker的元数据信息
zookeeper.connection.timeout.ms=6000 #设置连接zookeeper的超时时间,默认为6秒钟
1.4.2.4:各节点启动kafka:
/apps/kafka_2.12-2.3.1/bin/kafka-server-start.sh -daemon /apps/kafka_2.12-2.3.1/config/server.properties #-daemon 后台启动
1.4.2.5:验证zookeeper中kafka元数据:
1. Broker依赖于Zookeeper,每个Broker的id和Topic、Partition这些元数据信息都会写入Zookeeper的ZNode节点中。
2. Consumer依赖于Zookeeper,Consumer在消费消息时,每消费完一条消息,会将产生的offset保存到Zookeeper中,下次消费在当前offset往后继续消费;
3. Partition依赖于Zookeeper,Partition完成Replication备份后,选举出一个Leader,这个是依托于Zookeeper的选举机制实现的。
2.5:测试kafka读写数据:
http://kafka.apache.org/quickstart
2.5.1:创建topic
创建名为logstashtest,partitions(分区)为3,replication(每个分区的副本数/每个分区的分区因子)为3的topic(主题):
在任意kafka服务器操作:
[root@mq-server3 ~]# /apps/kafka_2.12-2.3.1/bin/kafka-topics.sh --create --zookeeper 172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 --partition 3 --replication-factor 3 --topic logstashtest
2.5.2:验证topic:
状态说明:logstashtest有三个分区分别为0、1、2,分区0的leader是3(broker.id),分区0有三个副本,并且状态都是lsr(ln-sync,表示可以参加选举成为leader)。
[root@mq-server3 ~]# /apps/kafka_2.12-2.3.1/bin/kafka-topics.sh --describe --zookeeper 172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 --topic magedu
Topic:magedu PartitionCount:3 ReplicationFactor:3 Configs:
Topic: magedu Partition: 0 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2
Topic: magedu Partition: 1 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
Topic: magedu Partition: 2 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
2.5.3:获取所有topic:
[root@mq-server3 ~]# /apps/kafka_2.12-2.3.1/bin/kafka-topics.sh --list --zookeeper 172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181
magedu
2.5.4:测试发送消息:
[root@mq-server3 ~]# /apps/kafka_2.12-2.3.1/bin/kafka-console-producer.sh --broker-list 172.16.10.22:9092,172.16.10.23:9092,172.16.10.24:9092 --topic magedu
>msg1
>msg2
>msg3
2.5.5:测试获取消息:
可以到任意一台kafka服务器测试消息获取,只要有相应的消息获取客户端即可。
[root@mq-server1 ~]# /apps/kafka_2.12-2.3.1/bin/kafka-console-consumer.sh --topic magedu --bootstrap-server 172.16.10.22:9092 --from-beginning
msg2
msg3
msg1
2.5.6:删除topic:
[root@mq-server3 ~]# /apps/kafka_2.12-2.3.1/bin/kafka-topics.sh --delete --zookeeper 172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 --topic magedu
Topic magedu is marked for deletion.
/apps/kafka_2.12-2.3.1/bin/kafka-topics.sh --delete --zookeeper 172.16.10.22:2181,172.16.10.23:2181,172.16.10.24:2181 --topic magedu
Topic magedu is marked for deletion.