外观
DM 进程架构
进程与线程模型
DM 数据库的进程架构包括以下层次:
- 主进程:负责管理整个数据库实例,包括启动和停止其他进程
- 辅助进程:负责特定功能,如数据守护、集群管理等
- 线程池:主进程内部的线程池,负责处理客户端请求和执行 SQL 语句
- 工作线程:线程池中的线程,负责具体的任务执行
架构设计特点
- 模块化设计:进程和线程功能明确,便于维护和扩展
- 高效的并发处理:通过线程池实现高并发请求处理
- 资源隔离:不同功能的进程之间资源隔离,提高可靠性
- 灵活的配置:支持根据硬件环境调整进程和线程数量
- 良好的扩展性:支持分布式架构和集群部署
主进程(dmserver)
主进程是 DM 数据库实例的核心进程,负责管理整个数据库实例的运行。所有其他进程和线程都由主进程启动和管理。
主进程功能
| 功能 | 描述 |
|---|---|
| 实例管理 | 负责数据库实例的启动、运行和关闭 |
| 资源管理 | 管理内存、CPU、磁盘等系统资源 |
| 客户端连接管理 | 接收和管理客户端连接 |
| SQL 执行 | 执行客户端提交的 SQL 语句 |
| 事务管理 | 管理数据库事务的开始、提交和回滚 |
| 数据完整性 | 维护数据的完整性和一致性 |
| 后台任务调度 | 调度和执行后台任务,如检查点、日志归档等 |
| 进程间通信 | 与其他进程进行通信和协调 |
主进程启动流程
- 读取配置文件:加载 dm.ini、dmarch.ini 等配置文件
- 初始化内存结构:分配内存池、数据缓冲区等内存组件
- 启动线程池:创建工作线程、任务线程、IO 线程等
- 挂载数据库:打开控制文件,读取数据库结构信息
- 恢复数据库:执行崩溃恢复,应用重做日志
- 打开数据库:打开数据文件和日志文件,允许客户端连接
- 启动后台任务:启动检查点、日志归档等后台任务
- 监听端口:开始监听客户端连接请求
主进程关闭流程
- 拒绝新连接:不再接受新的客户端连接
- 断开现有连接:断开所有现有客户端连接
- 停止后台任务:停止检查点、日志归档等后台任务
- 刷新内存数据:将内存中的脏数据刷新到磁盘
- 关闭文件:关闭数据文件、日志文件和控制文件
- 释放资源:释放内存、进程和线程资源
- 终止进程:主进程完全关闭
辅助进程
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 数据库使用线程池来管理线程,线程池的主要特点包括:
- 动态调整:根据负载情况动态调整线程数量
- 线程复用:线程可以被多次复用,减少线程创建和销毁的开销
- 任务队列:将客户端请求放入任务队列,由线程池中的线程处理
- 优先级调度:支持不同优先级的任务调度
- 资源限制:通过配置参数限制线程池的大小,避免资源耗尽
线程池配置
可以通过以下参数配置线程池:
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 数据库使用自定义的通信协议,确保进程间通信的高效性和可靠性:
- 消息格式:定义了统一的消息格式,包括消息头、消息体和校验和
- 错误处理:包含完善的错误处理机制,确保通信可靠性
- 压缩机制:支持消息压缩,减少网络传输开销
- 加密机制:支持消息加密,提高通信安全性
进程管理
进程启动
命令行启动
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 进程IDSQL 监控
sql
-- 查询实例状态
SELECT STATUS$ FROM V$INSTANCE;
-- 查询会话信息
SELECT * FROM V$SESSION;
-- 查询线程信息
SELECT * FROM V$THREAD;进程停止
命令行停止
bash
# 停止主进程
./DmService实例名 stop
# 停止数据守护进程
./DmWatchService实例名 stop
# 强制停止进程
kill -9 进程IDSQL 停止
sql
-- 关闭数据库实例
SHUTDOWN;
-- 立即关闭数据库实例
SHUTDOWN IMMEDIATE;
-- 强制关闭数据库实例
SHUTDOWN ABORT;进程架构与性能
进程架构对性能的影响
| 架构组件 | 对性能的影响 | 优化建议 |
|---|---|---|
| 工作线程数 | 影响并发处理能力 | 根据 CPU 核心数调整,建议设置为 CPU 核心数的 1-2 倍 |
| IO 线程数 | 影响 I/O 吞吐量 | 根据存储设备性能调整,SSD 可以设置更多 IO 线程 |
| 线程池大小 | 影响资源利用率 | 根据内存大小调整,避免设置过大导致内存不足 |
| 进程数量 | 影响资源消耗 | 只启动必要的进程,避免资源浪费 |
| 通信机制 | 影响进程间协作效率 | 根据部署环境选择合适的通信机制 |
性能优化建议
- 调整工作线程数:根据 CPU 核心数和业务负载调整 WORKER_THREADS 参数
- 优化 IO 线程:根据存储设备性能调整 IO_THR_GROUPS 和 IO_THR_INI 参数
- 合理配置线程池:避免线程池过大导致内存不足和上下文切换开销
- 减少进程间通信:优化应用设计,减少进程间通信开销
- 使用高效的存储设备:如 SSD,减少 IO 等待时间
进程架构与高可用性
高可用架构中的进程角色
在高可用架构中,DM 数据库的进程架构发生了扩展,增加了用于数据同步和故障切换的进程:
| 架构类型 | 进程角色 | 功能 |
|---|---|---|
| 主备架构 | 主库 dmserver | 处理所有写操作,生成重做日志 |
| 主备架构 | 备库 dmserver | 接收主库的重做日志,应用到备库 |
| 主备架构 | dmwatch | 监控主备库状态,实现自动故障切换 |
| 集群架构 | dmserver | 集群节点,处理客户端请求 |
| 集群架构 | dmcss | 集群同步服务,管理集群节点 |
| 集群架构 | dmmonitor | 集群监控,监控集群状态 |
故障检测与恢复
DM 数据库通过进程间通信和心跳机制实现故障检测和恢复:
- 心跳检测:进程之间定期发送心跳消息,检测对方是否存活
- 故障检测:当心跳超时或通信失败时,判定进程故障
- 自动恢复:根据故障类型和配置,自动执行恢复操作
- 手动干预:支持管理员手动干预故障恢复过程
版本差异
DM 7 vs DM 8 进程架构差异
| 差异点 | DM 7 | DM 8 |
|---|---|---|
| 线程池 | 固定大小的线程池 | 动态调整的线程池 |
| IO 线程 | 单 IO 线程组 | 支持多个 IO 线程组 |
| 进程管理 | 基本的进程管理 | 增强的进程管理和监控 |
| 高可用进程 | 基础的主备进程 | 完善的高可用进程体系 |
| 通信机制 | 基本的通信机制 | 增强的通信机制,支持更多协议 |
DM 8.1 新特性
- 优化了线程池,支持动态调整线程数
- 增强了 IO 线程管理,提高了 I/O 吞吐量
- 改进了进程间通信机制,提高了通信效率
- 增强了进程监控,提供了更多监控指标
- 优化了进程启动和关闭流程,提高了可靠性
常见问题(FAQ)
Q1: 如何查看 DM 数据库的进程信息?
A1: 可以通过以下方式查看:
- 命令行:
ps -ef | grep dmserver、ps -ef | grep dmwatch - 管理工具:通过 DM 管理工具查看进程信息
- SQL 查询:
SELECT * FROM V$INSTANCE;、SELECT * FROM V$THREAD;
Q2: 如何调整 DM 数据库的工作线程数?
A2: 可以通过以下方式调整:
- 修改配置文件:编辑 dm.ini 文件,修改 WORKER_THREADS 参数
- 在线修改:
ALTER SYSTEM SET "WORKER_THREADS" = 16 SPFILE; - 重启实例:修改配置文件后需要重启实例才能生效
Q3: DM 数据库有哪些主要进程?
A3: DM 数据库的主要进程包括:
- dmserver:主进程,管理整个数据库实例
- dmwatch:数据守护进程,实现主备同步
- dmcss:集群同步服务进程,管理集群节点
- dmasmsvr:共享存储管理进程,管理共享存储
- dmmonitor:集群监控进程,监控集群状态
Q4: 进程故障会导致数据库实例崩溃吗?
A4: 不同进程故障的影响不同:
- 主进程故障会导致数据库实例崩溃
- 辅助进程故障不会导致主进程故障,但会影响相应的功能
- 线程故障会被线程池自动处理,不会导致进程故障
Q5: 如何优化 DM 数据库的进程架构?
A5: 可以通过以下方式优化:
- 调整工作线程数和 IO 线程数,根据硬件环境和业务负载优化
- 只启动必要的辅助进程,避免资源浪费
- 优化存储设备,如使用 SSD,减少 IO 等待时间
- 调整线程池参数,提高资源利用率
- 优化应用设计,减少进程间通信开销
Q6: 如何监控 DM 数据库的进程资源使用情况?
A6: 可以通过以下方式监控:
- 操作系统工具:如 top、ps、perf 等
- DM 自带监控视图:如 V$INSTANCE、V$THREAD、V$MEMORY 等
- 第三方监控工具:如 Prometheus、Grafana 等
- DM 管理工具:通过 DM 管理工具监控进程资源使用情况
Q7: 如何处理进程死锁?
A7: 可以通过以下方式处理:
- 使用
SHOW PROCESSLIST或SELECT * FROM V$SESSION;查看进程状态 - 使用
ALTER SYSTEM KILL SESSION '会话ID';终止死锁进程 - 分析死锁原因,优化应用设计
- 调整死锁检查间隔参数 DEADLOCK_CHECK_INTERVAL
Q8: 如何配置 DM 数据库的进程优先级?
A8: 可以通过以下方式配置:
- 在启动进程时使用操作系统命令设置优先级,如
nice -n -10 ./dmserver - 在配置文件中设置进程优先级参数
- 使用操作系统工具调整运行中进程的优先级
Q9: 如何限制 DM 数据库的进程资源使用?
A9: 可以通过以下方式限制:
- 使用操作系统的资源限制机制,如 ulimit 命令
- 在配置文件中设置资源限制参数,如 MEMORY_POOL、BUFFER 等
- 调整线程池参数,限制线程数量
- 使用资源管理器,限制用户或角色的资源使用
Q10: 如何扩展 DM 数据库的进程架构以支持更大的负载?
A10: 可以通过以下方式扩展:
- 增加服务器硬件资源,如 CPU、内存、存储等
- 调整进程和线程参数,优化资源利用率
- 采用分布式架构,如读写分离、分库分表等
- 使用集群部署,如 DMDSC、DMRAC 等
- 优化应用设计,减少数据库负载
