Kafka 2017 Update(1)Zookeeper Cluster and Kafka Cluster

本文详细介绍了如何在三台节点上安装配置Zookeeper集群,并进一步搭建Kafka集群的过程。包括解决常见错误及配置问题,创建Topic,运行生产者与消费者等关键步骤。
Kafka 2017 Update(1)Zookeeper Cluster and Kafka Cluster

Install Zookeeper Cluster on 3 Nodes
>wget http://mirrors.advancedhosters.com/apache/zookeeper/zookeeper-3.5.3-beta/zookeeper-3.5.3-beta.tar.gz
>tar xf zookeeper-3.5.3-beta.tar.gz
>sudo ln -s /home/ec2-user/tool/zookeeper-3.5.3 /opt/zookeeper-3.5.3
>sudo ln -s /opt/zookeeper-3.5.3 /opt/zookeeper

Add the working directory to the PATH
PATH=$PATH:/opt/zookeeper/bin

Prepare the Configuration file
>cp conf/zoo_sample.cfg conf/zoo.cfg
Try start local server
>zkServer.sh start conf/zoo.cfg

Port 8080 is used by the AdminServer which is new in 3.5.0.
Add the settings in the zkServer.sh
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}" "-Dzookeeper.admin.serverPort=8081"\
"-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}" \
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p' \
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2>&1 < /dev/null &
if [ $? -eq 0 ]

https://zookeeper.apache.org/doc/r3.5.1-alpha/zookeeperAdmin.html#sc_adminserver_config
Source code is here https://github.com/apache/zookeeper/blob/master/src/java/main/org/apache/zookeeper/server/admin/JettyAdminServer.java
It is reading from the JVM system configuration of -Dzookeeper.admin.serverPort=8081

Visit the Admin console
http://fr-stage-api:8081/commands/stats

Connect with Client
>zkCli.sh -server localhost:2181

Stop the Service
>zkServer.sh stop

Prepare the Configuration for Cluster zoo1.cfg, zoo2.cfg, zoo3.cfg, adding these lines
server.1=fr-stage-api:2888:3888
server.2=fr-stage-consumer:2888:3888
server.3=fr-perf1:2888:3888

>vi /tmp/zookeeper/myid
1
>vi /tmp/zookeeper/myid
2
>vi /tmp/zookeeper/myid
3

Copy the file to all other server and start them all.
Exception:
2018-01-02 19:38:03,370 [myid:] - ERROR [main:QuorumPeerMain@86] - Invalid config, exiting abnormally
org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing conf/zoo1.cfg
at org.apache.zookeeper.server.quorum.QuorumPeerConfig.parse(QuorumPeerConfig.java:138)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:110)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:79)
Caused by: java.lang.IllegalArgumentException: myid file is missing

Solution:
https://github.com/31z4/zookeeper-docker/issues/13
On the system settings:
ZOO_MY_ID=1
export ZOO_MY_ID

This is not necessary if I directly install zookeeper on my local.

Check status on Server
>zkServer.sh status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Client port found: 2181. Client address: localhost.
Mode: follower

Kafka Cluster
Kafka requires Gradle 2.0 or higher
Install Gradle Manually https://gradle.org/install/#manually
>wget https://downloads.gradle.org/distributions/gradle-4.4.1-bin.zip
>unzip gradle-4.4.1-bin.zip

>sudo ln -s /home/ec2-user/tool/gradle-4.4.1 /opt/gradle-4.4.1
>sudo ln -s /opt/gradle-4.4.1 /opt/gradle

>gradle --version
------------------------------------------------------------
Gradle 4.4.1
------------------------------------------------------------
Build time: 2017-12-20 15:45:23 UTC
Revision: 10ed9dc355dc39f6307cc98fbd8cea314bdd381c
Groovy: 2.4.12
Ant: Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM: 1.8.0_60 (Oracle Corporation 25.60-b23)
OS: Linux 4.1.13-18.26.amzn1.x86_64 amd64

Run gradle command on the source directory of Kafka
>gradle

Build Jar package
>./gradlew jar

Build the release Jar Package
>./gradlew releaseTarGz -x signArchives

Copy the binary file out to install directory
>cp ./core/build/distributions/kafka_2.11-1.0.0.tgz ~/install/

Link that from the right working directory
>sudo ln -s /home/ec2-user/tool/kafka-1.0.0 /opt/kafka-1.0.0

Prepare Single Kafka Configuration
>cat config/server.properties
zookeeper.connect=fr-stage-api:2181,fr-stage-consumer:2181,fr-perf1:2181

Start the Server
>kafka-server-start.sh config/server.properties

Prepare the Cluster Configuration
>cp config/server.properties config/server1.properties
>cp config/server.properties config/server2.properties
>cp config/server.properties config/server3.properties
broker.id=1
broker.id=2
broker.id=3

Start the first kafka on the first machine
>nohup bin/kafka-server-start.sh config/server1.properties &

Exceptions:
[2018-01-03 18:17:02,882] FATAL Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.common.InconsistentBrokerIdException: Configured broker.id 1 doesn't match stored broker.id 0 in meta.properties. If you moved your data, make sure your configured broker.id matches. If you intend to create a new broker, you should remove all data in your data directories (log.dirs).
at kafka.server.KafkaServer.getBrokerIdAndOfflineDirs(KafkaServer.scala:615)
at kafka.server.KafkaServer.startup(KafkaServer.scala:201)
at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:38)
at kafka.Kafka$.main(Kafka.scala:92)
at kafka.Kafka.main(Kafka.scala)

Solution:
Clean the log directory
>rm -fr /tmp/kafka-logs/*

>nohup bin/kafka-server-start.sh config/server1.properties &
>nohup bin/kafka-server-start.sh config/server2.properties &
>nohup bin/kafka-server-start.sh config/server3.properties &

Create the topic
>bin/kafka-topics.sh --create --zookeeper fr-stage-api:2181,fr-stage-consumer:2181,fr-perf1:2181 --replication-factor 2 --partitions 2 --topic cluster1
Created topic "cluster1".

Producer
>bin/kafka-console-producer.sh --broker-list fr-stage-api:9092,fr-stage-consumer:9092,fr-perf1:9092 --topic cluster1

Consumer
>bin/kafka-console-consumer.sh --zookeeper fr-stage-api:2181,fr-stage-consumer:2181,fr-perf1:2181 --topic cluster1 --from-beginning


References:
Kafka 1~6
http://sillycat.iteye.com/blog/1563312
http://sillycat.iteye.com/blog/1563314
http://sillycat.iteye.com/blog/2015175
http://sillycat.iteye.com/blog/2015181
http://sillycat.iteye.com/blog/2094688
http://sillycat.iteye.com/blog/2108042

http://sillycat.iteye.com/blog/2215237
http://sillycat.iteye.com/blog/2183932

https://kafka.apache.org/downloads

zookeeper
http://sillycat.iteye.com/blog/2397642
http://sillycat.iteye.com/blog/2397645
<think>我们参考上述站内引用,结合Kafka集群部署的通用步骤,整理在Ubuntu系统上部署Kafka集群的详细步骤。注意:Kafka依赖Zookeeper,所以需要先部署Zookeeper集群。 根据引用[1][2][3][4][5],部署步骤如下: 步骤1:准备环境 - 至少三台Ubuntu服务器(或虚拟机),假设主机名为kafka1, kafka2, kafka3,对应的IP地址分别为192.168.50.131, 192.168.50.132, 192.168.50.133(根据引用[2]的配置示例)。 - 确保每台服务器已经安装JDK8或以上版本(Kafka需要Java环境)。 - 安装必要的工具:vim, curl等(引用[2])。 步骤2:配置网络 - 为每台服务器配置静态IP(引用[2])。 - 配置每台服务器的hosts文件,添加集群所有节点的IP和主机名映射(引用[2]示例): ``` 192.168.50.131 kafka1.com 192.168.50.132 kafka2.com 192.168.50.133 kafka3.com ``` 步骤3:部署Zookeeper集群(必须先行部署,引用[1]强调) - 参考引用[1]提到的另一篇博客部署Zookeeper集群(这里不展开,假设已经部署完成)。 步骤4:安装Kafka - 在每台服务器上,下载Kafka二进制包(以Kafka 2.7.0为例,也可选择其他版本,但注意版本兼容性): ```bash wget https://downloads.apache.org/kafka/2.7.0/kafka_2.13-2.7.0.tgz ``` - 解压并移动到指定目录(引用[5]示例): ```bash tar -xzf kafka_2.13-2.7.0.tgz sudo mkdir -p /usr/local/kafka/ sudo mv kafka_2.13-2.7.0 /usr/local/kafka/ cd /usr/local/kafka/kafka_2.13-2.7.0 ``` 步骤5:配置Kafka集群 - 修改每台服务器上的Kafka配置文件 `config/server.properties`,主要配置以下参数(引用[2][3]): ``` broker.id=1 # 每台服务器必须唯一,例如kafka1设为1kafka2设为2,kafka3设为3 listeners=PLAINTEXT://kafka1.com:9092 # 改为当前服务器的主机名或IP,端口统一为9092 log.dirs=/tmp/kafka-logs # 建议改为其他目录,如:/usr/local/kafka/logs zookeeper.connect=kafka1.com:2181,kafka2.com:2181,kafka3.com:2181 # Zookeeper集群地址 # 其他参数根据需要调整 ``` - 注意:引用[3]中使用了多个Zookeeper节点,所以这里填写所有Zookeeper节点地址。 步骤6:启动Kafka集群 - 在每台服务器上启动Kafka服务(引用[3][5]): ```bash # 进入Kafka目录 cd /usr/local/kafka/kafka_2.13-2.7.0 # 后台启动Kafka(注意:需要先启动Zookeeper集群) bin/kafka-server-start.sh -daemon config/server.properties ``` 步骤7:验证集群部署 - 创建Topic(在任意一台Kafka服务器上执行): ```bash bin/kafka-topics.sh --create --zookeeper kafka1.com:2181,kafka2.com:2181,kafka3.com:2181 --replication-factor 3 --partitions 1 --topic test-topic ``` - 查看Topic列表: ```bash bin/kafka-topics.sh --list --zookeeper kafka1.com:2181,kafka2.com:2181,kafka3.com:2181 ``` - 启动生产者(在一台服务器上): ```bash bin/kafka-console-producer.sh --broker-list kafka1.com:9092,kafka2.com:9092,kafka3.com:9092 --topic test-topic ``` - 启动消费者(在另一台服务器上): ```bash bin/kafka-console-consumer.sh --bootstrap-server kafka1.com:9092,kafka2.com:9092,kafka3.com:9092 --topic test-topic --from-beginning ``` - 在生产者端输入消息,消费者端能接收到即表示集群部署成功。 注意事项: - 防火墙:确保相关端口(如9092, 2181等)在服务器之间开放(引用[3]提到外网通信可能需要额外配置)。 - 如果使用Docker部署(引用[4]),可以采用docker-compose方式,但步骤会有所不同(此问题要求Ubuntu原生部署,故不展开)。 以上步骤参考了多个引用源,特别是引用[2]提供了详细的配置示例,引用[3]提供了命令行操作示例。 §§相关问题§§ 1. 如何验证Kafka集群的高可用性? 2. Kafka集群部署中常见的问题及解决方法? 3. Kafka配置参数中哪些对性能影响较大? 4. 如何监控Kafka集群的运行状态? </think>### Ubuntu系统部署Kafka集群详细步骤 #### **前提条件** 1. 准备3台Ubuntu服务器(物理机或虚拟机),配置静态IP和主机名(参考引用[2]): ``` IP 主机名 Zookeeper端口 Kafka端口 192.168.50.131 kafka1.com 2181 9092 192.168.50.132 kafka2.com 2181 9092 192.168.50.133 kafka3.com 2181 9092 ``` 2. 已部署Zookeeper集群(Kafka依赖Zookeeper协调)[^1] 3. 安装JDK 8+(Kafka基于Java开发) 4. 安装基础工具: `sudo apt update && sudo apt install vim curl -y` --- #### **部署步骤** ##### **1. 安装Kafka** ```bash # 所有节点执行 wget https://downloads.apache.org/kafka/3.5.1/kafka_2.13-3.5.1.tgz # 下载(版本可替换) tar -xzf kafka_2.13-3.5.1.tgz sudo mkdir -p /usr/local/kafka/ sudo mv kafka_2.13-3.5.1 /usr/local/kafka/ # 移动到安装目录[^5] cd /usr/local/kafka/kafka_2.13-3.5.1 ``` ##### **2. 配置Kafka集群** 编辑配置文件 `config/server.properties`(**每台服务器需修改以下参数**): ```properties # kafka1.com节点配置示例: broker.id=1 # 集群内唯一ID(kafka2.com改为2,kafka3.com改为3) listeners=PLAINTEXT://kafka1.com:9092 # 监听地址(改为本机主机名) log.dirs=/tmp/kafka-logs # 日志存储路径(建议改为持久化目录如/data/kafka-logs) zookeeper.connect=kafka1.com:2181,kafka2.com:2181,kafka3.com:2181 # Zookeeper集群地址[^3] ``` ##### **3. 启动Kafka集群** ```bash # 所有节点执行(后台启动) bin/kafka-server-start.sh -daemon config/server.properties ``` ##### **4. 验证集群状态** ```bash # 任意节点创建Topic(复制因子3表示数据存3份) bin/kafka-topics.sh --create \ --bootstrap-server kafka1.com:9092 \ --replication-factor 3 \ --partitions 3 \ --topic test-cluster # 查看Topic详情 bin/kafka-topics.sh --describe \ --bootstrap-server kafka1.com:9092 \ --topic test-cluster ``` **预期输出**:显示分区(Partition)的Leader和副本分布(如"Leader: 1, Replicas: 1,2,3"表明数据分布在3节点)[^3] ##### **5. 测试消息生产与消费** ```bash # 节点1启动生产者 bin/kafka-console-producer.sh \ --bootstrap-server kafka1.com:9092 \ --topic test-cluster # 节点2启动消费者 bin/kafka-console-consumer.sh \ --bootstrap-server kafka2.com:9092 \ --topic test-cluster \ --from-beginning ``` **验证**:生产端输入消息后,消费端应实时收到消息[^3][^4]。 --- #### **关键注意事项** 1. **主机名解析**:确保所有节点的`/etc/hosts`包含集群IP映射(引用[2]示例): ``` 192.168.50.131 kafka1.com 192.168.50.132 kafka2.com 192.168.50.133 kafka3.com ``` 2. **防火墙**:开放端口 `2181`(Zookeeper), `9092`(Kafka) 3. **资源规划**:`log.dirs`目录需预留足够磁盘空间(Kafka数据持久化位置) 4. **高可用**:建议复制因子(replication-factor) ≥ 2,防止节点故障丢数据[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值