Skip to content

DM 进程架构

进程与线程模型

DM 数据库的进程架构包括以下层次:

  1. 主进程:负责管理整个数据库实例,包括启动和停止其他进程
  2. 辅助进程:负责特定功能,如数据守护、集群管理等
  3. 线程池:主进程内部的线程池,负责处理客户端请求和执行 SQL 语句
  4. 工作线程:线程池中的线程,负责具体的任务执行

架构设计特点

  • 模块化设计:进程和线程功能明确,便于维护和扩展
  • 高效的并发处理:通过线程池实现高并发请求处理
  • 资源隔离:不同功能的进程之间资源隔离,提高可靠性
  • 灵活的配置:支持根据硬件环境调整进程和线程数量
  • 良好的扩展性:支持分布式架构和集群部署

主进程(dmserver)

主进程是 DM 数据库实例的核心进程,负责管理整个数据库实例的运行。所有其他进程和线程都由主进程启动和管理。

主进程功能

功能描述
实例管理负责数据库实例的启动、运行和关闭
资源管理管理内存、CPU、磁盘等系统资源
客户端连接管理接收和管理客户端连接
SQL 执行执行客户端提交的 SQL 语句
事务管理管理数据库事务的开始、提交和回滚
数据完整性维护数据的完整性和一致性
后台任务调度调度和执行后台任务,如检查点、日志归档等
进程间通信与其他进程进行通信和协调

主进程启动流程

  1. 读取配置文件:加载 dm.ini、dmarch.ini 等配置文件
  2. 初始化内存结构:分配内存池、数据缓冲区等内存组件
  3. 启动线程池:创建工作线程、任务线程、IO 线程等
  4. 挂载数据库:打开控制文件,读取数据库结构信息
  5. 恢复数据库:执行崩溃恢复,应用重做日志
  6. 打开数据库:打开数据文件和日志文件,允许客户端连接
  7. 启动后台任务:启动检查点、日志归档等后台任务
  8. 监听端口:开始监听客户端连接请求

主进程关闭流程

  1. 拒绝新连接:不再接受新的客户端连接
  2. 断开现有连接:断开所有现有客户端连接
  3. 停止后台任务:停止检查点、日志归档等后台任务
  4. 刷新内存数据:将内存中的脏数据刷新到磁盘
  5. 关闭文件:关闭数据文件、日志文件和控制文件
  6. 释放资源:释放内存、进程和线程资源
  7. 终止进程:主进程完全关闭

辅助进程

DM 数据库包含多个辅助进程,负责特定的功能,如数据守护、集群管理等。这些进程与主进程协同工作,共同构成完整的数据库系统。

主要辅助进程

进程名称功能适用场景
dmwatch数据守护进程,实现主备同步主备集群环境
dmcss集群同步服务进程,管理集群节点集群环境
dmasmsvr共享存储管理进程,管理共享存储共享存储集群环境
dmmonitor集群监控进程,监控集群状态集群环境
dmrman备份恢复工具进程,执行备份恢复操作所有环境
disql命令行工具进程,执行 SQL 命令所有环境
dmagent代理进程,实现远程管理分布式环境

辅助进程与主进程的关系

  • 启动关系:辅助进程可以由主进程启动,也可以独立启动
  • 通信机制:辅助进程与主进程通过共享内存、消息队列或 TCP/IP 进行通信
  • 依赖关系:辅助进程依赖主进程提供的服务,但主进程不依赖辅助进程
  • 故障影响:辅助进程故障不会导致主进程故障,但会影响相应的功能

线程结构

DM 数据库主进程内部采用多线程架构,通过线程池管理大量线程,提高并发处理能力和资源利用率。

线程类型

线程类型功能配置参数
工作线程处理客户端请求,执行 SQL 语句WORKER_THREADS
任务线程执行后台任务,如检查点、日志归档等TASK_THREADS
IO 线程处理磁盘 I/O 操作IO_THR_GROUPS, IO_THR_INI
定时器线程处理定时任务,如死锁检查、统计信息收集等-
网络线程处理网络连接,接收客户端请求-
日志写入线程负责将重做日志写入磁盘-
归档线程负责将重做日志归档-
检查点线程负责执行检查点操作,刷新脏数据到磁盘-

线程池管理

DM 数据库使用线程池来管理线程,线程池的主要特点包括:

  1. 动态调整:根据负载情况动态调整线程数量
  2. 线程复用:线程可以被多次复用,减少线程创建和销毁的开销
  3. 任务队列:将客户端请求放入任务队列,由线程池中的线程处理
  4. 优先级调度:支持不同优先级的任务调度
  5. 资源限制:通过配置参数限制线程池的大小,避免资源耗尽

线程池配置

可以通过以下参数配置线程池:

sql
-- 设置工作线程数
ALTER SYSTEM SET "WORKER_THREADS" = 16 SPFILE;

-- 设置任务线程数
ALTER SYSTEM SET "TASK_THREADS" = 8 SPFILE;

-- 设置 IO 线程组数
ALTER SYSTEM SET "IO_THR_GROUPS" = 2 SPFILE;

-- 设置每个 IO 线程组的初始线程数
ALTER SYSTEM SET "IO_THR_INI" = 4 SPFILE;

进程间通信

DM 数据库中的进程之间通过多种通信机制进行协调和数据交换,确保各个进程能够协同工作。

通信机制

通信机制特点适用场景
共享内存通信速度快,适合大量数据交换同一主机上的进程通信
信号量用于进程间同步,保护共享资源进程间同步操作
消息队列异步通信,适合不同优先级的消息进程间消息传递
TCP/IP支持跨主机通信,适合分布式环境不同主机上的进程通信
管道简单的单向通信,适合父子进程父子进程间通信

通信协议

DM 数据库使用自定义的通信协议,确保进程间通信的高效性和可靠性:

  1. 消息格式:定义了统一的消息格式,包括消息头、消息体和校验和
  2. 错误处理:包含完善的错误处理机制,确保通信可靠性
  3. 压缩机制:支持消息压缩,减少网络传输开销
  4. 加密机制:支持消息加密,提高通信安全性

进程管理

进程启动

命令行启动

bash
# 启动主进程
cd $DM_HOME/bin
./dmserver $DM_HOME/data/实例名/dm.ini

# 启动数据守护进程
./dmwatch $DM_HOME/data/实例名/dmwatch.ini

# 启动集群同步服务进程
./dmcss $DM_HOME/data/实例名/dmcss.ini

服务方式启动

bash
# 启动主进程服务
dm_service.sh start DmService实例名

# 启动数据守护服务
dm_service.sh start DmWatchService实例名

# 启动集群同步服务
dm_service.sh start DmCSSService实例名

进程监控

命令行监控

bash
# 查看进程状态
ps -ef | grep dmserver
ps -ef | grep dmwatch

# 查看端口监听
netstat -an | grep 5236

# 查看进程资源使用情况
top -p 进程ID

SQL 监控

sql
-- 查询实例状态
SELECT STATUS$ FROM V$INSTANCE;

-- 查询会话信息
SELECT * FROM V$SESSION;

-- 查询线程信息
SELECT * FROM V$THREAD;

进程停止

命令行停止

bash
# 停止主进程
./DmService实例名 stop

# 停止数据守护进程
./DmWatchService实例名 stop

# 强制停止进程
kill -9 进程ID

SQL 停止

sql
-- 关闭数据库实例
SHUTDOWN;

-- 立即关闭数据库实例
SHUTDOWN IMMEDIATE;

-- 强制关闭数据库实例
SHUTDOWN ABORT;

进程架构与性能

进程架构对性能的影响

架构组件对性能的影响优化建议
工作线程数影响并发处理能力根据 CPU 核心数调整,建议设置为 CPU 核心数的 1-2 倍
IO 线程数影响 I/O 吞吐量根据存储设备性能调整,SSD 可以设置更多 IO 线程
线程池大小影响资源利用率根据内存大小调整,避免设置过大导致内存不足
进程数量影响资源消耗只启动必要的进程,避免资源浪费
通信机制影响进程间协作效率根据部署环境选择合适的通信机制

性能优化建议

  1. 调整工作线程数:根据 CPU 核心数和业务负载调整 WORKER_THREADS 参数
  2. 优化 IO 线程:根据存储设备性能调整 IO_THR_GROUPS 和 IO_THR_INI 参数
  3. 合理配置线程池:避免线程池过大导致内存不足和上下文切换开销
  4. 减少进程间通信:优化应用设计,减少进程间通信开销
  5. 使用高效的存储设备:如 SSD,减少 IO 等待时间

进程架构与高可用性

高可用架构中的进程角色

在高可用架构中,DM 数据库的进程架构发生了扩展,增加了用于数据同步和故障切换的进程:

架构类型进程角色功能
主备架构主库 dmserver处理所有写操作,生成重做日志
主备架构备库 dmserver接收主库的重做日志,应用到备库
主备架构dmwatch监控主备库状态,实现自动故障切换
集群架构dmserver集群节点,处理客户端请求
集群架构dmcss集群同步服务,管理集群节点
集群架构dmmonitor集群监控,监控集群状态

故障检测与恢复

DM 数据库通过进程间通信和心跳机制实现故障检测和恢复:

  1. 心跳检测:进程之间定期发送心跳消息,检测对方是否存活
  2. 故障检测:当心跳超时或通信失败时,判定进程故障
  3. 自动恢复:根据故障类型和配置,自动执行恢复操作
  4. 手动干预:支持管理员手动干预故障恢复过程

版本差异

DM 7 vs DM 8 进程架构差异

差异点DM 7DM 8
线程池固定大小的线程池动态调整的线程池
IO 线程单 IO 线程组支持多个 IO 线程组
进程管理基本的进程管理增强的进程管理和监控
高可用进程基础的主备进程完善的高可用进程体系
通信机制基本的通信机制增强的通信机制,支持更多协议

DM 8.1 新特性

  • 优化了线程池,支持动态调整线程数
  • 增强了 IO 线程管理,提高了 I/O 吞吐量
  • 改进了进程间通信机制,提高了通信效率
  • 增强了进程监控,提供了更多监控指标
  • 优化了进程启动和关闭流程,提高了可靠性

常见问题(FAQ)

Q1: 如何查看 DM 数据库的进程信息?

A1: 可以通过以下方式查看:

  1. 命令行:ps -ef | grep dmserverps -ef | grep dmwatch
  2. 管理工具:通过 DM 管理工具查看进程信息
  3. SQL 查询:SELECT * FROM V$INSTANCE;SELECT * FROM V$THREAD;

Q2: 如何调整 DM 数据库的工作线程数?

A2: 可以通过以下方式调整:

  1. 修改配置文件:编辑 dm.ini 文件,修改 WORKER_THREADS 参数
  2. 在线修改:ALTER SYSTEM SET "WORKER_THREADS" = 16 SPFILE;
  3. 重启实例:修改配置文件后需要重启实例才能生效

Q3: DM 数据库有哪些主要进程?

A3: DM 数据库的主要进程包括:

  • dmserver:主进程,管理整个数据库实例
  • dmwatch:数据守护进程,实现主备同步
  • dmcss:集群同步服务进程,管理集群节点
  • dmasmsvr:共享存储管理进程,管理共享存储
  • dmmonitor:集群监控进程,监控集群状态

Q4: 进程故障会导致数据库实例崩溃吗?

A4: 不同进程故障的影响不同:

  • 主进程故障会导致数据库实例崩溃
  • 辅助进程故障不会导致主进程故障,但会影响相应的功能
  • 线程故障会被线程池自动处理,不会导致进程故障

Q5: 如何优化 DM 数据库的进程架构?

A5: 可以通过以下方式优化:

  1. 调整工作线程数和 IO 线程数,根据硬件环境和业务负载优化
  2. 只启动必要的辅助进程,避免资源浪费
  3. 优化存储设备,如使用 SSD,减少 IO 等待时间
  4. 调整线程池参数,提高资源利用率
  5. 优化应用设计,减少进程间通信开销

Q6: 如何监控 DM 数据库的进程资源使用情况?

A6: 可以通过以下方式监控:

  1. 操作系统工具:如 top、ps、perf 等
  2. DM 自带监控视图:如 V$INSTANCE、V$THREAD、V$MEMORY 等
  3. 第三方监控工具:如 Prometheus、Grafana 等
  4. DM 管理工具:通过 DM 管理工具监控进程资源使用情况

Q7: 如何处理进程死锁?

A7: 可以通过以下方式处理:

  1. 使用 SHOW PROCESSLISTSELECT * FROM V$SESSION; 查看进程状态
  2. 使用 ALTER SYSTEM KILL SESSION '会话ID'; 终止死锁进程
  3. 分析死锁原因,优化应用设计
  4. 调整死锁检查间隔参数 DEADLOCK_CHECK_INTERVAL

Q8: 如何配置 DM 数据库的进程优先级?

A8: 可以通过以下方式配置:

  1. 在启动进程时使用操作系统命令设置优先级,如 nice -n -10 ./dmserver
  2. 在配置文件中设置进程优先级参数
  3. 使用操作系统工具调整运行中进程的优先级

Q9: 如何限制 DM 数据库的进程资源使用?

A9: 可以通过以下方式限制:

  1. 使用操作系统的资源限制机制,如 ulimit 命令
  2. 在配置文件中设置资源限制参数,如 MEMORY_POOL、BUFFER 等
  3. 调整线程池参数,限制线程数量
  4. 使用资源管理器,限制用户或角色的资源使用

Q10: 如何扩展 DM 数据库的进程架构以支持更大的负载?

A10: 可以通过以下方式扩展:

  1. 增加服务器硬件资源,如 CPU、内存、存储等
  2. 调整进程和线程参数,优化资源利用率
  3. 采用分布式架构,如读写分离、分库分表等
  4. 使用集群部署,如 DMDSC、DMRAC 等
  5. 优化应用设计,减少数据库负载