kafka 集群_Kafka+ZooKeeper高可用集群部署

55e0fcd394a770ec793bd86215c3f5a1.gif

集群环境

40b32c68d660e56d95f89008bfb0b0b4.png
kafka+zk
IP地址主机名Kafka版本ZooKeeper版本JDK版本
172.17.0.2kafka_node1kafka_2.12-2.2.1.tgzzookeeper-3.4.14.tar.gzjdk-8u161-linux-x64.tar.gz
172.17.0.3kafka_node2kafka_2.12-2.2.1.tgzzookeeper-3.4.14.tar.gzjdk-8u161-linux-x64.tar.gz
172.17.0.4kafka_node3kafka_2.12-2.2.1.tgzzookeeper-3.4.14.tar.gzjdk-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_161export JRE_HOME=\$JAVA_HOME/jreexport CLASSPATH=.:\$JAVA_HOME/lib/dt.jar:\$JAVA_HOME/lib/tools.jar:\$JRE_HOME/libexport PATH=\$JAVA_HOME/bin:\$JRE_HOME/bin:\$PATHEOFsource /etc/profilejava -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.cfgtickTime=2000initLimit=10syncLimit=5dataDir=/data/zk_datadataLogDir=/usr/local/zookeeper-3.4.14/logsclientPort=2181maxClientCnxns=60autopurge.snapRetainCount=3autopurge.purgeInterval=1server.1=172.17.0.2:2888:3888server.2=172.17.0.3:2888:3888server.3=172.17.0.4:2888:3888EOF

创建ZooKeeper数据存储目录及日志目录

mkdir -p /data/zk_datamkdir /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 startZooKeeper JMX enabled by defaultUsing config: /usr/local/zookeeper-3.4.14/bin/../conf/zoo.cfgStarting 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:2888COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava    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:2888COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava     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:2888COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava     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.tgztar 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.propertiesbroker.id=1                                                     #Kafka_node2节点修改为2,3修改为3listeners=PLAINTEXT://172.17.0.2:9092                           #修改Kafka_node的IP地址为各自node本地地址num.network.threads=3num.io.threads=8socket.send.buffer.bytes=102400socket.receive.buffer.bytes=102400socket.request.max.bytes=104857600log.dirs=/data/kafka-logs/num.partitions=1num.recovery.threads.per.data.dir=1offsets.topic.replication.factor=1transaction.state.log.replication.factor=1transaction.state.log.min.isr=1log.retention.hours=72log.segment.bytes=1073741824log.retention.check.interval.ms=300000zookeeper.connect=172.17.0.2:2181,172.17.0.3:2181,172.17.0.4:2181delete.topic.enable=truezookeeper.connection.timeout.ms=6000group.initial.rebalance.delay.ms=3000EOF

启动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            

查看进程连接

jps15620 QuorumPeerMain16057 Jps15945 Kafka下面通过过滤端口号可以看到ZooKeeper监控本地地址TCP端口2181,可以ZooKeeper看到2181后面对应的还有一个端口号为43918Kafka监控本地地址TCP端口9092,可以看到Kafka9092后面也有对应的一个端口号55568netstat -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:9092COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava    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:9092COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava    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:9092COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAMEjava    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_dataWARNING: 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:9092kafka_data[root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.3:9092kafka_data[root@kafka_node1 /]# /usr/local/kafka_2.12-2.2.1/bin/kafka-topics.sh --list --bootstrap-server 172.17.0.4:9092kafka_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 createtestHello 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_dataTopic: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上全部删除

☆ END ☆

177a9eb63321f7a881f98e159c83dca8.png

f57063c55a39e752ca64ed5da50c8b36.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个基本的在k8s上部署zookeeper + kafka集群的配置教程: 1. 创建一个namespace 首先,我们需要创建一个namespace,用于部署zookeeperkafka集群。可以使用以下命令创建一个名为“zookeeper-kafka”的namespace: ``` kubectl create namespace zookeeper-kafka ``` 2. 部署Zookeeper 接下来,我们需要部署Zookeeper。可以使用以下YAML文件创建一个Zookeeper服务: ``` apiVersion: v1 kind: Service metadata: name: zookeeper spec: selector: app: zookeeper ports: - name: client port: 2181 protocol: TCP - name: follower port: 2888 protocol: TCP - name: leader port: 3888 protocol: TCP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: zookeeper spec: serviceName: zookeeper replicas: 3 selector: matchLabels: app: zookeeper template: metadata: labels: app: zookeeper spec: containers: - name: zookeeper image: zookeeper:3.5.8 ports: - name: client containerPort: 2181 - name: follower containerPort: 2888 - name: leader containerPort: 3888 volumeMounts: - name: datadir mountPath: /data env: - name: ZOO_MY_ID valueFrom: fieldRef: fieldPath: metadata.name - name: ZOO_SERVERS value: zookeeper-0.zookeeper:2888:3888,zookeeper-1.zookeeper:2888:3888,zookeeper-2.zookeeper:2888:3888 volumeClaimTemplates: - metadata: name: datadir spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 这将创建一个3个Pod的Zookeeper StatefulSet,并创建一个名为“zookeeper”的Service,暴露Zookeeper的客户端端口2181,follower端口2888和leader端口3888。 3. 部署Kafka 现在,我们可以部署Kafka。以下是一个Kafka部署的YAML文件示例: ``` apiVersion: v1 kind: Service metadata: name: kafka spec: type: NodePort selector: app: kafka ports: - name: kafka port: 9092 nodePort: 30092 protocol: TCP --- apiVersion: apps/v1 kind: StatefulSet metadata: name: kafka spec: serviceName: kafka replicas: 3 selector: matchLabels: app: kafka template: metadata: labels: app: kafka spec: containers: - name: kafka image: wurstmeister/kafka:2.13-2.7.0 ports: - name: kafka containerPort: 9092 env: - name: KAFKA_BROKER_ID valueFrom: fieldRef: fieldPath: metadata.name - name: KAFKA_ZOOKEEPER_CONNECT value: zookeeper-0.zookeeper:2181,zookeeper-1.zookeeper:2181,zookeeper-2.zookeeper:2181 - name: KAFKA_ADVERTISED_LISTENERS value: PLAINTEXT://$(hostname -f):9092 - name: KAFKA_LISTENERS value: PLAINTEXT://0.0.0.0:9092 - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR value: "3" volumeMounts: - name: datadir mountPath: /data volumeClaimTemplates: - metadata: name: datadir spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi ``` 这将创建一个3个Pod的Kafka StatefulSet和一个名为“kafka”的Service,它将Kafka的9092端口暴露为NodePort 30092。 4. 验证部署 现在,您可以使用以下命令检查ZookeeperKafka是否正在运行: ``` kubectl get pods -n zookeeper-kafka ``` 您应该看到3个Zookeeper和3个Kafka Pod处于“Running”状态。 接下来,您可以使用以下命令检查Kafka是否正在监听端口30092(或您自己选择的端口): ``` kubectl get services -n zookeeper-kafka ``` 您应该看到一个名为“kafka”的service,它将Kafka的9092端口暴露为30092端口。可以使用此端口测试Kafka是否正常运行。 至此,您已经成功地在k8s上部署zookeeper + kafka集群

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值