Kafka集群搭建及操作

一、配置单机Kafka

  Kafka官网:http://kafka.apache.org/

  1、下载&解压

wget https://mirrors.bfsu.edu.cn/apache/kafka/2.7.0/kafka_2.12-2.7.0.tgz
tar -zxvf kafka_2.12-2.7.0.tgz

  2、修改配置文件

vi /root/rj/kafka/kafka_2.12-2.7.0/config/server.properties

  修改内容

broker.id=0
listeners=PLAINTEXT://127.0.0.1:9092
log.dirs=/tmp/kafka-logs1
num.partitions=1
zookeeper.connect=127.0.0.1:2181

  3、启动&停止kafka

#启动
bin/kafka-server-start.sh -daemon config/server.properties
#停止
bin/kafka-server-stop.sh

  启动时加-daemon参数,是为了让kafka以守护进程的方式启动。

二、搭建Kafka集群

  1、搭建三台kafka服务器

  类似上面的单机搭建,配置信息如下:

    这里要特殊说明一下几个参数:

      broker.id:用来保证集群中的每一个kafka服务器都有一个broker

      listeners:本虚拟机ip及端口

      zookeeper.connect:zk服务器或zk集群

broker.id=0
listeners=PLAINTEXT://192.168.206.131:9092
log.dirs=/tmp/kafka-logs
num.partitions=1
zookeeper.connect=192.168.206.128:2181,192.168.206.129:2181,192.168.206.130:2181,192.168.206.134:2181

  2、分别启动三台服务器

bin/kafka-server-start.sh -daemon config/server.properties

   搭建完成

三、搭建Kafka伪集群

  1、复制两个server.properties配置文件

[root@lcl-aliyun kafka_2.12-2.7.0]# cp config/server.properties config/server2.properties
[root@lcl-aliyun kafka_2.12-2.7.0]# cp config/server.properties config/server3.properties

  2、修改配置文件

  主要修改broker.id和端口号以及日志存放路径

broker.id=1
listeners=PLAINTEXT://127.0.0.1:9093
log.dirs=/tmp/kafka-logs2
num.partitions=1
zookeeper.connect=127.0.0.1:2181
broker.id=2
listeners=PLAINTEXT://127.0.0.1:9094
log.dirs=/tmp/kafka-logs3
num.partitions=1
zookeeper.connect=127.0.0.1:2181

  3、分别启动三个kafka

bin/kafka-server-start.sh -daemon config/server.properties
bin/kafka-server-start.sh -daemon config/server1.properties
bin/kafka-server-start.sh -daemon config/server2.properties

四、Kafka操作

  创建topic&查看topic

###创建topic
[root@localhost kafka_2.12-2.7.0]# bin/kafka-topics.sh --create --bootstrap-server 192.168.206.132:9092 --replication-factor 1 --partitions 1 --topic lcltest
Created topic lcltest.

###查看topic
[root@localhost kafka_2.12-2.7.0]# bin/kafka-topics.sh --list --bootstrap-server 192.168.206.132:9092
lcltest
test

  发送消息

[root@localhost kafka_2.12-2.7.0]# bin/kafka-console-producer.sh --broker-list 192.168.206.132:9092 --topic lcltest
>lcl
>qmm
>love

  接收消息

[root@localhost kafka_2.12-2.7.0]# bin/kafka-console-consumer.sh --bootstrap-server 192.168.206.131:9092 --topic lcltest --from-beginning --group mygroup
lcl
qmm
love

  删除topic(由于上面已经有消息消费,因此会自动创建一个__consumer_offsets的topic)

[root@localhost kafka_2.12-2.7.0]# bin/kafka-topics.sh --delete --bootstrap-server 192.168.206.132:9092 --topic test
[root@localhost kafka_2.12-2.7.0]# bin/kafka-topics.sh --list --bootstrap-server 192.168.206.132:9092
__consumer_offsets
lcltest

五、Kafka日志

  1、一分区一备份

  分区是指topic会存在几台服务器上,备份是指同时有几个相同的topic编号,例如,设置分区为3,则topic会被均分为三份,分别为topicname-0、topicname-1、topicname-2,如果备份为1,那么以上三个topic分区,一台服务器上一个,如果备份为2,那么一台服务器上出现两个,如果备份为3,那么每台服务器上都是全量的topicname。

  Kafka的启动日志存放在logs目录中的server.log文件中

cat /root/rj/kafka/kafka_2.12-2.7.0/logs/server.log

  kafka的消息日志存放在/tem/kafka_logs目录中(以配置文件配置为准)

  以上述的lcltest这个topic为例,命令创建了一个备份和一个分区

   查看是只有一台服务器有lcltest这个topic,这说明只有一个分区,同时,这一台服务器中也只有一个lcltest-0的topic,这说明只有一个备份

   2、多分区多备份

  下面就模拟两个topic,一个topic为3分区3备份(topic:threerepli),一个topic为3分区2备份(topic:tworepli)

   创建topic

[root@localhost kafka_2.12-2.7.0]# bin/kafka-topics.sh --create --bootstrap-server 192.168.206.132:9092 --replication-factor 3 --partitions 3 --topic threerepli
Created topic threerepli.
[root@localhost kafka_2.12-2.7.0]# bin/kafka-topics.sh --create --bootstrap-server 192.168.206.132:9092 --replication-factor 3 --partitions 2 --topic tworepli
Created topic tworepli.

  分别来查看三台服务器的分配情况如下所示,可以看到,3分区3备份的topic(threerepli)在每台服务器上都是全量存在,而3分区2备份的topic(tworepli)在每一台服务器上存在两个,这样,有一台服务器宕机,2备份的集群仍然会存在全量的数据,而3备份的情况是有两台服务器宕机,其仍然保存着全量的数据。

   3、查看分区与备份在zk中的信息

    首先使用zkCli.sh命令连接上zk(直接在zk服务器上输入zkCli.sh即可)

    查看broker目录

[zk: localhost:2181(CONNECTED) 0] ls /brokers
[ids, seqid, topics]

    查看/brokers/ids目录,用于查看集群中各个主机的broker-id列表

[zk: localhost:2181(CONNECTED) 1] ls /brokers/ids
[0, 1, 2]

    查看/brokers/ids/id目录,id为具体的值,用于查看当前主机信息

[zk: localhost:2181(CONNECTED) 4] get /brokers/ids/0
{"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://192.168.206.131:9092"],"jmx_port":-1,"features":{},"host":"192.168.206.131","timestamp":"1616428178944","port":9092,"version":5}

    查看/brokers/topics,用于查看broker下所有的topic

[zk: localhost:2181(CONNECTED) 5] ls /brokers/topics
[__consumer_offsets, lcltest, lcltest123, threerepli, tworepli]

    查看/brokers/topics/topic/partitions(其中topic为实际的topic名称)用于查看分区情况

[zk: localhost:2181(CONNECTED) 7] ls /brokers/topics/threerepli/partitions
[0, 1, 2]

    查看/brokers/topics/topic/partitions/partition/state(其中topic为实际的topic名称,partition为分区编号),用于查看分区中具体的情况

[zk: localhost:2181(CONNECTED) 8] get /brokers/topics/threerepli/partitions/0/state
{"controller_epoch":3,"leader":1,"version":1,"leader_epoch":0,"isr":[1,2,0]}

  4、查看段segment

    segment是一个逻辑文件,由两类物理文件组成,分别为index文件和log文件,其中log文件中存放的是实际的消息,而index文件中存放的是log文件中消息的索引。

[root@localhost threerepli-2]# pwd
/tmp/kafka-logs/threerepli-2
[root@localhost threerepli-2]# ls
00000000000000000000.index  00000000000000000000.log  00000000000000000000.timeindex  leader-epoch-checkpoint

     对于segment中的log文件,是不能直接通过cat命令查看的,而是需要通过kafka自带的一个工具查看。

bin/kafka-run-class.sh kafka.tools.DumpLogSegments --files /tmp/kafka-logs/threerepli-2/00000000000000000000.log --print-data-log

    一个用户的一个主题会被提交到一个__consumer_offset分区中,使用主题字符串的hash值与50取模,就是分区索引。

posted @ 2021-03-23 00:46  李聪龙  阅读(618)  评论(0编辑  收藏  举报