Tencent / 3TS

腾讯事务处理技术验证系统(Tencent Transaction Processing Testbed System)
Other
145 stars 53 forks source link

Added MariaDB, Cassandra and YugabyteDB results #31

Closed zzhuncle closed 1 year ago

zzhuncle commented 1 year ago

MariaDB数据库测试说明

测试环境

Ubuntu 20.04 | MariaDB 10.5.22 | unixODBC 2.3.6

数据库简介

MariaDB 是一个开源的关系数据库管理系统(RDBMS),由 MySQL 的原始开发者创建,作为 MySQL 的一个分支。MariaDB 的创建是为了保持开放源代码的自由性,这是由于 Oracle 公司收购了 MySQL 的母公司 Sun MicrosystemsMariaDB 的开发目标是与 MySQL 数据库完全兼容,保证开源性,以及保持开放和透明的开发模式。

MariaDB 设计上对 MySQL 有很高的兼容性,它能够直接替换 MySQL,且大多数 MySQL 代码、表和API等在 MariaDB 中都可以直接使用。MariaDB 支持多种存储引擎,包括 InnoDBMyRocksAria等,以满足不同用途的需求。MariaDB 提供了一系列的扩展功能,如分区表、虚拟列、联合引擎等。同时,它还支持线性水平扩展,以支持更大的数据集和更高的查询负载。MariaDB 提供了适用于多种云平台的解决方案,支持容器化部署,例如在 Kubernetes 上运行。

隔离级别

MariaDB支持多种事务隔离级别,这些隔离级别决定了多个并发事务如何交互以及在读取数据时可能会看到哪些数据,以下是 MariaDB 支持的隔离级别:

在选择隔离级别时,通常需要在性能和数据的准确性/一致性之间进行权衡。更高的隔离级别通常提供更好的数据一致性保证,但可能降低并发性能。

实际测试说明

由于MariaDBMySQL渊源颇深,因此SQL语法类似,代码基本无需改动,最终在4种隔离级别,33种数据异常上的结果MariaDB 10.5.22也和MySQL 8.0.20基本相同。

zzhuncle commented 1 year ago

Cassandra数据库测试说明

测试环境

Ubuntu22.04 | Cassandra 4.0.11 | CQL spec 3.4.5 | unixODBC 2.3.9

数据库简介

Apache Cassandra是一个开源的、分布式的、NoSQL数据库系统,它最初是由Facebook开发的,用于处理大量的分布式数据存储。Cassandra是基于AmazonDynamo数据库和GoogleBigtable数据库的设计理念构建的,因此它结合了两者的优势,提供了高度可扩展性和高性能的数据管理功能。

隔离级别

Cassandra 数据库采用一种称为最终一致性(Eventual Consistency)的一致性模型,它与传统的关系型数据库中的 ACID 事务模型有所不同。因此,Cassandra 并不使用传统的隔离级别,如 Read CommittedRepeatable Read 等。而是提供一系列的一致性级别(Consistency Levels)来控制读写操作的一致性,一致性级别决定了在进行读取或写入操作时,必须成功应答的副本(replica)数量。主要的一致性级别包括:

  1. ANY:对于写操作,只要至少有一个副本应答,操作就被视为成功。
  2. ONE:至少有一个副本成功应答。
  3. TWO / THREE:至少有两个/三个副本成功应答。
  4. QUORUM:成功应答的副本数达到副本总数的大多数。
  5. ALL:所有副本都必须成功应答。
  6. LOCAL_ONE / LOCAL_QUORUM:对于多数据中心部署,至少有一个/大多数副本在本地数据中心应答。
  7. EACH_QUORUM:在每个数据中心,成功应答的副本数都达到该数据中心副本总数的大多数。
  8. SERIAL / LOCAL_SERIAL:用于轻量事务,确保线性一致性。

根据不同的一致性级别,Cassandra 的读写操作可能会表现出不同的隔离性,但这与传统的关系型数据库中定义的隔离级别是不同的。

轻量级事务

Cassandra支持轻量级事务(Lightweight Transactions),这可以为某些操作提供一种类似于传统ACID事务的一致性模型,但它们通常有一定的性能开销,并且不适用于所有用例。即在CQL语句中使用IF NOT EXISTSIF EXISTS,或IF子句来实现一些形式的条件更新和删除。这种情况下,Cassandra内部会使用Paxos协议来确保操作的线性一致性,但这会带来更高的延迟和开销。

例如,可以使用IF条件来保证操作的原子性:

UPDATE mykeyspace.mytable SET value = 123 WHERE key = 'some_key' IF EXISTS;

这个查询只有在some_key确实存在时才会更新,否则不会进行任何操作。但是,这并不等同于传统的ROLLBACK命令,因为一旦满足条件并执行了更新,这个操作是不可逆的。

批处理

Cassandra提供了一定程度的事务支持,即通过批处理(Batch)来实现原子性。在Cassandra中,可以将多个写操作(如INSERTUPDATEDELETE)组合到一个批处理中,这些操作要么全部成功,要么全部失败。但要注意,Cassandra中的批处理操作不同于关系型数据库中的事务,它不提供隔离性和持久性保证。

BEGIN BATCH
INSERT INTO table1 (column1, column2) VALUES ('value1', 'value2');
UPDATE table2 SET column1 = 'value1' WHERE column2 = 'value2';
DELETE FROM table3 WHERE column1 = 'value1';
APPLY BATCH;

CQL语言

COMMITROLLBACK指令

Cassandra不支持传统的SQL事务,因此也不支持COMMITROLLBACK指令。因为Cassandra不是一个支持ACID属性的关系型数据库系统。Cassandra是一个最终一致性(eventual consistency)的分布式数据库,它主要关注的是可扩展性和高可用性。

INSERT指令

INSERT INTO mytab VALUES (1, 20);语句在CQL语言中不被允许,需要完整形式INSERT INTO mytab (k,v) VALUES (1, 20);

实际测试说明

实际测试中编写了sql2cql.py脚本文件将原始测试文件中的INSERT语句转化为符合CQL语法的INSERT语句,其他测试语句保持原状,在单机环境对one一致性级别进行了测试,由于不支持传统的SQL事务,因此33个测试样例中大部分异常,小部分通过,仅有一个测试样例存在死锁情况。

针对除one以外的一致性级别,由于无法通过ODBC接口函数直接设置一致性隔离级别,因此暂时没有测试:

CONSISTENCY ***;是CQL中的一个命令,用于设置后续查询的一致性级别,但如果直接通过SQLExecDirect函数执行语句,会报错Malformed SQL Statement: Unrecognized keyword: consistency,原因为ODBC是通用SQL接口,无法直接发送非标准的SQL命令,如CassandraCONSISTENCY ***;,对于Cassandra,可以使用专有的驱动器,如DataStax的C++驱动器,在DataStax C++驱动器中,可以这样设置一致性级别:

CassStatement* statement = cass_statement_new("SELECT * FROM table_name", 0);
cass_statement_set_consistency(statement, CASS_CONSISTENCY_QUORUM);
zzhuncle commented 1 year ago

YugabyteDB测试说明

测试环境

Ubuntu22.04 | yugabyte 2.19.2 | unixODBC 2.3.9

数据库简介

YugabyteDB 是一个高性能的开源分布式 SQL 数据库,旨在支持全球部署的业务关键型应用程序。它结合了传统的 RDBMS(关系数据库管理系统)的 ACID (原子性、一致性、隔离性、持久性)事务特性和 Internet 级别的水平可扩展性、高可用性和地理分布特性。

YugabyteDB 使用 Raft 分布式共识算法确保强一致性,并且可以容忍网络分区和节点故障,从而实现高可用性。支持多种数据模型,包括文档存储(通过 YCQL,兼容 Apache Cassandra 查询语言)和关系存储(通过 YSQL,兼容 PostgreSQL)。YugabyteDB 支持全局 ACID 事务,这意味着即使在分布式环境中,也能保证数据的完整性和一致性。YugabyteDBSQL 接口(YSQL)与 PostgreSQL 高度兼容,这使得许多现有的应用程序和工具能够无缝迁移到 YugabyteDBYugabyteDB 是为云而生的数据库,支持多云、混合云和 Kubernetes 部署。

隔离级别

YugabyteDB在事务层支持三种隔离级别:可串行化(Serializable)、快照(Snapshot)和已提交读(Read Committed)。YSQL API的默认隔离级别本质上是快照隔离(即与PostgreSQL的可重复读(REPEATABLE READ)相同)

已提交读(Read committed):目前处于Beta阶段。只有在YB-TServer标志yb_enable_read_committed_isolation设置为true时,才支持已提交读隔离。

快照(Snapshot):默认情况下,yb_enable_read_committed_isolation标志为false,在这种情况下,YugabyteDB事务层的已提交读隔离级别将回退到更严格的快照(Snapshot)隔离(此时,YSQLREAD COMMITTED也会使用快照隔离)。

可串行化(Serializable),它要求一组可串行化事务的任何并发执行都保证产生与按某种串行顺序(一次一个事务)运行它们相同的效果。

实际测试说明

关于驱动程序ODBC

YugabyteDBPostgreSQL 兼容的,因此它通常可以使用 PostgreSQLODBC 驱动程序。

安装 PostgreSQL ODBC 驱动程序:

sudo apt-get install odbc-postgresql

关于隔离级别设置

注意:YugabyteDB的事务隔离级别要在每个事务开始时设置,而不是在线程连接时设置

由于已提交读(Read committed)特性仅在beta版本存在,因此并未测试。

快照(Snapshot)级别的设置命令为:BEGIN TRANSACTION;(默认隔离级别)

可串行化(Serializable)级别的设置命令为:BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;