kafka集群搭建

kafka集群搭建

Date:9/6/2017 5:44:21 PM 
Author:xnchall


- 准备篇

  1. 操作系统
    本文适用于linux、mac os
  2. 资源包下载
    kafka资源包:http://kafka.apache.org/downloads.html
    zookeeper资源包:https://zookeeper.apache.org/releases.html#download
    由于kafka是依托于zookeeper管理,可以理解为zookeeper是kafka的代理。
    分别解压缩包
    tar -zxvf kafka_2.10-0.9.0.1.tgz
    tar -zxvf zookeeper-3.5.2-alpha.tar.gz
  3. zookeeper集群搭建
    本文是模拟在一台机器上搭建zk集群,原理和多台主机搭建集群一样,只要集群主机之间可通过网络访问,均可以按照如下方式去实现集群搭建 

    • 模拟多台主机
      分别将上述zk解压包复制三份,具体如下:
      cp -r Documents/tools/zookeeper-3.5.2-alpha Software/zookeeper-3.5.2-alpha0cp -r Documents/tools/zookeeper-3.5.2-alpha Software/zookeeper-3.5.2-alpha1cp -r Documents/tools/zookeeper-3.5.2-alpha Software/zookeeper-3.5.2-alpha2
      如下图

      然后分别去修改三个zookeeper的配置文件,将conf/zoo_sample.cfg内容复制,创建新文件zoo.cfg
      cp zoo_sample.cfg zoo.cfg
      然后修改zoo.cfg内容,配置如下:
      clientPort=2181
      dataDir=/tmp/zookeeper1
      syncLimit=2
      initLimit=5
      tickTime=2000
      server.0=127.0.0.1:8880:7770
      server.1=127.0.0.1:8881:7771
      server.2=127.0.0.1:8882:7772
      说明:
      1> zoo.cfg配置文件中server.X=host:port1:port2,其中X分别是复制三个zk文件夹编号(用来标识该机器在集群中的机器序列号),即就是0、1、2。X为集群中该机器的编号(集群中唯一),该配置需要和dataDir目录下文件myid中的内容一致,为数字。集群启动的时候会去dataDir目录下查找myid,检查编号是否一致。因此在启动之前需要手动创建myid文件,myid文件只有一行,且值必须是X
      2> port1是用于leader之间通信,port2是用于laeder选举。
      3> 每个zookeeper启动端口不能相同,即就是zoo.cfg中【clientPort=】参数
      4> 按照上述要求分别去完成其余zk配置文件创建与设置

    • 启动zookeeper集群
      首先需要分别启动三个zookeeper
      zkServer.sh start zoo.cfg
      bin/zkCli.sh -server host:2181 #随机选一个zookeeper作为客户端,没必要选leader
      我们选取zookeeper0作为客户端的启动,注意的是启动命令需要输入zookeeper0目录下zoo.cfg中配置的端口
      zkCli.sh -server localhost:2181

      可以看到zookeeper集群启动成功了,也意味着准备阶段完成了,接下来搭建kafka集群。

- 小试牛刀

  1. 集群搭建: 
    1> 将已经准备好kafka资源解压文件,分别将kafka集群目录的配置文件夹config目录下server.properties复制三份并重命名,效果如下:
    xnchall@ubuntu:~/Software/kafka_2.10-0.9.0.1/config$ ls -al server*
    -rw-r--r-- 1 xnchall xnchall 5292 Jun 16 14:33 server1.properties
    -rw-r--r-- 1 xnchall xnchall 5298 Jun 15 16:59 server2.properties
    -rw-r--r-- 1 xnchall xnchall 5323 Jul 24 20:37 server.properties
    2> 下来通过修改三个配置文件,供启动时分别使用,达到kafka集群的目的(虽然是伪集群,原理和多台主机集群搭建一样)
    三个配置文件修改时,核心参数共同点是zookeeper集群接入点:
    zookeeper.connect=localhost:2183,localhost:2181,localhost:2182 #zookeeper集群
    核心参数不同设置:
    broker.id=Y #取决于集群规模,每个配置文件这个参数需不同
    log.dirs= #kafka日志输出目录,每个kafka有自己独立日志文件
    listeners=PLAINTEXT://:port #kafka监听请求的网络服务端口,伪集群port需不同
    3> 启动kafka集群
    bin/kafka-server-start.sh config/server.properties
    bin/kafka-server-start.sh config/server1.properties
    bin/kafka-server-start.sh config/server2.properties
    4> 查看集群本地化运行
    zookeeper集群本地化:

    kafka集群本地化:
    这里就补贴kafka本地化目录了,后边有介绍
    5> 创建topic深入理解kafka集群本地化
    ./kafka-topics.sh --create --zookeeper localhost:2181 --topic testKakfa_lk --replication-factor 2 --partition 2 #创建topic,2个分区,2个副本
    创建完成后,查看本地化状态(数据持久化)

    我们创建的kafka集群规模是3,创建topic时kafka会随机分配,理解上图需要一个命令
    xnchall@ubuntu:~/Software/kafka_2.10-0.9.0.1$ ./bin/kafka-topics.sh --zookeeper localhost:2181 --topic testKafka_lk --describe
    Topic:testKafka_lk PartitionCount:2 ReplicationFactor:2 Configs:
    Topic: testKafka_lk Partition: 0 Leader: 1 Replicas: 1,2 Isr: 1,2
    Topic: testKafka_lk Partition: 1 Leader: 2 Replicas: 2,0 Isr: 2,0
    可以看出,topic两个分区laeder分布情况,0分区leader是编号为1的kafak主机,副本在编号2主机上。1分区laeder是编号为2的kafka主机,副本是编号为0主机。再看看上图kafka本地化的疑惑就迎刃而解了。
    6> 关于kafka消息本地持久化
    进入kafka-logs-2/testKafka_lk-0目录发现了有两个文件,.index文件是消息的偏移,根据偏移可以找到具体的消息。.log文件存的是具体消息体,所有向这个topic生产的消息都会记录,实现数据持久化
  2. 再来看看zookeeper集群: 
    上边我们创建了topic,下来去zookeeper集群是看一下会有什么呢?
    [zk: localhost:2181(CONNECTED) 0] ls /
    [admin, brokers, config, consumers, controller, controller_epoch, isr_change_notification, zookeeper]
    对比一下发现多了很多kafka信息节点,进入brokers可以看到我们创建topic等节点信息,现在可以体会到zookeeper与kafka关系多么紧密了,其实zookeeper完成了leader选举、主备信息同步等很重要的功能。

- 总结

上述只是简单介绍,有问题多多提出,本文目的仅供技术交流使用~

posted @ 2017-09-08 17:42  xnchall  阅读(503)  评论(0编辑  收藏  举报