尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Quickwit 接入 S3 文件源实战:基于 SQS 通知自动摄取云端日志

Quickwit 接入 S3 文件源实战:基于 SQS 通知自动摄取云端日志 Quickwit 接入 S3 文件源实战基于 SQS 通知自动摄取云端日志【免费下载链接】quickwitCloud-native OSS search engine for observability项目地址: https://gitcode.com/GitHub_Trending/qu/quickwit本篇技术指南讲解如何在 Quickwit 中以S3 bucket SQS 通知作为 file source实现文件上传即自动索引的云端日志摄取方案。你将学会用 Terraform 一键创建源桶、通知队列与死信队列DLQ并配置最小权限 IAM在本地启动 Quickwit 并创建索引与 SQS 通知型文件源随后上传 NDJSON 数据并验证索引结果。文章同时深入仓库源码说明 SQS 消息接收、可见性超时管理、文件去重与检查点机制的真实实现帮助你在生产环境中正确调参。方案概述事件驱动的对象存储日志摄取Quickwit 的 file source 支持两种形态见 file_source.rs一种是直接指定filepath的单文件/单目录读取另一种是**基于通知notifications**的形态——由QueueCoordinator从消息队列拉取新文件已产生的通知再按通知指向的对象 URI 批量读取并索引。本教程使用的正是后者AWS S3 在每次对象创建时发出s3:ObjectCreated:*事件事件经 SQS 队列投递给 Quickwit 文件源文件源随即从源桶拉取该文件NDJSON 格式进入索引流水线。整体工作流如下Terraform 创建源桶source bucket与通知队列SQS queue在桶上配置通知规则s3:ObjectCreated:*事件写入 SQSQuickwit 文件源从 SQS 轮询通知消息解析出s3://对象 URI文件源按 URI 从 S3 读取文件内容逐行JSON送入索引管道文件处理完成后消息被确认ack索引提交后检查点落盘实现至少一次语义下的文件级去重处理失败的消息文件损坏、格式错误等超过重试次数后转入死信队列DLQ备查。第一步用 Terraform 创建 AWS 资源完整的 Terraform 脚本位于仓库 docs/assets/sqs-file-source.tf要求 Terraform 1.7.5、AWS provider~ 5.39.1。下面拆解脚本的每一部分。1. 创建接收源文件的 S3 桶源桶用来接收待索引的数据文件NDJSON 格式使用bucket_prefix让 AWS 自动生成唯一后缀force_destroy true便于教程环境清理resource aws_s3_bucket file_source { bucket_prefix local.source_bucket_name # qw-tuto-source-bucket force_destroy true }2. 创建通知队列与死信队列DLQSQS 队列承载 S3 的通知消息队列策略只允许源桶通过aws:SourceArn条件限定发送消息避免其他主体滥用locals { sqs_notification_queue_name qw-tuto-s3-event-notifications } data aws_iam_policy_document sqs_notification { statement { effect Allow principals { type * identifiers [*] } actions [sqs:SendMessage] resources [arn:aws:sqs:*:*:${local.sqs_notification_queue_name}] condition { test ArnEquals variable aws:SourceArn values [aws_s3_bucket.file_source.arn] } } } resource aws_sqs_queue s3_events_deadletter { name ${local.sqs_notification_queue_name}-deadletter } resource aws_sqs_queue s3_events { name local.sqs_notification_queue_name policy data.aws_iam_policy_document.sqs_notification.json redrive_policy jsonencode({ deadLetterTargetArn aws_sqs_queue.s3_events_deadletter.arn maxReceiveCount 5 }) } resource aws_sqs_queue_redrive_allow_policy s3_events_deadletter { queue_url aws_sqs_queue.s3_events_deadletter.id redrive_allow_policy jsonencode({ redrivePermission byQueue, sourceQueueArns [aws_sqs_queue.s3_events.arn] }) }关键点DLQ 的作用把文件源无法处理的消息例如文件损坏、压缩格式异常、文件不存在、消息体不是合法 S3 通知在重试 5 次后转入死信队列避免消息无限重投。仓库代码在消息预处理失败时会记录限速日志并建议使用 DLQ见 coordinator.rs。maxReceiveCount 5对应5 次索引尝试后转 DLQ这也是官方推荐的生产默认值。3. 配置桶通知仅监听对象创建事件resource aws_s3_bucket_notification bucket_notification { bucket aws_s3_bucket.file_source.id queue { queue_arn aws_sqs_queue.s3_events.arn events [s3:ObjectCreated:*] } }注意文件源只支持s3:ObjectCreated:*类型的事件。其他事件类型如ObjectRemoved会被文件源直接确认ack并记录一条警告日志不会进入索引流程。配置时请勿混入ObjectRemoved:*等事件。4. 创建 Quickwit 节点所需的最小权限 IAM文件源需要同时访问通知队列轮询/删除消息、修改可见性、读属性和源桶读取对象。下面的策略文档是官方给出的最小权限集data aws_iam_policy_document quickwit_node { statement { effect Allow actions [ sqs:ReceiveMessage, sqs:DeleteMessage, sqs:ChangeMessageVisibility, sqs:GetQueueAttributes, ] resources [aws_sqs_queue.s3_events.arn] } statement { effect Allow actions [s3:GetObject] resources [${aws_s3_bucket.file_source.arn}/*] } }这四个 SQS 权限与源码中的行为一一对应见 sqs_queue.rsReceiveMessagereceive()轮询消息DeleteMessageacknowledge()批量删除已处理消息ChangeMessageVisibilitymodify_deadlines()在长文件处理期间不断续期可见性超时GetQueueAttributes源启动时check_connectivity()校验队列可达。教程为方便起见创建了 IAM 用户并生成访问密钥resource aws_iam_user quickwit_node { name quickwit-filesource-tutorial path /system/ } resource aws_iam_user_policy quickwit_node { name quickwit-filesource-tutorial user aws_iam_user.quickwit_node.name policy data.aws_iam_policy_document.quickwit_node.json } resource aws_iam_access_key quickwit_node { user aws_iam_user.quickwit_node.name }警告教程使用长期 IAM 用户密钥仅为简化演示。生产环境在 EC2/ECS 上运行 Quickwit 时应把上述策略挂载到IAM 角色如实例角色或任务角色而非用户借助临时凭证自动轮换避免密钥泄露风险。5. 部署并读取输出脚本末尾声明了四个 Terraform 输出source_bucket_name、notification_queue_url、quickwit_node_access_key_id敏感、quickwit_node_secret_access_key敏感。在脚本目录执行terraform init terraform apply查看敏感输出密钥用terraform output quickwit_node_access_key_id terraform output quickwit_node_secret_access_key第二步以最小权限启动 Quickwit先按安装指南在本地安装 Quickwit。然后在安装目录下用上一步 Terraform 输出的两个敏感值替换占位符后启动区域与教程一致使用us-east-1AWS_ACCESS_KEY_IDquickwit_node_access_key_id \ AWS_SECRET_ACCESS_KEYquickwit_node_secret_access_key \ AWS_REGIONus-east-1 \ ./quickwit runQuickwit 会通过 AWS SDK 的标准凭证链读取环境变量。从源码看SQS 客户端会从queue_url正则提取 region形如https://sqs.region.amazonaws.com提取失败时回退到默认区域us-east-1见 sqs_queue.rs因此queue_url中的区域与凭据区域保持一致即可。第三步创建索引并注册 SQS 通知型文件源在另一个终端、同样位于 Quickwit 安装目录先创建索引cat EOF tutorial-sqs-file-index.yaml version: 0.7 index_id: tutorial-sqs-file doc_mapping: mode: dynamic indexing_settings: commit_timeout_secs: 30 EOF ./quickwit index create --index-config tutorial-sqs-file-index.yamldoc_mapping.mode: dynamic让 Quickwit 自动推断字段类型无需预先声明映射commit_timeout_secs: 30控制索引段提交频率该值同时影响消息可见性超时的初始设定见下文源码分析。再创建文件源notification_queue_url替换为 Terraform 输出的notification_queue_urlcat EOF tutorial-sqs-file-source.yaml version: 0.8 source_id: sqs-filesource source_type: file num_pipelines: 2 params: notifications: - type: sqs queue_url: notification_queue_url message_type: s3_notification EOF ./quickwit source create --index tutorial-sqs-file --source-config tutorial-sqs-file-source.yaml源配置参数详解对照配置文档 docs/configuration/source-config.md 与源码 source_config/mod.rsnotifications数组项支持以下字段参数必填取值说明type是sqs当前仅支持 SQS 通知每个源只能配置一个通知器源码中多于一个会报错queue_url是形如https://sqs.us-east-1.amazonaws.com/123456789012/queue-name通知队列的完整 URLmessage_type是s3_notification/raw_uris3_notification解析 AWS S3 事件通知 JSON 体raw_uri表示消息体直接是对象 URI如s3://mybucket/mykeydeduplication_window_duration_secs否默认3600已摄取文件检查点保留的最大时长deduplication_window_max_messages否默认100_000保留的已摄取文件检查点最大数量deduplication_cleanup_interval_secs否默认60过期检查点的清理频率tipnum_pipelines调优。它控制并行从队列消费的管道消费者数量。经验法则每 2 个 CPU 核配置 1 条 pipeline按你打算投入该源的计算资源取整。第四步上传数据并验证索引向源桶上传 NDJSON 数据。教程使用官方示例数据集HDFS 多租户日志1 万条curl https://quickwit-datasets-public.s3.amazonaws.com/hdfs-logs-multitenants-10000.json | \ aws s3 cp - s3://source_bucket_name/hdfs-logs-multitenants-10000.json不习惯用 AWS CLI 的话也可以先把文件下载到本地再通过 AWS 控制台上传到源桶。上传动作触发s3:ObjectCreated:*事件通知进入 SQSQuickwit 文件源随即拉取并索引该文件。等待约 1 分钟后查看索引状态与文档数./quickwit index describe --index tutorial-sqs-file当num_docs达到 10000 且无积压错误时说明整条链路S3 → SQS → file source → 索引已打通。深入源码文件源如何处理 SQS 消息消息接收与可见性超时管理SqsQueue实现了统一的Queuetrait见 sqs_queue.rs核心行为包括Receive调用 SQSReceiveMessage单次最多取 10 条与 SQS API 上限一致长轮询wait_time_seconds 20并把建议的可见性超时写入消息可见性续期modify_deadlines大文件读取可能超过一个可见性窗口协调器会周期性调用ChangeMessageVisibility续期续期上限为 43200 秒12 小时。源码注释指出该操作采用激进重试策略避免因续期失败丢失消息所有权sqs_queue.rs批量确认acknowledge每 10 个receipt_handle一组调用DeleteMessageBatch对部分失败采用限速日志记录而非无限重试——因为消息可能已被确认或已过期。可见性超时的初始值由commit_timeout_secs推导而来见 coordinator.rs 的VisibilitySettings::from_commit_timeout这就是教程把commit_timeout_secs显式设为 30 的原因它同时影响索引提交节奏与消息不被重新投递的安全窗口。消息类型解析s3_notification 与 raw_uriRawMessage::pre_process按message_type决定如何从消息体提取对象 URI见 message.rss3_notification解析 AWS S3 事件通知 JSON取出其中的对象键并拼成s3://URIraw_uri直接把消息体当作对象 URI 字符串解析。解析出 URI 后消息以 URI 作为分区 IDPartitionId进入去重与检查点流程若消息体无法解析则计入num_messages_failed_preprocessing指标并打限速错误日志最终消息会因无法确认而多次重投直至进入 DLQ见 coordinator.rs。文件级去重应对至少一次投递AWS S3 通知与 SQS 都只提供at-least-once投递保证同一文件的通知可能重复到达。Quickwit 的去重机制coordinator.rs 与 source-config.md分两层本地状态同一轮内重复到达的相同分区URI消息直接合并/跳过共享检查点文件处理完成并提交后其检查点含 EOF 位置与发布令牌写入 metastore其他 pipeline 或重启后的实例据此识别该文件已处理完直接确认对应通知消息而不重复索引。去重检查点按deduplication_window_*参数在时间与数量两个维度上保留窗口外的检查点会被周期性清理以控制 metastore 负载。若你的文件变更频繁、检查点膨胀可以调小deduplication_window_duration_secs/deduplication_window_max_messages或调大deduplication_cleanup_interval_secs。源启动自检文件源初始化时会执行check_connectivity调用GetQueueAttributes验证队列 URL 可访问且凭据有效sqs_queue.rs。如果启动即报 SQS 相关错误优先检查队列 URL 所在区域、IAM 权限四项与网络连通性。生产实践建议务必配置 DLQ文件损坏、压缩格式异常、对象被删除、通知体非法等都会导致消息处理失败。DLQ 让你能在不阻塞主链路的前提下审计失败原因。仓库测试中也覆盖了错误队列 URL 导致接收失败的场景sqs_queue.rs。权限收敛SQS 侧只授ReceiveMessage/DeleteMessage/ChangeMessageVisibility/GetQueueAttributesS3 侧只授s3:GetObject生产环境改用 IAM 角色承载这些权限。只监听s3:ObjectCreated:*其他事件会被确认并记录警告避免无效消息占用队列。源文件生命周期Quickwit 成功索引后不会自动删除源桶中的文件。如需控制存储成本可结合 S3 生命周期规则对象过期策略自行清理。num_pipelines与可见性窗口并行管道数按每 2 核 1 条估算单个超大文件处理时间接近可见性超时上限12 小时时应评估拆分文件而非依赖无限续期。结束后的清理本教程创建的 AWS 资源不产生固定费用但建议用完后一并删除避免遗留密钥与队列。在 Terraform 脚本目录执行terraform destroy该命令会移除源桶、通知队列、DLQ 及 IAM 用户与访问密钥配合桶上的force_destroy true即使桶内仍有文件也能正常删除。至此你已完整走通S3 上传 → SQS 通知 → Quickwit 自动索引的云端日志摄取闭环并理解了其底层去重与可见性管理机制可将同一套 Terraform 模板与源配置迁移到生产环境使用。【免费下载链接】quickwitCloud-native OSS search engine for observability项目地址: https://gitcode.com/GitHub_Trending/qu/quickwit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表