未验证 提交 29495dee 编写于 作者: Y Yuting 提交者: GitHub

docs(About StoneDB): update Chinese docs (#240)

#239
Co-authored-by: Nmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
上级 eed32670
......@@ -4,3 +4,131 @@ sidebar_position: 1.2
---
# 整体架构
![image.png](https://cdn.nlark.com/yuque/0/2022/png/22447227/1657027052362-321b55ab-60f9-4796-aaa7-651d2d3e555c.png#clientId=ue6882c22-0057-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=674&id=u4c1675ef&margin=%5Bobject%20Object%5D&name=image.png&originHeight=588&originWidth=634&originalType=binary&ratio=1&rotation=0&showTitle=false&size=136249&status=done&style=none&taskId=u1fb39fce-bd39-4e47-8e1e-a56cf423cb3&title=&width=727)
StoneDB是一个HTAP数据库,其存储引擎stonedb是一个高性能、高压缩比的列式存储引擎,适用于OLAP应用。和其他的存储引擎如InnoDB、MyISAM一样,stonedb提供了存储引擎所具有的一切功能。从架构上可以看出,逻辑上分为应用层、服务层和存储引擎层。在StoneDB中,一个SQL从发起到最终返回结果,会经历每个逻辑层的不同组件。
# 应用层
## 连接管理
当客户端向服务端发起连接请求后,服务端会从线程池中分配一个线程,这个线程专门负责和这个客户端进行交互。如果客户端断开连接,这个线程也不会被立即销毁,而是被线程池回收,重新分配给新的连接,减少了创建线程和释放线程所花费的时间。
## 用户鉴权
当客户端连接服务端后,服务端会对发起连接的用户进行鉴权处理,鉴权的依据是检查用户名、密码、IP地址及端口是否正确。如果鉴权失败,则拒绝连接。
## 安全管理
当客户端成功连接服务端后,服务端会从权限表里根据用户的权限来判断用户具体可执行哪些操作。
# 服务层
服务层提供了数据库的逻辑功能,StoneDB会使用服务层的相关组件,如系统管理、SQL接口、查询缓存、SQL解析器。<br />注:StoneDB有自己的优化器和执行器,这里不对MySQL的优化器和执行器做介绍。
## Management & Utilities
系统管理的主要作用是提供了丰富的数据库管理功能,如备份与恢复、用户及权限管理、数据库元数据管理等。
## SQL Interface
SQL接口的主要作用是接收用户的SQL并进行处理,得到用户所需要的结果。
## Caches & buffers
查询缓存主要缓存的是SQL语句的hash值和结果集,目的是提高执行效率。当一个SQL被发起,首先会经过hash运算,如果在查询缓存命中,则直接返回,无须再通过解析、优化和执行等阶段,如果在查询缓存不能命中,则需要解析、优化和执行等阶段。然而只要表结构有变更或者表数据有更新,查询缓存就会失效。因此,生产环境建议关闭查询缓存,到了MySQL 8.0已经废弃了查询缓存功能。
## Parser
解析器的主要作用是解析SQL语句,最终生成解析树。解析器会对SQL语句进行词法解析(表、列是否存在)和语法解析(SQL语法是否正确),如果有错误,则返回相应的错误信息。
# 存储引擎层
StoneDB的存储引擎层包括数据解压缩模块、优化器、知识网格等。
## StoneDB Optimizer
StoneDB有自己的优化器,优化器会对SQL语句进行优化,如表达式转化、子查询转连接等,然后基于知识网格技术生成一个高效的执行计划。
## StoneDB Executor
根据优化器产生的执行计划读取数据。
## Knowledge Grid Manager
当数据量达到千万、亿级的时候,在做统计分析执行聚合查询的时候,原生MySQL或其它关系型数据库可能需要几分钟到几十分钟左右才能得到结果集。而StoneDB在同等的数据量和查询语句条件下,比原生MySQL或其它关系型数据库要快数十倍。主要是得益于它的列式存储、数据压缩和知识网格技术。
### Data Pack
数据包用于存放实际数据,是最底层的数据存储单元,每列按照65536行切分成一个数据包。每个数据包比列更小,具有更高的压缩比,而每个数据包又比每行更大,具有更好的查询性能。数据包也是知识网格的解压缩单元。
根据粗糙集的概念,数据包分为以下几类:
1. 不相关的数据包:不满足查询条件的数据包
2. 相关的数据包:满足查询条件的数据包
3. 可疑的数据包:数据包中的数据部分满足查询条件,需要进一步解压缩数据包才能得到满足条件的数据行
通过对数据包的划分,知识网格技术过滤掉不相关的数据包,读取相关的数据包和可疑的数据包。其中相关的数据包不需要解压缩,只读取元数据,不会发生IO,可疑的数据包需要解压缩,会发生IO。
### Data Pack Node
数据包节点也称为元数据节点(Metadata Node),因为数据包节点记录了每个数据包中列的最大值、最小值、平均值、总和、总记录数、null值的数量、压缩方式、占用的字节数。每一个数据包节点对应一个数据包。
### Knowledge Node
数据包节点的上一层是知识节点,记录了数据包之间或者列之间关系的元数据集合,比如值数据包的最小值与最大值的范围、列之间的关联关系。大部分的知识节点数据是装载数据的时候产生的,另外一部分是查询的时候产生的。
知识节点的3种基本类型:
#### 1. Histogram
数据类型为整型、日期型、浮点型的列的统计信息以直方图的形式存在。将一个数据包的最小值到最大值之间分为1024段,每段占用一个bit,如果数据包中的实际值处于段中的范围,则标记为1,否则标记为0。数据被加载时,Histogram被自动创建。
如下的例子中,说明数据包中有值落在0~100和102301~102400两个区间。
| 0‒100 | 101‒200 | 201‒300 | ... | 102301‒102400 |
| --- | --- | --- | --- | --- |
| 1 | 0 | 0 | ... | 1 |
如果想要执行以下SQL:
```sql
select * from table where id>199 and id<299;
```
通过直方图可知,这个查询没有在这个数据包命中,即当前数据包不满足查询条件,这个数据包直接被丢弃。
#### 2. Character Map
数据类型为字符串的列的字符映射表。将字符串按照字符拆分,统计一个数据包内1~64长度中ASCII字符是否存在。如果存在,则标记为1,否则标记为0。数据被加载时,Character Map被自动创建。<br />如下的例子中,说明A在字符串的第1个和第64个位置存在。
| Char/Char pos | 1 | 2 | ... | 64 |
| --- | --- | --- | --- | --- |
| A | 1 | 0 | ... | 1 |
| B | 0 | 1 | ... | 0 |
| C | 1 | 1 | ... | 1 |
| ... | ... | ... | ... | ... |
#### 3. Pack to Pack
包对包关系表示不同表的两个列之间的等值映射表,并以二进制矩阵的形式进行存储,如果符合表关联条件,则标记为1,否则标记为0。包对包关系能帮助在表关联查询的时候快速判断出符合查询条件的数据包,从而提升表关联查询的效率。表关联查询时,Pack to Pack被自动创建。<br />如下的例子中,表关联的查询条件是"A.C=B.D",在A.C1这个数据包中,只有B.D2和B.D5这两个数据包中有符合表关联条件的值。
| | B.D1 | B.D2 | B.D3 | B.D4 | B.D5 |
| --- | --- | --- | --- | --- | --- |
| A.C1 | 0 | 1 | 0 | 0 | 1 |
| A.C2 | 1 | 1 | 0 | 0 | 0 |
| A.C3 | 1 | 1 | 0 | 1 | 1 |
### Knowledge Grid
知识网格是由数据包节点和知识节点组成的。由于数据包都是压缩存放的,所以数据读取解压的代价比较高,在查询中如何做到读取尽量少的数据包是提升效率的关键。知识网格正是起到了这样的一个作用,它能够有效的过滤查询中不符合条件的数据,以最小的代价定位以数据包为最小单位的数据。知识网格的数据大小只占数据总量的1%以下,通常情况下可以加载到内存中,进一步提升查询效率。
对于大部分统计、聚合性查询,StoneDB往往只需要使用知识网格就能返回查询结果,这是因为通过知识网格可以消除或大量减少需要解压的数据包,降低IO消耗,提高查询响应时间和网络利用率。例如:数据包节点记录了最大值、最小值、平均值、总和、总记录数、null值的数量,如果想对某个列做聚合运算,那么知识网格就能根据这些元数据很快的得到结果,而无需再解压访问底层的数据包。
**通过一个例子来理解一个查询语句在存储引擎层使用知识网格技术的查询优化过程。**
有如下的查询语句和数据包节点的数据值分布范围。
```sql
select min(t2.D) from t1,t2 where t1.B=t2.C and t1.A>15;
```
| | Min. | Max. |
| --- | --- | --- |
| t1.A1 | 1 | 9 |
| t1.A2 | 10 | 30 |
| t1.A3 | 40 | 100 |
根据列A的DPN可知,t1.A1属于不相关的数据包,t1.A2属于可疑的数据包,t1.A3属于相关的数据包,这一步就过滤掉数据包t1.A1。
| | t2.C1 | t2.C2 | t2.C3 | t2.C4 | t2.C5 |
| --- | --- | --- | --- | --- | --- |
| t1.B1 | 1 | 1 | 1 | 0 | 1 |
| t1.B2 | 0 | 1 | 0 | 0 | 0 |
| t1.B3 | 1 | 1 | 0 | 0 | 1 |
第一步已经过滤掉数据包t1.A1,这一步就不需要对t1.B1和t2.C1做关联对比,根据包对包关系的映射表可知,这一步过滤掉数据包t2.C3和t2.C4。
那么满足关联条件的数据包有t2.C2和t2.C5。
| | Min. | Max. |
| --- | --- | --- |
| t2.D1 | 0 | 500 |
| t2.D2 | 101 | 440 |
| t2.D3 | 300 | 6879 |
| t2.D4 | 1 | 432 |
| t2.D5 | 3 | 100 |
第一步和第二步已经过滤掉D1、D3、D4,那么只剩下D2和D5,根据列D的DPN可知,D5的最大值100小于D2的最小值101,这一步过滤掉数据包D2。最后只剩下数据包D5,只需要对数据包D5进行解压缩就能得到最终的结果。
## StoneDB Loader Parser
数据导入导出模块,即处理 LOAD DATA INFILE 与 SELECT … INTO FILE 任务。
## Insert Buffer
StoneDB的 Insert Buffer 是为整张表的插入做的优化设计,当向表插入数据时,数据先暂存到 Insert Buffer,然后再从 Insert Buffer 批量刷新到磁盘,从系统的表现来看是吞吐量提高了。如果不经过 Insert Buffer,而是直接写入磁盘,由于StoneDB不支持事务,只能一行接着一行往磁盘写入,系统的吞吐量是不高的,插入效率固然不高。Insert Buffer 由参数stonedb_insert_delayed控制,默认为on表示开启。
## Replication Manager
StoneDB复制管理模块,与MySQL的主从复制架构类似,StoneDB为了保证数据的一致性,会在Master上执行写操作,然后通过复制技术传输到Slave。与MySQL不同的是StoneDB存储引擎存储的不是原始数据,而是压缩后的数据。如果使用binlog的方式来复制,会导致网络上产生大量数据流量,为了解决这个问题,StoneDB实现了基于压缩后数据包的高效数据复制支持,相对于binlog复制,该技术可以大大降低网络传输所需的数据量。
## Compress
数据压缩模块,在StoneDB中,数据是按照列模式进行组织的,这种数据组织形式对各类压缩算法十分友好,可依据数据类型选择合适的高效压缩算法。StoneDB可以支持多达20多种自适应压缩算法,目前主要使用的有PPM、LZ4、B2、Delta等。如果列的重复值越高,压缩效果越好。数据压缩后,不仅可以节约存储成本,还可以节约IO和内存。
## Decompress
数据解压缩模块,数据压缩和解压缩的单位是数据包。知识网格技术过滤掉不相关的数据包后,对可疑的数据包需要解压缩才能得到符合查询的结果集。
......@@ -5,46 +5,46 @@ sidebar_position: 1.1
# StoneDB 简介
StoneDB 是由石原子科技公司自主设计、研发的国内首款基于 MySQL 内核打造的开源 HTAP(Hybrid Transactional and Analytical Processing)融合型数据库,可实现与 MySQL 的无缝切换。StoneDB 具备超高性能、实时分析等特点,为用户提供一站式HTAP解决方案。
StoneDB是由石原子科技公司自主设计、研发的国内首款基于MySQL内核打造的开源HTAP(Hybrid Transactional and Analytical Processing)融合型数据库,可实现与MySQL的无缝切换。StoneDB具备超高性能、实时分析等特点,为用户提供一站式HTAP解决方案。
StoneDB 是 100% 兼容 MySQL 5.6、5.7协议和 MySQL 生态等重要特性,支持 MySQL 常用的功能及语法,支持 MySQL 生态中的系统工具和客户端,如 Navicat、Workbench、mysqldump、mydumper。由于 100% 兼容 MySQL,因此 StoneDB 的所有工作负载都可以继续使用 MySQL 数据库体系运行。
StoneDB是100%兼容MySQL 5.6、5.7协议和MySQL生态等重要特性,支持MySQL常用的功能及语法,支持MySQL生态中的系统工具和客户端,如Navicat、Workbench、mysqldump、mydumper。由于100%兼容MySQL,因此StoneDB的所有工作负载都可以继续使用MySQL数据库体系运行。
StoneDB 专门针对 OLAP 应用程序进行了设计和优化,支持百亿数据场景下进行高性能、多维度字段组合的复杂查询,相对比社区版的 MySQL,其查询速度提升了十倍以上。
StoneDB专门针对OLAP应用程序进行了设计和优化,支持百亿数据场景下进行高性能、多维度字段组合的复杂查询,相对比社区版的MySQL,其查询速度提升了十倍以上。
StoneDB 采用基于知识网格技术和列式存储引擎,该存储引擎为海量数据背景下 OLAP 应用而设计,通过列式存储数据、知识网格过滤、高效数据压缩等技术,为应用系统提供低成本和高性能的数据查询支持。
StoneDB采用基于知识网格技术和列式存储引擎,该存储引擎为海量数据背景下OLAP应用而设计,通过列式存储数据、知识网格过滤、高效数据压缩等技术,为应用系统提供低成本和高性能的数据查询支持。
## 产品优势
# 产品优势
- 完全兼容 MySQL
- 完全兼容MySQL
StoneDB 是在原生的 MySQL 中加入的存储引擎,最终集成为 HTAP 数据库,因此是 100% 兼容 MySQL 的。支持标准数据库接口,包括 ODBC、JDBC 和本地连接。支持 API 接口,包括 C、C++、C#、Java、PHP、Perl 等。StoneDB 全面支持 ANSI SQL-92 标准和 SQL-99 扩展标准中视图和存储过程,这种支持使得现有应用程序无需修改应用代码即可使用 StoneDB,从而可实现与 MySQL 的无缝切换。
StoneDB是在原生的MySQL中加入的存储引擎,最终集成为HTAP数据库,因此是100%兼容MySQL的。支持标准数据库接口,包括ODBC、JDBC和本地连接。支持API接口,包括C、C++、C#、Java、PHP、Perl等。StoneDB全面支持ANSI SQL-92标准和SQL-99扩展标准中视图和存储过程,这种支持使得现有应用程序无需修改应用代码即可使用StoneDB,从而可实现与MySQL的无缝切换。
- 实时HTAP
同时提供行式存储引擎 InnoDB 和列式存储引擎 StoneDB,通过 binlog 从 InnoDB 复制数据,保证行式存储引擎 InnoDB 和列式存储引擎 StoneDB 之间的数据强一致性。
同时提供行式存储引擎InnoDB和列式存储引擎StoneDB,通过binlog从InnoDB复制数据,保证行式存储引擎InnoDB和列式存储引擎StoneDB之间的数据强一致性。
- 高性能查询
在千万、亿级甚至更多数据量下进行复杂查询时,相比 MySQL,其查询速度提升了十倍以上。
在千万、亿级甚至更多数据量下进行复杂查询时,相比MySQL,其查询速度提升了十倍以上。
- 低存储成本
对数据最高可实现 40 倍压缩,极大的节省了数据存储空间和企业的成本。
对数据最高可实现40倍压缩,极大的节省了数据存储空间和企业的成本。
## 核心技术
# 核心技术
- 列式存储
列式存储在存储数据时是按照列模式将数据存储到磁盘上的,读取数据时,只需要读取需要的字段,极大减少了网络带宽和磁盘 IO 的压力。基于列式存储无需为列再创建索引和维护索引。
列式存储在存储数据时是按照列模式将数据存储到磁盘上的,读取数据时,只需要读取需要的字段,极大减少了网络带宽和磁盘IO的压力。基于列式存储无需为列再创建索引和维护索引。
- 高效的数据压缩比
在关系型数据库中,同一列中的数据属于同一种数据类型,如果列中的重复值越多,则压缩比越高,而压缩比越高,数据量就越小,数据被读取时,对网络带宽和磁盘 IO 的压力也就越小。由于列式存储比行式存储有着十倍甚至更高的压缩比,StoneDB 节省了大量的存储空间,降低了存储成本。
在关系型数据库中,同一列中的数据属于同一种数据类型,如果列中的重复值越多,则压缩比越高,而压缩比越高,数据量就越小,数据被读取时,对网络带宽和磁盘IO的压力也就越小。由于列式存储比行式存储有着十倍甚至更高的压缩比,StoneDB节省了大量的存储空间,降低了存储成本。
- 知识网格
知识网格根据元数据信息进行粗糙集过滤查询中不符合条件的数据,最后只需要对可疑的数据包进行解压获取符合查询条件的数据,大量减少读取 IO 操作,提高查询响应时间和网络利用率。
知识网格根据元数据信息进行粗糙集过滤查询中不符合条件的数据,最后只需要对可疑的数据包进行解压获取符合查询条件的数据,大量减少读取IO操作,提高查询响应时间和网络利用率。
- 基于推送的矢量化查询处理
StoneDB通过执行计划将矢量块(列式数据切片)从一个运算符推送到另一个运算符来处理查询,与基于元组的处理模型相比,基于推送的执行模型避免了深度调用堆栈,并节省了资源。
StoneDB通过执行计划将矢量块(列式数据切片)从一个运算符推送到另一个运算符来处理查询,与基于元组的处理模型相比,基于推送的执行模型避免了深度调用堆栈,并节省了资源。
\ No newline at end of file
......@@ -5,55 +5,92 @@ sidebar_position: 1.3
# 使用限制
由于StoneDB是在原生的MySQL中加入的存储引擎,因此是高度兼容MySQL 5.6、5.7协议和MySQL生态等重要特性,支持MySQL常用的功能及语法,但由于StoneDB本身的一些特性,部分操作和功能尚未得到支持,以下列出的是不兼容MySQL的操作和功能。
## 不支持的DDL
# 不支持的DDL
1. 修改字段的数据类型
2. 修改字段的长度
3. 修改表/字段的字符集
4. 转换表的字符集
5. optimize table
6. analyze table
7. lock table
8. repair table
9. CTAS
10. 重组表
11. 重命名字段
12. 设置字段的默认值
13. 设置字段为空
14. 设置字段非空
15. 添加唯一约束
16. 删除唯一约束
17. 创建索引
18. 删除索引
19. 表修改注释
StoneDB是列式存储,数据是被高度压缩的,因此表和列的相关属性不易被修改,在表设计阶段尽可能定义好字符集、数据类型、约束和索引等。
## 不支持的DML
# 不支持的DML
1. delete
2. update关联子查询
3. update多表关联
4. replace into
StoneDB不适用于有频繁的更新操作,因为对列式存储来说,更新需要找到对应的每一列,然后分多次更新,而行式存储由于一行紧挨着一行,找到对应的page或者block就可直接在行上更新,因此StoneDB只支持了常规用的单表update和insert。
## 不支持跨存储引擎关联查询
# 不支持跨存储引擎关联查询
StoneDB默认不支持跨存储引擎关联查询,也就是说InnoDB存储引擎下的表和StoneDB存储引擎下的表进行关联查询会报错。可在stonedb.cnf参数文件里定义stonedb_ini_allowmysqlquerypath=1,这样就支持跨存储引擎表之间的关联查询了。
## 不支持的对象
# 不支持的对象
1. 全文索引
2. 唯一约束
3. 触发器
4. 临时表
5. 含有自定义函数的存储过程
6. 含有SQL的自定义函数
## 不支持的数据类型
# 不支持的数据类型
1. 位类型bit
2. 枚举型enum
3. 集合型set
4. decimal精度必须小于或等于18,否则不支持,如decimal(18,x)
5. 创建表时不支持使用关键字unsigned、zerofill
## 不支持事务
4. json类型
5. decimal精度必须小于或等于18,否则不支持,如decimal(18,x)
6. 创建表时不支持使用关键字unsigned、zerofill
# 不支持事务
只有严格遵守ACID四大属性,才能真正的支持事务。而StoneDB由于没有redo和undo,是不支持事务的。
## 不支持分区
# 不支持分区
列式存储不支持分区。
## 不支持行锁、表锁
# 不支持行锁、表锁
列式存储不支持行锁、表锁。
## 只支持statement的binlog格式
# 只支持statement的binlog格式
列式存储不支持row、mixed格式的binlog。
......@@ -4,3 +4,39 @@ sidebar_position: 1.4
---
# 常见术语介绍
- **行**:行是一组相关的数据,一行行数据组成了一张表。
- **列**:列也被称为字段,关系型数据库中,创建每个列需要定义数据类型和长度。
- **表**:由行与列组成,是数据库中用来存储数据的对象,是整个数据库系统的基础。
- **视图**:是一个虚拟表,实际不存储数据,其内容由查询定义。
- **存储过程**: 一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名称并设置参数来执行它。
- **数据库**:是各个数据库对象的集合,数据库对象包括表、视图、存储过程等。
- **实例**:是数据库的集合。
- **数据页**:是数据库管理的基本单位,默认大小为16KB。
- **数据文件**:存放实实在在的数据,默认情况下,每张表对应一个数据文件,数据文件是一个物理概念。
- **表空间**:表空间是逻辑存储单元,默认情况下,每张表对应一个表空间。
- **事务**:一个事务由一组DML组成,其严格遵循ACID四大属性,以提交或者回滚结束,其中DDL存在隐式提交。
- **字符集**:字符的编码规则
- **校对规则**:对字符集中的字符比较大小的一种规则
- **列式存储**:存储数据时是按照列模式将数据存储到磁盘上的。
- **数据压缩**:减少数据文件的大小即为数据压缩,数据压缩比由数据类型、数据重复度、压缩算法决定。
- **OLTP** :On-Line Transaction Processing ,指的是在线事务处理过程,其主要特征是交互式的快速响应,大并发的小型事务处理,典型的业务系统是银行交易系统。
- **OLAP** :On-Line Analytical Processing,指的是在线分析处理过程,其主要特征是对海量数据进行复查的分析查询,典型的业务系统是数据仓库系统。
- **HTAP**:Hybrid Transaction/Analytical Processing,指的是混合事务和分析处理过程,是一种新型的应用程序架构,出现HTAP的目的是打破OLTP和OLAP之间的壁垒。
......@@ -3,7 +3,7 @@ id: download
sidebar_position: 100
---
# 即将发布
# 立即下载
## StoneDB
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册