Kafka 集群搭建

#目录
1、Kafka 简介
2、Zookeeper 集群搭建
3、Kafka 集群搭建
4、Kafka 集群搭建问题记录
#详细过程

###1、Kafka 简介
Kafka是一个消息系统,由LinkedIn贡献给Apache 基金会,称为Apache 的一个顶级项目;Kafka对消息保存时根据 Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,无论是Kafka集群,还是Producer和consumer都依赖于 Zookeeper 来保证系统可用性。搭建 Kafka 集群环境要首先搭建 Zookeeper 集群。

Kafka集群搭建准备工作:

准备3台机器,IP地址分别为:

  • 192.168.1.184
  • 192.168.1.203
  • 192.168.1.208
    其中有两台物理机一台虚拟机,192.168.1.208为虚拟机Centos系统,192.168.1.184、192.168.1.203为物理机ubuntu系统。

下载kafka,当前版本为:kafka_2.11-0.9.0.1.tgz,将该文件拷贝到以上三台机器的安装目录,本次环境搭建目录:/home/shuzilm/Downloads/kafka_2.11-0.9.0.1/。
安装java1.8,安装方式参考:

http://www.centoscn.com/image-text/install/2014/0827/3585.html

Java1.8的下载 地址:

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

解压源码包
通过终端在/usr/local目录下新建java文件夹,命令行:

sudo mkdir /usr/local/java

然后将下载到压缩包拷贝到java文件夹中,命令行:
进入jdk源码包所在目录

cp jdk-7u79-linux-x64.tar.gz /usr/local/java

然后进入java目录,命令行:

cd /usr/local/java

解压压缩包,命令行:

tar xvf jdk-7u79-linux-x64.tar.gz

然后可以把压缩包删除,命令行:

rm jdk-7u79-linux-x64.tar.gz

设置jdk环境变量
这里采用全局设置方法,就是修改etc/profile,它是是所有用户的共用的环境变量

vi /etc/profile

打开之后在末尾添加:

export JAVA_HOME=/usr/local/java/jdk1.8.0_121
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
export JRE_HOME=/usr/local/java/jdk1.8.0_121/jre
export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:/srv/app/alarm

请记住,在上述添加过程中,等号两侧不要加入空格,不然会出现“不是有效的标识符”,因为source /etc/profile 时不能识别多余到空格,会理解为是路径一部分。
然后保存

source /etc/profile

使profile生效

###2、Zookeeper 集群搭建
#####2.1、简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
本文档使用的Zookeeper为Kafka_2.11-0.9.0.1自带版本。

#####2.2、环境搭建

(1)配置 /kafka_2.11-0.9.0.1/config/zookeeper.properties,配置内容如下所示:

tickTime=2000
dataDir=/srv/zookeeper/
clientPort=2181
initLimit=10
syncLimit=5
server.1=192.168.1.184:2888:3888
server.2=192.168.1.203:2888:3888
server.3=192.168.1.208:2888:3888

然后,使用命令创建 Zookeeper 主机标识,每个主机标识不同,这里我们用1、2、3分别标识三台主机,本机标识为1,创建命令如下所示:

cd /srv/zookeeper/
echo “1” > myid

最后,重复以上过程搭建另两台主机,完成后Zookeeper环境即搭建完毕。

(2)启动Zookeeper集群:

启动顺序:server.1、server.2、server.2。
进入启动脚本目录 /srv/kafka/bin,然后使用启动脚本启动每台主机,启动命令:

./zookeeper-server-start.sh ../config/zookeeper.properties &

最后,使用上面命令分别启动另外两个主机,如无错误,Zookeeper即启动完成。搭建环境过程遇到问题,可参考本文档第4节的解决方式。
停止zookeeper的命令:

/srv/kafka/bin/zookeeper-server-stop.sh

参考文档:

http://www.cnblogs.com/davidwang456/p/4238536.html

#####2.3、环境监测

Zookeepe环境搭建并启动,如何监测该集群的工作状态?这里使用nc命令进行状态监控,在任意一台Zookeeper主机上使用如下命令进行监控:
第一台服务器:

echo stat | nc 192.168.1.184 2181

命令返回:

Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
/192.168.1.184:35620[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/4/117
Received: 37394
Sent: 37399
Connections: 1
Outstanding: 0
Zxid: 0x10000e33f
Mode: follower
Node count: 30

第二台服务器:

echo stat | nc 192.168.1.203 2181

命令返回:

Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
 /192.168.1.184:60265[0](queued=0,recved=1,sent=0)
 /192.168.1.184:54585[1](queued=0,recved=32586,sent=32587)
 /192.168.1.203:1842[1](queued=0,recved=32563,sent=32565)
Latency min/avg/max: 0/1/297
Received: 95473
Sent: 95474
Connections: 3
Outstanding: 0
Zxid: 0x10000e4bf
Mode: leader(注意该主机为Zookeeper集群的leader节点)
Node count: 30

第三台服务器:

echo stat | nc 192.168.1.208 2181

命令返回:

Zookeeper version: 3.4.6-1569965, built on 02/20/2014 09:09 GMT
Clients:
 /192.168.1.208:35836[1](queued=0,recved=32701,sent=32707)
 /192.168.1.184:46630[0](queued=0,recved=1,sent=0)
Latency min/avg/max: 0/2/85
Received: 61940
Sent: 61945
Connections: 2
Outstanding: 0
Zxid: 0x10000e55f
Mode: follower
Node count: 30

如无返回说明该Zookeeper主机存在问题。如Zookeeper集群中的节点均无问题代表集群搭建成功。

参考文档:

http://blog.csdn.net/hackerwin7/article/details/43559991

###3、Kafka 集群搭建
#####3.1、环境搭建

1.配置 /srv/kafka/config/server.properties,配置内容如下所示:

broker.id=201  (数字随便取,每个服务器id号唯一即可)
port=9092
listeners=PLAINTEXT://IP:9092
advertised.host.name=IP
log.dirs=/data/log/kafka-logs
zookeeper.contact=192.168.1.184:2181,192.168.1.203:2181,192.168.1.208:2181

其中,broker.id用来标识Kafka节群中单节点的,本环境分别使用201、202、203来标识集群中的3个节点的。Host.name为本机的ip地址在此版本中可以注销不用。
最后,同样方式配置其他2个节点,完成后代表Kafka集群已搭建完毕。

2.Kafka集群启动

启动顺序:server.1、server.2、server.2。
进入启动脚本目录 /srv/kafka/bin,然后使用启动脚本启动每台主机,启动命令:

./kafka-server-start.sh ../config/server.properties  &

最后,使用上面命令分别启动另外两个主机,如无错误,Kafka集群即启动完成。搭建环境过程遇到问题,可参考本文档第4节的解决方式。
停止kafka的命令:

/srv/kafka/bin/kafka-server-stop.sh

参考文档:

http://www.cnblogs.com/davidwang456/p/4238536.html

3.集群外的ip作为客户端访问集群,需要先将该外部ip加入server.properties文件,如下所示:

advertised.host.name=192.168.2.252

#####3.2、应用测试

1.进入启动脚本目录 /srv/kafka/bin,创建Topic,命令如下:

./kafka-topics.sh --create --zookeeper 192.168.1.203:2181 --replication-factor 2 --partitions 3 --topic mykafka_all_zk

这里partitions一般设置与集群中kafka节点相同的数量,replication-factor一般为2,意义是每一个partitions有两个副本,一主一从互为热备(包含功能和数据)。

2.查看创建Topic信息,命令如下:

./kafka-topics.sh --describe --zookeeper 192.168.1.203:2181 --topic mykafka_all_zk

命令返回:

Topic:mykafka_all_zk    PartitionCount:3    ReplicationFactor:2    Configs:
Topic: mykafka_all_zk    Partition: 0    Leader: 132    Replicas: 132,133    Isr: 132,133
Topic: mykafka_all_zk    Partition: 1    Leader: 133    Replicas: 133,134    Isr: 133,134
Topic: mykafka_all_zk    Partition: 2    Leader: 134    Replicas: 134,132    Isr: 134

Isr : kafka维护一个isr—可以跟上leader的列表。这个列表的单元才会选取leader. 这种方式可以容忍N-1的失败。复制因子和吞吐量的权衡。以上建立的topic,最后一个Isr 缺少一个副本,在第4节问题4中解决。

http://www.tuicool.com/articles/FBZZRnu

###4、Kafka 集群搭建问题记录
1.Kafka集群搭建问题,错误日志:

Caused by: java.net.UnknownHostException: shuzilm: Name or service not known

处理方法如下:
修改配置文件/etc/hosts,加入如下内容:
192.168.1.208 shuzilm
注意该问题在192.168.1.208 虚拟Centos系统中发生,Ubuntu系统无该问题。

2.Zookeeper集群搭建问题,错误日志:

missing election port for server

该问题由于文件zookeeper.properties配置错误导致,处理方法如下:

server.1=192.168.1.184.2888:3888

改为

server.1=192.168.1.184:2888:3888

3.Zookeeper集群环境监测(echo stat | nc 192.168.1.208 2181)无反应问题
注意防火墙的关闭 service iptables stop,该问题在物理机上监测虚拟Centos系统Zookeeper主机时发生。

4.各种生产消费的报错:
生产报错:

WARN Error while fetching metadata with correlation id 41 : {=LEADER_NOT_AVAILABLE}

消费报错:

WARN [console-consumer-31807_shuzilm-1470397544037-f293512f-leader-finder-thread], Failed to add leader for partitions
ERROR Error when sending message to topic   with key: null

解决:
server.properties 配置中

listeners=PLAINTEXT://:9092

改为

listeners=PLAINTEXT://本节点ip:9092

上面问题解决过程曾关闭过ubuntu节点的防火墙,但关闭后问题未解决,不排出该操作与后面修改配置共同作用解决该问题的可能。

参考:

http://blog.csdn.net/kuluzs/article/details/51577678

以上解决后,可以生产消费,但某节点消费时报错:

[ConsumerFetcherThread-console-consumer-46869_shuzilm-1470451434898-37c43f8f-0-132], Error for partition [mykafka2,0] to broker 132:kafka.common.NotLeaderForPartitionException (kafka.consumer.ConsumerFetcherThread)

解决:
该问题由本小节配置问题导致建立的topic存在问题而引起,解决该问题后,新建的topic不存在该消费时报错的问题。

####备注:
创建topic:

./kafka-topics.sh --create --zookeeper 192.168.1.184:2181,192.168.1.208:2181,192.168.1.203:2181 --replication-factor 2 --partitions 3 --topic mykafka4

生产:

./kafka-console-producer.sh --broker-list 192.168.1.184:9092,192.168.1.203:9092,192.168.1.208:9092 --topic mykafka4

消费:

./kafka-console-consumer.sh --zookeeper 192.168.1.184:2181,192.168.1.203:2181,192.168.1.208:2181--topic mykafka4 --from-beginning
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值