Kafka和Zookeeper单机扩展为集群的笔记(内附一个小问题的解决)
kafka版本 kafka_2.11-0.10.1.0
我用的 zookeeper 是 kafka 自带的
旧机器ip: x.x.x.x 新机器 y.y.y.y
起因
之前 kafka
一直是单机跑, 由于容量需要扩容, 所以新增一台机器将 zookeeper
和 kafka
都扩展为集群
文章最后附 ansible
的安装脚本
Zookeeper
旧机器的编号是 0
, 新机器编号 1
, 主要修改下配置就可以自动加入集群了
#新机器上添加 zookeeper 编号
echo 1 > /data/zookeeper/myid
#新旧机器都修改 zookeeper.properties 文件
server.0=x.x.x.x:2888:3888
server.1=y.y.y.y:2888:3888
Kafka
kafka 的 broker
也需要编号, 需要在新机器上修改的配置如下, server.properties
文件
broker.id=1
advertised.listeners=PLAINTEXT://y.y.y.y:9092
zookeeper.connect=x.x.x.x:2181,y.y.y.y:2181
查看是否成功
bin/zookeeper-shell.sh localhost:2181
ls /brokers/ids/
遇到的问题
- Kafka 启动的时候报错
[2017-06-13 10:07:24,025] ERROR Processor got uncaught exception. (kafka.network.Processor)
java.lang.NoClassDefFoundError: Could not initialize class kafka.network.RequestChannel$
at kafka.network.RequestChannel$Request.<init>(RequestChannel.scala:114)
at kafka.network.Processor$$anonfun$processCompletedReceives$1.apply(SocketServer.scala:492)
at kafka.network.Processor$$anonfun$processCompletedReceives$1.apply(SocketServer.scala:487)
at scala.collection.Iterator$class.foreach(Iterator.scala:893)
at scala.collection.AbstractIterator.foreach(Iterator.scala:1336)
at scala.collection.IterableLike$class.foreach(IterableLike.scala:72)
at scala.collection.AbstractIterable.foreach(Iterable.scala:54)
at kafka.network.Processor.processCompletedReceives(SocketServer.scala:487)
at kafka.network.Processor.run(SocketServer.scala:417)
at java.lang.Thread.run(Thread.java:748)
一番百度搜索后, 有人说是 java 的小版本号不一致问题, 有人说要停掉旧 kafka 机器再启动. 然而我觉得并不是这么肤浅的原因, 然后没招就去搜旧的 java 安装包没找到, 果断放弃了, 最终只要加下 hosts
就解决了
# 新机器上 vim /etc/hosts
y.y.y.y y-y-y-y
后来请教朋友得到的解释是, 光 ping 是没用的,Linux 上的很多服务都会先解析主机名的
, 好吧又涨见识了
Ansible 部署脚本
# tasks/main.yml
---
- name: 检测是否已安装
stat:
path: /usr/local/kafka
register: kafka
- name: 解压安装包
unarchive: src=src/kafka_2.11-0.10.1.0.tgz dest=/usr/local/
when: kafka.stat.exists == False
- name: 重命名目录
shell: "{{item}}"
with_items:
- "mv /usr/local/kafka_2.11-0.10.1.0 /usr/local/kafka"
when: kafka.stat.exists == False
- name: 创建 kafka 目录
file:
path: "{{item}}"
state: directory
with_items:
- /data/zookeeper
- /data/log/kafka
- name: init
shell: "echo 1 > /data/zookeeper/myid"
- name: 复制 kafka & zookeeper 配置文件
template:
src: "{{ item }}"
dest: "/usr/local/kafka/config/{{ item }}"
with_items:
- 'server.properties'
- 'zookeeper.properties'
- name: 复制 supervisor 配置文件
template:
src: "{{ item }}"
dest: "/data/supervisor/conf.d/{{ item }}"
with_items:
- 'kafka.conf'
- 'zookeeper.conf'
- name: 启动 supervisor
shell: "supervisorctl update"
- 上一篇: 删除kafka的consumer和topics
- 下一篇: Kafka 迁移 Topics