• zookeeper与卡夫卡集群搭建


    首先这片博客没有任何理论性的东西,只是详细说明kafka与zookeeper集群的搭建过程,需要三台linux服务器。

    • java环境变量设置
    • zookeeper集群搭建
    • kafka集群搭建

    java环境变量设置

    在每台服务器上都有设置java环境变量

    这里使用java源码安装的方式:

    下载源码包解压,放入到/usr/local/文件夹下,修改名目录名字为jdk!接下就是把java的命令参数加入到linux的环境变量中。

    [root@test3 jdk]# cat /etc/profile.d/java.sh 
    JAVA_HOME=/usr/local/jdk
    JAVA_BIN=/usr/local/jdk/bin
    JRE_HOME=/usr/local/jdk/jre
    PATH=$PATH:/usr/local/jdk/bin:/usr/local/jdk/jre/bin
    CLASSPATH=/usr/local/jdk/jre/lib:/usr/local/jdk/lib:/usr/local/jdk/jre/lib/charsets.jar
    [root@test3 jdk]# 

    #然后执行source命令,加载新加入的java.sh脚本!
    [root@test3 bin]# source /etc/profile.d/java.sh

    #验证java环境变量是否设置成功
    [root@test3 bin]# java -version
    java version "1.7.0_79"
    Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)
    [root@test3 bin]# echo $JAVA_HOME #查看JAVA_HOME变量是否是上面设置的路径
    /usr/local/jdk/jdk
    [root@test3 bin]#

    若是以上均反馈正常,则说明java环境已经设置完毕!

    zookeeper集群搭建

    zookeeper集群被称为群组。zookeeper使用的是一致性协议,所以建议每个群组里应该包含奇数个节点,因为只有当群组中大多数节点处于可用状态,zookeeper才能处理外部请求。也就是说,如果一个包含3个节点的群组,那么它允许一个节点失效。如果包含5个节点,那么它允许2个节点失效。【不建议zookeeper群组超过7个节点,因为zookeeper使用了一致性协议,节点过多会降低群组的性能】

    群组中的每个服务器需要在数据目录中创建一个myid文件,用于指明自己的ID。

    这里zookeeper采用源码的方式安装:

    [root@test3 src]# tar zxvf zookeeper-3.4.6.tar.gz -C ../         #解压
    [root@test3 src]# cd ../
    [root@test2 local]# mv zookeeper-3.4.6 zookeeper                 #修改名字
    [root@test3 local]# cd zookeeper
    [root@test3 zookeeper]# ls
    bin        CHANGES.txt  contrib     docs             ivy.xml  LICENSE.txt  README_packaging.txt  recipes  zookeeper-3.4.6.jar      zookeeper-3.4.6.jar.md5   zookeeper.out
    build.xml  conf         dist-maven  ivysettings.xml  lib      NOTICE.txt   README.txt            src      zookeeper-3.4.6.jar.asc  zookeeper-3.4.6.jar.sha1
    [root@test3 zookeeper]# mkdir -p /data/zookeeper/data                 #创建数据目录
    [root@test3 zookeeper]# mkdir -p /data/zookeeper/logs                 #创建日志文件目录
    [root@test1 zookeeper]# cd conf [root@test1 conf]#
    ls configuration.xsl log4j.properties zoo_sample.cfg [root@test1 conf]# mv zoo_sample.cfg zoo.cfg #修改配置文件的名字,建议把原来的配置文件做备份

    zookeeper的配置文件如下:

    # The number of milliseconds of each tick
    tickTime=2000 #单位为毫秒
    # The number of ticks that the initial # synchronization phase can take initLimit
    =10
    #表示用于在从节点与主节点之间建立初始化连接的上限。
    # The number of ticks that can pass between # sending a request and getting an acknowledgement syncLimit=5
    #表示允许从节点与主节点处于不同步转台的时间上限。
    #initLimit与syncLimit这两个值都是tickTime的倍数,表示的时间是tickTime乘以这两个数值的值。 # the directory where the snapshot is stored. # do not use /tmp for storage, /tmp here is just # example sakes. dataDir=/data/zookeeper/data #指定数据目录文件 dataLogDir=/data/zookeeper/logs #指定日志目录文件 # the port at which the clients will connect clientPort=2181 #zookeeper监听的端口 # the maximum number of client connections. # increase this if you need to handle more clients #maxClientCnxns=60 # # Be sure to read the maintenance section of the # administrator guide before turning on autopurge. # # http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance # # The number of snapshots to retain in dataDir #autopurge.snapRetainCount=3 # Purge task interval in hours # Set to "0" to disable auto purge feature #autopurge.purgeInterval=1

    #zookeeper的群组设置
    server.1=10.0.102.179:2888:3888 server.2=10.0.102.204:2888:3888 server.3=10.0.102.214:2888:3888

    #群组设置的格式为: server.X=hostname:peerPort:leader:Port
    X:服务器的ID,必须是一个整数,不过不一定要从0开始,也不要求是连续的。
    peerPort:用于节点间通信的TCP端口。
    leaderPort:用于leader选举的TCP端口。

    客户端只需要通过clientport就能连接到群组,而群组节点间的通信则需要同时用到这三个端口。

    【上面的操作,只是修改了配置文件,创建了数据目录和日志文件目录,还有就是解压了源码包!

    下面要做的就是把上面操作在另外两台机器上做一遍,也可以把上面的文件直接通过scp命令复制到其余两台机器对应的位置上。】

    同MySQL集群一样,集群每台服务器都需要一个唯一的标识,zookeeper也一样,需要一个myid文件,来标识每一台服务器!

    [root@test1 data]# pwd
    /data/zookeeper/data
    [root@test1 data]# cat myid 
    1

    #在每台集群的数据文件目录下面创建myid文件,每个文件中写入一个整数,这个整数用来指明当前服务器的ID。
    #这个ID应该是需要和上面配置文件中的那个server.X中的X一致的。【遇到过不一致的情况,但是启动失败,修改为一致,就启动成功】

    另外两台的myid文件如下:

    [root@test2 data]# pwd
    /data/zookeeper/data
    [root@test2 data]# cat myid 
    2

    [root@test3 data]# pwd
    /data/zookeeper/data
    [root@test3 data]# cat myid
    3

    然后启动zookeeper集群:

    #三台服务器都这样启动,会在当前目录执行路径下面生成nohup.out文件,若是报错的话,可以查看文件内容!
    [root@test3 bin]# pwd
    /usr/local/zookeeper/bin
    [root@test3 bin]# ./zkServer.sh start JMX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED

    #需要注意的是,启动完成之后一定要查看是否有进程,有些时候不会报错,但是没有启动成功!
    [root@test3 bin]# netstat -alntp | grep 2181 #查看监听端口是否存在
    tcp        0      0 :::2181                     :::*                        LISTEN      27962/java

    三台服务器全部启动完成之后,进行如下验证:

    [root@test3 bin]# ./zkCli.sh --server10.0.102.204
    Connecting to localhost:2181
    2018-12-21 10:54:38,286 [myid:] - INFO  [main:Environment@100] - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT
    2018-12-21 10:54:38,289 [myid:] - INFO  [main:Environment@100] - Client environment:host.name=test3
    2018-12-21 10:54:38,289 [myid:] - INFO  [main:Environment@100] - Client environment:java.version=1.7.0_79
    2018-12-21 10:54:38,291 [myid:] - INFO  [main:Environment@100] - Client environment:java.vendor=Oracle Corporation
    2018-12-21 10:54:38,291 [myid:] - INFO  [main:Environment@100] - Client environment:java.home=/usr/local/jdk/jdk1.7.0_79/jre
    2018-12-21 10:54:38,291 [myid:] - INFO  [main:Environment@100] - Client environment:java.class.path=/usr/local/zookeeper/bin/../build/classes:/usr/local/zookeeper/bin/../build/lib/*.jar:/usr/local/zookeeper/bin/../lib/slf4j-log4j12-1.6.1.jar:/usr/local/zookeeper/bin/../lib/slf4j-api-1.6.1.jar:/usr/local/zookeeper/bin/../lib/netty-3.7.0.Final.jar:/usr/local/zookeeper/bin/../lib/log4j-1.2.16.jar:/usr/local/zookeeper/bin/../lib/jline-0.9.94.jar:/usr/local/zookeeper/bin/../zookeeper-3.4.6.jar:/usr/local/zookeeper/bin/../src/java/lib/*.jar:/usr/local/zookeeper/bin/../conf:
    
    2018-12-21 10:54:38,291 [myid:] - INFO  [main:Environment@100] - Client environment:java.library.path=/usr/local/mysql/lib:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib
    2018-12-21 10:54:38,291 [myid:] - INFO  [main:Environment@100] - Client environment:java.io.tmpdir=/tmp
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:java.compiler=<NA>
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:os.name=Linux
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:os.arch=amd64
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:os.version=2.6.32-504.el6.x86_64
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:user.name=root
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:user.home=/root
    2018-12-21 10:54:38,292 [myid:] - INFO  [main:Environment@100] - Client environment:user.dir=/usr/local/zookeeper/bin
    2018-12-21 10:54:38,293 [myid:] - INFO  [main:ZooKeeper@438] - Initiating client connection, connectString=localhost:2181 sessionTimeout=30000 watcher=org.apache.zookeeper.ZooKeeperMain$MyWatcher@1280d11b
    Welcome to ZooKeeper!
    2018-12-21 10:54:38,315 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@975] - Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
    JLine support is enabled
    2018-12-21 10:54:38,320 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@852] - Socket connection established to localhost/127.0.0.1:2181, initiating session
    2018-12-21 10:54:38,330 [myid:] - INFO  [main-SendThread(localhost:2181):ClientCnxn$SendThread@1235] - Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x367ce7db1fa0003, negotiated timeout = 30000
    
    WATCHER::
    
    WatchedEvent state:SyncConnected type:None path:null
    [zk: localhost:2181(CONNECTED) 0]


    #若有如上显示,则zookeeper集群搭建成功

    搭建卡夫卡集群

    仍然采用源码的方式安装。安装过程和zookeeper差不多,解压,修改配置文件,创建对应消息目录。

    [root@test3 src]# tar -zxvf kafka_2.10-0.10.0.0.tgz -C ../         #解压
    [root@test3 src]# cd ..
    [root@test3 local]# mv kafka_2.10-0.10.0.0 kafka                   #修改名字
    [root@test3 local]# cd kafka/
    [root@test3 kafka]# ls
    bin  config  libs  LICENSE  logs  NOTICE  site-docs
    [root@test3 kafka]# cd config/                                      #
    [root@test3 config]# ls                                             #kafka的配置文件有很多,但是目前我们只需要关注 server.properties
    connect-console-sink.properties    connect-file-sink.properties    connect-standalone.properties  producer.properties     zookeeper.properties
    connect-console-source.properties  connect-file-source.properties  consumer.properties            server.properties
    connect-distributed.properties     connect-log4j.properties        log4j.properties               tools-log4j.properties

    配置文件如下:把其中的注释删掉了!

    broker.id=3                            #在每个kafka服务器中唯一的,是一个整数
    port=9092
    host.name=10.0.102.179
    auto.create.topics.enable = false      
    delete.topic.enable = true
    num.network.threads=3
    
    num.io.threads=8
    
    socket.send.buffer.bytes=102400
    
    socket.receive.buffer.bytes=102400
    
    socket.request.max.bytes=104857600
    
    
    log.dirs=/data/kafka/logs                 
    
    num.partitions=1
    
    num.recovery.threads.per.data.dir=1
    
    log.retention.hours=168
    
    log.segment.bytes=1073741824
    
    log.retention.check.interval.ms=300000
    
    zookeeper.connect=10.0.102.179:2181,10.0.102.204:2181,10.0.102.214:2181
    zookeeper.connection.timeout.ms=6000

    配置文件的参数的说明:

    • broker.id: 每一个broker都需要一个标识符,使用broker.id来表示。默认是0,可以被设置为任意整数,在kafka集群中必须是唯一的。
    • port:默认端口是9092,配置kafka监听的端口。
    • zookeeper.connect:用于保存broker元数据的zookeeper地址是通过zookeeper.connect来指定的。新式就是上面那样,主机和端口号,多个地址用逗号隔开。上面的三个是一个zookeeper集群。若是当前连接的zookeeper宕机,broker可以连接到zookeeper群组中的其他服务器上。
    • log.dirs: kafka把所有消息都保存在磁盘上,存放这些日子片段的目录是通过log.dirs指定的。它是一组用逗号分隔的本地文件系统路径。如果指定了多个路径,那么broker会根据“最少使用”原则,把同一个分区的日志片段保存到同一个路径下。需要注意,borker会往拥有最少数目分区的路径新增分区,而不是往拥有最小磁盘空间的路径新增分区。
    • num.recovery.threads.per.data.dir,对于如下3种情况,kafka会使用多少个线程来处理日志片段。
      •   服务器正常启动,用于打开每个分区的日志片段。
      •        服务器崩溃后重启,用于检查和截短每个分区的日志片段。
      •        服务器正常关闭,用于关闭日志片段。

              默认情况下,每个日志目录只使用一个线程。因为这些线程只是在服务器启动和关闭时会用到,所以完全可以设置大量的线程来达到并行操作的目的。特别是对于包含大量分区的服务器来说,一旦发生崩溃,在进行恢复时使用并行操作可能会省下很多时间。所配置的数字对应的是log.dirs指定的单个日志目录。譬如,这个值被设置为8,并且log.dirx指定了3个路径,那么久需要24个线程。

    • auto.create.topics.enable 默认情况下,kafka会在以下几种情况下创建主题。
      •   当一个生产者开始往主题写入消息时。
      •        当一个消费者开始从主题读取消息时。
      •        当任意一个客户端向主题发送元数据请求是。

        这个参数有点迷糊,尽量设置为false吧!

    上面指定了kafa的日志目录,需要创建消息目录:

    [root@test1 ~]#  mkdir -p /data/kafka/logs

    和zookeeper一样,把上面解压后的文件和创建的日志目录,分别拷贝到其余两台服务器上,注意修改其余两台服务器的broker.id。

    然后启动kafka:

    [root@test3 bin]# ls
    connect-distributed.sh     kafka-consumer-groups.sh             kafka-reassign-partitions.sh   kafka-simple-consumer-shell.sh   zookeeper-server-start.sh
    connect-standalone.sh      kafka-consumer-offset-checker.sh     kafka-replay-log-producer.sh   kafka-topics.sh                  zookeeper-server-stop.sh
    kafka-acls.sh              kafka-consumer-perf-test.sh          kafka-replica-verification.sh  kafka-verifiable-consumer.sh     zookeeper-shell.sh
    kafka-configs.sh           kafka-mirror-maker.sh                kafka-run-class.sh             kafka-verifiable-producer.sh
    kafka-console-consumer.sh  kafka-preferred-replica-election.sh  kafka-server-start.sh          windows
    kafka-console-producer.sh  kafka-producer-perf-test.sh          kafka-server-stop.sh           zookeeper-security-migration.sh

    #bin目录下面有很多脚本,kafka自带的有zookeeper启动,但是建议搭建独立的zookeeper集群。

    [root@test2 bin]# ./kafka-server-start.sh /usr/local/kafka/config/server.properties 1>/dev/null 2>&1 &
    [1] 8757
    [root@test2 bin]#

    #kafka默认标准输出到屏幕,上面的命令把kafka挂起在后台运行。

    #启动之后查看是否监听了9092端口。
    [root@test2 bin]# netstat -lntp |grep 9092
    tcp        0      0 ::ffff:10.0.102.204:9092    :::*                        LISTEN      8757/java           
    [root@test2 bin]#

    三台服务器全部启动完毕,可以进行如下测试:

    [root@test1 bin]# ./kafka-console-producer.sh --broker-list 10.0.102.179:9092 --topci science       #创建一个主题
    topci is not a recognized option
    [root@test1 bin]#

    #创建一个生产者,发送消息
    [root@test1 bin]# ./kafka-console-producer.sh --broker-list 10.0.102.179:9092 --topic science
    test message
    first
    #创意一个消费者对象,接收生产者发送的消息
    [root@test1 bin]# ./kafka-console-consumer.sh --zookeeper 10.0.102.179:2181 --topic science --from-beginning
    test message

    first

    #可以看到卡夫卡是一个先进先出的消息队列

    若是以上的队列消息验证成功,则说明集群搭建成功、

    [root@test1 bin]# ./kafka-topics.sh --zookeeper 10.0.102.179:2181 --describe --topic science         #查看主题的信息
    Topic:science    PartitionCount:1    ReplicationFactor:1    Configs:
        Topic: science    Partition: 0    Leader: 2    Replicas: 2    Isr: 2
    [root@test1 bin]# 

    一个异常说明:在测试的时候,刚开始总报如下错误:

    [root@test1 bin]# ./kafka-console-producer.sh --broker-list localhost:9092 --topic lianxi
    test1
    [2018-12-20 17:33:27,112] ERROR Error when sending message to topic lianxi with key: null, value: 5 bytes with error: (org.apache.kafka.clients.producer.internals.ErrorLoggingCallback)
    org.apache.kafka.common.errors.TimeoutException: Failed to update metadata after 60000 ms.

    这个问题搞了好久,最好把java的版本从1.8降到了1.7之后,然后就成功了!

    搭建成功的各个组件的版本信息如下:

    [root@test1 ~]# java -version
    java version "1.7.0_79"
    Java(TM) SE Runtime Environment (build 1.7.0_79-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 24.79-b02, mixed mode)

    #kafka没有类似的version命令,需要查看kafka的使用包信息
    [root@test1 libs]# pwd
    /usr/local/kafka/libs
    [root@test1 libs]# ls kafka_2.10-0.10.0.0.jar
    kafka_2.10-0.10.0.0.jar

    #2.10是scala的版本,后面的0.10.0.0是kafka的版本

    #在zookeeper的安装目录下面有对应版本的一些包
    [root@test1 zookeeper]# ls
    bin        CHANGES.txt  contrib     docs             ivy.xml  LICENSE.txt  README_packaging.txt  recipes  zookeeper-3.4.6.jar      zookeeper-3.4.6.jar.md5
    build.xml  conf         dist-maven  ivysettings.xml  lib      NOTICE.txt   README.txt            src      zookeeper-3.4.6.jar.asc  zookeeper-3.4.6.jar.sha1
    [root@test1 zookeeper]#
    #zookeeper的版本是3.4.6
  • 相关阅读:
    前端 -- html
    MySQL索引
    Python操作MySQL
    MySQL表操作进阶
    MySQL表操作基础
    Github使用教程
    Android开发面试题
    MYSQL学习记录
    Java开发从零到现在
    JavaWeb(JSP/Servlet/上传/下载/分页/MVC/三层架构/Ajax)
  • 原文地址:https://www.cnblogs.com/wxzhe/p/10154947.html
Copyright © 2020-2023  润新知