0
点赞
收藏
分享

微信扫一扫

「从ES到CK 05」高效数据处理工具vector

导航

在完成将公司日志数据从Elasticsearch(下称ES)转战到Clickhouse后,个人认为有必要将过程记录分享。限于篇幅及便于分类组织,我会以一个系列文章的形式记录:

  • 01 《Elasticsearch vs Clickhouse》
  • 02 《Clickhouse的基础知识扫盲》
  • 03 《Clickhouse多分片多副本集群部署》
  • 04 《Clickhouse表引擎选择和表结构设计》
  • 05 《高效数据处理工具vector》
  • 06 《clickhouse的数据可视化》(敬请期待)


一、常见的日志处理工具logstash

跟大部分企业一样,在日志解决方案选型时,优先选择了业界成熟方案elk + kafka + beats;顾名思义,该方案是使用logstash进行数据处理的。


二、现状与挑战

Logstash 是一款服务器端数据处理管道,用于采集、转换和存储数据。目前我司运行了8个logstash节点,日均日志处理量大约 2TB。随着日志量的增加,logstash的一些问题逐渐暴露:


  • 资源成本问题:logstash使用的8个节点,规格均为16c32g的服务器,在工作时间内资源使用率基本在90%以上。作为一个非利润部门的工具平台,占用的资源过多;


  • 性能问题:因资源成本有限且当前资源使用率较高,任何操作引起的日志量增加(如修改日志级别、增加日志打印以排查业务问题等场景)都可能成为压垮骆驼的最后一根稻草,引起日志写入延时甚至影响ES集群稳定性,更别提应付流量高峰带来的日志量激增


站在运维人员的角度,资源成本和运维成本的增加,无疑压力是越来越大,亟需寻找优化方案


三、什么是vector

「从ES到CK 05」高效数据处理工具vector_logstash


  • Vector是一种高性能、端到端的可观察性数据管道,可以收集、转换所有日志、指标和跟踪信息,并将其写到您想要的存储当中
  • Vector用Rust语言编写,可以实现显着的资源成本降低、丰富的数据处理和数据安全
  • 安装便捷:跨平台,目前支持10种操作系统(如centos、debian、windows、mac os)、9种包管理器(如yum、helm、homebrew),并支持容器部署(docker/k8s)


四、为什么选择vector

用数据说话。以下性能测试基本涵盖常用的数据处理场景,可以看出Vector在各种场景中,性能均比logstash优胜:

「从ES到CK 05」高效数据处理工具vector_数据处理_02


五、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


  1. 修改原生vector镜像的启动命令

从下图可见,原生镜像的ENTRYPOINT命令是/usr/bin/vector,没有指定配置文件,默认是读取/etc/vector/vector.yaml的配置。这样一来,需要修改原生镜像的启动命令,否则不支持多配置文件。(修改过程略,Dockerfile继承原生镜像再复写ENTRYPOINT即可)

· 原生镜像:

「从ES到CK 05」高效数据处理工具vector_vector_03

· 修改后:

「从ES到CK 05」高效数据处理工具vector_clickhouse_04


  1. 将配置文件以configmap的形式添加k8s:

「从ES到CK 05」高效数据处理工具vector_clickhouse_05


  1. 创建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


  1. 创建HPA,实现自动横向扩缩容

实现方法有很多,过程略,请自行度娘。以下是通过kubesphere实现的效果

「从ES到CK 05」高效数据处理工具vector_数据处理_06


下回预告

clickhouse的数据可视化,欢迎关注后续更新的系列文章~


举报

相关推荐

0 条评论