【实战ES】实战 Elasticsearch:快速上手与深度实践-7.1.2Flink CDC同步MySQL数据

👉 点击关注不迷路

👉 点击关注不迷路

👉 点击关注不迷路


文章大纲

  • [7.1.2 Flink CDC同步MySQL数据深度实践指南](#7.1.2 Flink CDC同步MySQL数据深度实践指南)
    • [1. 核心同步原理](#1. 核心同步原理)
      • [1.1 CDC技术对比](#1.1 CDC技术对比)
      • [1.2 数据流转流程](#1.2 数据流转流程)
    • [2. 全链路配置实战](#2. 全链路配置实战)
      • [2.1 环境准备清单](#2.1 环境准备清单)
      • [2.2 基础同步模板](#2.2 基础同步模板)
    • [3. 高级调优策略](#3. 高级调优策略)
      • [3.1 参数调优矩阵](#3.1 参数调优矩阵)
      • [3.2 同步模式对比](#3.2 同步模式对比)
    • [4. 企业级应用案例](#4. 企业级应用案例)
      • [4.1 电商订单实时同步](#4.1 电商订单实时同步)
      • [4.2 用户画像实时更新](#4.2 用户画像实时更新)
    • [5. 容错与监控](#5. 容错与监控)
      • [5.1 容错机制配置](#5.1 容错机制配置)
      • [5.2 监控指标体系](#5.2 监控指标体系)
    • [6. 安全加固方案](#6. 安全加固方案)
      • [6.1 安全连接配置](#6.1 安全连接配置)
      • [6.2 权限控制模板](#6.2 权限控制模板)
  • 基于Flink CDCMySQLElasticsearch实时同步架构
    • Flink CDC(Change Data Capture)即 Flink 变更数据捕获,是 Flink 用于实时捕获和处理数据库变更数据的技术。
    • Flink CDC 基于数据库的日志(如 MySQL 的 binlog、PostgreSQL 的 WAL 等)来获取数据的变更记录,能够实时地捕捉到数据库表中的插入、更新和删除操作,并将这些变更数据以流的形式输出,以便进行后续的处理和分析。

Elasticsearch Flink MySQL binlog 日志变化 Elasticsearch 客户端 Elasticsearch 集群 Flink 作业处理逻辑 数据转换与处理 Flink CDC 连接器 MySQL 数据库

1. 核心同步原理

1.1 CDC技术对比

方案 同步延迟 资源消耗 数据一致性 运维复杂度
Flink CDC 毫秒级 Exactly-Once
Debezium+Kafka 秒级 At-Least-Once
定时批量抽取 分钟级 最终一致
触发器日志 秒级 强一致
  • Debezium+Kafka 是一种常用于实现数据实时捕获和传输的技术组合
    • Debezium 是一个开源的分布式数据变更捕获(CDC)平台,能将现有数据库的更改转换为事件流,让应用程序能实时感知数据库的行级更改。
    • 应用场景: 数据实时同步、实时数据集成、事件驱动架构、实时分析。

1.2 数据流转流程

结构映射 状态计算 MySQL Binlog Flink CDC Source 数据转换 数据清洗 增量聚合 Elasticsearch Sink Elasticsearch Cluster

2. 全链路配置实战

2.1 环境准备清单

xml 复制代码
<!-- Maven依赖 -->
<!-- 以下标签用于定义项目的依赖项,Maven 会根据这些依赖信息下载相应的库文件 -->
<dependencies>
  <!-- 引入 Flink 连接 MySQL 进行变更数据捕获(CDC)的依赖 -->
  <dependency>
    <!-- 依赖的组织 ID,通常代表开发该库的组织或公司 -->
    <groupId>com.ververica</groupId>
    <!-- 依赖的项目 ID,用于唯一标识该依赖项 -->
    <artifactId>flink-connector-mysql-cdc</artifactId>
    <!-- 依赖的版本号,指定使用的具体版本 -->
    <version>2.4.1</version>
  </dependency>
  <!-- 引入 Flink 连接 Elasticsearch 7.x 版本的依赖 -->
  <dependency>
    <!-- 依赖的组织 ID,这里是 Apache Flink 项目的组织 ID -->
    <groupId>org.apache.flink</groupId>
    <!-- 依赖的项目 ID,明确该依赖是用于连接 Elasticsearch 7.x 的连接器 -->
    <artifactId>flink-connector-elasticsearch7</artifactId>
    <!-- 依赖的版本号,与 Flink 1.16.1 版本兼容 -->
    <version>1.16.1</version>
  </dependency>
</dependencies>

<!-- 版本兼容矩阵 -->
Flink版本 Flink CDC版本 MySQL版本 ES版本
1.13.x 1.4.x 5.7+ 7.x
1.15.x 2.3.x 8.0+ 7.x
1.16.x 2.4.x 8.0+ 7.x/8.x

2.2 基础同步模板

java 复制代码
// 定义一个名为 MySQLToESJob 的公共类,用于实现从 MySQL 到 Elasticsearch 的数据同步任务
public class MySQLToESJob {
    // 程序的入口点,Java 程序从 main 方法开始执行
    public static void main(String[] args) throws Exception {
        // 创建一个 StreamExecutionEnvironment 对象,它是 Flink 流处理程序的基础环境,用于配置和执行 Flink 作业
        StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

        // 配置 MySQL CDC Source,用于从 MySQL 数据库捕获变更数据
        // 使用 MySQLSource 的构建器模式创建一个 SourceFunction,该函数将从 MySQL 数据库中读取数据变更
        SourceFunction<MySQLEvent> source = MySQLSource.<MySQLEvent>builder()
                // 指定 MySQL 数据库所在的主机名,这里设置为本地主机
                .hostname("localhost")
                // 指定 MySQL 数据库监听的端口号,默认是 3306
                .port(3306)
                // 指定要监控的数据库名称,这里是 "mydb"
                .databaseList("mydb")
                // 指定要监控的表名,这里是 "mydb.orders",即 "mydb" 数据库中的 "orders" 表
                .tableList("mydb.orders")
                // 指定连接 MySQL 数据库的用户名
                .username("user")
                // 指定连接 MySQL 数据库的密码
                .password("pass")
                // 指定反序列化器,用于将从 MySQL 捕获的变更数据反序列化为 MySQLEvent 对象
                // 这里使用 JsonDebeziumDeserializationSchema 进行 JSON 格式的反序列化
                .deserializer(new JsonDebeziumDeserializationSchema())
                // 构建最终的 SourceFunction 对象
                .build();

        // 配置 Elasticsearch Sink,用于将从 MySQL 捕获的数据写入到 Elasticsearch 中
        // 创建一个包含 Elasticsearch 主机信息的列表,这里只配置了一个本地的 Elasticsearch 节点
        List<HttpHost> esHosts = Arrays.asList(new HttpHost("localhost", 9200, "http"));
        // 使用 ElasticsearchSink 的构建器模式创建一个 ElasticsearchSink.Builder 对象
        ElasticsearchSink.Builder<MySQLEvent> esSinkBuilder = new ElasticsearchSink.Builder<>(
                // 传入 Elasticsearch 主机列表
                esHosts,
                // 定义一个函数式接口,用于将 MySQLEvent 对象转换为 Elasticsearch 的索引请求
                (element, ctx, indexer) -> {
                    // 创建一个索引请求,指定索引名称为 "orders"
                    indexer.add(
                            Requests.indexRequest()
                                    .index("orders")
                                    // 设置文档的 ID,这里使用 MySQLEvent 对象的 id 属性
                                    .id(element.id)
                                    // 设置文档的源数据,将 MySQLEvent 对象转换为 JSON 格式
                                    .source(element.toJson())
                    );
                }
        );

        // 构建数据处理管道,将从 MySQL 捕获的数据传输到 Elasticsearch 中
        env.addSource(source)
                // 为数据源添加一个唯一标识符,方便后续监控和调试
                .uid("mysql-cdc-source")
                // 将数据源的数据添加到 Elasticsearch Sink 中
                .addSink(esSinkBuilder.build())
                // 为 Sink 添加一个唯一标识符,方便后续监控和调试
                .uid("es-sink");

        // 执行 Flink 作业,作业名称为 "MySQL to ES Sync"
        env.execute("MySQL to ES Sync");
    }
}

3. 高级调优策略

3.1 参数调优矩阵

参数 默认值 推荐值 调优效果
scan.incremental.snapshot.chunk.size 8096 4096 减少内存占用20%
server-id 随机 5400-5500 避免集群内冲突
checkpoint.interval 禁用 60000 保证Exactly-Once语义
sink.bulk-flush.max-actions 1000 5000 提升35%写入吞吐量
parallelism 1 4 资源利用率提升300%
  • scan.incremental.snapshot.chunk.size = 10000

    • 用于配置在进行增量快照扫描时,每个数据块的大小
    • 增量快照扫描是 Flink CDC 在捕获 MySQL 数据变更时的一种机制,它会将表数据分割成多个数据块进行扫描
    • 该参数的值会影响扫描的性能和资源占用情况
    • 较小的值会使扫描更加细粒度,可能会增加扫描的开销,但能更及时地捕获数据变更
    • 较大的值会减少扫描的次数,但可能会导致在数据量较大时,扫描过程中数据变更的处理不够及时
    • 单位通常为行数,例如设置为 10000 表示每个数据块包含 10000 行数据
  • server-id = 5400

    bash 复制代码
    # server-id 是 MySQL 复制过程中用于唯一标识复制节点的一个参数
    # 在 Flink CDC 从 MySQL 捕获数据时,Flink 作为一个复制客户端需要有一个唯一的 server-id
    # 这个 ID 用于在 MySQL 的复制拓扑中区分不同的客户端,避免冲突
    # 该值必须是一个正整数,并且在整个 MySQL 复制环境中是唯一的
    # 例如,设置为 5400 表示 Flink CDC 客户端在 MySQL 复制中的标识为 5400
  • checkpoint.interval = 5000

    bash 复制代码
    # checkpoint.interval 用于设置 Flink 作业的检查点(Checkpoint)间隔时间
    # 检查点是 Flink 实现容错机制的重要手段,它会定期保存作业的状态信息
    # 当作业出现故障时,可以从最近的检查点恢复,保证数据的一致性和处理的准确性
    # 该参数的值表示检查点之间的时间间隔,单位通常为毫秒
    # 例如,设置为 5000 表示每 5 秒进行一次检查点操作
  • sink.bulk-flush.max-actions = 1000

    bash 复制代码
    # sink.bulk-flush.max-actions 是 Elasticsearch Sink 的一个配置参数
    # 它用于控制批量写入 Elasticsearch 时,每次批量操作中包含的最大操作数量
    # 在将数据从 Flink 写入 Elasticsearch 时,为了提高写入性能,会采用批量写入的方式
    # 该参数的值决定了每次批量写入包含多少条数据操作(如插入、更新等)
    # 例如,设置为 1000 表示每次批量写入最多包含 1000 条数据操作
    # 合理设置该参数可以在性能和资源占用之间取得平衡
  • parallelism = 4

    bash 复制代码
    # parallelism 用于设置 Flink 作业的并行度
    # 并行度表示 Flink 作业中每个操作可以并行执行的任务数量
    # 增加并行度可以提高作业的处理能力和吞吐量,但也会增加系统资源的消耗
    # 该参数可以在不同的级别进行设置,如全局并行度、算子并行度等
    # 例如,设置为 4 表示 Flink 作业中的每个操作将以 4 个并行任务的方式执行

3.2 同步模式对比

同步模式 配置参数 适用场景 性能基准(万条/秒)
全量+增量 scan.startup.mode=initial 初始化数据迁移 2.8
仅增量 scan.startup.mode=latest-offset 生产环境持续同步 4.5
时间点恢复 scan.startup.timestamp-millis 容灾恢复场景 3.2
表结构变更同步 debezium.schema.history.internal DDL同步需求 2.1

4. 企业级应用案例

4.1 电商订单实时同步

java 复制代码
// 订单状态实时更新处理

// 从 MySQL 数据源添加数据到 Flink 流处理环境中,获取订单事件流
// mysqlSource 是一个从 MySQL 数据库捕获订单数据变更的数据源
DataStream<OrderEvent> orderStream = env.addSource(mysqlSource)
    // 按照订单 ID 对订单事件进行分组
    // 这样相同订单 ID 的事件会被分到同一个分组中,便于后续对每个订单的状态进行统一处理
    .keyBy(OrderEvent::getOrderId)
    // 对每个分组内的订单事件应用自定义的处理逻辑
    // OrderStateUpdater 是一个自定义的处理类,用于更新订单的状态
    .process(new OrderStateUpdater());

// 将处理后的订单事件流写入到 Elasticsearch 中
// esSink 是一个配置好的 Elasticsearch 数据接收器,用于将数据写入到 Elasticsearch 集群
orderStream.addSink(esSink);


// ES 索引模板配置
// 创建一个名为 order_template 的索引模板
// 索引模板用于定义符合特定模式的索引的默认设置和映射
PUT _index_template/order_template
{
    // 定义索引模板匹配的索引名称模式
    // 这里表示该模板将应用于所有以 "orders" 开头的索引
    "index_patterns": ["orders*"],
    // 定义当创建匹配此模板的索引时所使用的设置和映射
    "template": {
        // 索引的设置部分,包含一些与索引性能、存储等相关的参数
        "settings": {
            // 指定索引的主分片数量为 3
            // 主分片用于存储索引数据,多个主分片可以实现数据的分布式存储和并行处理
            "number_of_shards": 3,
            // 指定索引使用的压缩编解码器为 "best_compression"
            // 该编解码器会以较高的压缩率对索引数据进行压缩,以节省磁盘空间,但可能会增加一定的 CPU 开销
            "codec": "best_compression"
        },
        // 索引的映射部分,定义了索引中字段的类型和结构
        "mappings": {
            // 设置动态映射规则为 false
            // 这意味着只有在映射中显式定义的字段才能被索引,新字段不会自动添加到映射中
            "dynamic": false,
            // 定义索引中各个字段的具体属性
            "properties": {
                // 定义 "order_id" 字段的类型为关键字类型
                // 关键字类型适用于精确匹配和排序,常用于存储唯一标识符等
                "order_id": { "type": "keyword" },
                // 定义 "status" 字段的类型为关键字类型
                // 用于存储订单的状态信息,如 "待支付"、"已支付" 等,方便进行精确查询
                "status": { "type": "keyword" },
                // 定义 "update_time" 字段的类型为日期类型
                // 该字段通常用于存储订单状态更新的时间戳,方便进行时间范围的查询和分析
                "update_time": { "type": "date" }
            }
        }
    }
}
  • 性能指标
数据规模 同步延迟 吞吐量 CPU消耗 内存消耗
1万条/秒 200ms 1.2万条/秒 35% 4GB
5万条/秒 450ms 5.8万条/秒 68% 16GB
10万条/秒 900ms 9.5万条/秒 85% 32GB

4.2 用户画像实时更新

sql 复制代码
-- 用户画像实时更新 -- Flink SQL模式

-- 创建一个名为 users 的表,用于从 MySQL 数据库捕获用户数据的变更
CREATE TABLE users (
    -- 用户的唯一标识符,整数类型
    id INT,
    -- 用户的姓名,字符串类型
    name STRING,
    -- 用户的标签数组,每个标签是一个字符串
    tags ARRAY<STRING>,
    -- 用户信息的更新时间,精确到毫秒的时间戳类型
    update_time TIMESTAMP(3)
) WITH (
    -- 指定使用 MySQL CDC 连接器来捕获 MySQL 数据库中的数据变更
    'connector' = 'mysql-cdc',
    -- MySQL 数据库所在的主机名
    'hostname' = 'localhost',
    -- MySQL 数据库监听的端口号
    'port' = '3306',
    -- 连接 MySQL 数据库的用户名
    'username' = 'user',
    -- 连接 MySQL 数据库的密码
    'password' = 'pass',
    -- 要监控的 MySQL 数据库名称
    'database-name' = 'mydb',
    -- 要监控的 MySQL 数据库中的表名
    'table-name' = 'users'
);

-- 创建一个名为 es_users 的表,用于将数据写入 Elasticsearch
CREATE TABLE es_users (
    -- 用户的唯一标识符,整数类型,与 users 表中的 id 对应
    id INT,
    -- 用户的姓名,字符串类型,与 users 表中的 name 对应
    name STRING,
    -- 用户的标签数组,每个标签是一个字符串,与 users 表中的 tags 对应
    tags ARRAY<STRING>,
    -- 用户信息的更新时间,精确到毫秒的时间戳类型,与 users 表中的 update_time 对应
    update_time TIMESTAMP(3)
) WITH (
    -- 指定使用 Elasticsearch 7 连接器来将数据写入 Elasticsearch
    'connector' = 'elasticsearch-7',
    -- Elasticsearch 集群的主机地址和端口
    'hosts' = 'http://localhost:9200',
    -- 数据要写入的 Elasticsearch 索引名称
    'index' = 'users'
);

-- 将从 MySQL 数据库捕获的用户数据实时插入到 Elasticsearch 的 users 索引中
-- 使用 SELECT * 表示选择 users 表中的所有列,并将这些数据插入到 es_users 表对应的列中
-- 由于 es_users 表与 Elasticsearch 连接,数据最终会写入到 Elasticsearch 的 users 索引中
INSERT INTO es_users SELECT * FROM users;

5. 容错与监控

5.1 容错机制配置

java 复制代码
// 启用检查点
// 调用 enableCheckpointing 方法来开启 Flink 的检查点(Checkpoint)机制
// 传入的参数 60000 表示检查点的间隔时间为 60000 毫秒,即 1 分钟
// 检查点机制是 Flink 实现容错的重要手段,它会定期保存作业的状态信息,以便在出现故障时可以从最近的检查点恢复作业
env.enableCheckpointing(60000);

// 设置检查点的存储位置
// 通过 getCheckpointConfig 方法获取当前环境的检查点配置对象
// 调用 setCheckpointStorage 方法将检查点存储位置设置为 HDFS 上的 /checkpoints 目录
// 这样,Flink 会将检查点数据保存到 HDFS 中,确保数据的可靠性和持久性
env.getCheckpointConfig().setCheckpointStorage("hdfs:///checkpoints");

// 设置可容忍的检查点失败次数
// 继续使用 getCheckpointConfig 方法获取检查点配置对象
// 调用 setTolerableCheckpointFailureNumber 方法设置可容忍的检查点失败次数为 3
// 意味着在作业执行过程中,如果检查点连续失败 3 次以上,作业才会终止,否则会继续尝试进行检查点操作
env.getCheckpointConfig().setTolerableCheckpointFailureNumber(3);

// 死信队列处理
// 创建一个 OutputTag 对象,用于标记死信事件
// 这里的 "dead-events" 是该 OutputTag 的名称,用于在后续代码中识别死信事件流
OutputTag<MySQLEvent> deadTag = new OutputTag<>("dead-events");

// 对输入的流数据进行处理
// 调用 process 方法对 stream 流中的每个元素应用自定义的处理逻辑
// 使用 ProcessFunction 匿名内部类来定义处理逻辑
SingleOutputStreamOperator<MySQLEvent> processed = stream
    .process(new ProcessFunction<MySQLEvent, MySQLEvent>() {
        // 重写 processElement 方法,该方法会对每个输入的事件进行处理
        public void processElement(MySQLEvent event, Context ctx, Collector<MySQLEvent> out) {
            try {
                // 调用 validate 方法对事件进行验证
                // validate 方法可能会检查事件的格式、内容等是否符合要求
                validate(event);
                // 如果验证通过,将事件收集到主流中,继续后续处理
                out.collect(event);
            } catch (Exception e) {
                // 如果验证过程中抛出异常,说明该事件是无效的,将其发送到侧输出流中
                // 使用 ctx.output 方法将事件发送到之前定义的 deadTag 标记的侧输出流中
                ctx.output(deadTag, event);
            }
        }
    });

// 将死信事件发送到死信队列
// 调用 getSideOutput 方法从处理后的流中获取标记为 deadTag 的侧输出流
// 该侧输出流包含了所有验证失败的死信事件
// 调用 addSink 方法将这些死信事件发送到死信队列中,由 deadLetterSink 进行处理
// 死信队列可以用于后续的问题排查和数据修复
processed.getSideOutput(deadTag).addSink(deadLetterSink);

5.2 监控指标体系

指标类别 监控项 告警阈值 采集方式
数据一致性 Checkpoint成功率 <95% Flink Dashboard
资源使用 TaskManager CPU >85%持续5分钟 Prometheus
同步延迟 Source到Sink延迟 >5秒 Latency Marker
错误率 死信队列堆积量 >1000条/分钟 Metric Reporter

6. 安全加固方案

6.1 安全连接配置

yaml 复制代码
# MySQL SSL配置部分,用于设置与MySQL建立连接时的SSL相关安全选项
security:
  ssl:
    # 配置SSL连接的模式为VERIFY_CA
    # VERIFY_CA模式表示会验证MySQL服务器的证书,确保连接到的服务器是由受信任的证书颁发机构(CA)签名的
    mode: VERIFY_CA
    # 指定信任存储库的路径,这里是/path/to/truststore.jks
    # 信任存储库中包含了可信任的证书颁发机构的证书,用于验证服务器证书的合法性
    trust-store: /path/to/truststore.jks
    # 设置信任存储库的密码为changeit
    # 此密码用于访问信任存储库,确保只有授权的程序可以读取其中的证书信息
    trust-store-password: changeit

# Elasticsearch安全配置部分,用于配置与Elasticsearch交互时的SSL安全设置
es.security.ssl:
  # 启用SSL连接,设置为true表示开启Elasticsearch的SSL加密通信
  enabled: true
  # 指定密钥库的路径为/path/to/keystore.p12
  # 密钥库包含了用于SSL通信的私钥和证书,用于对客户端进行身份验证
  keystore: /path/to/keystore.p12
  # 设置密钥库的密码为password
  # 该密码用于保护密钥库中的私钥和证书,防止未授权访问
  keystore-password: password
  # 指定信任存储库的路径为/path/to/truststore.p12
  # 信任存储库包含了可信任的证书颁发机构的证书,用于验证Elasticsearch服务器证书的合法性
  truststore: /path/to/truststore.p12
  # 设置信任存储库的密码为password
  # 此密码用于访问信任存储库,以确保只有授权的程序可以读取其中的证书信息
  truststore-password: password

6.2 权限控制模板

sql 复制代码
-- MySQL用户权限设置部分

-- 创建一个名为 'flink_user' 的MySQL用户,并且允许该用户从任何主机(%)连接到MySQL服务器
-- 使用 IDENTIFIED BY 子句设置该用户的密码为'securePass!'
CREATE USER 'flink_user'@'%' IDENTIFIED BY'securePass!';

-- 为 'flink_user' 用户授予一系列权限
-- GRANT 关键字用于授予权限
-- SELECT 权限允许用户从表中查询数据
-- RELOAD 权限允许用户执行一些管理操作,如重新加载配置等
-- SHOW DATABASES 权限允许用户查看服务器上的所有数据库
-- REPLICATION SLAVE 权限是为了让该用户能够参与MySQL的复制过程,在Flink CDC中用于捕获binlog等数据变更
-- REPLICATION CLIENT 权限允许用户查看复制服务器的状态等信息
-- ON *.* 表示这些权限应用于所有数据库和所有表
GRANT SELECT, RELOAD, SHOW DATABASES, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'flink_user';


-- Elasticsearch角色设置部分

-- 使用 PUT 请求创建一个名为 'flink_writer' 的Elasticsearch角色
-- _security/role/flink_writer 是创建角色的API端点,其中 flink_writer 是角色名称
PUT _security/role/flink_writer
{
  "indices": [
    {
      -- 定义该角色可以操作的索引名称,这里包括 'users' 和 'orders' 索引
      "names": ["users","orders"],
      -- 定义该角色在这些索引上拥有的权限
      -- create_index 权限允许创建索引
      -- index 权限允许在索引中添加或更新文档
      -- delete 权限允许删除索引中的文档
      "privileges": ["create_index","index","delete"]
    }
  ]
}

附录:运维工具箱

工具类别 推荐方案 核心功能
数据校验 Great Expectations 同步数据质量验证
压力测试 JMeter 同步管道压力测试
日志分析 ELK Stack 同步异常分析
资源监控 Grafana+Prometheus 实时资源监控
  • Great Expectations
    • 是一个开源的 Python 库,用于帮助数据团队开发、更改和验证数据管道,通过建立和维护 "期望" 来监控和验证数据集的质量。
  • JMeter
    • 基于 Java 的压力测试工具,最初用于 Web 应用测试,后扩展到其他测试领域。
    • 可对 HTTP 和 FTP 服务器、数据库等进行压力和性能测试,具有完全可移植性和多线程框架,支持缓存和离线分析 / 回放测试结果,能充当 HTTP 代理记录请求,也可记录 Web 服务器日志文件重现 HTTP 流量。
  • ELK Stack
    • 以 Elasticsearch、Logstash、Kibana 三个开源软件为主的数据处理工具链,是开源界流行的实时数据分析解决方案。
      • Logstash 用于收集、转换和传输日志数据;
      • Elasticsearch基于 JSON 的分布式搜索和分析引擎,可快速存储、搜索和分析大量数据;
      • Kibana 是可扩展的用户界面,用于对数据进行可视化分析。
  • Grafana+Prometheus
    • Grafana
      • 开源的数据可视化和监控工具,支持多种数据源,提供丰富插件生态,可定制。
      • 用于监控系统性能,实时查看 CPU、内存等资源使用情况;分析业务指标,将业务指标与图表关联;安全审计,查看系统日志信息发现异常;搭建数据分析平台。
    • Prometheus
      • 云监控领域的开源工具,为云原生监控而生,可帮助用户揭开云及云上应用运行情况的神秘面纱。
      • 用于系统性能监控、网络流量监测、应用程序监控、故障预警和资源管理等场景。

最佳实践

  1. 生产环境必须启用检查点和重试机制
  2. 建议使用Flink 1.16+版本获得最新优化
  3. 定期执行历史数据一致性校验
  4. 建立Schema变更管理流程
相关推荐
大大大大晴天13 分钟前
每天认识一个组件:数据治理Apache Atlas
大数据
数字新视界30 分钟前
2026模块化机房选型指南:行业市场发展趋势、占有率与竞争梯队分析报告解析
大数据·人工智能·物联网·数据中心·微模块机房·模块化机房·冷通道
姜穆澜3 小时前
OneID 从 0 到 1 完整生产案例(四)
大数据
OsDepK3 小时前
项目快速Git至仓库(完整版)
大数据·git·elasticsearch·搜索引擎
合米AI SOP系统4 小时前
传统产线如何快速上马落地 AI 防错?合米科技 AI SOP 7天即可上线。
大数据·人工智能·科技
思录Echo4 小时前
什么决定具身智能的最终走向?多技术路线与落地现实辨析
大数据·人工智能
xiaohaiAIgeo4 小时前
【2026年】AI监控加行为分析守护实验室安全
大数据·人工智能·科普知识
林墨聊AIGC5 小时前
动漫AI视频创作工具在哪找到的?2026年最新动漫AI视频平台与软件指南
大数据·人工智能·ai作画·aigc·音视频
jyOverQ5 小时前
MySQL 联合索引怎么用?最左匹配原则到底是什么意思?
数据库·mysql
没文化的阿浩5 小时前
【MySQL】用户管理
android·mysql·adb