Day08-kafka集群搭建,集群原理,压力测试及filebeat和logstash结合kafak实战案例

Day08-kafka集群搭建,集群原理,压力测试及filebeat和logstash结合kafak实战案例

0、昨日内容回顾:

  • Kibana的RBAC的管理
  • filebeat,logstash,kibana,postman,es-head,连接ES加密集群
bash 复制代码
[root@elk101 ~]# curl -u elastic:123456 10.0.0.101:9200/_cat/nodes
10.0.0.103 52 91 1 0.40 0.17 0.14 cdfhilmrstw - elk103.oldboyedu.com
10.0.0.101 72 64 1 0.00 0.02 0.05 cdfhilmrstw * elk101.oldboyedu.com
10.0.0.102 60 50 2 0.17 0.08 0.06 cdfhilmrstw - elk102.oldboyedu.com
  • zookeeper单点部署
  • zookeeper的集群部署
  • zookeeper集群管理脚本
  • zookeeper的命令行管理方式
    • create
      -s
      -e
    • get
    • delete
    • deleteall
    • set
    • ls
    • stat
  • zookeeper的zkWeb管理方式
  • kafka的单点部署

1、修改zookeeper的堆内存大小

温馨提示: 修改zookeeper的堆内存大小,一般情况下,生产环境给到2G足以,如果规模较大可以适当调大到4G。

(1)查看zk默认的堆内存大小为1GB。

bash 复制代码
[root@elk101.oldboyedu.com ~]# jmap -heap `jps | awk '/QuorumPeerMain/{print $1}'`

(2)配置ZK的堆内存

bash 复制代码
[root@elk101.oldboyedu.com ~]# cat > /oldboyedu/softwares/zk/conf/java.env << 'EOF'
export JAVA_HOME=/oldboyedu/softwares/jdk1.8.0_291
export JVMFLAGS="-Xms256m -Xmx256m $JVMFLAGS"
EOF

(3)将配置文件同步到集群的其他zk节点上

bash 复制代码
[root@elk101.oldboyedu.com ~]# data_rsync.sh /oldboyedu/softwares/zk/conf/java.env

(4)重启ZK集群

bash 复制代码
[root@elk101.oldboyedu.com ~]# zkManager.sh restart

(5)验证堆内存

bash 复制代码
[root@elk101.oldboyedu.com ~]# jmap -heap `jps | awk '/QuorumPeerMain/{print $1}'`

2、部署kafka集群

(1)停止kafka单点服务

bash 复制代码
[root@elk101.oldboyedu.com ~]# kafka-server-stop.sh 

(2)修改配置文件

bash 复制代码
[root@elk101.oldboyedu.com ~]# yy /oldboyedu/softwares/kafka/config/server.properties 
...
# 唯一标识kafka节点的数字编号,随便写,同一个集群中节点的id编号不重复即可。
broker.id=101
# 指定kafka的数据存储路径。
log.dirs=/oldboyedu/data/kafka
# kafka连接zookeeper集群地址
zookeeper.connect=10.0.0.101:2181,10.0.0.102:2181,10.0.0.103:2181/oldboyedu-linux85-kafka321

(3)同步kafka软件包相关文件

bash 复制代码
[root@elk101.oldboyedu.com ~]# data_rsync.sh /oldboyedu/softwares/kafka
[root@elk101.oldboyedu.com ~]# data_rsync.sh /oldboyedu/softwares/kafka_2.13-3.2.1/
[root@elk101.oldboyedu.com ~]# data_rsync.sh /etc/profile.d/kafka.sh 

(4)其他2个节点修改配置文件

bash 复制代码
[root@elk102.oldboyedu.com ~]# vim /oldboyedu/softwares/kafka/config/server.properties 
...
broker.id=102

[root@elk103.oldboyedu.com ~]# vim /oldboyedu/softwares/kafka/config/server.properties 
...
broker.id=103

(5)所有节点启动kafka环境

bash 复制代码
[root@elk101.oldboyedu.com ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 
	
[root@elk102.oldboyedu.com ~]# source /etc/profile.d/kafka.sh 
[root@elk102.oldboyedu.com ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 

[root@elk103.oldboyedu.com ~]# source /etc/profile.d/kafka.sh 
[root@elk103.oldboyedu.com ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 

(6)查看zookeeper的源数据

bash 复制代码
[root@elk101.oldboyedu.com ~]# zkCli.sh -server 10.0.0.101:2181,10.0.0.102:2181,10.0.0.103:2181
...
ls /oldboyedu-linux85-kafka321/brokers/ids 
[zk: 10.0.0.101:2181,10.0.0.102:2181,10.0.0.103:2181(CONNECTED) 0] ls /oldboyedu-linux85-kafka321/brokers/ids 
[101, 102, 103]

kafka架构

kafka消费组工作原理

3、kafka的常用术语

bash 复制代码
kafka cluster(broker list):
		kafka集群。
kafka Server (broker):
	指的是kafka集群的某个节点。
	
Producer:
	生产者,即往kafka集群写入数据的角色。

Consumer:
	消费者,即从kafka集群中读取数据的角色。一个消费者隶属于一个消费者组。
	
Concumer Group:
	消费者组,里面有一个或多个消费者。
	
Topic:
	主题,是一个逻辑概念,用于区分业务,一个主题最少要有1个分区和一个副本。
	
Partition:
	分区,分区可以暂时理解为分区编号。

replica:
	副本,副本是实际存储数据的地方,分为两种角色,即leader和follower。
	   leader:
			负责读写。
	   follower:
			负责从leader节点同步数据,无法对集群外部提供任何服务。当leader无法访问时,follower会接管leader的角色。
	
	AR:
		所有的副本,包含leader和follower副本。
	ISR:
		表示和leader同步的所有副本集合。
	OSR:
		表示和leader不同步的所有副本即可。
		
zookeeper集群:
	kafka 0.9之前的版本维护消费者组的offset,之后kafka内部的topic进行维护。
	协调kafka的leader选举,控制器协调者选举等....

client:

复制代码
consumer API:
    即消费者,指的是从boker拉取数据的角色。
    每个消费者均隶属于一个消费者组(consumer Group),一个消费者组内可以有多个消费者。
    
producer API:
	即生产者,指的是往broker写入数据的角色。
	
admin API:
	集群管理的相关API,包括topic,parititon,replica等管理。
	
stream API:
	数据流处理等API,提供给Spark,Flink,Storm分布式计算框架提供数据流管道。
	
connect API:
	连接数据库相关的API,例如将MySQL导入到kafka。	

常见问题:

Q1: 分区和副本有啥区别?

分区可以暂时理解为分区编号,它包含该分区编号的所有副本,和磁盘的分区没关系。

副本是实际存储数据的地方,

Q2: offset存储在kafka集群,客户端在kafka集群任意一个节点如何获取偏移量。

通过内部的消费者组的偏移量读取即可。("__consumer_offsets")

4、topic管理

  • 查看topic
bash 复制代码
# 查看topic列表,
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --list

# 查看指定topic的详细信息。
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --describe --topic oldboyedu-linux85

# 查看所有的topic详细信息。	
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --describe 
  • 创建topic

一个topic是生产者(producer)和消费者(consumer)进行逻辑的通信单元。

底层存储数据的是对应一个或多个分区(partition)副本(replica)。

bash 复制代码
# 创建一个名为"oldboyedu-linux85",分区数为3,副本数量为2的topic。
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --create  --partitions 3 --replication-factor 2 --topic oldboyedu-linux85

# 创建一个名为"oldboyedu-jiaoshi07",分区数为3,副本数量为2的topic。
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --create  --partitions 3 --replication-factor 2 --topic oldboyedu-jiaoshi07
  • 修改topic(分区数量可以调大,但不可以调小!)
bash 复制代码
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --alter --topic oldboyedu-linux85 --partitions 5
  • 刪除topic
bash 复制代码
[root@elk101.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --delete --topic oldboyedu-linux85 

kafka关于修改副本数和分区的数的案例实战:

https://www.cnblogs.com/yinzhengjie/p/9808125.html

  • 创建生产者
bash 复制代码
[root@elk102.oldboyedu.com ~]# kafka-console-producer.sh --bootstrap-server 10.0.0.103:9092 --topic oldboyedu-jiaoshi07
  • 创建消费者
bash 复制代码
[root@elk103.oldboyedu.com ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.102:9092 --topic oldboyedu-jiaoshi07 --from-beginning
  • 消费者组案例
bash 复制代码
[root@elk103 ~]# vim /oldboyedu/softwares/kafka/config/consumer.properties
...
group.id=linux85

(1)创建topic
[root@elk103.oldboyedu.com ~]# kafka-topics.sh --bootstrap-server 10.0.0.101:9092 --create  --partitions 3 --replication-factor 2 --topic oldboyedu-jiaoshi03

(2)启动生产者
[root@elk102.oldboyedu.com ~]# kafka-console-producer.sh --bootstrap-server 10.0.0.103:9092 --topic oldboyedu-jiaoshi03

(3)启动消费者加入同一个消费者组
[root@elk101.oldboyedu.com ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.102:9092 --topic oldboyedu-jiaoshi03 --consumer-property group.id=linux85 --from-beginning

kafka-console-consumer.sh --bootstrap-server 10.0.0.102:9092 --topic oldboyedu-jiaoshi01 --consumer-property group.id=linux85 --from-beginning

[root@elk103.oldboyedu.com ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.102:9092 --topic oldboyedu-jiaoshi03 --consumer.config  /oldboyedu/softwares/kafka/config/consumer.properties --from-beginning

(4)测试

在生产者端写入数据,观察消费者的输出即可。

(5)观察消费者组的详细信息

bash 复制代码
[root@elk101.oldboyedu.com ~]# kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --describe --group linux85

[root@elk101 ~]# kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --list
console-consumer-43305
console-consumer-7295
console-consumer-79844
[root@elk101 ~]# kafka-consumer-groups.sh --bootstrap-server 10.0.0.101:9092 --describe --all-groups

Consumer group 'console-consumer-43305' has no active members.

GROUP                 TOPIC               PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                           HOST            CLIENT-ID
console-consumer-7295 oldboyedu-jiaoshi01 0          -               3               -               console-consumer-388fafbd-8e5e-4783-a771-60d490889de3 /10.0.0.103     console-consumer

GROUP                  TOPIC               PARTITION  CURRENT-OFFSET  LOG-END-OFFSET  LAG             CONSUMER-ID                                           HOST            CLIENT-ID
console-consumer-79844 oldboyedu-jiaoshi01 0          -               3               -               console-consumer-9ae9c8eb-634f-4a65-b637-cc3b45c50798 /10.0.0.103     console-consumer

彩蛋:

bash 复制代码
查看内置的"__consumer_offsets "的数据:
[root@elk103.oldboyedu.com ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.101:9092  --topic __consumer_offsets  --formatter "kafka.coordinator.group.GroupMetadataManager\$OffsetsMessageFormatter" --from-beginning  | grep linux85


# kafka-server-start.sh
# kafka-server-stop.sh
# kafka-topics.sh
# kafka-console-producer.sh
# kafka-console-consumer.sh
# kafka-consumer-groups.sh

5、kafka堆内存调优

(1)修改启动脚本

bash 复制代码
[root@elk101.oldboyedu.com ~]# vim `which kafka-server-start.sh ` +28
...
if [ "x$KAFKA_HEAP_OPTS" = "x" ]; then
	...
	# 将原有的注释掉
	# export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"
	export KAFKA_HEAP_OPTS="-server -Xmx256m -Xms256m -XX:PermSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70"
export JMX_PORT="8888"
fi

(2)同步集群启动脚本

bash 复制代码
[root@elk101.oldboyedu.com ~]# data_rsync.sh `which kafka-server-start.sh `

(3)重启kafka集群

bash 复制代码
[root@elk101.oldboyedu.com ~]# kafka-server-stop.sh 
[root@elk101.oldboyedu.com ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 

[root@elk102.oldboyedu.com ~]# kafka-server-stop.sh 
[root@elk102.oldboyedu.com ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 

[root@elk103.oldboyedu.com ~]# kafka-server-stop.sh 
[root@elk103.oldboyedu.com ~]# kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties 

(4)验证kafka集群的内存大小

bash 复制代码
[root@elk101.oldboyedu.com ~]# jmap -heap `jps | awk '/Kafka/{print $1}'`
[root@elk102.oldboyedu.com ~]# jmap -heap `jps | awk '/Kafka/{print $1}'`
[root@elk103.oldboyedu.com ~]# jmap -heap `jps | awk '/Kafka/{print $1}'`

6、kafka开源监控组件-kafka-eagle

  • 启动kafka的JXM端口

(1)所有节点停止kafka

bash 复制代码
kafka-server-stop.sh

(2)所有节点修改kafka的配置文件

bash 复制代码
vim `which kafka-server-start.sh`
...
 #  export KAFKA_HEAP_OPTS="-Xmx1G -Xms1G"  # 注视掉该行,并将下面2行复制即可
export KAFKA_HEAP_OPTS="-server -Xmx256M -Xms256M -XX:PermSize=128m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:ParallelGCThreads=8 -XX:ConcGCThreads=5 -XX:InitiatingHeapOccupancyPercent=70"
export JMX_PORT="8888"

(3)所有节点启动kafka服务

bash 复制代码
kafka-server-start.sh -daemon /oldboyedu/softwares/kafka/config/server.properties 
  • 启动zookeeper的JMX端口

(1)修改配置文件

bash 复制代码
[root@elk101.oldboyedu.com ~]# vim /oldboyedu/softwares/zk/conf/zoo.cfg  

# 添加下面的一行,启动zk的4字监控命令
4lw.commands.whitelist=*

(2)修改zk的启动脚本

bash 复制代码
[root@elk101.oldboyedu.com ~]# vim /oldboyedu/softwares/zk/bin/zkServer.sh +77
...
# 如果修改上面的方式不生效,则需修改zkServer.sh脚本中77行之后ZOOMAIN的值即可。
ZOOMAIN="-Dzookeeper.4lw.commands.whitelist=* ${ZOOMAIN}"

(3)修改环境变量开启JMX

bash 复制代码
[root@elk101.oldboyedu.com ~]# vim /oldboyedu/softwares/zk/bin/zkEnv.sh
...
JMXLOCALONLY=false
JMXPORT=21812
JMXSSL=false
JMXLOG4J=false

(4)同步脚本

bash 复制代码
[root@elk101.oldboyedu.com ~]# data_rsync.sh /oldboyedu/softwares/zk/bin/zkServer.sh 
[root@elk101.oldboyedu.com ~]# data_rsync.sh /oldboyedu/softwares/zk/bin/zkEnv.sh 

(5)使用jconsole验证是否能连接JMX端口

  • 安装MySQL

(1)安装mariadb

bash 复制代码
[root@elk101.oldboyedu.com ~]# yum -y install mariadb-server

(2)配置mariadb的配置文件

bash 复制代码
[root@elk101 ~]# vim /etc/my.cnf
[mysqld]
...
# 关闭MySQL的反向解析功能
skip-name-resolve=1

(2)启动服务并设置开机自启动

bash 复制代码
[root@elk101.oldboyedu.com ~]# systemctl enable mariadb --now

(3)创建数据库

bash 复制代码
[root@elk101.oldboyedu.com ~]# mysql
...
CREATE DATABASE oldboyedu_kafka DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

4)创建授权用户

bash 复制代码
CREATE USER admin IDENTIFIED  BY 'oldboyedu';
GRANT ALL ON oldboyedu_kafka.* TO admin;
SHOW GRANTS FOR admin;

(5)测试用户

bash 复制代码
mysql -u admin -poldboyedu -h 10.0.0.101
  • 部署kafka-eagle监控

(1)下载kafka-eagle软件

bash 复制代码
[root@elk101.oldboyedu.com ~]# wget http://192.168.15.253/ElasticStack/day08-/softwares/kafka-eagle-bin-2.0.8.zip

(2)解压软件包

bash 复制代码
[root@elk101.oldboyedu.com ~]# unzip kafka-eagle-bin-2.0.8.zip 
[root@elk101.oldboyedu.com ~]# tar xf efak-web-2.0.8-bin.tar.gz -C /oldboyedu/softwares/

(3)修改配置文件

bash 复制代码
[root@elk101.oldboyedu.com ~]# yy /oldboyedu/softwares/efak-web-2.0.8/conf/system-config.properties 
...
efak.zk.cluster.alias=oldboyedu-linux85
oldboyedu-linux85.zk.list=10.0.0.101:2181,10.0.0.102:2181,10.0.0.103:2181/oldboyedu-linux85-kafka321
oldboyedu-linux85.efak.broker.size=20
kafka.zk.limit.size=32
efak.webui.port=8048
oldboyedu-linux85.efak.offset.storage=kafka
oldboyedu-linux85.efak.jmx.uri=service:jmx:rmi:///jndi/rmi://%s/jmxrmi
efak.metrics.charts=true
efak.metrics.retain=15
efak.sql.topic.records.max=5000
efak.sql.topic.preview.records.max=10
efak.topic.token=oldboyedu
efak.driver=com.mysql.cj.jdbc.Driver
efak.url=jdbc:mysql://10.0.0.101:3306/oldboyedu_kafka?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
efak.username=admin
efak.password=oldboyedu
[root@elk101.oldboyedu.com ~]# 

(4)配置环境变量

bash 复制代码
cat >> /etc/profile.d/kafka.sh <<'EOF'
export KE_HOME=/oldboyedu/softwares/efak-web-2.0.8
export PATH=$PATH:$KE_HOME/bin
EOF
source /etc/profile.d/kafka.sh

(5)修改堆内存大小

bash 复制代码
[root@elk101.oldboyedu.com ~]# vim `which ke.sh `
...
export KE_JAVA_OPTS="-server -Xmx256m -Xms256m -XX:MaxGCPauseMillis=20 -XX:+UseG1GC -XX:MetaspaceSize=128m -XX:InitiatingHeapOccupancyPercent=35 -XX:G1HeapRegionSize=16M -XX:MinMetaspaceFreeRatio=50 -XX:MaxMetaspaceFreeRatio=80"

(6)启动服务

bash 复制代码
[root@elk101.oldboyedu.com ~]# ke.sh start

账号:admin 密码:123456

7、kafka集群压力测试

7.1 什么叫压力测试

在软件工程中,压力测试是对系统不断施加压力的测试,是通过确定一个系统的瓶颈或者不能接收的性能点,来获得系统能提供的最大服务级别的测试。

简单来说,所谓压力测试就是对一个集群的处理能力的上限做一个评估。为将来集群扩容提供有效的依据。

7.2 为什么要进行压力测试

(1)压力测试可以了解当前集群的处理能力上限;

(2)当修改集群的配置参数后,压力测试可以协助运维人员去参考本次调优的效果;

(3)压力测试的结果以后可以作为参考扩容集群的有效依据;

7.3 实战案例

bash 复制代码
install -d /tmp/kafka-test/

cat >oldboyedu-kafka-test.sh <<'EOF'
# 创建topic
kafka-topics.sh --bootstrap-server 10.0.0.101:9092,10.0.0.102.9092,10.0.0.103:9092 --topic oldboyedu-kafka-2022 --replication-factor 1 --partitions 10 --create

# 启动消费者消费数据
nohup kafka-consumer-perf-test.sh --broker-list 10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 --topic
oldboyedu-kafka-2022 --messages 100000000 &>/tmp/kafka-test/oldboyedu-kafka-consumer.log &

#启动生产者写入数据
nohup kafka-producer-perf-test.sh --num-records 100000000 --record-size 1000 --topic oldboyedu-kafka-2022 --throughput 1000000 --producer-props bootstrap.servers=10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092 &>/tmp/kafka-test/oldboyedu-kafka-producer.log &
EOF

bash oldboyedu-kafka-test.sh

参数说明:
kafka-consumer-perf-test.sh
  ---messages:
     指定消费消息的数量。
  --broker-list:
     指定broker列表。
  --topic:
     指定topic主体。
     
kafka-producer-perf-test.sh
  -num-records
     生产消息的数量,
  --record-size:
     每条消息的大小,单位是字节。
  --topic:
     指定topic主体。
  --throughput
     设置每秒发送的消息数量,即指定最大消息的吞吐量,若设置为-1代表不限制!
  --producer-props 
     bootstrap.servers指定broker列表。
     
温馨提示:
本案例测试大约会生成93GB( echo  "100000000*1000/1024/1024/1024"|bc)的数据,如果硬盘资源不足的小伙伴可以暂时不用测试了,或者改小上面提到的参数。

7.4 kafka生产环节测试截图

bash 复制代码
生产端:
    总共需要发送的消息数:1亿条,每个记录的字节数是:1000字节,每秒钟发送的记录数是:1000000

消费端:
    模拟了10个消费者:进行消费

    指定每次fetch的数据的大小:1M
    总共要消费的消息个数:1亿条

生产端结论:
    1>.每秒平均向kafka写入了225.07 MB的数据;
    2>.每次写入的平均延迟为 129.81毫秒;
    3>.最大延迟为2422.00毫秒;

消费端结论:
    1>. 共消费了95367.4316M的数据;
    2>.消费速度为225.2047M/s;
    3>.总共消费了1亿条消息;
    4>.每秒消费236144.2369条消息;
    
参考链接:
https://www.cnblogs.com/yinzhengjie/p/9953212.html

7.5 压力测试注意点

如下图所示,压测试需要注意以下几点:

(1)根据公司的架构来调整咱们的生产者和消费者所在的环境;

(2)专线带宽需要实时监控,不能因为测试把正常业务的数据因打满带宽而导致数据丢失;

(3)测试时尽量选择在业务低峰期去操作,不建议在业务高峰期做:

8、kafka优化

broker优化

bash 复制代码
#################################### Server Basics ###############################################
#每一个broker在集群中的唯一表示,要求是正数。当该服务器的IP地址发生改变时,broker.id没有变化,则不会影响consumers的消息情况
broker.id=116

#这就是说,这条命令其实并不执行删除动作,仅仅是在zookeeper上标记该topic要被删除而已,同时也提醒用户一定要提前打开delete.topic.enable开关,否则删除动作是不会执行的。
delete.topic.enable=true

#是否允许自动创建topic,若是false,就需要通过命令创建topic
auto.create.topics.enable=false

########################## Socket Server Settings #########################
# The address the socket server listens on. It will get the value returned from
# java.net.InetAddress.getCanonicalHostName() if not configured.
# FORMAT:
#    listeners =listener_name://host_name:port
# EXAMPLE:
#    listeners =PLAINTEXT://your.host.name:9092

#Socket服务器侦听的地址。如果没有配置,它将获得从Java.NET.InAddio.GETCANONICALITHAMEMENE()返回的值
#listeners=PLAINTEXT://10.1.3.116:9092

#broker server服务端口
port=9092
#broker的主机地址,若是设置了,那么会绑定到这个地址上,若是没有,会绑定到所有的接口上,并将其中之一发送到ZK,一般不设置
host.name=10.1.3.116
# Hostname and port the broker will advertise to producers and consumers. If not set,
# it uses the value for "listeners" if configured. otherwise, it will use the value
# returned from java.net.InetAddress.getcanonicalHostName()

#kafka 0.9.x以后的版本新增了advertised.listeners配置,kafka 0.9.x以后的版本不要使用 advertised.host.name 和advertised.host.port 已经deprecated.如果配置的话,它使用"listeners"的值。否则,它将使用从java.net.InetAddress.getcanonicalHostName()返回的值。
#advertised.listeners=PLAINTEXT://your.host.name:9092

#将侦听器(listener)名称映射到安全协议,默认情况下它们是相同的。有关详细信息,请参阅配置文档。#listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL

#处理网络请求的最大线程数
num.network.threads=30

#处理磁盘I/0的线程数
num.io.threads=30

#套接字服务器使用的发送缓冲区(SOYSNDBUF)
socket.send.buffer.bytes=5242880

#套接字服务器使用的接收缓冲区(SOYRCVBUF)
socket.receive.buffer.bytes=5242880

#套接字服务器将接受的请求的最大大小(对OOM的保护)
socket.request.max.bytes=104857600

#I/0线程等待队列中的最大的请求数,超过这个数量,network线程就不会再接收一个新的请求。应该是一种自我保护机制。
queued.max.requests=1000

############################### Log Basics ################################

#日志存放目录,多个目录使用逗号分割,如果你有多块磁盘,建议配置成多个目录,从而达到I/0的效率的提升。
log.dirs=/home/oldhoyedu/kafka/logs,/home/oldboyedu/kafka/1ogs2,/home/oldboyedu/kafka/logs3

#每个topic的分区个数,若是在topic创建时候没有指定的话会被topic创建时的指定参数覆盖
# num.partitions=20

# 默认副本数
# default.replication.factor=2

#在启动时恢复日志和关闭时刷盘日志时每个数据目录的线程的数量,默认1
num.recovery.threads.per.data.dir=32

#服务器接受单个消息的最大大小,即消息体的最大大小,单位是字节,下面是100MB
message.max.bytes=104857600

# 自动负载均衡,如果设为true,复制控制器会周期性的自动尝试,为所有的broker的每个partition平衡leadership,为更优先(preferred)#的replica分配leadership。
auto.leader.rebalance.enable=true

############################# Log Flush Policy ###############################
#在强制fsync一个partition的log文件之前暂存的消息数量。调低这个值会更领繁的sync数据到磁盘,影响性能。通常建议人家使用replication来确保持久性,而不是依靠单机上的fsync,但是这可以带来更多的可靠性,默认10000.
#log.flush.interval.messages=10000

#2次fsync调用之间最大的时间间隔,单位为ms。即使log.flush.interval.messages没有达到,只要这个时间到了也需要调用fsync。默认3000ms.
#log.flush.interval.ms=10000

################################## Log Retention Policy ####################################
#日志保存时间(hours|minutes),默认为7天(168小时)。超过这个时间会根据policy处理数据。hours和minutes无论哪个先达到都会触发。
log.retention.hours=168

#日志数据存储的最大字节数。超过这个时间会根据po1icy处理数据。
#log.retention.bytes=1073741824

#控制日志segment文件的大小,超出该大小则追加到一个新的日志segment文件中(-1表示没有限制)
log.segment.bytes=536870912

#当达到下面时间,会强制新建一个segment
#log.roll.hours = 24*7

#日志片段文件的检查周期,查看它们是否达到了删除策略的设置(log.retention.hours或log.retention.bytes)
log.retention.check.interval.ms=600000

#是否开启压缩
#log.cleaner.enable=false

#日志清理策略选择有:delete和compact主要针对过期数据的处理,或是日志文件达到限制的额度,会被topic创建时的指定参数覆盖
#log.cleanup.policy=delete

#日志压缩运行的线程数
#log.cleaner.threads=2

# 压缩的日志保留的最长时间
#log.cleaner.delete.retention.ms=3600000

############################### Zookeeper ########################################
#zookeeper集群的地址,可以是多个,多个之间用逗号分割,生产环境中,建议配置chroot目录
zookeeper.connect=10.1.3.117:2181,10.1.3.118:2181,10.1.3.119:2181/oldboyedu-kafka300

#zooKeeper的最大超时时间,就是心跳的间隔,若是没有反映,那么认为已经死了,不易过大
zookeeper.session.timeout.ms=180000

#指定多久消费者更新offset到zookeeper中。注意offset更新时基于time而不是每次获得的消息。一旦在更新zookeeper发生异常并重启,将可能拿到已拿到过的消息,连接zk的超时时间
zookeeper.connection.timeout.ms=6000

#请求的最大大小为字节,请求的最大字节数。这也是对最大记录尺寸的有效覆盖。注意:server具有自己对消息记录尺寸的覆盖,这些尺寸和这个设置不同。此项设置将会限制producer每次批量发送请求的数目,以防发出巨量的请求。
max.request.size=104857600

#每次fetch请求中,针对每次fetch消息的最大字节数。这些字节将会督导用于每个partition的内存中,因此,此设置将会控制consumer所使用的memory大小。这个fetch请求尺寸必须至少和server允许的最大消息尺寸相等,否则,producer可能发送的消息尺寸大于consumer所能消耗的尺寸。
fetch.message.max.bytes=104857600

#zooKeeper集群中leader和follower之间的同步时间,换句话说:一个zK fo11ower能落后leader多久。
#zookeeper.sync.time.ms=2000

################################## Replica Basics #########################################
# leader接收follower的"fetch请求"的超时时间,默认是10秒。
# replica.lag.time.max.ms=30000

# 如果relicas落后太多,将会认为此partition relicas已经失效。而一般情况下,因为网络延迟等原因,总会导致replicas中消息同步滞后。如果消息严重滞后,leader将认为此relicas网络延迟较大或者消息吞吐能力有限。在broker数量较少,或者网络不足的环境中,建议提高此值.follower落后于leader的最大message数,这个参数是broker全局的。设置太大了,影响真正"落后"follower的移除;设置的太小了,导致follower的频繁进出。无法给定一个合适的replica.lag.max.messages的值,因此不推荐使用,据说新版本的Kafka移除了这个参数。#replica.lag.max.messages=4000

#follower与leader之间的socket超时时间
#replica.socket.timeout.ms=30000

# follower每次fetch数据的最大尺寸
replica.fetch.max.bytes=104857600

# follower的fetch请求超时重发时间
replica.fetch.wait.max.ms=2000

# fetch的最小数据尺寸
#replica.fetch.min.bytes=1

#是否允许控制器关闭broker,默认值为true,它会关团所有在这个broker上的leader,并转移到其他broker,建议启用,增加集群稳定性。
# controlled.shutdown.enable = false

#0.11.0.0版本开始unclean.leader.election.enable参数的默认值由原来的true改为fa1se,可以关闭unclean leader election,也就是不在ISR(IN-Sync Replica)列表中的replica,不会被提升为新的leader partition。kafka集群的持久化力大于可用性,如果ISR中没有其它的replica,会导致这个partition不能读写。
unclean.leader.election=false

# follower中开启的fetcher线程数,同步速度与系统负载均衡
num.replica.fetchers=5

# partition leader与replicas之间通讯时,socket的超时时间
#controller.socket.timeout.ms=30000

# partition leader与replicas数据同步时,消息的队列尺寸
#controller.message.queue.size=10

#指定将使用哪个版本的 inter-broker 协议。 在所有经纪人升级到新版本之后,这通常会受到冲击。升级时要设置
#inter.broker.protocol.version=0.10.1

#指定broker将用于将消息添加到日志文件的消息格式版本。该值应该是有效的Apiversion。一些例子是:0.8.2,0.9.0.0,0.10.0。通过设置特定的消息格式版本,用户保证磁盘上的所有现有消息都小于或等于指定的版本。 不正确地设置这个值将导致使用旧版本的用户出错,因为他们将接收到他们不理解的格式的消息。
#log.message.format.version=0.10.1

温馨提示:
      生产环境中请一定要弄清楚参数的含义,然后在配置,配置后重启集群时请不要批量重启,要滚动重启!
      
推荐阅读:
      https://kafka.apache.org/documentation/#configuration

9、filebeat将数据写入到Kafka实战

bash 复制代码
[root@elk103.oldboyedu.com filebeat-7.17.5-linux-x86_64]# cat config/25-stdin-to-kafka.yaml
filebeat.inputs:

- type: stdin
# 将数据输出到kafka
output.kafka:
  # 指定kafka主机列表
  hosts:
  - 10.0.0.101:9092
  - 10.0.0.102:9092
  - 10.0.0.103:9092
  # 指定kafka的topic
  topic: "oldboyedu-linux85-kafka"
[root@elk103.oldboyedu.com filebeat-7.17.5-linux-x86_64]# 
[root@elk103.oldboyedu.com filebeat-7.17.5-linux-x86_64]# ./filebeat -e -c config/25-stdin-to-kafka.yaml

# 查看
[root@elk101 ~]# kafka-console-consumer.sh --bootstrap-server 10.0.0.102:9092 --topic oldboyedu-linux85-kafka --from-beginning
{"@timestamp":"2024-06-10T09:40:37.364Z","@metadata":{"beat":"filebeat","type":"_doc","version":"7.17.5"},"host":{"name":"elk103.oldboyedu.com"},"agent":{"version":"7.17.5","hostname":"elk103.oldboyedu.com","ephemeral_id":"24af5d8c-aaa8-4552-ad29-cb085e3367da","id":"eb4646e6-59e9-4aa8-a54d-3bbd11132ce8","name":"elk103.oldboyedu.com","type":"filebeat"},"log":{"offset":0,"file":{"path":""}},"message":"111111111111111","input":{"type":"stdin"},"ecs":{"version":"1.12.0"}}
{"@timestamp":"2024-06-10T09:40:39.688Z","@metadata":{"beat":"filebeat","type":"_doc","version":"7.17.5"},"message":"2222222222222222222","log":{"offset":0,"file":{"path":""}},"input":{"type":"stdin"},"host":{"name":"elk103.oldboyedu.com"},"agent":{"id":"eb4646e6-59e9-4aa8-a54d-3bbd11132ce8","name":"elk103.oldboyedu.com","type":"filebeat","version":"7.17.5","hostname":"elk103.oldboyedu.com","ephemeral_id":"24af5d8c-aaa8-4552-ad29-cb085e3367da"},"ecs":{"version":"1.12.0"}}
{"@timestamp":"2024-06-10T09:40:42.619Z","@metadata":{"beat":"filebeat","type":"_doc","version":"7.17.5"},"ecs":{"version":"1.12.0"},"host":{"name":"elk103.oldboyedu.com"},"agent":{"id":"eb4646e6-59e9-4aa8-a54d-3bbd11132ce8","name":"elk103.oldboyedu.com","type":"filebeat","version":"7.17.5","hostname":"elk103.oldboyedu.com","ephemeral_id":"24af5d8c-aaa8-4552-ad29-cb085e3367da"},"log":{"offset":0,"file":{"path":""}},"message":"33333333333333333333333333","input":{"type":"stdin"}}

10、logstash从kafka拉取数据并解析json格式案例

bash 复制代码
[root@elk101.oldboyedu.com ~]# cat  config/17-kafka-to-stdout.conf 
input {
  kafka {
    # 指定kafka集群地址
    bootstrap_servers => "10.0.0.101:9092,10.0.0.102:9092,10.0.0.103:9092"
    # 指定消费的topic
    topics => ["oldboyedu-linux85-kafka"]
    # 指定消费者组
    group_id => "oldboyedu-linux85-demo04"
    # 指定消费的偏移量,"earliest"表示从头读取数据,"latest"表示从最新的位置读取数据.
    auto_offset_reset => "earliest"
  }
}

filter {
  json {
    # 对指定字段进行json格式解析。
    source => "message"
  }

  mutate {
     remove_field => [ "agent","log","input","host","ecs","tags" ]
  }
}

output { 
  stdout {} 
}
[root@elk101.oldboyedu.com ~]# 

今日作业:

(1)完成课堂的所有练习并整理思维导图;

(2)使用zabbix监控zookeeper和kafka集群;

明日环境准备:

(1)主机集群地址:

bash 复制代码
10.0.0.231 k8s231.oldboyedu.com
10.0.0.232 k8s232.oldboyedu.com
10.0.0.233 k8s233.oldboyedu.com

(2)配置说明如下

内存:4G

CPU:2C

DISK:20G+

(3)准备一台harbor服务器(1c2G足以)

要求是使用https认证。服务器地址为: "https://habor.oldboyedu.com"

扩展作业:

(1)使用ansible一键构建zookeeper和kafka集群;

(2)使用docker一键构建elasticstack架构体系,要求镜像命名规则如下:

bash 复制代码
- oldboyedu-es:v0.1
- oldboyedu-logstash:v0.1
- oldboyedu-filebeat:v0.1
- oldboyedu-kibana:v0.1
- oldboyedu-zookeeper:v0.1
- oldboyedu-kafka:v0.1

使用docker-compose一键构建即可。

bash 复制代码
# 查看自定义网络
[root@elk103.oldboyedu.com ~]# docker network ls     
# 创建自定义网络
[root@elk103.oldboyedu.com ~]# docker network create oldboyedu-linux85   
# 查看自定义网络的详细信息。
[root@elk103.oldboyedu.com ~]# docker network inspect oldboyedu-linux85   
# 创建网络时,可以自定义网段,分配容器的网段地址及网关地址。
[root@elk103.oldboyedu.com ~]# docker network create --subnet 172.31.0.0/16 --ip-range 172.31.200.0/24 --gateway 172.31.0.254 test02     
# 启动容器时指定自定义网络。
[root@elk103.oldboyedu.com ~]# docker run --network test02 --rm --name myweb -d nginx:1.22.1-alpine  

参考链接:
https://gitee.com/jasonyin2020/docker-compose/tree/master
相关推荐
Elasticsearch14 小时前
3个信号、2个环境变量、0个采集器:使用 Python 和 Elastic 的托管 OTLP 端点实现 OpenTelemetry
elasticsearch
XIAOHEZIcode20 小时前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220702 天前
如何搭建本地yum源(上)
运维
Elasticsearch3 天前
如何通过 Claude Code 来写入 CSV 数据到 Elasticsearch
elasticsearch
大树884 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠4 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
大志哥1235 天前
ES和Logstash日志链路系统上线后遭遇切片爆炸(解决)
大数据·elasticsearch
霸道流氓气质5 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工5 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智5 天前
ARP代理--工作原理
运维·网络·arp·arp代理