Skip to content

MariaDB 物理架构

架构概述

MariaDB的物理架构描述了数据库数据在磁盘上的存储方式和组织形式。了解MariaDB的物理架构对于DBA进行存储管理、性能优化和故障恢复至关重要。MariaDB的物理架构主要包括以下几个方面:

  1. 数据文件结构:表数据、索引数据的存储方式
  2. 表空间管理:InnoDB表空间的组织和管理
  3. 日志文件:二进制日志、重做日志、回滚日志等
  4. 配置文件:MariaDB的配置参数存储
  5. 进程结构:MariaDB服务器的进程组织

数据文件结构

InnoDB存储引擎文件

InnoDB是MariaDB的默认存储引擎,其数据文件结构如下:

1. 系统表空间文件

  • 默认名称:ibdata1, ibdata2, ...
  • 存储内容
    • InnoDB数据字典
    • 双写缓冲区
    • 撤销日志(undo logs)
    • 变更缓冲区(change buffer)
    • 表数据和索引(如果未使用独立表空间)
  • 配置参数
    • innodb_data_file_path:定义系统表空间文件路径和大小
    • innodb_data_home_dir:系统表空间文件存储目录

2. 独立表空间文件

  • 默认名称表名.ibd
  • 存储内容
    • 单个表的数据
    • 单个表的索引
  • 配置参数
    • innodb_file_per_table:启用独立表空间(默认开启)

3. 临时表空间

  • 默认名称:ibtmp1
  • 存储内容
    • 临时表数据
    • 排序和哈希操作的临时结果
  • 配置参数
    • innodb_temp_data_file_path:临时表空间配置

Aria存储引擎文件

1. 数据文件

  • 默认名称表名.MAD
  • 存储内容:表数据

2. 索引文件

  • 默认名称表名.MAI
  • 存储内容:表索引

3. 日志文件

  • 默认名称:aria_log_control, aria_log.00000001
  • 存储内容:Aria引擎的事务日志

MyRocks存储引擎文件

1. SST文件(Sorted String Table)

  • 存储内容:排序的数据和索引
  • 特点
    • 不可变文件
    • 分层存储(L0, L1, ..., LN)
    • 压缩存储

2. WAL文件(Write-Ahead Log)

  • 存储内容:数据修改日志
  • 用途:崩溃恢复

3. MANIFEST文件

  • 存储内容:SST文件的元数据和版本信息

表空间管理

InnoDB表空间类型

1. 系统表空间

  • 特点
    • 共享表空间,可存储多个表的数据和索引
    • 包含InnoDB数据字典
    • 管理复杂,扩展性差
    • 适合小型数据库

2. 独立表空间

  • 特点
    • 每个表有自己的表空间文件
    • 易于管理和维护
    • 支持单独备份和恢复
    • 适合大型数据库
    • 默认开启

3. 通用表空间

  • 特点
    • 可存储多个表的数据和索引
    • 支持不同的页面大小
    • 适合存储相似类型的表

4. 临时表空间

  • 特点
    • 存储临时表和临时结果
    • 服务器重启时自动重建

表空间管理最佳实践

  1. 使用独立表空间:便于管理和维护
  2. 合理设置表空间大小:避免频繁扩展表空间
  3. 定期清理无用数据:释放表空间空间
  4. 监控表空间使用情况:及时发现和解决空间不足问题
  5. 使用分区表:对于大表,考虑使用分区表管理

日志文件

1. 二进制日志(Binlog)

  • 默认名称:binlog.000001, binlog.index
  • 存储内容
    • 所有数据修改操作
    • 表结构变更
  • 用途
    • 主从复制
    • 数据恢复
    • 审计
  • 配置参数
    • log_bin:启用二进制日志
    • binlog_format:二进制日志格式(ROW, STATEMENT, MIXED)
    • expire_logs_days:二进制日志过期时间

2. 重做日志(Redo Log)

  • 默认名称:ib_logfile0, ib_logfile1
  • 存储内容
    • 数据修改操作的重做信息
  • 用途
    • 崩溃恢复
    • 保证事务持久性
  • 配置参数
    • innodb_log_file_size:重做日志文件大小
    • innodb_log_files_in_group:重做日志文件数量

3. 回滚日志(Undo Log)

  • 存储位置:系统表空间或独立回滚表空间
  • 存储内容
    • 事务修改前的数据镜像
  • 用途
    • 事务回滚
    • 多版本并发控制(MVCC)
  • 配置参数
    • innodb_undo_tablespaces:独立回滚表空间数量
    • innodb_undo_log_truncate:启用回滚日志截断

4. 错误日志

  • 默认名称:hostname.err
  • 存储内容
    • 服务器启动和关闭信息
    • 错误和警告信息
    • 严重错误堆栈跟踪
  • 配置参数
    • log_error:错误日志文件路径
    • log_error_verbosity:错误日志详细程度

5. 慢查询日志

  • 默认名称:hostname-slow.log
  • 存储内容
    • 执行时间超过阈值的查询
  • 用途
    • 性能优化
    • 查询分析
  • 配置参数
    • slow_query_log:启用慢查询日志
    • long_query_time:慢查询阈值
    • slow_query_log_file:慢查询日志文件路径

6. 通用查询日志

  • 默认名称:hostname.log
  • 存储内容
    • 所有查询语句
  • 用途
    • 审计
    • 问题排查
  • 配置参数
    • general_log:启用通用查询日志
    • general_log_file:通用查询日志文件路径

配置文件

1. 主配置文件

  • 默认名称
    • Linux/Unix:/etc/my.cnf, /etc/mysql/my.cnf, ~/.my.cnf
    • Windows:my.ini, my.cnf
  • 存储内容
    • MariaDB服务器配置参数
    • 存储引擎配置
    • 日志配置
    • 安全配置

2. 配置文件结构

ini
# 全局配置
[mysqld]
# MariaDB服务器配置

[mysqld_safe]
# mysqld_safe脚本配置

[client]
# 客户端配置

[mysql]
# mysql客户端配置

[mysqldump]
# mysqldump工具配置

3. 配置参数类型

  • 布尔型:如log_bin=1log_bin=ON
  • 数值型:如max_connections=1000
  • 字符串型:如datadir=/var/lib/mysql
  • 枚举型:如binlog_format=ROW

进程结构

1. 主要进程

mysqld

  • 功能:MariaDB服务器主进程
  • 职责
    • 处理客户端连接
    • 执行SQL语句
    • 管理数据存储
    • 处理事务

mysqld_safe

  • 功能:MariaDB服务器的启动脚本
  • 职责
    • 启动mysqld进程
    • 监控mysqld进程状态
    • 自动重启mysqld进程

mysql.server

  • 功能:系统服务脚本
  • 职责
    • 启动、停止和重启MariaDB服务
    • 配置服务自启动

2. 线程结构

  • 主线程

    • 负责服务器启动和关闭
    • 处理后台任务(如检查点、日志刷新)
  • IO线程

    • 处理网络IO
    • 处理磁盘IO
  • 查询线程

    • 执行客户端查询
    • 处理事务
  • 后台线程

    • InnoDB后台线程(如脏页刷新、日志写入)
    • 复制线程(主从复制)
    • 监控线程

数据目录结构

典型数据目录结构

/var/lib/mysql/
├── ibdata1              # 系统表空间文件
├── ib_logfile0          # 重做日志文件
├── ib_logfile1          # 重做日志文件
├── ibtmp1               # 临时表空间文件
├── mysql/               # 系统数据库
├── performance_schema/  # 性能模式数据
├── sys/                 # 系统视图数据库
├── your_database/       # 用户数据库
│   ├── table1.ibd       # 独立表空间文件
│   ├── table2.ibd       # 独立表空间文件
│   └── ...
├── binlog.000001        # 二进制日志文件
├── binlog.index         # 二进制日志索引
├── hostname.err         # 错误日志
├── hostname-slow.log    # 慢查询日志
└── auto.cnf             # 服务器UUID

数据目录配置

ini
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

常见问题

如何查看MariaDB的数据目录?

使用以下命令查看数据目录:

sql
SHOW VARIABLES LIKE 'datadir';

如何修改数据目录?

  1. 停止MariaDB服务
  2. 复制数据目录到新位置
  3. 修改配置文件中的datadir参数
  4. 更新权限
  5. 启动MariaDB服务

如何优化InnoDB表空间?

  • 使用独立表空间
  • 合理设置innodb_file_per_table=1
  • 定期优化表:OPTIMIZE TABLE table_name
  • 对于大表,考虑使用分区表
  • 监控表空间使用情况

如何管理二进制日志?

  • 设置合理的过期时间:expire_logs_days=7
  • 定期手动清理:PURGE BINARY LOGS BEFORE '2023-01-01'
  • 监控二进制日志大小和数量
  • 对于主从复制环境,确保从库已应用所有二进制日志

如何优化日志配置?

  • 合理设置日志级别
  • 启用慢查询日志,但设置合理的阈值
  • 定期归档和清理日志文件
  • 考虑使用日志管理工具(如ELK Stack)

如何查看MariaDB的进程状态?

使用以下命令查看进程状态:

sql
-- 查看服务器状态
SHOW GLOBAL STATUS;

-- 查看当前连接线程
SHOW PROCESSLIST;

-- 查看InnoDB状态
SHOW ENGINE INNODB STATUS;

最佳实践

  1. 合理规划数据目录

    • 选择高性能存储设备
    • 分离数据文件和日志文件到不同磁盘
    • 预留足够的磁盘空间
  2. 优化表空间配置

    • 使用独立表空间
    • 合理设置表空间大小
    • 定期清理无用数据
  3. 优化日志配置

    • 启用必要的日志
    • 设置合理的日志大小和过期时间
    • 定期归档和清理日志
  4. 监控存储使用情况

    • 监控磁盘空间使用
    • 监控表空间增长
    • 设置存储使用告警
  5. 备份数据目录

    • 定期备份整个数据目录
    • 备份配置文件
    • 测试备份恢复
  6. 优化进程配置

    • 根据服务器资源调整max_connections
    • 启用线程池
    • 合理设置线程优先级

结论

了解MariaDB的物理架构对于DBA进行存储管理、性能优化和故障恢复至关重要。通过合理配置数据目录、表空间和日志文件,可以提高MariaDB的性能和可靠性。同时,定期监控存储使用情况和优化配置,可以确保MariaDB在生产环境中稳定运行。