这里是在一台虚拟机,使用伪集群搭建Kafka及zookeeper,多台虚拟机同理,注意ip和端口号即可
一.搭建zookeeper集群,虚拟机要有Java环境
1.创建zookeeper文件夹,下载并解压zookeeper
#创建文件夹
mkdir zookeeper
cd zookeeper
#下载并解压zookeeper
wget http://mirrors.cnnic.cn/apache/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
tar -zxvf zookeeper-3.4.14.tar.gz
2.重命名zookeeper1文件夹,创建zkdata和zkdatalog文件夹
#重命名
mv zookeeper-3.4.14 zookeeper1
#存放快照日志
mkdir zkdata
#存放事物日志
mkdir zkdatalog
3.修改配置文件制作zoo.cfg
cd zookeeper1/conf
// 复制zoo.cfg文件
cp zoo_sample.cfg zoo.cfg
#zoo.cfg的配置信息
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/opt/work/zookeeper/zookeeper1/zkdata //设置zkdata路径
dataLogDir=/opt/work/zookeeper/zookeeper1/zkdatalog //设置zkdatalog路径
clientPort=12181 //默认是2181
//第一个端口是master和slave之间的通信端口,默认是2888,
第二个端口是leader选举的端口,集群刚启动的时候选举或者leader挂掉之后进行新的选举的端口默认是3888
//因为是伪集群尽量端口号不重复
server.1=192.168.254.68:12888:13888
server.2=192.168.254.68:14888:15888
server.3=192.168.254.68:16888:17888
//处理zookeeper日志,表示24小时清理一次
autopurge.purgeInterval=24
//日志文件个数
autopurge.snapRetainCount=3
4.重复2、3步骤,同样方式创建zookeeper2、zookeeper3,注意zoo.cfg配置文件路径,端口号修改
5.创建myid文件
以现在所在的第一台虚拟机192.168.254.68为例,对应server.1,通过上边的配置信息可以查到。创建myid文件的目的是为了让zookeeper知道自己在哪台服务器上,例如现在所在的虚拟机是192.168.254.68,它对应的id是1,那么就在myid文件中写入1.
echo "1" > /opt/zookeeper/zookeeper1/zkdata/myid
echo "2" > /opt/zookeeper/zookeeper2/zkdata/myid
echo "3" > /opt/zookeeper/zookeeper3/zkdata/myid
5.启动zookeeper,其他两个同样启动
cd zookeeper1/bin
#启动
./zkServer.sh start
#查看状态
./zkServer.sh status
可以使用jps查看,三个启动是否成功
二.搭建Kafka集群
1.创建kafka文件夹
mkdir kafka
2.从官网下载kafka,这里使用版本:kafka_2.11-2.2.0.tgz,上传到kafka文件夹下,解压并重命名
tar -zxvf kafka_2.11-2.2.0.tgz
mv kafka_2.11-2.2.0.tgz kafka1
3.修改配置文件server.properties
cd kafka1/config
//配置文件信息
#这是这台虚拟机上的值,在另外两台虚拟机上应该是2或者3,这个值是唯一的,每台虚拟机或者叫服务器不能相同
broker.id=1
#设置本机IP和端口,设置的是listeners,也可以直接设置host.name=192.168.254.68,port=19292,这个IP地址也是与本机相关的,每台服务器上设置为自己的IP地址。(伪集群端口号不要重复)
host.name=192.168.254.68,port=19092
listeners=PLAINTEXT://192.168.254.68:19092 //端口默认是9092,为了加深理解,没有设置为默认值
//在og.retention.hours=168下面新增下面三项
message.max.byte=5242880
default.replication.factor=2
replica.fetch.max.bytes=5242880
#设置zookeeper的连接端口,新版本的kafka不再使用zookeeper而是通过brokerlist的配置让producer直接连接broker,这个brokerlist可以配置多个,只要有一个能连接上,就可以让producer获取道集群中的其他broker的信息,绕过了zookeeper。因此这个zookeeper.connect可以设置多个值
(注意自己zookeeper的端口号)
zookeeper.connect=192.168.254.68:12181,192.168.254.68:12182,192.168.254.68:12183
4.同样方式创建kafka2、kafka3,修改server.properties配置文件,注意端口号、ip;
5.启动三个kafka,可使用jps查看是否启动成功(如果启动不成功,看文章末)
cd kafka1/bin
#-daemon 后台启动,日志可在logs日志文件中查看
./kafka-server-start.sh -daemon ../config/server.properties
#其他两个同样方式启动
三.启动成功后,测试kafka集群
1.创建topic,这里定义的topic叫my-topic
#replication-factor 2 // 复制两份
#partitions 1 // 创建1个分区
#topic // 主题为my-topic
#--zookeeper // 此处为为zookeeper监听的地址
./kafka-topics.sh --create --zookeeper 192.168.254.68:12181 --replication-factor 2 --partitions 1 --topic my-topic
2.创建生产者,可在控制台输入数据
./kafka-console-producer.sh --broker-list 192.168.254.68:19092 --topic my-topic
3.创建消费者(再另外连接虚拟机,在bin下创建,创建生产者的虚拟机不要断)
./kafka-console-consumer.sh --zookeeper 192.168.254.68:12181 --topic my-topic --from-beginning
此时,可能会报错:consumer zookeeper is not a recognized option
这是因为kafka版本问题,高版本要使用下面命令:
./kafka-console-consumer.sh --bootstrap-server 192.168.254.68:19092 --topic my-topic --from-beginning
效果图:
四.kafka启动报错问题
1.检查三个kafka配置文件里broker.id是否重复,检测zookeeper和kafka的端口号
2.伪集群启动报错:Configured broker.id 2 doesn't match stored broker.id 0 in meta.properties.
参考:
log.dirs目录下的meta.properties中配置的broker.id和配置目录下的server.properties中的broker.id不一致了,解决问题的方法是将两者修改一致后再重启。
伪集群下解决:在/tmp下复制kafka-logs文件夹,分别重命名kafka1-logs、kafka2-logs、kafka3-logs,将目录下的meta.properties中配置的broker.id改成对应的值;
然后在kafka的server.properties配置文件里,修改 log.dirs=/tmp/kafka-logs,改成相应的路径;
最后将kafka重启就能启动成功。
伪集群搭建注意配置文件的信息,端口号,broker.id的值,基本上都能搭建成功。同理多台服务器搭建kafka集群。