MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

MongoDB分片集群成员健康检查与预防性维护

2021-01-177.7k 阅读

MongoDB 分片集群成员健康检查

健康检查的重要性

在 MongoDB 分片集群环境中,确保各个成员(分片服务器、配置服务器和路由服务器)的健康状态至关重要。任何一个成员出现故障,都可能导致整个集群的性能下降甚至服务中断。通过定期进行健康检查,可以提前发现潜在问题,及时采取措施进行修复,从而保障集群的高可用性和稳定性。

分片服务器健康检查

  1. 基本状态检查
    • 连接状态:可以使用 MongoDB 的官方驱动程序或 mongo 命令行工具来尝试连接分片服务器。例如,使用 mongo 命令行工具连接到分片服务器:
mongo <shard_server_host>:<shard_server_port>

如果连接成功,说明分片服务器的网络和进程基本正常。如果连接失败,需要检查服务器的网络配置、防火墙设置以及 MongoDB 服务是否正常运行。

  • 进程状态:在服务器上,可以使用系统命令来检查 MongoDB 进程是否正在运行。在 Linux 系统上,可以使用 ps 命令:
ps -ef | grep mongod

如果有 mongod 进程显示,说明 MongoDB 服务正在运行。同时,注意观察进程的状态和资源占用情况,比如 CPU 和内存使用量。如果 CPU 使用率持续过高,可能是有大量的查询或数据处理操作导致,需要进一步分析查询语句或数据量。 2. 数据同步状态检查

  • 复制集状态(如果分片使用复制集):对于作为分片的复制集,使用 rs.status() 命令来查看复制集的状态。
mongo <shard_server_host>:<shard_server_port>
rs.status()

在输出结果中,关注 state 字段,1 表示主节点,其他数字有不同的含义,比如 2 表示从节点。确保所有节点的状态正常,没有出现 STARTUPRECOVERING 等异常状态。同时,查看 lastHeartbeat 字段,确认节点之间的心跳是否正常,心跳间隔过长可能表示网络或节点本身存在问题。

  • 数据同步延迟:在从节点上,可以通过比较主从节点的 opTime 来判断数据同步延迟。opTime 记录了数据库操作的时间戳。
// 在主节点获取opTime
mongo <primary_shard_server_host>:<primary_shard_server_port>
var primaryOpTime = db.getReplicationInfo().opTime
printjson(primaryOpTime)

// 在从节点获取opTime
mongo <secondary_shard_server_host>:<secondary_shard_server_port>
var secondaryOpTime = rs.status().members[0].optime
printjson(secondaryOpTime)

比较 primaryOpTimesecondaryOpTime,如果差异较大,说明存在数据同步延迟。可能的原因包括网络带宽不足、从节点负载过高、主从节点硬件性能差异等。

  1. 磁盘空间检查
    • 分片服务器存储着实际的数据,磁盘空间不足会导致写入失败等问题。在 Linux 系统上,使用 df -h 命令来检查磁盘使用情况:
df -h /path/to/mongodb/data

确保 /path/to/mongodb/data 目录所在的磁盘有足够的可用空间。一般建议保留至少 20% - 30% 的可用空间,以应对数据增长和临时文件的生成。

配置服务器健康检查

  1. 连接与进程检查 与分片服务器类似,首先要检查配置服务器的连接状态和进程状态。使用 mongo 命令行工具连接配置服务器:
mongo <config_server_host>:<config_server_port>

并通过系统命令检查 mongod 进程:

ps -ef | grep mongod

确保连接正常且进程运行稳定。 2. 配置数据一致性检查 配置服务器存储着集群的元数据,包括分片信息、数据库和集合的路由信息等。通过 config 数据库来检查配置数据的一致性。

mongo <config_server_host>:<config_server_port>
use config
db.collections.find()

检查 collections 集合中的数据,确保每个集合的路由信息准确无误。同样,可以检查 shards 集合以确认分片信息的正确性。如果发现配置数据不一致,可能会导致路由错误,影响整个集群的正常运行。此时,需要谨慎地进行修复操作,一般建议在测试环境中模拟问题并找到正确的修复方法后,再在生产环境中实施。

路由服务器(mongos)健康检查

  1. 连接与进程检查 使用 mongo 命令行工具连接路由服务器:
mongo <mongos_host>:<mongos_port>

并通过系统命令检查 mongos 进程:

ps -ef | grep mongos

确保连接正常且 mongos 进程运行稳定。 2. 路由功能检查 路由服务器负责将客户端的请求正确地路由到相应的分片服务器。可以通过执行一些简单的查询操作来检查路由功能。例如,插入一些测试数据并进行查询:

mongo <mongos_host>:<mongos_port>
use test
db.testCollection.insert({name: 'test'})
db.testCollection.find()

如果查询能够正确返回结果,说明路由服务器的基本路由功能正常。如果查询失败,可能是路由配置错误、配置服务器数据不一致或分片服务器出现问题。此时,需要结合配置服务器和分片服务器的健康检查结果来进行综合分析。

预防性维护措施

硬件维护

  1. 服务器硬件检查 定期对运行 MongoDB 分片集群的服务器硬件进行检查,包括服务器的物理部件,如硬盘、内存、CPU 等。
    • 硬盘检查:使用硬盘制造商提供的工具或系统自带的磁盘检查工具(如 Linux 上的 smartctl)来检查硬盘的健康状态。
smartctl -H /dev/sda

该命令会显示硬盘的健康状态信息,如果出现 PASSED 以外的状态,说明硬盘可能存在问题,需要及时更换。

  • 内存检查:可以使用 memtest86+ 工具来对内存进行全面检测。在服务器启动时,进入 memtest86+ 界面,它会自动检测内存的完整性,检测过程可能需要几个小时,完成后会显示检测结果。如果发现内存错误,需要更换有问题的内存模块。
  • CPU 检查:监控 CPU 的温度和使用率。在 Linux 系统上,可以使用 sensors 命令查看 CPU 温度:
sensors

如果 CPU 温度过高,可能需要清理服务器内部灰尘,检查散热风扇是否正常运转。同时,通过 tophtop 命令监控 CPU 使用率,过高的使用率可能意味着需要升级 CPU 或优化服务器上运行的应用程序。 2. 网络设备维护 确保网络设备(交换机、路由器等)的正常运行。定期检查网络设备的日志,查看是否有网络故障或异常流量记录。同时,对网络链路进行带宽测试,保证集群内部和外部的网络带宽满足业务需求。例如,可以使用 iperf 工具来测试网络带宽:

// 在服务端启动iperf
iperf -s

// 在客户端测试到服务端的带宽
iperf -c <server_ip>

如果带宽不足,需要与网络管理员协作,检查网络配置、升级网络设备或增加网络链路。

软件维护

  1. MongoDB 版本升级 定期关注 MongoDB 的官方发布信息,及时升级到稳定的新版本。新版本通常会修复已知的漏洞、提升性能并增加新的功能。在升级之前,务必在测试环境中进行充分的测试。
    • 备份数据:在升级 MongoDB 之前,对整个分片集群的数据进行备份。可以使用 mongodump 工具进行备份:
mongodump --uri="mongodb://<mongos_host>:<mongos_port>/<database_name>" -o /path/to/backup
  • 升级流程:按照 MongoDB 官方文档的指导进行升级。一般步骤包括停止所有的 mongodmongos 进程,下载并安装新版本的 MongoDB,然后启动进程,并使用 mongorestore 工具恢复备份的数据(如果需要)。
// 停止进程
sudo systemctl stop mongod
sudo systemctl stop mongos

// 下载并安装新版本
// 根据操作系统和 MongoDB 版本进行相应的下载和安装操作

// 启动进程
sudo systemctl start mongod
sudo systemctl start mongos

// 恢复数据(如果需要)
mongorestore --uri="mongodb://<mongos_host>:<mongos_port>/<database_name>" /path/to/backup
  1. 操作系统和依赖软件更新 及时更新服务器的操作系统和 MongoDB 依赖的软件包。在 Linux 系统上,可以使用系统自带的包管理器(如 yumapt - get)来更新软件包。
// 在 CentOS 上更新软件包
sudo yum update

// 在 Ubuntu 上更新软件包
sudo apt - get update
sudo apt - get upgrade

更新操作系统和依赖软件可以修复安全漏洞,提升系统性能,但同样需要在测试环境中先进行验证,确保不会对 MongoDB 集群造成不良影响。

数据维护

  1. 数据备份与恢复演练 定期进行数据备份,并进行恢复演练,以确保备份数据的可用性。除了前面提到的 mongodumpmongorestore 工具,还可以使用 MongoDB 的自动备份功能,如 MongoDB Enterprise 的备份和恢复功能。
    • 自动备份配置:在 MongoDB Enterprise 中,可以通过配置备份策略来实现自动备份。例如,配置每周日凌晨 2 点进行一次全量备份:
// 连接到 MongoDB 配置服务器
mongo <config_server_host>:<config_server_port>
use admin
db.createUser({
    user: "backup_user",
    pwd: "backup_password",
    roles: [
        { role: "backup", db: "admin" }
    ]
})

// 在备份服务器上配置备份任务
var backupConfig = {
    uri: "mongodb://<mongos_host>:<mongos_port>",
    authentication: {
        mechanism: "SCRAM - SHA - 1",
        user: "backup_user",
        password: "backup_password"
    },
    storage: {
        type: "local",
        destination: "/path/to/backup"
    },
    schedule: {
        type: "periodic",
        period: "weekly",
        startTime: "02:00"
    }
}
db.adminCommand({ createBackup: 1, config: backupConfig })
  • 恢复演练:定期从备份数据中恢复数据到测试环境,检查恢复的数据是否完整且可用。使用 mongorestore 工具进行恢复演练:
mongorestore --uri="mongodb://<test_mongos_host>:<test_mongos_port>/<database_name>" /path/to/backup
  1. 数据清理与优化 定期清理不再需要的数据,优化数据库的存储结构。例如,删除过期的日志数据或不再使用的历史记录。
    • 数据删除:根据业务需求,使用 deleteMany 方法删除数据。例如,删除 testCollection 中所有创建时间超过一年的数据:
mongo <mongos_host>:<mongos_port>
use test
var oneYearAgo = new Date(new Date().getTime() - 365 * 24 * 60 * 60 * 1000)
db.testCollection.deleteMany({createdAt: {$lt: oneYearAgo}})
  • 索引优化:定期检查和优化数据库索引。可以使用 db.collection.getIndexKeys() 方法查看集合的索引,对于不再使用或重复的索引,使用 db.collection.dropIndex() 方法删除。例如,删除 testCollection 中名为 duplicate_index 的索引:
mongo <mongos_host>:<mongos_port>
use test
db.testCollection.dropIndex("duplicate_index")

同时,对于查询频繁的集合,根据查询条件合理创建索引,以提升查询性能。

监控与报警设置

  1. 监控指标选择 选择关键的监控指标来实时了解 MongoDB 分片集群的运行状态。主要的监控指标包括:
    • CPU 使用率:反映服务器的计算资源使用情况,过高的 CPU 使用率可能导致查询性能下降。
    • 内存使用率:MongoDB 依赖内存来缓存数据和索引,内存使用率过高可能导致数据频繁从磁盘读取,影响性能。
    • 磁盘 I/O:包括磁盘的读写速度和 I/O 等待时间,磁盘 I/O 性能对数据存储和读取至关重要。
    • 网络带宽:集群内部和外部的网络带宽使用情况,网络带宽不足会导致数据同步和查询延迟。
    • 复制集状态:如主从节点的状态、数据同步延迟等。
    • 分片数据分布:检查各个分片上的数据量分布是否均匀,不均匀的分布可能导致部分分片负载过高。
  2. 监控工具使用 可以使用多种工具来监控 MongoDB 分片集群,如 MongoDB 自带的监控工具 mongostatmongotop,以及第三方监控工具如 Prometheus + Grafana。
    • mongostat:在命令行中运行 mongostat 命令,可以实时查看 MongoDB 服务器的各项指标,如插入、查询、更新、删除操作的速率,以及内存、CPU 使用情况等。
mongostat --host <mongos_host>:<mongos_port>
  • Prometheus + Grafana:首先需要在 MongoDB 服务器上部署 Prometheus 客户端,采集 MongoDB 的监控指标。然后将采集到的数据发送到 Prometheus 服务器进行存储和分析。最后,使用 Grafana 来可视化这些监控数据,创建各种监控面板。
  • 配置 Prometheus 客户端:在 MongoDB 服务器上安装 prometheus - mongodb - exporter,并配置连接到 MongoDB 实例。例如,在配置文件 config.yml 中:
global:
  scrape_interval: 15s

scrape_configs:
  - job_name:'mongodb'
    static_configs:
      - targets: ['<mongos_host>:<mongos_port>']
    metrics_path: /metrics
    params:
      module: [mongodb]
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: <prometheus_exporter_host>:9216
  • 启动 Prometheus 客户端
prometheus - mongodb - exporter --config.file=config.yml
  • 配置 Grafana:在 Grafana 中添加 Prometheus 作为数据源,然后导入 MongoDB 相关的监控面板模板,即可在 Grafana 界面中查看 MongoDB 分片集群的各种监控指标图表。
  1. 报警设置 基于监控数据设置合理的报警规则,以便在集群出现问题时及时通知运维人员。例如,在 Prometheus 中,可以使用 alertmanager 来设置报警。
    • 配置报警规则:在 Prometheus 的 rules.yml 文件中定义报警规则,如当 CPU 使用率连续 5 分钟超过 80% 时触发报警:
groups:
  - name: mongodb_alerts
    rules:
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: critical
        annotations:
          summary: "High CPU usage on {{ $labels.instance }}"
          description: "CPU usage on {{ $labels.instance }} is above 80% for 5 minutes"
  • 配置 alertmanager:在 alertmanager.yml 文件中配置报警接收方式,如通过邮件或短信发送报警通知:
global:
  smtp_smarthost:'smtp.example.com:587'
  smtp_from: 'alert@example.com'
  smtp_auth_username: 'alert@example.com'
  smtp_auth_password: 'password'
  smtp_require_tls: true

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 12h
  receiver: 'email'

receivers:
  - name: 'email'
    email_configs:
      - to: 'admin@example.com'

通过合理的监控与报警设置,可以在问题发生的第一时间发现并处理,避免对业务造成严重影响。

应急预案制定

  1. 故障场景分析 对可能出现的故障场景进行详细分析,包括分片服务器故障、配置服务器故障、路由服务器故障以及网络故障等。
    • 分片服务器故障:可能导致部分数据无法读写,如果是主分片服务器故障,复制集需要进行主节点选举,期间可能会有短暂的服务中断。同时,如果故障的分片服务器长时间未恢复,可能会影响整个集群的数据均衡。
    • 配置服务器故障:配置服务器存储着集群的元数据,故障可能导致路由信息丢失或错误,使得客户端无法正确访问数据。如果所有配置服务器同时故障,集群将无法正常运行。
    • 路由服务器故障:会导致客户端请求无法正确路由到分片服务器,影响业务的正常访问。单个路由服务器故障,一般不会影响数据的可用性,但可能会造成请求的短暂堆积。
    • 网络故障:包括集群内部网络故障和外部网络故障。内部网络故障可能导致分片服务器之间、配置服务器与路由服务器之间的数据同步和通信中断;外部网络故障则会使客户端无法连接到集群。
  2. 应急处理流程制定 针对不同的故障场景,制定详细的应急处理流程。
    • 分片服务器故障
      • 确认故障:通过监控报警或手动检查发现分片服务器连接异常、进程停止等情况,确定故障分片服务器。
      • 切换主节点(如果是复制集):如果故障的是主分片服务器,等待复制集自动选举新的主节点。如果自动选举失败或需要手动干预,可以使用 rs.stepDown() 命令来强制当前主节点退位,促使新的主节点选举。
      • 修复或替换故障服务器:检查故障服务器的硬件、软件问题,进行修复或更换服务器硬件。在修复完成后,将其重新加入复制集。
      • 数据均衡调整:如果故障导致了数据不均衡,使用 sh.status() 命令查看集群状态,并使用 sh.rebalanceCollection() 命令手动触发数据均衡操作。
    • 配置服务器故障
      • 确认故障:通过监控报警或连接配置服务器失败等情况确认故障。
      • 启动备用配置服务器(如果有):如果配置服务器采用多节点冗余配置,启动备用配置服务器。
      • 恢复配置数据:如果备用配置服务器的数据不是最新的,需要从备份中恢复配置数据。可以使用 mongorestore 工具从配置服务器的备份中恢复数据到备用配置服务器。
      • 更新集群配置:在备用配置服务器启动并恢复数据后,通知路由服务器和分片服务器更新配置信息,使其能够连接到新的配置服务器。
    • 路由服务器故障
      • 确认故障:通过客户端请求失败、监控报警等发现路由服务器故障。
      • 重启路由服务器:尝试重启故障的路由服务器,检查是否能够恢复正常。
      • 切换客户端连接:如果重启无效,可以将客户端连接切换到其他正常的路由服务器(如果有多台路由服务器)。
      • 排查故障原因:对故障的路由服务器进行详细排查,包括检查日志文件、网络配置等,找出故障原因并进行修复。
    • 网络故障
      • 确认故障范围:通过检查服务器之间的网络连接、网络设备的状态等,确定网络故障的范围是内部网络还是外部网络。
      • 联系网络管理员:如果是外部网络故障,及时联系网络服务提供商,了解故障情况并等待修复。如果是内部网络故障,通知内部网络管理员进行排查和修复。
      • 临时调整配置(如有必要):在等待网络修复的过程中,如果可能,可以临时调整集群的配置,例如将部分业务流量切换到备用网络链路(如果有)。
  3. 应急演练实施 定期进行应急演练,模拟各种故障场景,检验应急预案的有效性。在演练过程中,记录处理时间、遇到的问题以及解决方案,不断完善应急预案。例如,每季度进行一次模拟分片服务器故障的应急演练,按照应急预案的步骤进行操作,演练结束后进行总结和评估,对应急预案进行优化。通过应急演练,可以提高运维人员在面对实际故障时的处理能力,确保在最短时间内恢复集群的正常运行。