参考:

 (kafka安装部署)

常识:

kafak依赖zookeeper,zookerper基于java

linux一般默认安装了java,如果没有安装java就先安装

java -version #查看java版本

安装zookeeper(kafka已自带zookeeper)

参考:https://www.runoob.com/w3cnote/zookeeper-setup.html

安装kafka

参考:http://kafka.apache.org/quickstart

下载:

wget  https://downloads.apache.org/kafka/2.8.0/kafka_2.13-2.8.0.tgz
tar -xzf kafka_2.13-2.8.0.tgz
cd kafka_2.13-2.8.0
//或
wget https://mirrors.bfsu.edu.cn/apache/kafka/2.8.0/kafka_2.13-2.8.0.tgz
tar -zxvf tar zxvf kafka_2.13-2.8.0.tgz
cd kafka_2.13-2.8.0

启动:

#先启动zookeeper
#这是前台启动,启动以后,当前就无法进行其他操作(不推荐)
./bin/zookeeper-server-start.sh ./config/zookeeper.properties
./bin/kafka-server-start.sh ./config/server.properties

#后台启动(推荐)
//方式1
nohup ./bin/zookeeper-server-start.sh ./config/zookeeper.properties 1>/dev/null 2>&1 &
nohup ./bin/kafka-server-start.sh ./config/server.properties 1>/dev/null 2>&1 & 
//方式2
./bin/zookeeper-server-start.sh -daemon ./config/zookeeper.properties
./bin/kafka-server-start.sh -daemon ./config/server.properties

允许外网访问:

2处需要同时修改,否则报错

1,找到listeners配置项,默认可能是listeners=PLAINTEXT://localhost:9092,将其修改为listeners=PLAINTEXT://0.0.0.0:9092。这样Kafka就会在所有网络接口上监听9092端口。

2,确保advertised.listeners配置项被设置为Kafka将向客户端宣告的可访问的地址和端口。

例如,如果Kafka部署在一个云服务上,并且该服务有一个公共IP,则应设置为advertised.listeners=PLAINTEXT://<公共IP>:9092。

命令行使用:

参考:(命令行介绍)

命令行分类

1、kafka-acls.sh #配置,查看kafka集群鉴权信息
2、kafka-configs.sh #查看,修改kafka配置
3、kafka-console-consumer.sh #消费命令
4、kafka-console-producer.sh #生产命令
5、kafka-consumer-groups.sh #查看消费者组,重置消费位点等
6、kafka-consumer-perf-test.sh #kafka自带消费性能测试命令
7、kafka-mirror-maker.sh #kafka集群间同步命令
8、kafka-preferred-replica-election.sh #重新选举topic分区leader
9、kafka-producer-perf-test.sh #kafka自带生产性能测试命令
10、kafka-reassign-partitions.sh #kafka数据重平衡命令
11、kafka-run-class.sh #kafka执行脚本
12、kafka-server-start.sh #进程启动
13、kafka-server-stop.sh #进程停止
14、kafka-topics.sh #查询topic状态,新建,删除,扩容

topic管理

#创建topic
bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 3 --partitions 3 --topic test 
#删除topic
bin/kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic test 
#查看topic描述
sh bin/kafka-topics.sh --topic test --bootstrap-server xxxx:9092 --describe --exclude-internal
sh bin/kafka-topics.sh --topic ".*?" --bootstrap-server xxxx:9092 --describe --exclude-internal

生产发送

## 生产者:无key消息
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test --producer.config config/producer.properties
## 生产者:有key消息
bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test --producer.config config/producer.properties  --property parse.key=true

消息 key 的作用是将消息与特定的分区进行绑定。这使得消息可以被有序地写入和读取,消费者可以按照一定的顺序获取消息

在命令行中以tab键隔开 key和value

消费接受

1. 新客户端从头消费
--from-beginning (注意这里是新客户端,如果之前已经消费过了是不会从头消费的) 下面没有指定客户端名称,所以每次执行都是新客户端都会从头消费
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning

2. 正则表达式匹配topic进行消费
--whitelist** **消费所有的topic
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --whitelist ‘.*’
消费所有的topic,并且还从头消费
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --whitelist ‘.*’ --from-beginning

3.显示key进行消费
--property print.key=true
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --property print.key=true

4. 指定分区消费
--partition 指定起始偏移量消费--offset
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --partition 0 --offset 100

5. 给客户端命名分组
--group
注意给客户端命名之后,如果之前有过消费,那么--from-beginning就不会再从头消费了
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --group test-group

6. 添加客户端属性
--consumer-property
这个参数也可以给客户端添加属性,但是注意 不能多个地方配置同一个属性,他们是互斥的;比如在下面的基础上还加上属性--group test-group 那肯定不行
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer-property group.id=test-consumer-group

7. 添加客户端属性
--consumer.config
跟--consumer-property 一样的性质,都是添加客户端的属性,不过这里是指定一个文件,把属性写在文件里面, --consumer-property 的优先级大于 --consumer.config
sh bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --consumer.config config/consumer.properties

配置管理

#查询配置
sh bin/kafka-configs.sh --describe --bootstrap-server xxxxx:9092 --entity-type topics [--all]  [--entity-name test_create_topic] #可以指定某个topic

#查询kafka版本信息
sh bin/kafka-configs.sh --describe --bootstrap-server xxxx:9092 --version 

#增删改 配置
--alter
删除配置: --delete-config k1,k2
添加/修改配置: --add-config k1=v1,k2=v2
选择类型: --entity-type (topics/clients/users/brokers/broker- loggers)
类型名称: --entity-name

Topic添加/修改动态配置
--add-config
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type topics --entity-name test_create_topic1 --add-config file.delete.delay.ms=222222,retention.ms=999999

Topic删除动态配置
--delete-config
sh bin/kafka-configs.sh --bootstrap-server xxxxx:9092 --alter --entity-type topics --entity-name test_create_topic1 --delete-config file.delete.delay.ms,retention.ms

其他配置同理,只需要类型改下
--entity-type

压力测试

#生产者压力测试
1. 发送1024条消息--num-records 100并且每条消息大小为1KB--record-size 1024 最大吞吐量每秒10000条--throughput 100
sh bin/kafka-producer-perf-test.sh --topic test_create_topic4 --num-records 100 --throughput 100000 --producer-props bootstrap.servers=localhost:9092 --record-size 1024 

2. 用指定消息文件--payload-file发送100条消息最大吞吐量每秒100条--throughput 100
先配置好消息文件batchmessage.txt,
然后执行命令 发送的消息会从batchmessage.txt里面随机选择; 注意这里我们没有用参数--payload-delimeter指定分隔符,默认分隔符是\n换行;
bin/kafka-producer-perf-test.sh --topic test_create_topic4 --num-records 100 --throughput 100 --producer-props bootstrap.servers=localhost:9092--payload-file config/batchmessage.txt

#消费者压力测试:消费100条消息--messages 100
sh bin/kafka-consumer-perf-test.sh -topic test_create_topic4 --bootstrap-server localhost:9092--messages 100

Broker磁盘信息

查询指定topic磁盘信息--topic-list topic1,topic2
sh bin/kafka-log-dirs.sh --bootstrap-server xxxx:9092 --describe --topic-list test2

查询指定Broker磁盘信息--broker-list 0 broker1,broker2
sh bin/kafka-log-dirs.sh --bootstrap-server xxxx:9092 --describe --topic-list test2 --broker-list 0

消费者组管理:待整理

bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --all-groups
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --all-groups --members
bin/kafka-consumer-groups.sh --bootstrap-server localhost:9092 --describe --all-groups --state

重新选举:待整理

php的kafka操作

方式1:安装php的kafka的扩展(源码安装或pecl安装)


#//源码安装
git clone https://github.com/arnaud-lb/php-rdkafka.git
 
#生成configure文件
/Users/shiyibo/LNMP/php/bin/phpize 
 
#编译安装
 ./configure --with-php-config=/Users/shiyibo/LNMP/php/bin/php-config
make
make install 
 
#在php.ini 文件中配置 rdkafka扩展
vim /Users/shiyibo/LNMP/php/etc/php.ini
extension=rdkafka.so
 
#查看扩展是否生效
$php -m | grep kafka

#//pecl 安装(实践成功!)
yum install zlib-devel -y
yum install librdkafka-devel
pecl install rdkafka
vim php.ini 添加 extension=rdkafka.so

#遇到问题:
1,librdkafka/rdkafka.h in default path... not found  
解决:librdkafka是kafka的c语言接口,yum install librdkafka-devel
参考资源:https://github.com/edenhill/librdkafka

2,如果yum install php71w-extname 失败就用pecl代替
生产者
$objRdKafka = new RdKafka\Producer();
$objRdKafka->setLogLevel(LOG_DEBUG);
$objRdKafka->addBrokers("localhost:9092");

$oObjTopic = $objRdKafka->newTopic("test");

// 从终端接收输入 
$oInputHandler = fopen('php://stdin', 'r');

while (true) {
    echo "\nEnter  messages:\n";
    $sMsg = trim(fgets($oInputHandler));

   // 空消息意味着退出
    if (empty($sMsg)) {
        break;
    }

    // 发送消息
    $oObjTopic->produce(RD_KAFKA_PARTITION_UA, 0, $sMsg);
}
消费者
$objRdKafka = new RdKafka\Consumer();
$objRdKafka->setLogLevel(LOG_DEBUG);
$objRdKafka->addBrokers("localhost:9092");

$oObjTopic = $objRdKafka->newTopic("test");

/**
 * consumeStart
 *   第一个参数标识分区,生产者是往分区0发送的消息,这里也从分区0拉取消息
 *   第二个参数标识从什么位置开始拉取消息,可选值为
 *     RD_KAFKA_OFFSET_BEGINNING : 从开始拉取消息
 *     RD_KAFKA_OFFSET_END : 从当前位置开始拉取消息
 *     RD_KAFKA_OFFSET_STORED : 猜测跟RD_KAFKA_OFFSET_END一样
 */
$oObjTopic->consumeStart(0, RD_KAFKA_OFFSET_END);

while (true) {
    // 第一个参数是分区,第二个参数是超时时间
    $oMsg = $oObjTopic->consume(0, 1000);

    // 没拉取到消息时,返回NULL
    if (!$oMsg) {
        usleep(10000);
        continue;
    }

    if ($oMsg->err) {
        echo $msg->errstr(), "\n";
        break;
    } else {
        echo $oMsg->payload, "\n";
    }
}

方式2:php的composer包

参考:https://github.com/weiboad/kafka-php

 

kafka常用配置

配置项

默认值/示例值

说明

broker.id

0

Broker唯一标识

listeners

PLAINTEXT://172.31.9.177:9092

监听信息,PLAINTEXT表示明文传输

log.dirs

kafka/logs

kafka数据存放地址,可以填写多个。用”,”间隔

message.max.bytes

message.max.bytes

单个消息长度限制,单位是字节

num.partitions

1

默认分区数

log.flush.interval.messages

Long.MaxValue

在数据被写入到硬盘和消费者可用前最大累积的消息的数量

log.flush.interval.ms

Long.MaxValue

在数据被写入到硬盘前的最大时间

log.flush.scheduler.interval.ms

Long.MaxValue

检查数据是否要写入到硬盘的时间间隔。

log.retention.hours

24

控制一个log保留时间,单位:小时

zookeeper.connect

172.31.9.177:2181

ZooKeeper服务器地址,多台用”,”间隔