zoukankan      html  css  js  c++  java
  • Kafka+ZooKeeper高可用集群部署

    集群环境


    kafka+zk
    IP地址                    主机名                                      Kafka版本                                  ZooKeeper版本                                     JDK版本
    172.17.0.2   kafka_node1                      kafka_2.12-2.2.1.tgz                      zookeeper-3.4.14.tar.gz                      jdk-8u161-linux-x64.tar.gz
    172.17.0.3   kafka_node2                      kafka_2.12-2.2.1.tgz                      zookeeper-3.4.14.tar.gz                      jdk-8u161-linux-x64.tar.gz
    172.17.0.4   kafka_node3                      kafka_2.12-2.2.1.tgz                      zookeeper-3.4.14.tar.gz                      jdk-8u161-linux-x64.tar.gz
    我这里并没有设置专业的存储设备,大家用到生产中一定要把数据存储到专业的存储设备或者带有冗余设备的磁盘上
    ###部署JDK

    tar xf jdk-8u161-linux-x64.tar.gz -C /usr/local/
    cat << EOF >> /etc/profile
    #################JAVA#################
    export JAVA_HOME=/usr/local/jdk1.8.0_161
    export JRE_HOME=$JAVA_HOME/jre
    export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
    export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
    EOF

    source /etc/profile
    java -version
    ###部署ZooKeeper ZooKeeper官方站点:https://zookeeper.apache.org/ Kafka使用ZooKeeper来管理,因此需要安装ZooKeeper,并且要先启动ZooKeeper

    wget https://mirrors.tuna.tsinghua.edu.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
    解压安装

    tar xf zookeeper-3.4.14.tar.gz -C /usr/local/
    cp -rf /usr/local/zookeeper-3.4.14/conf/zoo_sample.cfg /usr/local/zookeeper-3.4.14/conf/zoo.cfg
    修改ZooKeeper配置 三台设备保持一致,配置文件详解请看这篇文章内的配置文件详解部分:https://abcops.cn/zookeeper-single-deployment/

    cat << EOF > /usr/local/zookeeper-3.4.14/conf/zoo.cfg
    tickTime=2000
    initLimit=10
    syncLimit=5
    dataDir=/data/zk_data
    dataLogDir=/usr/local/zookeeper-3.4.14/logs
    clientPort=2181
    maxClientCnxns=60
    autopurge.snapRetainCount=3
    autopurge.purgeInterval=1
    server.1=172.17.0.2:2888:3888
    server.2=172.17.0.3:2888:3888
    server.3=172.17.0.4:2888:3888
    EOF
    创建ZooKeeper数据存储目录及日志目录

    mkdir -p /data/zk_data
    mkdir /usr/local/zookeeper-3.4.14/logs
    创建ServerID标识

    在ZooKeeper集群中除配置文件外,还需要配置一个myid文件,这个文件需要存放在配置文件中dataDir配置项所指定的数据位置,要根据集群中的节点创建不用的文件。我们要根据ServerID标示来创建相应的文件
    Kafka_node1

    [root@kafka_node1 /]# echo '1' > /data/zk_data/myid
    Kafka_node2

    [root@kafka_node2 /]# echo '2' > /data/zk_data/myid
    Kafka_node3

    [root@kafka_node3 /]# echo '3' > /data/zk_data/myid
    启动ZK集群并查看 三台ZK节点全部启动

    /usr/local/zookeeper-3.4.14/bin/zkServer.sh start
    ZooKeeper JMX enabled by default
    Using config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfg
    Starting zookeeper ... STARTED
    查看ZK端口监听情况 losf -i:命令来查看端口信息 leader:如果此设备是leader,那么使用losf查看到的连接会是与集群内所有的follower的连接 follower:如果此设备是follower,那么使用losf查看到的连接将只会与ZK集群中的leader连接

    Kafka_node1 node1只有一个连接是和172.17.0.3建立的,可以表明此节点为follower节点

    [root@kafka_node1 /]# lsof -i:2888
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 15620 root 30u IPv4 71449 0t0 TCP kafka_node1:42424->172.17.0.3:spcsdlobby (ESTABLISHED)
    Kafka_node2 node2是与集群内的其它两台机器所连接,可以表明此节点为leader节点

    [root@kafka_node2 /]# lsof -i:2888
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 91 root 30u IPv4 65243 0t0 TCP kafka_node2:spcsdlobby (LISTEN)
    java 91 root 31u IPv4 69183 0t0 TCP kafka_node2:spcsdlobby->172.17.0.2:42424 (ESTABLISHED)
    java 91 root 33u IPv4 69192 0t0 TCP kafka_node2:spcsdlobby->172.17.0.4:49420 (ESTABLISHED)
    Kafka_node3 node3与node1一样为follower节点

    [root@kafka_node3 /]# lsof -i:2888
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 91 root 31u IPv4 64087 0t0 TCP kafka_node3:49420->172.17.0.3:spcsdlobby (ESTABLISHED)
    到此ZK集群搭建完毕,如需了解ZK更多的管理操作,请看:https://abcops.cn/zookeeper-single-deployment/

    ###部署Kafka 下载安装

    wget http://mirror.bit.edu.cn/apache/kafka/2.2.1/kafka_2.12-2.2.1.tgz
    tar xf kafka_2.12-2.2.1.tgz -C /usr/local/
    修改Kafka配置

    关于Kafka配置详解请参考:https://abcops.cn/kafka-config-file/
    原文件备份

    cp -rf /usr/local/kafka_2.12-2.2.1/config/server.properties /usr/local/kafka_2.12-2.2.1/config/server.properties.default
    配置修改

    cat << EOF > /usr/local/kafka_2.12-2.2.1/config/server.properties
    broker.id=1 #Kafka_node2节点修改为2,3修改为3
    listeners=PLAINTEXT://172.17.0.2:9092 #修改Kafka_node的IP地址为各自node本地地址
    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
    offsets.topic.replication.factor=1
    transaction.state.log.replication.factor=1
    transaction.state.log.min.isr=1
    log.retention.hours=72
    log.segment.bytes=1073741824
    log.retention.check.interval.ms=300000
    zookeeper.connect=172.17.0.2:2181,172.17.0.3:2181,172.17.0.4:2181
    delete.topic.enable=true
    zookeeper.connection.timeout.ms=6000
    group.initial.rebalance.delay.ms=3000
    EOF
    启动Kafka 三台Kafka_node全部启动

    /usr/local/kafka_2.12-2.2.1/bin/kafka-server-start.sh -daemon /usr/local/kafka_2.12-2.2.1/config/server.properties
    查看进程连接

    jps
    15620 QuorumPeerMain
    16057 Jps
    15945 Kafka

    下面通过过滤端口号可以看到
    ZooKeeper监控本地地址TCP端口2181,可以ZooKeeper看到2181后面对应的还有一个端口号为43918
    Kafka监控本地地址TCP端口9092,可以看到Kafka9092后面也有对应的一个端口号55568
    netstat -anplt | egrep "(2181|9092)"
    tcp 0 0 172.17.0.2:9092 0.0.0.0:* LISTEN 15945/java
    tcp 0 0 0.0.0.0:2181 0.0.0.0:* LISTEN 15620/java
    tcp 0 0 172.17.0.2:45674 172.17.0.4:9092 ESTABLISHED 15945/java
    tcp 0 0 172.17.0.2:55568 172.17.0.2:9092 ESTABLISHED 15945/java
    tcp 0 0 172.17.0.2:9092 172.17.0.2:55568 ESTABLISHED 15945/java
    tcp 0 0 172.17.0.2:43094 172.17.0.3:9092 ESTABLISHED 15945/java
    tcp 0 0 172.17.0.2:2181 172.17.0.2:43918 ESTABLISHED 15620/java
    tcp 0 0 172.17.0.2:43918 172.17.0.2:2181 ESTABLISHED 15945/java
    查看Kafka监听状态 Kafka_node1 可以看到node1节点同时与node2及node3建立了连接,可以看到node1节点为主导者

    [root@kafka_node1 /]# lsof -i:9092
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 15945 root 106u IPv4 64487 0t0 TCP kafka_node1:XmlIpcRegSvc (LISTEN)
    java 15945 root 122u IPv4 72859 0t0 TCP kafka_node1:55568->kafka_node1:XmlIpcRegSvc (ESTABLISHED)
    java 15945 root 123u IPv4 71815 0t0 TCP kafka_node1:XmlIpcRegSvc->kafka_node1:55568 (ESTABLISHED)
    java 15945 root 127u IPv4 72997 0t0 TCP kafka_node1:43094->172.17.0.3:XmlIpcRegSvc (ESTABLISHED)
    java 15945 root 131u IPv4 75769 0t0 TCP kafka_node1:45674->172.17.0.4:XmlIpcRegSvc (ESTABLISHED)
    Kafka_node2 node2只与node1建立了连接

    [root@kafka_node2 /]# lsof -i:9092
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 415 root 106u IPv4 75016 0t0 TCP kafka_node2:XmlIpcRegSvc (LISTEN)
    java 415 root 116u IPv4 72998 0t0 TCP kafka_node2:XmlIpcRegSvc->172.17.0.2:43094 (ESTABLISHED)
    Kafka_node3 node3与node2一样和node1建立了连接

    [root@kafka_node3 /]# lsof -i:9092
    COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
    java 1125 root 106u IPv4 73394 0t0 TCP kafka_node3:XmlIpcRegSvc (LISTEN)
    java 1125 root 116u IPv4 72253 0t0 TCP kafka_node3:XmlIpcRegSvc->172.17.0.2:45674 (ESTABLISHED)
    ###管理Kafka

    接下来我们操作下Kafka,我们会通过kafka-topics.sh新建一个Topic,然后使用kafka-console-producer.sh消息生产脚本来生产消息到Topic中,再由kafka-console-consumer.sh消息消费者消费消息,以及常用的选项介绍。
    创建Topic主题

    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --create --bootstrap-server 172.17.0.2:9092,172.17.0.3:9092,172.17.0.4:9092 --replication-factor 3 --partitions 3 --topic kafka_data
    WARNING: Due to limitations in metric names, topics with a period ('.') or underscore ('_') could collide. To avoid issues it is best to use either, but not both.
    #上面kafka警告说“在创建Topic时不允许使用"_."之类的符号,由于我们是测试,没有关系”

    选项解释:
    --create:创建新的Topic
    --bootstrap-server:指定要哪台Kafka服务器上创建Topic,主机加端口,指定的主机地址一定要和配置文件中的listeners一致
    --zookeeper:指定要哪台zookeeper服务器上创建Topic,主机加端口,指定的主机地址一定要和配置文件中的listeners一致
    --replication-factor:创建Topic中的每个分区(partition)中的复制因子数量,即为Topic的副本数量,建议和Broker节点数量一致,如果复制因子超出Broker节点将无法创建
    --partitions:创建该Topic中的分区(partition)数量
    --topic:指定Topic名称
    查看已创建的Topic

    刚才我们创建了3份Topic,创建时指定了三台Kafka的地址及端口,所以每天上面都会有我们创建的Topic
    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.2:9092
    kafka_data
    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.3:9092
    kafka_data
    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.4:9092
    kafka_data
    生产消息

    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-console-producer.sh --broker-list 172.17.0.2:9092 --topic kafka_data
    >Hello Kafka_data
    >I'm the 172.17.0.2 Kafka create
    >test

    参数解释:
    --broker-list:指定使用哪台broker来生产消息
    --topic:指定要往哪个Topic中生产消息
    消费消息 我们在Kafka_node1上的Topic生产消息,在Kafka_node3中消费消息,可以得出,Broker存储过消息后会同步给集群内的其它Broker节点

    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-console-consumer.sh --bootstrap-server 172.17.0.4:9092 --topic kafka_data --from-beginning
    I'm the 172.17.0.2 Kafka create
    test
    Hello Kafka_data
    查看Topic详情

    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --describe --bootstrap-server 172.17.0.2:9092 --topic kafka_data
    Topic:kafka_data PartitionCount:3 ReplicationFactor:3 Configs:segment.bytes=1073741824
    Topic: kafka_data Partition: 0 Leader: 1 Replicas: 1,2,3 Isr: 1,2,3
    Topic: kafka_data Partition: 1 Leader: 2 Replicas: 2,3,1 Isr: 2,3,1
    Topic: kafka_data Partition: 2 Leader: 3 Replicas: 3,1,2 Isr: 3,1,2

    参数解释:
    Topic:kafka_data:topic名称
    PartitionCount:3:分片数量
    ReplicationFactor:3:Topic副本数量
    删除Topic

    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --delete --bootstrap-server 172.17.0.2:9092 --topic kafka_data

    查看删除信息
    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.2:9092
    __consumer_offsets
    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.3:9092
    __consumer_offsets
    [root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.4:9092
    __consumer_offsets
    我们在node1节点删除了Topic,三台节点会同步更新,所以我们的kafka_data在三台node上全部删除

  • 相关阅读:
    Educational Codeforces Round 88 (Rated for Div. 2) D. Yet Another Yet Another Task(枚举/最大连续子序列)
    Educational Codeforces Round 88 (Rated for Div. 2) A. Berland Poker(数学)
    Educational Codeforces Round 88 (Rated for Div. 2) E. Modular Stability(数论)
    Educational Codeforces Round 88 (Rated for Div. 2) C. Mixing Water(数学/二分)
    Codeforces Round #644 (Div. 3)
    Educational Codeforces Round 76 (Rated for Div. 2)
    Educational Codeforces Round 77 (Rated for Div. 2)
    Educational Codeforces Round 87 (Rated for Div. 2)
    AtCoder Beginner Contest 168
    Codeforces Round #643 (Div. 2)
  • 原文地址:https://www.cnblogs.com/cheyunhua/p/13255337.html
Copyright © 2011-2022 走看看