跳转到主要内容

MongoDB 插件

lynx-mongodb 是 Lynx 运行时持有的 MongoDB client。本页严格围绕 lynx-mongodb/conf/example_config.yml 里的字段来说明每个 YAML 键什么时候生效、默认值如何交互,以及最容易踩到的误配点。

Runtime Facts(运行时事实)

项目
Go modulegithub.com/go-lynx/lynx-mongodb
配置前缀lynx.mongodb
Runtime 插件名mongodb.client
公开 getterGetMongoDB()GetMongoDBDatabase()GetMongoDBCollection(name)GetMetricsGatherer()GetMongoDBPlugin()

Template Field Guide(模板字段说明)

字段作用什么时候启用默认值 / 交互关系常见误配
uriMongoDB 连接 URI。始终需要。默认 "mongodb://localhost:27017"。副本集、分片、SRV 这类选项仍应写在 URI 里。把同一套部署信息一部分写 URI,一部分写顶层 YAML,最后没人说得清谁才是主配置。
databaseGetMongoDBDatabase() 返回的默认数据库。始终需要。默认 "test"。所有 GetMongoDBCollection(name) 都从这个数据库解析。忘了改模板值,结果集合全建到错误数据库。
usernameMongoDB 认证用户名。走 URI 外的显式凭证认证时。默认空。只有 usernamepassword 同时非空时,插件才会真正设置认证。只填用户名就以为已经启用认证。
passwordMongoDB 认证密码。走 URI 外的显式凭证认证时。默认空。没有 username 就不会生效。填了密码,但用户名留空。
auth_source认证数据库。只有和 usernamepassword 配套时才有意义。默认空。认证启用时会一起传入。单独设置 auth_source,却没有真正启用凭证认证。
max_pool_sizeMongoDB 驱动连接池最大值。一般都应考虑。默认 100设得过低,业务并发一上来就把锅甩给 MongoDB。
min_pool_sizeMongoDB 驱动连接池最小值。想保留一定空闲连接时。默认 5低流量服务把它拉太高,白白占着连接。
connect_timeout初始连接超时。一般都应考虑。默认 "30s"。会影响启动和重连。跨可用区或冷启动场景里设得太小。
server_selection_timeout选择 MongoDB server 的时间预算。尤其在副本集和分片场景重要。默认 "30s"failover 场景里设得太小。
socket_timeoutSocket 读写超时。一般都应考虑。默认 "30s"合法的长查询还没完成就被超时打断。
heartbeat_interval驱动心跳间隔。通常保留默认值即可。默认 "10s"。更低能更快感知拓扑变化,但会增加后台流量。没评估集群开销就一味调低。
enable_metrics开启插件本地 Prometheus 指标。计划把插件 gatherer 暴露到 /metrics 时。默认 false开了它,却从来没把 GetMetricsGatherer() 并进应用指标端点。
enable_health_check开启后台健康检查。需要周期性运行时健康可见性时。默认 false。无论开不开,启动时都会做连通性测试。设成 false,却以为启动 ping 也不会跑。
health_check_interval后台健康检查间隔。只有 enable_health_check: true 时。默认 "30s"改了这个值,却没开健康检查。
enable_tls为 client options 启用 TLS 文件处理。部署要求 TLS,且你使用文件式 TLS 材料时。默认 false。当前实现只会根据提供的证书文件构造 TLS config;如果 enable_tls: true 但所有 TLS 文件路径都为空,并不会自动注入自定义 TLS config。只把 enable_tls 改成 true,却既没提供证书文件,也没在 URI 里写 TLS 选项。
tls_cert_file客户端证书路径。enable_tls: true 且需要 mTLS 时。默认空。证书路径填了,但 enable_tls 仍是关闭的。
tls_key_file客户端私钥路径。enable_tls: true 且需要 mTLS 时。默认空。只配证书不配匹配的私钥。
tls_ca_file自定义 CA 证书路径。集群 CA 不在主机默认信任链中时。默认空。以为私有 CA 会被系统自动信任。
enable_compression开启 MongoDB 压缩协商。需要节省网络且集群支持压缩时。默认 false。当前实现会启用 zlibsnappy只改 compression_level,却期待压缩已经生效。
compression_level保存压缩级别提示。目前只能当元数据。默认 0。当前实现会保存它,但不会把它应用到驱动选项里。调这个值,却期待立即改变运行时行为。
enable_retry_writes开启可重试写。部署拓扑支持 retryable writes 时。默认 false在不支持 retryable writes 的拓扑上硬开。
enable_read_concern给 client 应用 read concern。需要显式读一致性语义时。默认 false只配 read_concern_level,忘了开关本身。
read_concern_levelRead concern 级别。只有 enable_read_concern: true 时。默认 "local"。当前实现遇到未知值会退回 local拼写错误后悄悄退回 local
enable_write_concern给 client 应用 write concern。需要显式持久化语义时。默认 false配了 write_concern_w / write_concern_timeout,却忘了打开这个开关。
write_concern_wWrite concern 确认级别。只有 enable_write_concern: true 时。默认 1没确认副本拓扑和延迟预算,就盲目调高。
write_concern_timeoutWrite concern 超时。只有 enable_write_concern: true 时。默认 "5s"设得比正常副本确认延迟还短。

Complete YAML Example(完整 YAML 示例)

下面这个示例展开了 lynx-mongodb/conf/example_config.yml 中出现的全部字段。

lynx:
mongodb:
uri: "mongodb://localhost:27017" # MongoDB 连接 URI。
database: "orders" # GetMongoDBDatabase() 返回的默认数据库。
username: "admin" # 当认证信息不写进 URI 时使用的用户名。
password: "change_me" # 与 username 成对使用的认证密码。
auth_source: "admin" # username/password 认证所使用的认证库。
max_pool_size: 100 # MongoDB 驱动连接池最大值。
min_pool_size: 5 # 驱动保留的最小空闲连接数。
connect_timeout: "30s" # 初始连接超时。
server_selection_timeout: "30s" # 副本集 / 分片场景里的 server selection 超时。
socket_timeout: "30s" # Socket 读写超时。
heartbeat_interval: "10s" # 驱动心跳间隔。
enable_metrics: true # 暴露 gatherer 时导出插件本地 Prometheus 指标。
enable_health_check: true # 启动后开启后台健康检查。
health_check_interval: "30s" # 后台健康检查间隔。
enable_tls: false # 需要证书文件式 TLS 时打开。
tls_cert_file: "" # mTLS 客户端证书路径,可选。
tls_key_file: "" # mTLS 客户端私钥路径,可选。
tls_ca_file: "" # 自定义 CA 证书路径,可选。
enable_compression: true # 启用 zlib/snappy 压缩协商。
compression_level: 6 # 保存压缩级别意图;当前 runtime 不会把它应用到驱动选项。
enable_retry_writes: true # 拓扑支持时启用 retryable writes。
enable_read_concern: true # 给 client 应用 read concern。
read_concern_level: "local" # enable_read_concern 为 true 时使用的 read concern 级别。
enable_write_concern: true # 给 client 应用 write concern。
write_concern_w: 1 # write concern 确认级别。
write_concern_timeout: "5s" # write concern 超时。

Minimum Viable YAML Example(最小可用 YAML 示例)

这个插件可以完全依赖默认值启动,因此最小可运行块就是一个空的 lynx.mongodb 对象。

lynx:
mongodb: {} # 本地开发默认会回落到 mongodb://localhost:27017 和数据库 "test"。

Practical Notes(实际注意点)

  • GetMongoDBCollection(name) 永远基于默认 database 解析;集合创建、索引、文档模型仍属于业务代码。
  • metrics 和后台健康检查是两套独立开关:前者控制指标导出,后者控制周期性探活。
  • 如果你更倾向于把认证或 TLS 放在 URI 里,就尽量把同类信息集中到一个地方,不要 URI 和顶层 YAML 混着配。