Kafka基础知识1:安装,启动,基本操作,php扩展使用
参考:
https://blog.csdn.net/panchang199266/article/details/82113453 (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。
命令行使用:
参考:https://blog.csdn.net/qq_42544599/article/details/124966968(命令行介绍)
命令行分类
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安装)
参考:https://www.jianshu.com/p/fd8ce54e1156 (php操作kafka)
参考:https://zhuanlan.zhihu.com/p/142044988 (知乎)
#//源码安装 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服务器地址,多台用”,”间隔 |