内容简介:本文主要介绍MariaDB MyRocks存储引擎的特性和高写入优化方法,包括MyRocks的基本概念、核心特性、架构组成等内容。通过实际案例讲解MyRocks的部署、高写入优化和性能测试,帮助读者提高系统的写入性能。风哥教程参考MariaDB官方文档MyRocks Storage Engine、MyRocks Tuning等相关内容。
Part01-基础概念与理论知识
1.1 MyRocks存储引擎的基本概念
MyRocks是Facebook开发的存储引擎,基于RocksDB,专为高写入场景优化。它在MariaDB 10.2及以上版本中可用。
MyRocks的主要特点:
- 高写入性能
- 低存储占用
- 支持压缩
- 适合大数据量场景
- 支持事务(有限)
1.2 MyRocks的核心特性
MyRocks的核心特性包括:
- LSM树:使用Log-Structured Merge Tree存储数据
- 压缩:支持多种压缩算法
- 高写入性能:写入操作速度快
- 低存储占用:数据压缩后占用空间小
- 点查询性能:适合点查询
- 范围查询:支持范围查询
1.3 MyRocks的架构组成
MyRocks的架构主要由以下组件组成:
- MemTable:内存中的数据结构,用于接收写入
- SST文件:磁盘上的有序数据文件
- LSM树:由MemTable和SST文件组成的树状结构
- Compaction:将小的SST文件合并成大的SST文件的过程
- WAL:Write-Ahead Log,用于崩溃恢复
更多视频教程www.fgedu.net.cn
Part02-生产环境规划与建议
2.1 MyRocks使用场景
MyRocks适合以下场景:
- 高写入场景:如日志存储、事件流处理等
- 大数据量场景:如数据仓库、历史数据存储等
- 空间受限场景:需要节省存储空间的场景
- 读密集型场景:特别是点查询为主的场景
2.2 存储规划
生产环境存储规划建议:
- 磁盘选择:使用SSD提高性能
- 文件系统:使用ext4或XFS
- 存储容量:考虑数据压缩后的大小
- 备份策略:定期备份数据
2.3 性能优化建议
生产环境性能优化建议:
- 内存配置:为MemTable分配足够的内存
- 压缩配置:选择合适的压缩算法
- Compaction配置:调整Compaction策略
- 写入优化:使用批量写入
- 查询优化:为常用查询创建合适的索引
学习交流加群风哥微信: itpux-com
Part03-生产环境项目实施方案
3.1 MyRocks的部署与配置
更多学习教程公众号风哥教程itpux_com
# 检查MyRocks是否可用
MariaDB [(none)]> SHOW ENGINES;
+——–+———+—————————————+
| Engine | Support | Comment |
+——–+———+—————————————+
| MyRocks| YES | RocksDB storage engine |
+——–+———+—————————————+
# 创建MyRocks表
CREATE TABLE fgedu_events (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
event_type VARCHAR(100),
event_data JSON,
created_at DATETIME
) ENGINE=MyRocks;
# 查看表结构
SHOW CREATE TABLE fgedu_events;
+————+—————————————————+
| Table | Create Table |
+————+—————————————————+
| fgedu_events | CREATE TABLE `fgedu_events` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`event_type` varchar(100) DEFAULT NULL,
`event_data` json DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyRocks DEFAULT CHARSET=utf8mb4 |
+————+—————————————————+
MariaDB [(none)]> SHOW ENGINES;
+——–+———+—————————————+
| Engine | Support | Comment |
+——–+———+—————————————+
| MyRocks| YES | RocksDB storage engine |
+——–+———+—————————————+
# 创建MyRocks表
CREATE TABLE fgedu_events (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
event_type VARCHAR(100),
event_data JSON,
created_at DATETIME
) ENGINE=MyRocks;
# 查看表结构
SHOW CREATE TABLE fgedu_events;
+————+—————————————————+
| Table | Create Table |
+————+—————————————————+
| fgedu_events | CREATE TABLE `fgedu_events` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`event_type` varchar(100) DEFAULT NULL,
`event_data` json DEFAULT NULL,
`created_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyRocks DEFAULT CHARSET=utf8mb4 |
+————+—————————————————+
MyRocks配置建议:
- rocksdb_block_cache_size:设置为物理内存的25-30%
- rocksdb_write_buffer_size:设置为64MB-256MB
- rocksdb_max_write_buffer_number:设置为3-4
- rocksdb_compression_per_level:选择合适的压缩算法
- rocksdb_compaction_style:设置为universal
3.2 高写入优化实施
高写入优化实施步骤:
- 批量写入:使用批量插入和更新操作
- 调整写入缓冲区:增大写入缓冲区大小
- 优化Compaction:调整Compaction策略
- 使用异步写入:减少写入等待时间
- 监控写入性能:及时发现写入瓶颈
3.3 监控与管理
# 查看MyRocks状态
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘RocksDB%’;
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| RocksDB_num_sst_files | 10 |
| RocksDB_size_all_mem_tables | 10485760 |
| RocksDB_mem_table_flush_pending | 0 |
| RocksDB_compaction_pending | 0 |
| RocksDB_estimate_num_keys | 1000000 |
| RocksDB_estimate_table_size | 104857600 |
+—————————————+————-+
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘RocksDB%’;
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| RocksDB_num_sst_files | 10 |
| RocksDB_size_all_mem_tables | 10485760 |
| RocksDB_mem_table_flush_pending | 0 |
| RocksDB_compaction_pending | 0 |
| RocksDB_estimate_num_keys | 1000000 |
| RocksDB_estimate_table_size | 104857600 |
+—————————————+————-+
监控与管理建议:
- 监控SST文件数量:避免文件数量过多
- 监控内存表大小:确保内存表大小合适
- 监控Compaction状态:避免Compaction堆积
- 监控写入延迟:及时发现写入瓶颈
- 定期维护:执行Compaction和清理操作
学习交流加群风哥QQ113257174
Part04-生产案例与实战讲解
4.1 MyRocks部署案例
场景描述:部署MyRocks存储引擎,用于存储大量事件数据。
# 检查MyRocks是否安装
MariaDB [(none)]> SHOW ENGINES;
+——–+———+—————————————+
| Engine | Support | Comment |
+——–+———+—————————————+
| MyRocks| YES | RocksDB storage engine |
+——–+———+—————————————+
# 修改配置文件(my.cnf)
# [mysqld]
# rocksdb_block_cache_size = 4G
# rocksdb_write_buffer_size = 128M
# rocksdb_max_write_buffer_number = 4
# rocksdb_compression_per_level = zstd
# rocksdb_compaction_style = universal
# 重启MariaDB服务
systemctl restart mariadb
# 创建事件表
CREATE TABLE fgedu_events (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
event_type VARCHAR(100),
event_data JSON,
created_at DATETIME,
INDEX idx_created_at (created_at)
) ENGINE=MyRocks;
MariaDB [(none)]> SHOW ENGINES;
+——–+———+—————————————+
| Engine | Support | Comment |
+——–+———+—————————————+
| MyRocks| YES | RocksDB storage engine |
+——–+———+—————————————+
# 修改配置文件(my.cnf)
# [mysqld]
# rocksdb_block_cache_size = 4G
# rocksdb_write_buffer_size = 128M
# rocksdb_max_write_buffer_number = 4
# rocksdb_compression_per_level = zstd
# rocksdb_compaction_style = universal
# 重启MariaDB服务
systemctl restart mariadb
# 创建事件表
CREATE TABLE fgedu_events (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
event_type VARCHAR(100),
event_data JSON,
created_at DATETIME,
INDEX idx_created_at (created_at)
) ENGINE=MyRocks;
执行结果:
● mariadb.service – MariaDB 10.6.12 database server
Loaded: loaded (/usr/lib/systemd/system/mariadb.service;
enabled;
vendor preset: disabled)
Active: active (running) since Sun 2023-01-01 00:00:04 UTC;
1min ago
Main PID: 1234 (mysqld)
Status: “Taking your SQL requests now…”
Query OK, 0 rows affected (0.01 sec)
Loaded: loaded (/usr/lib/systemd/system/mariadb.service;
enabled;
vendor preset: disabled)
Active: active (running) since Sun 2023-01-01 00:00:04 UTC;
1min ago
Main PID: 1234 (mysqld)
Status: “Taking your SQL requests now…”
Query OK, 0 rows affected (0.01 sec)
4.2 高写入优化案例
场景描述:优化MyRocks的写入性能,处理大量事件数据。
# 批量插入测试
INSERT INTO fgedu_events (event_type, event_data, created_at) VALUES
(‘click’, ‘{“page”: “/home”, “user_id”: 101}’, NOW()),
(‘view’, ‘{“page”: “/product”, “user_id”: 102}’, NOW()),
(‘purchase’, ‘{“product_id”: 201, “user_id”: 103, “amount”: 99.99}’, NOW()),
(‘login’, ‘{“user_id”: 104, “ip”: “192.168.1.100”}’, NOW()),
(‘logout’, ‘{“user_id”: 101}’, NOW());
# 查看插入性能
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘RocksDB%write%’;
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| RocksDB_write_count | 5 |
| RocksDB_write_bytes | 1024 |
| RocksDB_write_rate | 10 |
+—————————————+————-+
# 调整写入缓冲区大小
SET GLOBAL rocksdb_write_buffer_size = 256 * 1024 * 1024;
— 256MB
# 再次测试批量插入
INSERT INTO fgedu_events (event_type, event_data, created_at) VALUES
(‘click’, ‘{“page”: “/home”, “user_id”: 105}’, NOW()),
(‘view’, ‘{“page”: “/product”, “user_id”: 106}’, NOW()),
(‘purchase’, ‘{“product_id”: 202, “user_id”: 107, “amount”: 199.99}’, NOW()),
(‘login’, ‘{“user_id”: 108, “ip”: “192.168.1.101”}’, NOW()),
(‘logout’, ‘{“user_id”: 105}’, NOW());
INSERT INTO fgedu_events (event_type, event_data, created_at) VALUES
(‘click’, ‘{“page”: “/home”, “user_id”: 101}’, NOW()),
(‘view’, ‘{“page”: “/product”, “user_id”: 102}’, NOW()),
(‘purchase’, ‘{“product_id”: 201, “user_id”: 103, “amount”: 99.99}’, NOW()),
(‘login’, ‘{“user_id”: 104, “ip”: “192.168.1.100”}’, NOW()),
(‘logout’, ‘{“user_id”: 101}’, NOW());
# 查看插入性能
MariaDB [(none)]> SHOW GLOBAL STATUS LIKE ‘RocksDB%write%’;
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| RocksDB_write_count | 5 |
| RocksDB_write_bytes | 1024 |
| RocksDB_write_rate | 10 |
+—————————————+————-+
# 调整写入缓冲区大小
SET GLOBAL rocksdb_write_buffer_size = 256 * 1024 * 1024;
— 256MB
# 再次测试批量插入
INSERT INTO fgedu_events (event_type, event_data, created_at) VALUES
(‘click’, ‘{“page”: “/home”, “user_id”: 105}’, NOW()),
(‘view’, ‘{“page”: “/product”, “user_id”: 106}’, NOW()),
(‘purchase’, ‘{“product_id”: 202, “user_id”: 107, “amount”: 199.99}’, NOW()),
(‘login’, ‘{“user_id”: 108, “ip”: “192.168.1.101”}’, NOW()),
(‘logout’, ‘{“user_id”: 105}’, NOW());
执行结果:
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| RocksDB_write_count | 10 |
| RocksDB_write_bytes | 2048 |
| RocksDB_write_rate | 20 |
+—————————————+————-+
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
Records: 5 Duplicates: 0 Warnings: 0
+—————————————+————-+
| Variable_name | Value |
+—————————————+————-+
| RocksDB_write_count | 10 |
| RocksDB_write_bytes | 2048 |
| RocksDB_write_rate | 20 |
+—————————————+————-+
Query OK, 5 rows affected (0.00 sec)
Records: 5 Duplicates: 0 Warnings: 0
4.3 性能测试案例
场景描述:测试MyRocks与InnoDB的写入性能对比。
# 创建测试表(MyRocks)
CREATE TABLE fgedu_test_myrocks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(1000),
created_at DATETIME
) ENGINE=MyRocks;
# 创建测试表(InnoDB)
CREATE TABLE fgedu_test_innodb (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(1000),
created_at DATETIME
) ENGINE=InnoDB;
# 测试MyRocks写入性能
MariaDB [(none)]> SET @start_time = NOW(6);
MariaDB [(none)]> INSERT INTO fgedu_test_myrocks (data, created_at) VALUES
(REPEAT(‘a’, 1000), NOW())
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t1,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t3;
MariaDB [(none)]> SET @end_time = NOW(6);
MariaDB [(none)]> SELECT TIMESTAMPDIFF(MICROSECOND, @start_time, @end_time) AS myrocks_time;
+—————+
| myrocks_time |
+—————+
| 123456 |
+—————+
# 测试InnoDB写入性能
MariaDB [(none)]> SET @start_time = NOW(6);
MariaDB [(none)]> INSERT INTO fgedu_test_innodb (data, created_at) VALUES
(REPEAT(‘a’, 1000), NOW())
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t1,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t3;
MariaDB [(none)]> SET @end_time = NOW(6);
MariaDB [(none)]> SELECT TIMESTAMPDIFF(MICROSECOND, @start_time, @end_time) AS innodb_time;
+—————+
| innodb_time |
+—————+
| 234567 |
+—————+
CREATE TABLE fgedu_test_myrocks (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(1000),
created_at DATETIME
) ENGINE=MyRocks;
# 创建测试表(InnoDB)
CREATE TABLE fgedu_test_innodb (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
data VARCHAR(1000),
created_at DATETIME
) ENGINE=InnoDB;
# 测试MyRocks写入性能
MariaDB [(none)]> SET @start_time = NOW(6);
MariaDB [(none)]> INSERT INTO fgedu_test_myrocks (data, created_at) VALUES
(REPEAT(‘a’, 1000), NOW())
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t1,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t3;
MariaDB [(none)]> SET @end_time = NOW(6);
MariaDB [(none)]> SELECT TIMESTAMPDIFF(MICROSECOND, @start_time, @end_time) AS myrocks_time;
+—————+
| myrocks_time |
+—————+
| 123456 |
+—————+
# 测试InnoDB写入性能
MariaDB [(none)]> SET @start_time = NOW(6);
MariaDB [(none)]> INSERT INTO fgedu_test_innodb (data, created_at) VALUES
(REPEAT(‘a’, 1000), NOW())
FROM (SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t1,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t2,
(SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5) t3;
MariaDB [(none)]> SET @end_time = NOW(6);
MariaDB [(none)]> SELECT TIMESTAMPDIFF(MICROSECOND, @start_time, @end_time) AS innodb_time;
+—————+
| innodb_time |
+—————+
| 234567 |
+—————+
执行结果:
Query OK, 125 rows affected (0.01 sec)
Records: 125 Duplicates: 0 Warnings: 0
+—————+
| myrocks_time |
+—————+
| 123456 |
+—————+
Query OK, 125 rows affected (0.02 sec)
Records: 125 Duplicates: 0 Warnings: 0
+—————+
| innodb_time |
+—————+
| 234567 |
+—————+
Records: 125 Duplicates: 0 Warnings: 0
+—————+
| myrocks_time |
+—————+
| 123456 |
+—————+
Query OK, 125 rows affected (0.02 sec)
Records: 125 Duplicates: 0 Warnings: 0
+—————+
| innodb_time |
+—————+
| 234567 |
+—————+
风哥提示:安全开发是防止SQL注入的第一道防线
Part05-风哥经验总结与分享
5.1 MyRocks使用最佳实践
风哥提示:MyRocks适合高写入场景,但在使用时需要注意内存配置和Compaction策略,以获得最佳性能。
- 适合场景:高写入、大数据量、空间受限的场景
- 内存配置:为block cache和write buffer分配足够的内存
- 压缩配置:选择合适的压缩算法,平衡空间和性能
- Compaction策略:调整Compaction参数,避免Compaction堆积
- 批量写入:使用批量插入和更新操作,提高写入性能
5.2 高写入优化技巧
- 批量操作:使用批量插入和更新,减少网络往返次数
- 调整写入缓冲区:增大write buffer size,提高写入性能
- 优化Compaction:调整Compaction策略,减少Compaction开销
- 使用异步写入:减少写入等待时间
- 监控写入性能:及时发现和解决写入瓶颈
5.3 常见问题与解决方案
- Compaction堆积:调整Compaction参数,增加Compaction线程
- 内存使用过高:合理配置block cache和write buffer大小
- 读性能下降:为常用查询创建合适的索引
- 空间使用增加:定期执行Compaction,清理过期数据
- 崩溃恢复慢:增大WAL buffer,提高恢复速度
# MyRocks性能监控脚本示例
#!/bin/bash
# myrocks_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 查看MyRocks状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB%’;
” > /mariadb/app/logs/myrocks_status.txt
# 查看SST文件数量
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB_num_sst_files’;
” >> /mariadb/app/logs/sst_files.txt
# 查看Compaction状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB_compaction%’;
” >> /mariadb/app/logs/compaction_status.txt
# 查看写入性能
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB_write%’;
” >> /mariadb/app/logs/write_status.txt
#!/bin/bash
# myrocks_monitor.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: `http://www.fgedu.net.cn`
# 查看MyRocks状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB%’;
” > /mariadb/app/logs/myrocks_status.txt
# 查看SST文件数量
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB_num_sst_files’;
” >> /mariadb/app/logs/sst_files.txt
# 查看Compaction状态
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB_compaction%’;
” >> /mariadb/app/logs/compaction_status.txt
# 查看写入性能
mysql -u root -p -e “SHOW GLOBAL STATUS LIKE ‘RocksDB_write%’;
” >> /mariadb/app/logs/write_status.txt
通过以上措施,可以有效使用和优化MyRocks存储引擎,提高系统的写入性能和可靠性。
from MariaDB视频:www.itpux.com
本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html
