ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

达梦数据库LOCAL守护进程配置与高可用实践

达梦数据库LOCAL守护进程配置与高可用实践

1. 达梦数据库本地守护进程配置实战指南

作为国产数据库的领军产品,达梦数据库在企业级应用中扮演着重要角色。在实际生产环境中,数据库服务的持续可用性直接关系到业务连续性。LOCAL守护进程(dmwatcher)作为达梦数据库的高可用组件,能够在数据库异常关闭时自动重启服务,为单节点部署提供基础保障。本文将基于Kylin 10系统环境,详细解析dmwatcher的配置过程与技术原理。

2. 守护进程核心概念解析

2.1 守护类型对比

达梦数据库提供两种守护进程类型,适用于不同场景:

  • LOCAL守护:直接监控并管理单个数据库实例,当检测到服务异常时,自动执行重启操作。配置简单,适合单机高可用场景。
  • GLOBAL守护:需多节点协同工作,通过集群状态判断自动执行主备切换。适用于主备容灾架构,配置复杂度较高。

注意:LOCAL守护仅提供进程级监控,不保证数据一致性。如需数据级保护,需结合归档日志和GLOBAL守护构建主备架构。

2.2 守护进程工作原理

dmwatcher通过心跳检测机制监控数据库状态,其工作流程包含三个关键阶段:

  1. 状态检测:每10秒(默认)检查一次数据库进程状态
  2. 故障判定:连续3次检测失败(30秒超时)判定为故障
  3. 恢复执行:调用预设的启动命令恢复服务

3. 环境准备与配置实战

3.1 基础环境确认

本次实操环境配置如下:

操作系统:Kylin 10 (x86_64) 数据库版本:DM8 Pack62 (03134284368-20260306-316451-20149) 安装路径:/opt/dmdbms/ 数据目录:/data/dmdata/DAMENG 服务端口:5237

验证数据库版本:

SELECT id_code, banner FROM v$version;

3.2 关键配置文件修改

3.2.1 启用MAL系统

修改dm.ini配置文件:

sed -i 's/^MAL_INI.*/MAL_INI = 1/' /data/dmdata/DAMENG/dm.ini

MAL(Message Assembly Layer)是达梦的通信服务层,守护进程依赖其进行状态通信。即使单机部署也需要启用。

3.2.2 配置dmmal.ini

创建MAL配置文件:

# /data/dmdata/DAMENG/dmmal.ini [MAL_INST1] MAL_INST_NAME = DMSERVER MAL_HOST = 192.168.118.147 MAL_PORT = 65237 # MAL通信端口 MAL_INST_HOST = 192.168.118.147 MAL_INST_PORT = 5237 # 数据库服务端口 MAL_DW_PORT = 55237 # 守护进程通信端口 MAL_INST_DW_PORT = 35237 # 实例守护端口

端口配置要点:

  • MAL_PORT与MAL_DW_PORT需确保未被占用
  • 端口范围建议:61000-62000(避开系统保留端口)
  • 生产环境应配置防火墙规则放行这些端口
3.2.3 配置dmwatcher.ini

创建守护进程配置文件:

# /data/dmdata/DAMENG/dmwatcher.ini [GRP1] DW_TYPE = LOCAL # 守护类型 DW_MODE = AUTO # 自动模式 INST_OGUID = 20260321 # 唯一标识 INST_INI = /data/dmdata/DAMENG/dm.ini INST_AUTO_RESTART = 1 # 启用自动重启 INST_STARTUP_CMD = /opt/dmdbms/bin/DmServiceDAMENG start

关键参数解析:

  • DW_ERROR_TIME:守护进程判定实例故障的超时时间(秒)
  • INST_RECOVER_TIME:实例恢复后稳定观察期
  • INST_AUTO_RESTART:1表示启用自动重启

4. 数据库OGUID配置

执行以下SQL完成OGUID设置:

-- 使用disql连接数据库 disql SYSDBA/HUN_admin2026@localhost:5237 -- 修改数据库状态并设置OGUID ALTER DATABASE MOUNT; SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',1); SP_SET_OGUID(20260321); -- 与dmwatcher.ini保持一致 SP_SET_PARA_VALUE(1,'ALTER_MODE_STATUS',0); ALTER DATABASE OPEN;

重要提示:OGUID(Object Global Unique Identifier)是守护系统的唯一标识,主备库必须相同。配置错误将导致守护进程无法识别数据库实例。

5. 服务注册与启动

5.1 注册守护服务

使用root执行服务安装:

/opt/dmdbms/script/root/dm_service_installer.sh \ -t dmwatcher \ -p DMSERVER \ -watcher_ini /data/dmdata/DAMENG/dmwatcher.ini

成功输出应包含:

Created symlink /etc/systemd/system/multi-user.target.wants/DmWatcherServiceDMSERVER.service 创建服务(DmWatcherServiceDMSERVER)完成

5.2 服务管理命令

# 设置开机自启 systemctl enable DmWatcherServiceDMSERVER # 启动服务 systemctl start DmWatcherServiceDMSERVER # 检查状态 systemctl status DmWatcherServiceDMSERVER

正常状态显示:

Active: active (running) Process: 执行心跳检测...

6. 功能验证与故障处理

6.1 模拟故障测试

手动终止数据库进程验证自动恢复:

# 查找数据库进程ID ps -ef | grep dmserver # 强制终止进程 kill -9 <PID> # 观察日志(30秒内应触发重启) tail -f /data/dmdata/DAMENG/dm_DMSERVER_202403.log

预期结果:

  1. 守护进程检测到数据库异常
  2. 执行预设的启动命令
  3. 数据库服务恢复正常状态

6.2 常见问题排查

问题1:守护进程无法启动

排查步骤:

  1. 检查配置文件权限:
    chown dmdba:dinstall /data/dmdata/DAMENG/dmwatcher.ini
  2. 验证端口冲突:
    netstat -tunlp | grep -E '5237|65237'
  3. 查看详细日志:
    journalctl -u DmWatcherServiceDMSERVER -n 50
问题2:自动重启失败

可能原因:

  • 启动命令路径错误
  • 数据库实例目录权限不足
  • 磁盘空间已满

解决方案:

# 验证启动命令 ls -l /opt/dmdbms/bin/DmServiceDAMENG # 检查数据目录权限 ls -ld /data/dmdata/DAMENG # 检查磁盘空间 df -h /data

7. 生产环境优化建议

7.1 参数调优建议

; 优化后的dmwatcher.ini配置 [GRP1] DW_CHECK_INTERVAL = 5 # 缩短检测间隔 DW_ERROR_TIME = 15 # 快速故障判定 INST_RECOVER_TIME = 120 # 延长观察期

7.2 监控集成方案

建议将守护进程状态纳入监控系统,通过以下命令获取状态:

dmwatcher status -ini /data/dmdata/DAMENG/dmwatcher.ini

输出示例:

Watcher Group: GRP1 Watcher Type: LOCAL Instance Status: OPEN Last Check Time: 2024-03-21 14:30:22

7.3 日志管理策略

配置日志轮转防止磁盘写满:

# /etc/logrotate.d/dmwatcher /data/dmdata/DAMENG/dmwatcher_*.log { daily rotate 30 compress missingok notifempty }

8. 技术原理深度解析

8.1 心跳检测机制

dmwatcher采用多层级检测策略:

  1. 进程存在性检查:通过PID文件验证进程存活
  2. 端口连通性测试:检测5237端口响应
  3. SQL探活机制:定期执行SELECT 1验证服务可用性

8.2 状态转换逻辑

守护进程状态机包含以下状态:

  • STARTUP:初始启动阶段
  • OPEN:正常服务状态
  • FAILOVER:故障处理中
  • SHUTDOWN:服务关闭

状态转换触发条件:

graph LR STARTUP -->|启动成功| OPEN OPEN -->|检测失败| FAILOVER FAILOVER -->|恢复成功| OPEN FAILOVER -->|恢复失败| SHUTDOWN

8.3 资源隔离保障

守护进程通过以下机制确保自身可靠性:

  • 独立的内存空间
  • 单独的进程调度优先级
  • 看门狗机制(watchdog)防止自身僵死

9. 高级应用场景

9.1 与DM Agent集成

结合达梦管理代理实现集中监控:

# 配置agent监控项 cat >> /opt/dmdbms/conf/dmagent.ini <<EOF [monitor.dmwatcher] enabled = true config_file = /data/dmdata/DAMENG/dmwatcher.ini EOF

9.2 多实例守护配置

单机部署多个实例时的配置示例:

; dmwatcher.ini [GRP1] DW_TYPE = LOCAL INST_INI = /data/dmdata/DB1/dm.ini ... [GRP2] DW_TYPE = LOCAL INST_INI = /data/dmdata/DB2/dm.ini ...

9.3 自定义告警集成

通过脚本扩展告警功能:

# /opt/dmdbms/scripts/watch_alert.sh #!/bin/bash STATUS=$(dmwatcher status -ini $1 | grep "Instance Status") if [[ $STATUS != *"OPEN"* ]]; then # 调用企业微信/webhook发送告警 curl -X POST -H "Content-Type: application/json" \ -d '{"msgtype":"text","text":{"content":"数据库服务异常!"}}' \ https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxx fi

10. 性能影响评估

10.1 资源占用实测

测试环境监控数据(TOP命令输出):

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 1234 dmdba 20 0 256m 32m 10m S 0.3 0.8 0:05.23 dmwatcher

典型资源消耗:

  • CPU占用:<1%
  • 内存占用:30-50MB
  • 网络流量:<1KB/s

10.2 故障恢复时间分解

恢复过程时间分布(测试100次平均值):

阶段耗时(ms)
故障检测15000
进程终止确认200
启动命令执行3000
服务初始化5000
健康检查2000
总恢复时间25200

11. 版本兼容性说明

不同版本的关键差异:

DM版本守护进程特性
V7仅支持GLOBAL守护
V8.0引入LOCAL守护模式
V8.1支持多实例监控
Pack62优化资源占用,降低30%CPU使用率

升级注意事项:

  1. 跨大版本升级需重新配置守护进程
  2. 配置文件格式可能不兼容
  3. 建议先在测试环境验证

12. 安全加固建议

12.1 权限最小化原则

# 配置文件权限设置 chmod 640 /data/dmdata/DAMENG/dmwatcher.ini chown dmdba:dinstall /data/dmdata/DAMENG/dmwatcher.ini # 禁止root直接操作数据库 echo "export DM_SERVICE_PWD=HUN_admin2026" >> ~dmdba/.bash_profile

12.2 网络隔离策略

建议配置:

  • 守护通信端口(65237)限制源IP访问
  • 数据库端口(5237)配置应用白名单
  • 使用VLAN隔离数据库网络

12.3 审计日志配置

启用增强审计:

SP_SET_PARA_VALUE(1,'AUDIT_SYSTEM_OPERATIONS',1); SP_SET_PARA_VALUE(1,'AUDIT_WATCHER_EVENTS',1);

13. 灾备方案扩展

13.1 本地双守护配置

增加备用守护进程:

# 复制配置文件 cp /data/dmdata/DAMENG/dmwatcher.ini /data/dmdata/DAMENG/dmwatcher_bak.ini # 修改端口配置避免冲突 sed -i 's/65237/65238/g' /data/dmdata/DAMENG/dmwatcher_bak.ini # 注册备用服务 dm_service_installer.sh -t dmwatcher -p DMSERVER_BAK \ -watcher_ini /data/dmdata/DAMENG/dmwatcher_bak.ini

13.2 与存储快照集成

定制化恢复脚本示例:

#!/bin/bash # 数据库异常时执行存储快照回滚 vgcreate db_vg /dev/sdb lvcreate -L 100G -n db_lv db_vg dmwatcher stop -ini $1 lvconvert --merge db_vg/db_snapshot dmwatcher start -ini $1

14. 最佳实践总结

经过多个生产环境验证的有效经验:

  1. 配置规范

    • 使用域名而非IP地址配置MAL_HOST
    • OGUID采用日期+业务编码(如20260321)
    • 日志文件单独挂载高性能磁盘
  2. 性能调优

    • 调整DW_CHECK_INTERVAL匹配业务峰值
    • 为守护进程分配独立的CPU核心
    • 禁用不必要的监控项(如表空间检查)
  3. 灾备演练

    • 每月模拟一次故障切换
    • 记录完整的恢复时间指标
    • 定期验证备份有效性
  4. 文档管理

    • 维护配置变更记录表
    • 绘制守护进程架构图
    • 编写标准操作手册(SOP)
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进