zookeeper集群配置&kafka安装常见问题

一 简介

  • 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主机地址,如果有多个,用逗号隔开
    port :应用程序端口
    refresh :应用程序在数据库中刷新和存储点的频率
    retain :在db中保留多长时间
    dbName :保存的数据库文件名,默认为offsetapp

    此外,kafka0.8版本以前,offset默认存储在zookeeper中(基于Zookeeper),kafka0.9版本以后,offset默认存储在内部的topic中(基于Kafka内部的topic),Storm Kafka Spout(默认情况下基于Zookeeper)。因此在启动脚本中,还另外添加了--offsetStorage kafka来声明offset的存储方式。

五 常见问题

  • 消费者数量大于partition数时,多余的消费者将无法被分配到对应的partition,因此会有消费者无法消费
  • topic的partition数量小于broker时,将可能导致kafka高可用失败,即一个broker断掉后,集群无法重新平衡,导致消费者无法正常消费(生产者仍正常工作)。故一般将topic的partition数大于broker数

六 参考文档

​​​​​​​http://www.cnblogs.com/iforever/p/9095095.html

https://baike.baidu.com/item/zookeeper/4836397?fr=aladdin

https://www.jianshu.com/p/3e54a5a39683

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值