- 最新动态
- 功能总览
-
服务公告
- 漏洞公告
-
产品公告
- 【通知】2024年11月5日起文档数据库服务DDS5.0版本集群开放公测
- 【通知】2024年10月11日起文档数据库服务DDS副本集5.0版本开始转商计费
- 【通知】华为云文档数据库服务DDS3.4版本计划于2024年10月11日停售
- 【通知】2024年07月24日起文档数据库服务DDS5.0版本开放公测
- 【通知】2023年02月15日起文档数据库服务上线x86架构增强Ⅱ型副本集和集群shard的1:8系列规格
- 【通知】文档数据库服务DDS4.4邀请公测
- 【停售公告】华为云文档数据库服务DDS单节点规格计划于2023年07月15日停售内部通知
- 【通知】2023年10月8日起文档数据库服务DDS4.4版本开始转商计费
- 版本说明
- 产品发布说明
- 产品介绍
- 计费说明
- 快速入门
- 开发指南
-
用户指南
- 购买实例
- 连接实例
- 数据迁移
- 性能调优
- 权限管理
- 实例生命周期管理
- 变更实例
- 数据备份
- 数据恢复
- 参数模板管理
- 连接管理
- 数据库使用
- 数据安全性
- 监控与告警
- 审计
- 日志管理
- 任务中心
- 智能DBA助手
- SQL自动查杀
- 跨可用区容灾
- 标签管理
- 配额管理
- DDS使用规范建议
-
最佳实践
- DDS最佳实践汇总
- 安全最佳实践
- 连接DDS实例的常用方式
- 其他云MongoDB迁移到DDS
- 本地MongoDB迁移到DDS
- ECS自建MongoDB迁移DDS
- 如何实现副本集高可用和读写分离
- 通过设置数据分片提升性能
- 如何通过SQL优化来提升DDS性能
- 如何规避dds mongos路由缓存缺陷
- 排查DDS实例CPU使用率高的问题
- 排查DDS实例内存占用较高的问题
- 排查DDS实例连接数耗尽的问题
- 创建用户并授权使用DDS只读权限
- 合理使用DDL(Data Definition Languages)语句
- DDS节点脱节原理和说明
- 避免hideIndex导致游标失效
- 使用DDS存储和分析日志数据
- DDS查询计划及查询重规划
- 安全白皮书
- 性能白皮书
-
API参考
- 使用前必读
- API概览
- 如何调用API
- 快速入门
-
API v3(推荐)
- 查询API版本
- 查询数据库版本信息
- 查询数据库规格
- 查询数据库磁盘类型
-
实例管理
- 创建实例
- 重启实例
- 删除实例
- 查询实例列表和详情
- 扩容实例存储容量
- 扩容集群实例的节点数量
- 变更实例规格
- 切换副本集实例的主备节点
- 切换SSL开关
- 修改实例名称
- 修改实例备注
- 修改数据库端口
- 变更实例安全组
- 绑定弹性公网IP
- 解绑弹性公网IP
- 修改实例内网地址
- 创建集群的Shard/Config IP
- 副本集跨网段访问配置
- 查询实例可迁移到的可用区
- 实例可用区迁移
- 设置实例回收站策略
- 扩容副本集实例的节点数量
- 实例新增只读节点
- 数据库补丁升级
- 开启/关闭秒级监控
- 查询秒级监控配置
- 设置可维护时间段
- 查询实例回收站策略
- 查询回收站实例列表
- 检查弱密码
- 查询数据库补丁升级预估时长
- 查询实例磁盘信息
- 获取SSL证书下载地址
- 查询数据库复制集名称
- 修改数据库复制集名称
- 删除实例的节点
- 删除实例的只读节点
- 查询副本集跨网段访问配置
- 查询LTS日志配置信息
- 关联LTS日志流
- 解除关联LTS日志流
- 设置磁盘自动扩容策略
- 查询磁盘自动扩容策略
- 批量数据库补丁升级
- 连接管理
- 备份与恢复
- 参数配置
- 获取日志信息
- 标签管理
- 管理数据库和用户
- 配额管理
- 数据库运维
- 任务管理
- API v3(即将下线)
- 应用示例
- 权限策略和授权项
- 附录
- SDK参考
- 场景代码示例
- 常见问题
-
故障排除
- 概述
- DDS实例节点故障处理机制
- 连接失败,提示:network error while attempting to run command ‘isMaster’
- 连接失败,提示:No route to host以及connection attempt failed
- 连接失败,提示:Authentication failed
- 连接失败,提示:couldn't connect to server
- 连接失败,提示:cannot list multiple servers in URL without ‘replicaSet’ option
- Java驱动连接实例失败,提示:Timeout while receiving message
- 连接失败,提示:exception: login failed 以及 U_STRINGPREP_PROHIBITED_ERROR
- 视频帮助
- 文档下载
- 通用参考
链接复制成功!
使用DDS存储和分析日志数据
在现代应用的运维和分析中,日志数据扮演着至关重要的角色。不仅可以帮助监控应用的健康状况,还提供了宝贵的数据以方便洞察,用于优化用户体验和业务决策。然而,随着数据量的激增,传统的日志存储和分析方法逐渐显得力不从心。本文介绍如何使用DDS(Document Database Service)高效存储和分析日志数据,以挖掘数据的最大价值。DDS 4.2及其以上版本采用RocksDB作为底层存储引擎,对于日志存储与分析这种写多读少的场景有较好的性能表现。
通过合理设计日志存储结构、优化写入和查询策略、采用数据分片原理,DDS能够高效地存储和分析海量日志数据,为应用运维和业务分析提供强有力的支持。DDS不仅提供了强大的数据存储能力,还通过灵活的配置和优化策略,帮助用户在数据爆炸的时代中,轻松应对挑战,挖掘数据的无限价值。
日志数据的存储策略
在物联网(Internet of Things,简称IoT)领域,设备的日志数据扮演着至关重要的角色,不仅能帮助监控设备的运行状态,还提供了设备使用模式和故障预测的宝贵信息。例如,一个智能家庭安全系统的日志记录,可以包含设备ID、时间戳、事件类型(如“门锁开启”、“运动检测”)、设备状态、以及可能的错误代码等信息。
- 日志数据示例
- 存储模式优化
在数据存储到DDS时,将上述日志转换为结构化的文档,提取关键字段,例如:
{ _id: ObjectId('5f442120eb03305789000000'), device_id: "001", timestamp: ISODate("2023-04-05T14:30:00Z"), event: "DoorLockOpened", device_status: "Active", error: "None" }
在存储时,根据分析需求过滤无关字段,以节省存储空间。例如,如果分析不关心的设备的错误状态,可以省略error字段。
日志写入与性能优化
replica:PRIMARY> log = { ... "device_id": "001", ... "timestamp": ISODate("2023-04-05T14:30:00Z"), ... "event": "DoorLockOpened", ... "device_status": "Active", ... "error": "None" ... }; // 以{w: 0}写入 replica:PRIMARY> db.getSiblingDB("iot_logs").events.insert(log, {w: 0}) WriteResult({ "nInserted" : 1 }) // 以{w: 1}写入 replica:PRIMARY> db.getSiblingDB("iot_logs").events.insert(log, {w: 1}) WriteResult({ "nInserted" : 1 }) // 以{w: "majority"}写入 replica:PRIMARY> db.getSiblingDB("iot_logs").events.insert(log, {w: "majority"}) WriteResult({ "nInserted" : 1 }) // 单次批量写入: replica:PRIMARY> logs = [ ... { "device_id": "002", "timestamp": ISODate("2023-04-06T09:45:00Z"), "event": "MotionDetected", "device_status": "Active", "error": "None"}, ... { "device_id": "003", "timestamp": ISODate("2023-04-07T16:15:00Z"), "event": "TemperatureAlarm", "device_status": "Active", "error": "None"}, ... {"device_id": "004", "timestamp": ISODate("2023-04-08T20:30:00Z"), "event": "WindowOpened", "device_status": "Active", "error": "None"} ... ] replica:PRIMARY> db.getSiblingDB("iot_logs").events.insertMany(logs, {w: 0})
日志查询与分析
- 日志查询示例
- 建立索引以提高查询效率
- 复杂分析
利用DDS的聚合框架可以进行更复杂的查询分析。具体详情请参考聚合框架。
数据分片与扩展
随着日志数量的激增,日志数据量呈指数级增长,单一数据库节点往往难以应对海量数据的存储和查询需求。DDS(Document Database Service)通过数据分片(Sharding)技术,提供了水平扩展能力,能够有效分担数据存储和查询压力,确保系统的高可用性和高性能。
- Shard Key选择策略
- 均匀分布:Shard Key应确保数据在Shard之间均匀分布,避免热点问题。
- 查询模式:Shard Key应与常见的查询模式相匹配,以提高查询效率。
- 数据访问模式:如果数据访问模式是基于时间的,可以考虑使用时间戳或基于时间的字段作为Shard Key。
详细可参考文档通过设置数据分片提升性能。
- 基于设备ID的分片
假设有大量的IoT设备,每个设备产生大量日志。可以选择device_id作为Shard Key,这样可以确保每个设备的日志数据存储在不同的Shard上,实现数据的均匀分布。具体示例如下:
db.getSiblingDB("iot_logs").events.createIndex({"device_id": 1}) sh.enableSharding("iot_logs") sh.shardCollection("iot_logs.events", {"device_id": 1 })
说明:
- 在创建分片集合时,确保Shard Key字段在数据中具有足够的唯一性,以实现数据的均匀分布。
- Shard Key的选择应考虑到数据的访问模式,以优化查询性能。
- 分片集群的管理,如添加或删除Shard,应根据数据增长和查询需求进行调整。
自动删除过期数据
- TTL索引:自动删除过期文档,如设置30天后自动删除。
db.eventlog.createIndex( { "timestamp": 1 }, { expireAfterSeconds: 30 * 24 * 60 * 60 } )
- Capped集合:限制集合大小,自动删除最旧文档。固定大小集合是大小固定的集合,根据插入顺序插入和检索文档。固定大小集合的工作方式与循环缓冲区类似:一旦一个集合填满了分配的空间,它就会通过覆盖集合中最旧的文档来为新文档腾出空间。
// 创建固定集合需要在创建集合的时候指定 db.getSiblingDB("iot_logs").dropDatabase() db.getSiblingDB("iot_logs").createCollection( "events", { capped: true, size: 5242880 } )
- 定期归档:按月归档日志数据,便于历史数据管理和查询。
db.getSiblingDB("iot_logs").events.renameCollection("events202301")
须知:
单个实例中,数据库的总的个数不要超过200个,总的集合个数不要超过500个。集合数量过多会导致内存压力变高,并且集合数量多会导致重启以及主备倒换性能变差,影响紧急情况下的高可用性能。建议定期删除不需要的集合。