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

这篇具有很好参考价值的文章主要介绍了「从ES到CK 05」clickhouse高效数据处理工具vector。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 导航

        在完成将公司日志数据从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)

「从ES到CK 05」clickhouse高效数据处理工具vector,elasticsearch,clickhouse,大数据,elk

四、为什么选择vector

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

「从ES到CK 05」clickhouse高效数据处理工具vector,elasticsearch,clickhouse,大数据,elk

五、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即可)

        · 原生镜像:

「从ES到CK 05」clickhouse高效数据处理工具vector,elasticsearch,clickhouse,大数据,elk

        · 修改后:

「从ES到CK 05」clickhouse高效数据处理工具vector,elasticsearch,clickhouse,大数据,elk

3、将配置文件以configmap的形式添加k8s:

「从ES到CK 05」clickhouse高效数据处理工具vector,elasticsearch,clickhouse,大数据,elk

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/​​

下回预告

        clickhouse的数据可视化工具clickvisual,欢迎关注后续更新的系列文章~文章来源地址https://www.toymoban.com/news/detail-771344.html

到了这里,关于「从ES到CK 05」clickhouse高效数据处理工具vector的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python文件操作和异常处理:高效处理数据的利器

    重温Python,适合新手搭建知识体系,也适合大佬的温故知新~ 1.1 文件操作和异常处理对于编程的重要性 文件操作和异常处理对于编程非常重要。它们使得我们能够处理文件数据、持久化数据、导入和导出数据,并且能够优雅地处理和解决错误,提高程序的可靠性和稳定性。

    2024年01月23日
    浏览(39)
  • 【数据库学习】ClickHouse(ck)

    是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 按列存储,列越多速度越慢; 按列存储,数据更容易压缩(类型相同、区分度);==》每次读取的数据就更多,更少的io。 聚合性能高; 类sql操作;仅支持数据的查询、批量写入、批量删除。 用于磁盘查询,同时也利用

    2024年02月02日
    浏览(47)
  • 机器学习05-数据准备(利用 scikit-learn基于Pima Indian数据集作数据预处理)

    机器学习的数据准备是指在将数据用于机器学习算法之前,对原始数据进行预处理、清洗和转换的过程。数据准备是机器学习中非常重要的一步,它直接影响了模型的性能和预测结果的准确性 以下是机器学习数据准备的一些常见步骤: 数据收集:首先需要收集原始数据,可

    2024年02月14日
    浏览(28)
  • 高效Python-1提高数据处理效率的迫切需要

    本章包括 处理指数级增长的数据所面临的挑战 传统计算架构与最新计算架构的比较 Python在现代数据分析中的作用和不足 提供高效Python计算解决方案的技术 我们一直在以极快的速度从各种来源收集海量数据。无论目前是否有使用价值,这些数据都会被收集起来。无论是否有

    2024年02月15日
    浏览(36)
  • 流式计算中的多线程处理:如何使用Kafka实现高效的实时数据处理

    作者:禅与计算机程序设计艺术 Apache Kafka 是 Apache Software Foundation 下的一个开源项目,是一个分布式的、高吞吐量的、可扩展的消息系统。它最初由 LinkedIn 开发并于 2011 年发布。与其他一些类似产品相比,Kafka 有着更强大的功能和活跃的社区支持。因此,越来越多的人开始使

    2024年02月12日
    浏览(46)
  • pandas DataFrame内存优化技巧:让数据处理更高效

    Pandas 无疑是我们数据分析时一个不可或缺的工具,它以其强大的数据处理能力、灵活的数据结构以及易于上手的API赢得了广大数据分析师和机器学习工程师的喜爱。 然而,随着数据量的不断增长,如何高效、合理地管理内存,确保 Pandas DataFrame 在运行时不会因内存不足而崩

    2024年03月14日
    浏览(40)
  • Python编程:高效数据处理与自动化任务实践

    一、引言 Python,作为一种解释型、交互式、面向对象的编程语言,凭借其简洁易懂的语法和强大的功能库,已经成为数据科学、机器学习、Web开发等多个领域的首选工具。本文将探讨Python在数据处理和自动化任务方面的应用,通过具体的代码案例展示Python的强大功能。 二、

    2024年04月26日
    浏览(23)
  • 探索C++非质变算法:如何更高效地处理数据

    前言 📖 欢迎大家来到小K的c++专栏,本节将为大家带来C++非质变算法的详解 🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​ 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾 头文件定义了一个专门设计用于元素范围的函数集合。 范围是可以通过迭代

    2024年02月06日
    浏览(28)
  • “探索C++非质变算法:如何更高效地处理数据“

    前言 📖 欢迎大家来到小K的c++专栏,本节将为大家带来C++非质变算法的详解 🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​ 💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾 头文件定义了一个专门设计用于元素范围的函数集合。 范围是可以通过迭代

    2024年02月03日
    浏览(27)
  • React 状态管理:高效处理数组数据的5种方法

    为什么在 React 中,状态(state)如果是数组类型,需要单独处理?主要有以下几个原因: 不可变性(Immutability) : React 中的状态是不可变的,意味着我们不能直接修改状态,而是要创建一个新的状态对象。对于数组来说,直接修改数组元素是不符合 React 的设计原则的。 性能优化 : React 使用

    2024年04月10日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包