kafka简介与安装使用

简介

kafka是一个分布式、高可用、速度快、基于磁盘的发布-订阅消息中间件。由LinkedIn公司使用Scala开发,后来又称为了Apache的顶级项目(Apache要逆天啊)。kafka使用topic对消息进行分类,topic可分区可复制,分区用来并发,复制用来高可用。

kafka读效率可到100M-150M每秒,写可达50M-80M每秒,因为kafka是直接操作的磁盘,因此磁盘的速度决定了其速度,kafka的消息直接存磁盘,不会因为主机断电丢失消息。kafka自己、生产者、消费者都是高可用的,消费者自己维护消息读写的位置。

组件

在做安装测试之前先说一下kafka的一些基本概念,比如topic、partition、replication、producer、consumer、broker

topic:kafka消息的归类,比如一个系统中的订单有多种类型,每种类型对应一个topic存在于kafka中

partition:一个topic分成多个partition(分区),有了多个分区使数据分散到更多的机器,数据丢失的几率更小,稳定性更好。每个分区的数据是不重复的,因此可以开启多个消费者对不同分区并发消费,提高效率

replication:每个分区的副本数,一个partition可以有多个副本,其中只有一个副本是提供读写服务的,其他副本都只是做备份与恢复使用

producer:生产者,发送消息到kafka,kafka可以随机或者按照指定的分区方式将消息发到不同的分区中

consumer:消费者,从kafka(或者指定kafka指定分区)拿消息

broker:启动的kafka实例就是一个broker。不建议在同一个机器上启动多个broker,原因如下:

1.增加了故障不可恢复的几率,一旦该机器挂了,会有多个broker消失,副本丢失得也就越多

2.虽然可以提高CPU利用率,但是磁盘的争用却更加厉害。如果系统正常运行中磁盘工作非常不饱和,硬件资源有很紧张的话,也不是不可以单台机器启动多个broker

安装

kafka有两种工作模式,1.伪分布式 2.完全分布式。直接说完全分布式,步骤如下:

1.下载kafka

到这个网址http://kafka.apache.org/downloads选择想要的版本进行下载

2.上传并解压

3.安装与配置zookeeper集群

这个就不详细在啰嗦了,可以去https://my.oschina.net/u/3049601/blog/956410查看

4.启动zookeeper集群

到集群中各个机器的zookeeper安装目录下执行./zkServer.sh start,生产中一般都是写一个shell在某台服务器上一键启动所有zookeeper,或者有一套自己的应用程序通过界面进行启动

5.配置kafka集群

简单的非生产环境需要,只需修改两个配置文件即可

zookeeper.properties

#zookeeper数据文件存放地址
dataDir=/home/hadoop/data/kafka/tmp/zookeeper
#zookeeper集群提供服务的端口
clientPort=2181
#zookeeper为每个IP提供连接的个数
maxClientCnxns=0

因为zookeeper集群的默认端口就是2181,因此上面的配置文件值需要修改dataDir即可

server.properties

broker.id=3
log.dirs=/home/hadoop/data/kafka/tmp/kafka-logs
num.partitions=1
zookeeper.connect=hadoop01,hadoop02,hadoop03:2181

该配置文件中有很多设置项,我简单的列举了其中几个

broker.id=xx:这个必须设置,每个broker使用的id必须在集群中唯一,建议按照集群hostname的编号来设置,方便后续维护

log.dirs=path:kafka文件目录

num.partitions=xx:每个topic全局默认分区数,当然还可以在创建分区时指定topic的分区数

zookeeper.connect=xxx:zookeeper的集群地址

6.启动kafka集群

在kafka集群每台主机上的kafka安装目录/bin下面执行启动命令

./kafka-server-start.sh -daemon ../config/server.properties

下面就可以测试了

测试

#创建一个topic,它只有一个分区,每个分区三个副本
./kafka-topics.sh --create --zookeeper hadoop01,hadoop02,hadoop03:2181 --partitions 1 --replication-factor 3 --topic mytopic1
#查看topic,其他参数可以使用./kafka-topics.sh --help查看
./kafka-topics.sh --list --zookeeper hadoop01:2181

查看topic的全局信息

#查看每个节点的信息
./kafka-topics.sh --describe --zookeeper hadoop01:2181 --topic mytopic1

这张图可以仔细看看

拿几个重点的说说

ReplicationFactor:3 ---------- mytopic1的每个分区有3个副本

Partition:0 ---------------------- mytopic1只有一个分区,分区号是0

Leader:1 ------------------------ 分区三个副本中的Leader是副本1

Replicas:1,2,3 ----------------- 分区的三个副本,1 2 3

Isr:1,2,3 ------------------------- 分区所有副本与Leader副本保持同步的列表,这个东西很重要,涉及到整个集群是否可用,故障恢复是否成功,数据是否丢失。后面应该会针对这部分内容做详细的描述

发送消息

./kafka-console-producer.sh --broker-list hadoop01:9092 --topic mytopic1

消费消息

./kafka-console-consumer.sh --zookeeper hadoop02:2181 --from-beginning --topic mytopic1

我在hadoop01机器上发送的消息,在hadoop02机器上执行命令,连接的hadoop02对应的zookeeper,同样可以拿到消息,说明集群的分布式工作是完全没有问题的

测试容错与Leader选举

#kill掉hadoop01机器上的kafka,因为Leader在hadoop01上面,正好测试容错性和Leader选举是否正常
#kill之前还是先确认一下Leader是否在hadoop01上(hadoop01对应的broker-id=1)
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-topics.sh --describe --zookeeper hadoop01:2181 --topic mytopic1
Topic:mytopic1	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: mytopic1	Partition: 0	Leader: 1	Replicas: 1,2,3	Isr: 1,2,3
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$jps
3041 QuorumPeerMain
7467 Jps
4222 Kafka
6878 ConsoleProducer
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$kill -9 4222
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-topics.sh --describe --zookeeper hadoop01:2181 --topic mytopic1
Topic:mytopic1	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: mytopic1	Partition: 0	Leader: 2	Replicas: 1,2,3	Isr: 2,3
#可以看到Leader已经切换到了hadoop02机器上,Isr中已经没有了hadoop01机器上的副本
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-console-consumer.sh --zookeeper hadoop02:2181 --from-beginning --topic mytopic1
Hello Messi
Hello Havi
Hello lucy
Hello Tom
Are you sure
yeah i am sure
#仍然可以消费到数据,说明kafka容错性和Leader选举都没有问题。此时hadoop01还没有重启,我们向集群发布数据,然后重启hadoop01上的kafka,再kill掉非hadoop01机器上的kafka,以此方式验证重启的hadoop01上的kafka在离线期间集群收到的消息,是否在它重启之后做了数据同步,并正常工作
#注意这个时候生产者不能去连hadoop01上的kafka发数据,为了保证生产者不修改命令就可以发送数据,可以将所有的kafka列表放在命令中
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-console-producer.sh --broker-list hadoop01:9092,hadoop02:9092,hadoop03:9092 --topic mytopic1
>1234abcd
[2018-06-07 02:29:13,751] WARN [Producer clientId=console-producer] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
#在控制台打印了一条警告,说有一个broker无法使用,但其实生产者是已经把消息发送出去了,否则上面的警告会一直刷屏
#到另外一个机器启动消费者看看
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-console-consumer.sh --zookeeper hadoop02:2181 --from-beginning --topic mytopic1
Hello Messi
Hello Havi
Hello lucy
Hello Tom
Are you sure
yeah i am sure
1234abcd
#可以看到消息被正确的消费了,多发一点,然后启动hadoop01上的kafka,再kill掉其他kafka,直到Leader是hadoop01上的kafka
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-console-producer.sh --broker-list hadoop01:9092,hadoop02:9092,hadoop03:9092 --topic mytopic1
>I love you
>you love me
>you are so pretty
>you are so handsome
>thank you
>It's too late,i have a room card ,Look at it 
>.......
#启动hadoop01上的kafka
[hadoop@hadoop01 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-server-start.sh -daemon ../config/server.properties
[hadoop@hadoop02 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$jps
5251 ConsoleConsumer
6148 Jps
4041 Kafka
3082 QuorumPeerMain
5770 ConsoleConsumer
#把刚才启的consumer也一起杀了
[hadoop@hadoop02 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$ kill -9 5251 5770 4041
[hadoop@hadoop02 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$./kafka-topics.sh --describe --Topic:mytopic1	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: mytopic1	Partition: 0	Leader: 3	Replicas: 1,2,3	Isr: 3,1
#可以看到Leader还是hadoop03,而Isr已经有hadoop03和hadoop01了
#再去把hadoop03上的kafka干掉
[hadoop@hadoop03 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$ jps
4613 Kafka
6311 Jps
3115 QuorumPeerMain
[hadoop@hadoop03 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$ kill -9 4613
[hadoop@hadoop03 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$ ./kafka-topics.sh --describe --zookeeper hadoop01:2181 --topic mytopic1
Topic:mytopic1	PartitionCount:1	ReplicationFactor:3	Configs:
	Topic: mytopic1	Partition: 0	Leader: 1	Replicas: 1,2,3	Isr: 1
#Leader如期的切换到了hadoop01上
[hadoop@hadoop03 /home/hadoop/proc/kafka_2.11-1.0.0/bin]$ ./kafka-console-consumer.sh --zookeeper hadoop01:2181 --from-beginning --topic mytopic1
Using the ConsoleConsumer with old consumer is deprecated and will be removed in a future major release. Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
Hello Messi
Hello Havi
Hello lucy
Hello Tom
Are you sure
yeah i am sure
1234abcd
I love you
you love me
you are so pretty
you are so handsome
thank you
It's too late,i have a room card ,Look at it 
.......
#消息被正常消费,重启其他机器kafka...略

猜你喜欢

转载自my.oschina.net/u/3049601/blog/1826232