一、Kafka介绍
- 介绍
• Kafka是由LinkedIn开发的一个分布式的消息系统,最初是用作LinkedIn的活动流(Activity Stream)和运营数据处理的基础。
• 活动流数据包括页面访问量(Page View)、被查看内容方面的信息以及搜索情况等内容。这种数据通常的处理方式是先把各种活动以日志的形式写入某种文件,然后周期性地对这些文件进行统计分析。
• 运营数据指的是服务器的性能数据(CPU、IO使用率、请求时间、服务日志等等数据)。运营数据的统计方法种类繁多。
• Kafka是一种分布式的,基于发布/订阅的消息系统,能够高效并实时的吞吐数据,以及通过分布式集群及数据复制冗余机制(副本冗余机制)实现数据的安全 - 特性
• 高吞吐量、低延迟:kafka每秒可以处理几十万条消息,它的延迟最低只有几毫秒,每个topic可以分多个partition, consumer group 对partition进行consume操作。
• 可扩展性:kafka集群支持热扩展
• 持久性、可靠性:消息被持久化到本地磁盘,并且支持数据备份防止数据丢失
• 容错性:允许集群中节点失败(若副本数量为n,则允许n-1个节点失败)
• 高并发:支持数千个客户端同时读写 - Kafka中术语的关系及介绍
Producer 消息生产者,就是向kafka broker发消息的客户端; Consumer 消息消费者,向kafka broker取消息的客户端; Topic 可以理解为一个队列; Consumer Group (CG) 这是kafka用来实现一个topic消息的广播(发给所有的consumer)和单播(发给任意一个consumer)的手段。一个topic可以有多个CG。topic的消息会复制(不是真的复制,是概念上的)到所有的CG,但每个partion只会把消息发给该CG中的一个consumer。如果需要实现广播,只要每个consumer有一个独立的CG就可以了。要实现单播只要所有的consumer在同一个CG。用CG还可以将consumer进行自由的分组而不需要多次发送消息到不同的topic; Broker 一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic; Partition 为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序。 Offset kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka
二、Zookeeper安装
- 因为 Kafka 需要 Zookeeper 和 jdk1.8 的支持才能启动,所以安装 Kafka 之前安装 Zookeeper和 jdk1.8
- 单机安装
a. 关闭Linux(CentOS6.X版本)的防火墙
永久关闭防火墙:chkconfig iptables off
临时关闭防火墙:service iptables stop
b. 解压Zookeeper的安装包:tar -xvf zookeeper-3.4.8
c. 进入conf目录中:cd zookeeper-3.4.8/conf
d. 将conf目录下的zoo_sample.cfg文件复制为zoo.cfg。
Zookeeper在启动的时候会自动寻找zoo.cfg,根据其中的配置来启动服务
cp zoo_sample.cfg zoo.cfg
e. 编辑zoo.cfg文件:vim zoo.cfg
f. 修改其中的属性dataDir,指定数据的存储目录
dataDir=/home/software/zookeeper-3.4.8/tmp
g. 进入bin目录中启动
执行zkServer.sh文件,来启动Zookeeper服务器端:sh zkServer.sh start
执行zkCli.sh文件,来启动进入Zookeeper客户端:sh zkCli.sh
h. 查看服务器端状态:sh zkServer.sh status
,如果出现了Standalone,说明启动成功
三、安装Kafka
-
解压
tar -xvf kafka_2.11-1.0.0.tgz
-
改名
mv kafka_2.11-1.0.0 kafka
-
进入config目录中对server.properties进行配置
broker.id=1 (集群之间编号不能重复)节点的id log.dirs=/home/software/kafka/kafka-logs 数据的存储路径 zookeeper.connect=192.168.40.136:2181,192.168.40.135:2181,192.168.40.138:2181 三台虚拟机的名称 delete.topic.enable=true 是否能真正删除主题 -
在kafka目录下创建目录kafka-logs
mkdir kafka-logs
-
启动
a. 先启动Zookeepesh zkServer.sh start
b. 再启动Kafka
sh kafka-server-start.sh ../config/server.properties
四、Kafka的使用
- 创建自定义的topic
在bin目录下执行:
sh kafka-topics.sh --create --zookeeper 192.168.40.136:2181 --replication-factor 1 --partitions 1 --topic enbook
注:副本数量要小于等于节点数量 - 查看所有的topic
执行:sh kafka-topics.sh --list --zookeeper 192.168.40.136:2181
- 启动producer生产者
执行:sh kafka-console-producer.sh --broker-list 192.168.40.136:9092,192.168.40.136:9092,192.168.40.136:9092 --topic enbook
- 启动consumer消费者
执行:sh kafka-console-consumer.sh --zookeeper 192.168.40.136:2181 --topic enbook --from-beginning
当我用上面的命令启动消费者的时候报错,因为kafka版本比较高,所以用以下命令
sh kafka-console-consumer.sh --bootstrap-server 192.168.40.136:2181 --topic enbook --from-beginning
- 删除topic指令:
进入bin目录,执行:sh kafka-topics.sh --delete --zookeeper 192.168.40.136:2181 --topic enbook