• 搭建kafka集群


    一、环境准备

    OS hostname IP
    centos 7.2 kafka01 192.168.99.233
    centos 7.2 kafka02 192.168.99.234
    centos 7.2 kafka03 192.168.99.235

    1.1 配置hosts文件

    $ cat >> /etc/hosts << EOF
    192.168.99.233 kafka01
    192.168.99.234 kafka02
    192.168.99.235 kafka03
    EOF
    
    $ ssh-keygen 
    $ for i in kafka0{1..3};do ssh-copy-id ${i};done
    $ for i in kafka0{1..3};do scp /etc/hosts ${i}:/etc/;done
    

    二、部署zookeeper集群

    2.1 获取kafka软件包

    $ cd /opt	
    $ wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.5.0/kafka_2.13-2.5.0.tgz
    $ tar zxf kafka_2.13-2.5.0.tgz 
    $ mv kafka_2.13-2.5.0 kafka
    

    2.2 配置zookeeper

    $ rm -rf /opt/kafka/bin/windows
    $ cat > /opt/kafka/config/zookeeper.properties << EOF
    dataDir=/data/zk
    clientPort=2181
    maxClientCnxns=0
    tickTime=2000
    initLimit=10
    syncLimit=5
    quorumListenOnAllIPs=true
    server.1=kafka01:2888:3888
    server.2=kafka02:2888:3888
    server.3=kafka03:2888:3888
    EOF
    $ mkdir /data/zk -pv
    $ echo 1 > /data/zk/myid
    

    配置文件解释:

    • dataDir:zookeeper数据存放目录;

    • clientPort:client连接zookeeper需要指定的端口;

    • maxClientCnxns:表示允许客户端最大连接数,如果设置为0,则表示不限制;

    • tickTime:表示zookeeper集群之间的心跳检测时间间隔(单位是毫秒);

    • initLimit:表示zookeeper集群中的follower在启动时需要在多少个心跳检测时间内从leader同步数据(如果数据量过大,此值可适当调整);

    • syncLimit:表示超过多少个心跳时间收不到follower的响应,leader就认为follower已经下线;

    • quorumListenOnAllIPs:该参数设置为true,配置为true可以避免入坑(尤其是多网卡主机),Zookeeper服务器将监听所有可用IP地址的连接。他会影响ZAB协议和快速Leader选举协议。默认是false;

    • server.x=IP:Port1:Port2:指定zk节点列表;

      • x:表示节点的编号,此编号需要写入到zk数据存放目录下,以myid命名的文件。

      • IP:可以指定IP也可以是主机名。

      • Port1表示该Zookeeper集群中的Follower节点与Leader节点通讯时使用的端口。作为Leader时监听该端口。

      • Port2表示选举新的Leader时,Zookeeper节点之间互相通信的端口,比如当Leader挂掉时,其余服务器会互相通信,选出新的Leader。Leader和Follower都会监听该端口。

    至此,第一台主机的zk配置完成,但是现在先不启动,我们先接着把第一台主机的kafka也配置好。

    三、配置kafka

    $ cat > /opt/kafka/config/server.properties << EOF
    broker.id=0
    listeners=PLAINTEXT://:9092
    auto.create.topics.enable=true
    delete.topic.enable=true
    num.network.threads=15
    num.io.threads=30
    socket.send.buffer.bytes=102400
    socket.receive.buffer.bytes=102400
    socket.request.max.bytes=104857600
    log.dirs=/data/kafka/log
    num.partitions=3
    num.recovery.threads.per.data.dir=3
    default.replication.factor=2
    num.replica.fetchers=2
    log.retention.hours=168
    log.segment.bytes=1073741824
    log.retention.check.interval.ms=300000
    zookeeper.connect=kafka01:2181:kafka02:2181,kafka03:2181
    zookeeper.connection.timeout.ms=10000
    group.initial.rebalance.delay.ms=0
    EOF
    $ mkdir -pv /data/kafka/log 
    

    配置文件解释:

    以下只介绍比较常见又比较重要的参数:

    • auto.create.topics.enable:该配置项默认值是true,但在生产环境最好设置为false。这样可以控制创建Topic的人以及创建时间。

    • background.threads:该配置项默认值是10,既整个Kafka在执行各种任务时会启动的线程数。如果你的CPU很强劲,那么可以将线程数设大一点。

    • delete.topic.enable:该配置项默认值是false,可以根据实际需求改变,在生产环境还是建议保持默认值,这样至少不会出现Topic被误删的情况。

    • log.flush.interval.messages:该配置项最好保持默认值,把这个任务交给操作系统的文件系统去处理。

    • log.retention.hours:日志文件保留的时间默认是168小时,即7天。这个配置可以根据具体业务需求而定。

    • message.max.bytes:每条Message或一批次Message的大小默认是1MB。这个配置也要根据具体需求而定,比如带宽的情况。

    • min.insync.replicas:该配置项的默认值是1,既在acks=all时,最少得有一个Replica进行确认回执。建议在生产环境配置为2,保证数据的完整性。

    • num.io.threads:处理I/O操作的线程数,默认是8个线程。如果觉得在这个环节达到了瓶颈,那么可以适当调整该参数。

    • num.network.threads:处理网络请求和响应的线程数,默认是3个线程。如果觉得在这个环节达到了瓶颈,那么可以适当调整该参数。

    • num.recovery.threads.per.data.dir:每个数据目录启用几个线程来处理,这里的线程数和数据目录数是乘积关系,并且只在Broker启动或关闭时使用。默认值是1,根据实际情况配置数据目录数,从而判断该配置项应该如何设置。

    • num.replica.fetchers:该配置项影响Replicas同步数据的速度,默认值是1,如果发现Replicas同步延迟较大,可以提升该配置项。

    • offsets.retention.minutes:Offset保留的时间,默认值是1440,既24小时。在生产环境建议将该配置项设大一点,比如设置为1个月,保证消费数据的完整性。

    • unclean.leader.election.enable:该配置项的作用是,指定是否可以将非ISR的Replicas选举为Leader,默认值为false。在生产环境建议保持默认值,防止数据丢失。

    • zookeeper.session.timeout.ms:Zookeeper会话超时时间,默认值为6000。按实际情况而定,通常情况下保持60秒即可。

    • default.replication.factor:默认Replication Factor为1,建议设置为2或者3,以保证数据完整性和整个集群的健壮性。

    • num.partitions:Topic默认的Partition数,默认是1,建议设置为3或者6,以保证数据完整性和整个集群的健壮性。

    • group.initial.rebalance.delay.ms:当Consumer Group新增或减少Consumer时,重新分配Topic Partition的延迟时间。

    至此第一个节点上的kafka也配置完成!为了简单起见,将所需文件拷贝到另外两个节点上!

    四、 复制所需文件到其他节点

    $ for i in kafka0{2..3};do rsync -avz /opt/kafka ${i}:/opt/;done
    $ for i in kafka0{2..3};do rsync -avz /data ${i}:/;done
    
    # kafka02
    $ echo 2 > /data/zk/myid
    $ sed -i 's#broker.id=0#broker.id=1#g' /opt/kafka/config/server.properties
    
    # kafka03
    $ echo 3 > /data/zk/myid
    $ sed -i 's#broker.id=0#broker.id=2#g' /opt/kafka/config/server.properties
    

    五、 启动zookeeper

    5.1 启动zookeeper

    每个节点都需执行以下操作:

    $ cd /opt/kafka/bin
    $ ./zookeeper-server-start.sh ../config/zookeeper.properties &
    
    $ ss -lnpt | egrep '2181|3888|2888'      # 只有leader才会监听2888端口
    LISTEN     0      50          :::2181                    :::*                   users:(("java",pid=58948,fd=118))
    LISTEN     0      50          :::2888                    :::*                   users:(("java",pid=58948,fd=130))
    LISTEN     0      50          :::3888                    :::*                   users:(("java",pid=58948,fd=127))
    

    5.2 验证

    我们通过Zookeeper Client连接到集群来检验。我们选择任意一台服务器,首先连接kafka01主机。

    $ ./zookeeper-shell.sh kafka01:2181      # 连接到kafka01
    create /my_zNode "some data"       # 连接成功后,创建一个zNode
    ls /                   # 查看节点中所有znode
    [my_zNode, zookeeper]
    
    
    $ ./zookeeper-shell.sh kafka02:2181       # 再连接到kaka02
    ls /          # 同样可以查看到my_zNode
    [my_zNode, zookeeper]
    get /my_zNode     # 查看my_zNode中的数据
    some data
    
    
    $ ./zookeeper-shell.sh kafka03:2181      # 再连接到kafka03节点
    ls /       # 查看
    [my_zNode, zookeeper]
    get /my_zNode             # 获取数据
    some data
    set /my_zNode "new data"          # 修改my_zNode中的数据
    get /my_zNode      # 确认数据已修改
    new data
    
    
    $ ./zookeeper-shell.sh kafka01:2181      # 再连接到kafka1,确定数据修改
    
    get /my_zNode
    new data
    

    上面的过程虽然比较繁琐,但是充分说明了我们的Zookeeper集群是搭建成功的。无论从哪个Zookeeper节点创建的zNode,都可以同步到集群中的其他节点。无论从哪个Zookeeper节点修改的zNode中的数据,也可以同步到起群中的其他节点。

    六、启动kafka

    6.1 启动kafka

    三个节点都需启动kafka!

    $ cd /opt/kafka/bin/
    $ ./kafka-server-start.sh -daemon ../config/server.properties
    $ ss -lnt | grep 9092           # 三台kafka都启动完成后,端口才会监听
    LISTEN     0      50          :::9092                    :::*                  
    

    6.2 kafka常用指令

    当三个节点都启动后,并且确认9092端口在监听,那么就可以执行下面的指令,来测试kafka是否正常了。

    $ cd /opt/kafka
    # 显示topic列表
    $ bin/kafka-topics.sh --zookeeper kafka1:2181,kafka2:2181,kafka3:2181  --list  
    也可以从一个节点上查看。下面简写查看一个节点。
    
    # 创建一个topic,并指定topic属性(副本数、分区数等)
    $ bin/kafka-topics.sh --create --zookeeper kafka1:2181 --replication-factor 1 --partitions 3 --topic test
    # --partitions(分区)应等于或大于消费者,--replication-factor(副本数)不能大于kafka集群内主机节点
    
    # 查看某个topic的状态
    $ bin/kafka-topics.sh   --zookeeper   kafka1:2181    --topic   test   --describe
    
    # 生产消息
    $ bin/kafka-console-producer.sh --broker-list kafka1:9092 --topic  test    
    
    # 消费消息
    $ bin/kafka-console-consumer.sh --bootstrap-server PLAINTEXT://kafka1:9092 --topic  test
    
    # 查看实时消息,如果从头看可在后面加   --from-beginning  
    $ bin/kafka-console-consumer.sh --bootstrap-server kafka1:9092 --topic test --from-beginning
    
    # 删除topic
    $ bin/kafka-topics.sh --delete --zookeeper kafka1:2181  --topic   test
    

    七、安装kafka manager

    kafka有一个管理工具叫kafka-manager,它支持管理多个集群、选择副本、副本重新分配以及创建Topic。同时,这个管理工具也是一个非常好的可以快速浏览这个集群的工具。

    kafka manager有如下功能:

    • 管理多个kafka集群

    • 便捷的检查kafka集群状态(topics,brokers,备份分布情况,分区分布情况)

    • 选择你要运行的副本

    • 基于当前分区状况进行

    • 可以选择topic配置并创建topic(0.8.1.1和0.8.2的配置不同)

    • 删除topic(只支持0.8.2以上的版本并且要在broker配置中设置delete.topic.enable=true)

    • Topic list会指明哪些topic被删除(在0.8.2以上版本适用)

    • 为已存在的topic增加分区

    • 为已存在的topic更新配置

    • 在多个topic上批量重分区

    • 在多个topic上批量重分区(可选partition broker位置)

    强烈建议使用docker来部署这个kafka-manager工具,如下:

    $ docker run -itd --rm  -p 9000:9000 -e ZK_HOSTS="192.168.99.233:2181,192.168.99.234:2181,192.168.99.235:2181" -e APPLICATION_SECRET=letmein sheepkiller/kafka-manager
    

    此项目托管在github上,可以参阅github

    docker启动后,访问9000端口,界面如下:

    20200616224534

    关于kafka-manager的配置使用,可以参阅详细解析 kafka manager 的使用

    八、kafka开启jmx polling

    在使用kafka-amnager时,有一个功能为Enable JMX Polling,该部分直接影响部分 kafka broker 和 topic 监控指标指标的获取,那么如何开启此功能呢?方法有两种。如下:

    方法1:

    启动kafka时增加JMX_PORT=9988。如下:

    $ JMX_PORT=9988 ./kafka-server-start.sh -daemon ../config/server.properties
    

    方法2:

    修改kafka-run-class.sh脚本,第一行增加JMX_PORT=9988即可。

    不管是哪种方法,都只是定义了一个变量而已,剩下的事情交给程序去做就好。

    附加:k8s部署kafka-manager

    在k8s中部署kafka-manager的yml文件如下(可根据实际情况来修改):

    apiVersion: v1
    kind: Service
    metadata:
      name: iov-sjjh-kafka-manager
      namespace: iov-sjjh
      labels:
        name: iov-sjjh-kafka-manager
    spec:
      type: NodePort
      ports:
      - name: service
        port: 9000
        nodePort: 30200
        targetPort: 9000
      selector:
        name: iov-sjjh-kafka-manager
    ---
    apiVersion: apps/v1beta1
    kind: Deployment
    metadata:
      name: iov-sjjh-kafka-manager
      namespace: iov-sjjh
    spec:
      replicas: 1
      template:
        metadata:
          labels:
            name: iov-sjjh-kafka-manager
        spec:
          containers:
          - name: iov-sjjh-kafka-manager
            image: sheepkiller/kafka-manager:latest 
            imagePullPolicy: IfNotPresent
            ports:
            - containerPort: 9000
            resources:
              limits:
                memory: 1G
                cpu: 2
              requests:
                memory: 1G
                cpu: 2
            env:
            - name: "ZK_HOSTS"
              value: "192.168.99.233:2181,192.168.99.234:2181,192.168.99.235:2181"
            - name: "KAFKA_MANAGER_AUTH_ENABLED"
              value: "true"
            - name: "KAFKA_MANAGER_USERNAME"
              value: "iov_sjjh"
            - name: "KAFKA_MANAGER_PASSWORD"
              value: "iov_sjjh123"
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    个人温度上报小软件
    假期10
    Android开发 07
    假期09
    Android开发 06
    Android开发 05
    假期08
    Android开发 04
    假期07
    每日日报
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14197049.html
Copyright © 2020-2023  润新知