导航
在完成将公司日志数据从Elasticsearch(下称ES)转战到Clickhouse后,个人认为有必要将过程记录分享。限于篇幅及便于分类组织,我会以一个系列文章的形式记录:
- 01 《Elasticsearch vs Clickhouse》
- 02 《Clickhouse的基础知识扫盲》
- 03 《Clickhouse多分片多副本集群部署》
- 04 《Clickhouse表引擎选择和表结构设计》
- 05 《clickhouse高效数据处理工具vector》
- 06 《clickhouse的数据可视化工具clickvisual》
- 07 《kibana自定义插件跳转clickvisual》
- 08 《妙用clickvisual api实现用户自动管理》(敬请期待)
一、常见的日志处理工具logstash
跟大部分企业一样,在日志解决方案选型时,优先选择了业界成熟方案elk + kafka + beats;顾名思义,该方案是使用logstash进行数据处理的。
二、现状与挑战
Logstash 是一款服务器端数据处理管道,用于采集、转换和存储数据。目前我司运行了8个logstash节点,日均日志处理量大约 2TB。随着日志量的增加,logstash的一些问题逐渐暴露:
- 资源成本问题:logstash使用的8个节点,规格均为16c32g的服务器,在工作时间内资源使用率基本在90%以上。作为一个非利润部门的工具平台,占用的资源过多;
- 性能问题:因资源成本有限且当前资源使用率较高,任何操作引起的日志量增加(如修改日志级别、增加日志打印以排查业务问题等场景)都可能成为压垮骆驼的最后一根稻草,引起日志写入延时甚至影响ES集群稳定性,更别提应付流量高峰带来的日志量激增
站在运维人员的角度,资源成本和运维成本的增加,无疑压力是越来越大,亟需寻找优化方案
三、什么是vector
- Vector是一种高性能、端到端的可观察性数据管道,可以收集、转换所有日志、指标和跟踪信息,并将其写到您想要的存储当中
- Vector用Rust语言编写,可以实现显着的资源成本降低、丰富的数据处理和数据安全
- 安装便捷:跨平台,目前支持10种操作系统(如centos、debian、windows、mac os)、9种包管理器(如yum、helm、homebrew),并支持容器部署(docker/k8s)
四、为什么选择vector
用数据说话。以下性能测试基本涵盖常用的数据处理场景,可以看出Vector在各种场景中,性能均比logstash优胜:
五、vector配置文件及基本概念
vector配置文件格式为toml,一般的数据处理流程包含source(输入)、transforms(数据处理)和sinks(输出)三部分:
-
source
支持40+种主流输入源,包括常见的文件、kafka、syslog等。此处以kafka作为示例:
[sources.java-log-input] ## 输入源名称(唯一)
type = "kafka" ## 输入源类型
bootstrap_servers = "xxx.xxx.xxx.xxx:9092" ## kafka地址
group_id = "java.vector" ## consumer名称
topics = [ "^.*-java-log" ] ## topic名称,支持正则匹配
decoding.codec = "json" ## 数据格式
[sources.nginx-input] ## 输入源名称
type = "kafka" ## 输入源类型
bootstrap_servers = "xxx.xxx.xxx.xxx:9092" ## kafka地址
group_id = "nginx.vector" ## consumer名称
topics = [ "^.*-nginx-log" ] ## topic名称,支持正则匹配
decoding.codec = "json" ## 数据格式
-
transforms
常用remap模式,通过VRL(Vector Remap Language,一种面向表达式的语言)来实现数据处理,丰富的函数基本能涵盖logstash插件能实现的场景。由于我司日志格式五花八门,所以VRL的函数几乎用了个遍,如有疑问欢迎留言与我交流,此处仅列举一些常见的数据操作:
[transforms.java-log-trans] ## 转换名称(唯一)
type = "remap" ## 转换类型
inputs = [ "java-log-input" ] ## 从何处获取数据,支持通配符
source = """
## 小写转换
.topic = downcase!(.topic)
## 正则提取字段值
. |= parse_regex!(.topic, r'(?P<sys_code>\\S+)-(?P<env_type>\\w+)-.*-log’)
## 重命名字段
._time_nanosecond_ = del(.time)
## 删除字段
del(.@metadata)
"""
-
sinks
支持50+种主流输出源,包括常见的文件、控制台、elasticsearch、clickhouse等。此处以输出控制台、es、clickhouse作为示例:
[sinks.java-log-console] ## 输出源名称(唯一)
type = "console" ## 输出源类型
inputs = [ "java-log-trans" ] ## 从何处获取数据,支持通配符
target = "stdout" ## 输出流
encoding.codec = "json" ## 数据格式
[sinks.java-log-es] ## 输出源名称(唯一)
type = "elasticsearch" ## 输出源类型
inputs = [ "java-log-trans" ] ## 从何处获取数据,支持通配符
endpoint = "http://xxxx.xxx.xxx.xxx:9200" ## es地址
auth.strategy = "basic"
auth.user = "xxxx"
auth.password = "xxxx"
bulk.index = "{{ project_name }}-{{ env }}-%Y-%m-%d" ## es索引名称,支持变量
batch.max_events = 50000 ## 批处理参数
batch.timeout_secs = 5 ## 批处理参数
[sinks.java-log-ck]
type = "clickhouse"
inputs = [ "java-log-trans" ] ## 从何处获取数据,支持通配符
database = "elk"
endpoint = "http://xxx.xxx.xxx.xxx:xxxx" ## clickhouse负载均衡地址
auth.strategy = "basic"
auth.user = "xxxx"
auth.password = "xxxx"
table = "java_log_local" ## 写入clickhouse本地表
compression = "gzip"
healthcheck.enabled = false ## 关闭健康检查
batch.timeout_secs = 5 ## 批处理参数
batch.max_events = 50000 ## 批处理参数
六、vector部署
考虑到资源利用率,以及应付潜在流量高峰带来的日志量激增,最终选择部署在k8s并启用hpa,以实现vector服务节点自动横向扩缩容。以下方法是在无法使用helm在线部署的情况下,如何完成vector在k8s上的部署:
1、从dockerhub拉取vector镜像
docker pull timberio/vector:0.26.0-debian
2、 修改原生vector镜像的启动命令
从下图可见,原生镜像的ENTRYPOINT命令是/usr/bin/vector,没有指定配置文件,默认是读取/etc/vector/vector.yaml的配置。这样一来,需要修改原生镜像的启动命令,否则不支持多配置文件。(修改过程略,Dockerfile继承原生镜像再复写ENTRYPOINT即可)
· 原生镜像:
· 修改后:
3、将配置文件以configmap的形式添加k8s:
4、创建deployment,并将含有配置文件的configmap挂载到/data/vector。参考yaml如下:
kind: Deployment
apiVersion: apps/v1
metadata:
name: vector-prod
namespace: vector
labels:
app: vector-prod
spec:
replicas: 1
selector:
matchLabels:
app: vector-prod
template:
metadata:
creationTimestamp: null
labels:
app: vector-prod
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
- name: volume-94n56c
configMap:
name: vector-prod-conf
defaultMode: 420
containers:
- name: vector-prod
image: timberio/vector:0.26.0-debian
resources:
limits:
cpu: '4'
memory: 4Gi
requests:
cpu: '4'
memory: 4Gi
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
- name: volume-94n56c
readOnly: true
mountPath: /data/vector
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: IfNotPresent
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
affinity: {}
schedulerName: default-scheduler
strategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 25%
maxSurge: 25%
revisionHistoryLimit: 10
progressDeadlineSeconds: 600
5、创建HPA,实现自动横向扩容(实现方法有很多,过程略)
七、参考资料
- vector
https://vector.dev/docs/文章来源:https://www.toymoban.com/news/detail-771344.html
下回预告
clickhouse的数据可视化工具clickvisual,欢迎关注后续更新的系列文章~文章来源地址https://www.toymoban.com/news/detail-771344.html
到了这里,关于「从ES到CK 05」clickhouse高效数据处理工具vector的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!