Kafka集群搭建
//启动zookeeper:
bin/zookeeper-server-start.sh config/zookeeper.properties
//启动集群中所有的kafka
bin/kafka-server-start.sh -daemon config/server.properties
//创建topic,设置副本和分区:
bin/kafka-topics.sh --create --zookeeper 192.168.1.5:2181 --replication-factor 4 --partitions 4 --topic test
–replication-factor 4(设置副本为4)–partitions 4(设置分区为4{最优为4})
//删除topic
./bin/kafka-topics.sh --delete --zookeeper 192.168.1.5:2181 --topic topic名称
方法一:手动删除法,通过zookeeper客户端删除topic(Delete topic时显示“Topic test is marked for deletion”)
需要进入zookeeper内部进行删除
./zookeeper-shell.sh 192.168.1.5:2181
ls /brokers/topics
rmr /brokers/topics/test
quit
方法二:快速配置删除法(简单粗暴,如果这个主题有程序还在消费者,此时KAFKA就game over)
1.kafka启动之前,在server.properties配置:delete.topic.enable=true
2.执行命令bin/kafka-topics.sh –delete –topic test –zookeeper zk:2181或者使用kafka-manager集群管理工具删除
注意:如果kafka启动之前没有配置delete.topic.enable=true,topic只会标记为marked for deletion,加上配置,重启kafka,之前的topick就真正删除了。
//发送消息
bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic test(windows版本)
bin/kafka-console-producer.sh --broker-list 192.168.1.5:9092 --topic test
//启动consumer接受消息
bin/kafka-console-consumer.sh --bootstrap-server 192.168.1.5:9092 --topic test --from-beginning
//启动多个kafka(新的节点)
bin/kafka-server-start.sh config/server-1.properties &
bin/kafka-server-start.sh config/server-2.properties &
//扩容分区
#把liNingShortSleeveTopic主题扩容为6个分区。
#注意:目前不支持减少分区,扩容前必须存在这个主题。
bin/kafka-topics.sh --zookeeper 192.168.1.5:2181 --alter --topic test --partitions 4
//查询某个Topic的详细信息(–describe)
bin/kafka-topics.sh --describe --zookeeper 192.168.1.5:2181 --topic my-replicated-topic
bin/kafka-topics.sh --describe --zookeeper 192.168.1.5:2181 --topic test,track,user
名词说明(如partition)
Partition:
kafka 中 Topic 被分成多个 Partition 分区。Topic 是一个逻辑概念,Partition 是最小的存储单元,掌握着一个 Topic 的部分数据。每个 Partition 都是一个单独的 log 文件,每条记录都以追加的形式写入。
1、 一个Topic可以配置几个Partition,
2、 Producer发送的消息分到不同的Partition中
3、Consumer接收数据是按照 Consumer Group(消费组)来接接收,kafka确保每个Partition在同一个Consumer Group(消费组)只能由其中一个消费者消费。
Partitioner(分区器):
分区选择器,作用就是为消息分配分区。默认使用murmur2对key进行hash计算,然后对于总分区数去模,得到对应的分区号,然后消息就发往该分区。Producer可以实现自定义分区器,或者指定特定的分区。只需要实现Partitioner接口。
Partition Leader
Kafka为了到达高可用,每个分区(Partition)都会多个副本,其中有且仅有一个作为leader,leader负责当前消息的读写Partition。
Partition Follower
所有 Follower 都需要从 Leader 同步消息,Follower 与 Leader 始终保持消息同步。
partition leader 与 follower 是主备关系,而非主从。
AR
Assigned Replicas 同步副本,AR=ISR+OSR
ISR
ISR,In-Sync Replicas,是指及时副本同步列表,消息同步的频率或者时效达到一定要求副本。
OSR
Outof-Sync Replicas 消息同步存在滞后情况的副本集合
//查看某个kafka所有的topic列表
bin/kafka-topics.sh --list --zookeeper 192.168.1.5:2181
//查看kafka某个topic中的数据量
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.1.5:9092 --topic testpro --time -1
//查看某个用户组的kafka消息消费情况,有没有数据积压
bin/kafka-consumer-groups.sh --bootstrap-server 192.168.1.5:9092 --describe --group group-1
//查看topic某分区数据偏移量(offset)最大值,就是看目前Kafka里有多少条消息
bin/kafka-run-class.sh kafka.tools.GetOffsetShell --broker-list 192.168.1.5:9092 --topic topic队列名字 --partitions 0
docker整合zookeeper:
如果没有docker会先下载docker(选第三个)
docker run -d --name zookeeper -p 2181:2181 -p 2888:2888 -p 3888:3888 wurstmeister/zookeeper
进入docker容器
docker exec -it kafka3 /bin/bash
docker容器中没有vi编辑器的解决办法
mv /etc/apt/sources.list /etc/apt/sources.list.bak
cat <<EOF >/etc/apt/sources.list
deb http://mirrors.ustc.edu.cn/debian stable main contrib non-free
deb http://mirrors.ustc.edu.cn/debian stable-updates main contrib non-free
EOF
apt update
apt install vim
mv /etc/apt/sources.list.bak /etc/apt/sources.list
docker创建启动kafka:
docker run -it -d --name 要取的别名 -p 宿主机端口:容器端口 -v 宿主机文件存储位置:容器内文件位置
镜像名:Tag /bin/bash
-it 表示 与容器进行交互式启动
-d 表示可后台运行容器 (守护式运行)
–name 给要运行的容器 起的名字 /bin/bash 交互路径
-p 将容器的端口映射到宿主机上,通过宿主机访问内部端口
-v 将容器内的指定文件夹挂载到宿主机对应位置
docker run --name kafka1 \
-p 9092:9092 \
-e KAFKA_BROKER_ID=1 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.1.5:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.5:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://:9092 \
-d wurstmeister/kafka
docker run --name kafka2 \
-p 9093:9093 \
-e KAFKA_BROKER_ID=2 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.1.5:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.5:9093 \
-e KAFKA_LISTENERS=PLAINTEXT://:9093 \
-d wurstmeister/kafka
docker run --name kafka3 \
-p 19092:19092 \
-e KAFKA_BROKER_ID=3 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.1.5:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.6:19092 \
-e KAFKA_LISTENERS=PLAINTEXT://:19092 \
-d wurstmeister/kafka
docker run --name kafka4 \
-p 19093:19093 \
-e KAFKA_BROKER_ID=4 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.1.5:2181 \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.1.6:19093 \
-e KAFKA_LISTENERS=PLAINTEXT://:19093 \
-d wurstmeister/kafka
进入kafka本地的zookeeper
进入zookeeper客户端
[root@localhost bin] ./zookeeper-shell.sh 192.168.1.5:2181
(提示下面的表示进入成功)
Connecting to localhost:2181
Welcome to ZooKeeper!
JLine support is disabled
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
查看客户端里面的节点信息
ls /
[admin, brokers, cluster, config, consumers, controller, controller_epoch, isr_change_notification, latest_producer_id_block, log_dir_event_notification, zookeeper]
ls /brokers/ids
[0, 1, 2]
nginx整合kafka:
nginx版本 1.12.2
1.将kafka的c客户端源码clone到本地
git clone https://github.com/edenhill/librdkafka
2.进行编译 需要有gcc gcc-c++ pcre-devel zlib-devel环境
yum install -y gcc gcc-c++ pcre-devel zlib-devel
./configure
make && make install
3.安装nginx整合kafka的插件
git clone https://github.com/brg-liuwei/ngx_kafka_module
4.进入nginx源码包 将插件进行编译
./configure --add-module=/usr/local/src/ngx_kafka_module/
make
make install
这里遇到的问题,编译的时候会报错 这里把报错的源码位置注释一下就好了
并且按照网上给的提示,将objs里面的Makefile文件中的编译命令 WErroe 删除
启动nginx,报错,找不到kafka.so.1的文件
加载so库
echo “/usr/local/lib” >> /etc/ld.so.conf ldconfig
5.修改nginx配置文件,启动nginx
http{
kafka;
kafka_broker_list host1 host2;
server{
location = /kafka/track {
kafka_topic track;
}
location = /kafka/user {
kafka_topic user;
}
}
}
测试nginx整合kafka
curl localhost/kafka/track -d "message send to kafka topic"