SkyWalking日志异步采集架构
【重点知识】
1、【Agent】kafka-reporter-plugin-x.x.x.jar包放plugins目录后必走kafka(kafka没有正确配置就会报错)
2、【Agent】异步如不开启数据压缩,日志数据较大,pod多、业务大时容易造成网络拥堵
3、【Agent】SW_AGENT_INSTANCE_NAME默认:UUID@hostname,建议调整为:nodeip@podip
4、【Agent】官方说:使用Kafka时skywalking.collector.backend_service参数依然要配置
5、【APM】SkyWalking OAP配置启用kafka并配置好后,OAP启动时会自动创建Topic
6、看到最后会有惊喜,作者在附件六中记录了大型系统(POD数量>30000个)的最佳实践
7、可通过链路数据过滤插件过滤不需要监控的请求,详见:SkyWalking异步采集spring gateway日志-CSDN博客
8、gateway集成skywalking见:SkyWalking异步采集spring gateway日志-CSDN博客
环境及帮助文件
SkyWalking-OAP帮助文档 -- 配置说明
SkyWalking-Agent帮助文档 -- 配置说明
Agent is available for JDK 8 - 21
Oracle JDK8u202(Oracle JDK8最后一个非商业版本) 下载地址:Oracle JDK8u202
skywalking-OAP服务
启用kafka配置
编辑oap配置文件 ${skywalking-apm}/config/application.yml配置
# line 323 apache-skywalking-apm-9.6.0
kafka-fetcher:
selector: ${SW_KAFKA_FETCHER:default}
default:
# 多个使用逗到分隔
bootstrapServers: ${SW_KAFKA_FETCHER_SERVERS:localhost:9092}
namespace: ${SW_NAMESPACE:""}
# 默认3,几个消费者就配几
partitions: ${SW_KAFKA_FETCHER_PARTITIONS:3}
# 不能超过kafka集群机器的数量,默认2
replicationFactor: ${SW_KAFKA_FETCHER_PARTITIONS_FACTOR:2}
enableNativeProtoLog: ${SW_KAFKA_FETCHER_ENABLE_NATIVE_PROTO_LOG:true}
enableNativeJsonLog: ${SW_KAFKA_FETCHER_ENABLE_NATIVE_JSON_LOG:true}
consumers: ${SW_KAFKA_FETCHER_CONSUMERS:1}
kafkaHandlerThreadPoolSize: ${SW_KAFKA_HANDLER_THREAD_POOL_SIZE:-1}
kafkaHandlerThreadPoolQueueSize: ${SW_KAFKA_HANDLER_THREAD_POOL_QUEUE_SIZE:-1}
...
skywalking-agent服务
经验
-》 kafka-reporter-plugin-x.x.x.jar 这个包放plugins目录后必走kafka,如果kafka没有正确配置就会报错
-》 不压缩的情况下,一次请求约1KB日志
-》SW_AGENT_INSTANCE_NAME 默认:UUID@hostname,建议:host_ip@pod_ip
-》使用Kafka时skywalking.collector.backend_service参数依然要配置(官方说的)
开启Kafka
- 将${skywalking-agent}/optional-reporter-plugins/kafka-reporter-plugin-x.x.x.jar 拷贝到 ${skywalking-agent}/plugins
开启消息数据压缩
# optional-reporter-plugins下面任选一种(lz4、snappy、zstd-jni)压缩实现包即可
- 将${skywalking-agent}/optional-reporter-plugins/zstd-jni-x.x.x.jar 拷贝到 ${skywalking-agent}/plugins
Springboot应用增加jvm参数
应用启动参数,多个kafka地址使用逗号分割
# myApp 改为你的包名
java \
-javaagent:/usr/local/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=myApp \
-Dskywalking.collector.backend_service=aigoServer:11800 \
-Dskywalking.plugin.kafka.bootstrap_servers=10.81.**.14:9092 \
-Xmx1g \
myApp.jar
Tomcat应用增加jvm参数
应用启动参数,多个kafka地址使用逗号分割
# myApp 改为实际应用名
JAVA_OPTS="$JAVA_OPTS --javaagent:/usr/local/agent/skywalking-agent.jar \
-Dskywalking.agent.service_name=myApp \
-Dskywalking.collector.backend_service=aigoServer:11800 \
-Dskywalking.plugin.kafka.bootstrap_servers=10.81.**.14:9092"
说明:
使用Kafka时skywalking.collector.backend_service参数依然要配置(官方说的)
附件
附件一:lz4压缩算法
lz4压缩算法 --- 压缩速度快
GitHub - lz4/lz4: Extremely Fast Compression algorithm
附件二:snappy压缩工具
snappy压缩算法 --- 压缩速度快
GitHub - google/snappy: A fast compressor/decompressor
附件三:Zstd压缩算法
Zstd压缩算法 --- 压缩比高,CPU比较富裕时此算法
GitHub - facebook/zstd: Zstandard - Fast real-time compression algorithm
附件四:Kafka可视化管理工具
-) Kafka Map -- 国产、开源,通过配置kafka地址实现管理(作者使用)
kafka-map: 一个美观简洁且强大的kafka web管理工具。
-) kafka CMAK -- 通过配置zookeeper地址实现管理(作者使用)
GitHub - yahoo/CMAK: CMAK is a tool for managing Apache Kafka clusters
-) kafka-monitor -- 开源
https://github.com/linkedin/kafka-monitor/wiki
-) kafka-eagle -- 商业软件(收费)
等等
附件五:客户端配置示例
# 客户端参数两种key形式
# 客户端参数两种key形式
-Dskywalking.agent.service_name=smet-rpc-service
-javaagent:/app/saashealth/skywalking-agent/skywalking-agent-9.2.0/skywalking-agent.jar
-Dskywalking.plugin.kafka.bootstrap_servers=10.130.***.92:19092
-Dskywalking.collector.backend_service=10.130.***.92:11801
# 大写变量形式
-DSW_AGENT_NAME=smet-rpc-service \
-javaagent:/app/saashealth/skywalking-agent/skywalking-agent-9.2.0/skywalking-agent.jar \
-DSW_KAFKA_BOOTSTRAP_SERVERS=10.130.***.92:19092 \
-DSW_AGENT_COLLECTOR_BACKEND_SERVICES=10.130.***.92:11801 \
附件六:SkyWalking-OAP配置最佳实践
这里只对几个关键的参数进行说明,这些参数经常是成功实施的关键所在:
1、SW_STORAGE_ES_FLUSH_INTERVAL 默认5秒,这里设置10s
2、SW_STORAGE_ES_CONCURRENT_REQUESTS 默认4,这里设置为2
3、SW_STORAGE_ES_INDEX_SHARDS_NUMBER -- 这个有资料显示用ES节点数*2,但作者告诉你,你只要设置为2就行了,这个2将是图中这个2,另外几个索引是10(2*5)个分区
注意:
- 修改oap配置需要在重启oap后删除ES索引,oap会自动按新分区数重建
- 上图几个G只是30分钟的数据(因为作者30分钟前有删除所有索引数据)
4、SW_STORAGE_ES_INDEX_REPLICAS_NUMBER ES 副本数量设置为0即可
5、SW_KAFKA_FETCHER_CONSUMERS 默认2,不变
6、SW_KAFKA_FETCHER_PARTITIONS 单个消费者消费多少个分区:这里设5,那么2个消费都一共消费10个分区。实际kafka10个分区,这里所有pod(3个集群,每个集群4个oap的pod,共12个oap的pod)都消费所有分区。下图可以看到kafka topic的分区数量
7、SW_KAFKA_FETCHER_PARTITIONS_FACTOR -- 分区因子,可以是kafka topic的总分区数,也可以是小数,比如:0.2 (表示消费的topic的数量占总数量的比例) 。作者设置为10
总之,读者在实际项目中根据上面的信息结合实际理论上可以优化出一套可行的配置。保证7*24小时不挂