一 简介
- Zookeeper是一个分布式应用服务协调服务,为分布式应用提供一致性服务,包括配置维护、域名服务、分布式同步、组服务等(源自百科)
- kafka是一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据。具有以下特性
- 通过O(1)的磁盘数据结构听过消息的持久化
- 高吞吐量
- 支持通过Kafka服务器和消费机集群来分区消息
- 支持Hadoop并行数据加载
- kafka相关名词介绍
- Broker:kafka集群包含一个或多个服务器,这种服务器被称为broker
- Topic:每条发布到kafka集群的消息都有一个类别,这个类别被称为Topic(物理上不同Topic消息分开存储,逻辑上一个Topic的消息虽然保存在一个或多个Broker上,但用户无需关系数据存放在哪个Broker上,只需要指定消息对应的Topic即可)
- Partition:物理上的概念,每个Topic包含一个或多个Partition
- LogSegment:日志分段,每个partition被分为多个logSegment,日志段是kafka日志对象分片的最小单位,可以算作一个逻辑概念,由一个具体的日志文件(.log的数据文件)和两个索引文件(.index和.timeindex,分别对应偏移量索引文件和消息时间戳索引文件)组成
- Offset:偏移量,每个partition中都有一系列有序的、不可变的消息组成,这些消息被顺序地追加到partition中。每个消息都有一个连续的序列号称之为offset,用于在partition内唯一标识消息(并不表示消息在磁盘上的物理位置)
- Message:消息是kafka中存储的最小最基本的单位,即为一个commit log,由一个固定长度的消息头和一个可变长度的消息体组成
- Producer:生产者,发布消息到kafka broker
- Consumer:消费者,向kafka broker读取消息的客户端
- Consumer Group:每个consumer属于一个特定的consumer group
- Zookeeper在kafka中的作用
- 在kafka中,zookeeper负责存储kafka中的元数据信息,队列的数据不会存储在zookeeper中(而是存放在日志数据文件中)。kafka是分布式的,zookeeper协调broker、producer、consumer之间的关系,当有新的角色加入的时候,更新zookeeper中的数据,其他角色就可以得到通知,并作出相应的调整。
二 zookeeper集群安装部署
- 在服务器上,下载安装包,上传至服务器,解压缩。
- 创建dataDir、dataLogDir文件夹
- dataDir:快照日志的存储路径
- dataLogDir:事务日志的存储路径,如果不配置的话,会默认存储到dataDir指定的目录,将严重影响zookeeper的性能。
- 进入zookeeper安装目录中conf文件夹,复制zoo_sample.cfg文件为zoo.cfg,编辑zoo.cfg
- zoo.cfg配置,其中dataDir和dataLogDir分别为之前创建的文件夹路径(其他tickTime、initLimit等可自行配置)
- #clientPort:这个端口是客户端连接zookeeper服务器的端口,zookeeper会监听该端口,接受客户端的访问请求
- #server.1 这个1是服务器的标识,表示这是第几号服务器,需要写到快照目录下面的myid文件中
- #10.100.1.156:这个是集群里的IP地址,第一个端口是master和slave之间的通信端口,第二个端口是leader选举的端口
- 进入dataDir文件夹,新建myid
- 进入bin文件夹,启动服务
- /zkServer.sh start
- 检查zookeeper状态
- /zkServer.sh status
- 其他服务器配置与之相同,需要注意,其他服务器上zookeeper配置zoo.cfg时,clientPort不能其他zookeeper重复,myid文件需与zoo.cfg文件中的server.对应,不能重复。所有服务器都配置好后,全部启动。
- zk集群一般只有一个leader,多个follower,leader一般是相应客户端的读写请求,当leader挂掉后,会从follower里投票选举出一个新的leader
三 kafka安装部署
- 在服务器上,下载安装包,上传至服务器,解压缩。
- 进入config目录,修改配置文件server.properties,主要配置如下:
-
broker.id=0 #当前机器在集群中的唯一标识,和zookeeper的myid性质一样 port=9092 #当前kafka对外提供服务的端口默认是9092 host.name=10.100.1.156 #这个参数默认是关闭的,在0.8.1有个bug,DNS解析问题,失败率的问题。 listeners=PLAINTEXT://server11:9092 #效果同上 log.dirs=/opt/kafka/kafkalogs/ #消息存放的目录,这个目录可以配置为“,”逗号分割的表达式,上面的num.io.threads要大于这个目录的个数这个目录,如果配置多个目录,新创建的topic他把消息持久化的地方是,当前以逗号分割的目录中,那个分区数最少就放那一个 num.partitions=2 #默认的分区数,一个topic默认1个分区数 zookeeper.connect=10.100.1.156:2181,10.100.1.155:2181,10.100.1.154:2181 #设置zookeeper的连接端口 #kafka保存消息的副本数,如果一个副本失效了,另一个还可以继续提供服务。不能大于集群中broker的个数。集群中各broker保持一致 default.replication.factor=2
-
进入bin目录,启动kafka
-
./kafka-server-start.sh config/server.properties &
-
-
检查服务是否启动
-
jps
-
-
同理,其他服务器上相同配置,需注意在其他服务器上修改各broker值,全部启动后,检查kafka集群是否配置成功
四 kafka监控
- KafkaOffsetMonitor:一款客户端消费监控工具,用来实时监控kafka服务的Consumer以及它们所在partition中的Offset.
- 下载并上传KafkaOffsetMonitor jar包到服务器,新建并编辑启动脚本
-
[root@devhost16-6 kafkaoffsetMonitor]# cat run.sh nohup java -Xms256m -Xmx512m -cp KafkaOffsetMonitor-assembly-0.3.0-SNAPSHOT.jar com.quantifind.kafka.offsetapp.OffsetGetterWeb --offsetStorage kafka --zk 10.100.1.156:2180 --port 9999 --refresh 10.seconds --retain 2.days &
参数说明:
zk :zookeeper主机地址,如果有多个,用逗号隔开
此外,kafka0.8版本以前,offset默认存储在zookeeper中(基于Zookeeper),kafka0.9版本以后,offset默认存储在内部的topic中(基于Kafka内部的topic),Storm Kafka Spout(默认情况下基于Zookeeper)。因此在启动脚本中,还另外添加了--offsetStorage kafka来声明offset的存储方式。
port :应用程序端口
refresh :应用程序在数据库中刷新和存储点的频率
retain :在db中保留多长时间
dbName :保存的数据库文件名,默认为offsetapp
五 常见问题
- 消费者数量大于partition数时,多余的消费者将无法被分配到对应的partition,因此会有消费者无法消费
- topic的partition数量小于broker时,将可能导致kafka高可用失败,即一个broker断掉后,集群无法重新平衡,导致消费者无法正常消费(生产者仍正常工作)。故一般将topic的partition数大于broker数
六 参考文档
http://www.cnblogs.com/iforever/p/9095095.html