数据库 101:初学者数据一致性
让数据库研究再次伟大!!!
目录
TL:DR
在本文中,我将分享我在数据库学习过程中学到的知识以及迄今为止我对数据库主题着迷的内容。
1. 序言
2022 年底,我决定把数据库相关的知识讲得更清楚一些,因为作为一名后端开发人员,数据库查询总是让人头疼,我讨厌复杂的数据库查询。因此,我挑战自己从零开始,纯粹为了好玩,去探索这个鲜为人知的世界。
2. 比MySQL有更多的可能性
我没有完成大学学业,在大学期间也没有接触过任何有关数据库的知识,因此我没有任何理论背景,并且在这 4 年的企业级编码中,我的重点完全集中在:清洁代码、 SOLID、 设计模式 和其他与代码相关的东西上,我唯一的数据库知识是关于 SQL/MySQL 和 Cache / Redis的。
在谷歌搜索、在推特上询问内容推荐的前五分钟,我偶然发现了一个叫做 “7 种数据库范式”的视频 ,它完全震撼了我。难道说,数据库不仅仅是键值对和关系型数据库?什么?
以下是范式和相应具体实现的列表:
- 键值: Redis
- 宽列: Apache Cassandra、 ScyllaDB 和 DynamoDB
- 文档: MongoDB
- 图表: Neo4J
- 关系型数据库: MySQL、 MariaDB、 PostgreSQL
- 搜索引擎: ElasticSearch
- 多模型: FaunaDB、 MongoDB、 Redis 等。
3. SQL 与 NoSQL
由于我们正在尝试迎接一个新的挑战,我的主要重点是摆脱所有让我感到舒服的事物,研究我以前从未见过的事物,其中包括我在 NodeJS 世界中经常听到的这个词: NoSQL。
我知道 MySQL、OracleDB、SQLServer 使用SQL(结构化查询语言) ,但我从未试图理解为什么会有这样的“反向 SQL”或“反 SQL”,所以我首先深入研究了它们之间的区别,并简要地解释一下:
// Structured
table: users
id: int
name: string
table: user_addresses
id: int
user_id: int references id in users
address: string
table: users
--------------------
| id | name |
| 1 | danielhe4rt |
--------------------
table: user_addresses
---------------------------------------------------------
| id | user_id | address |
| 1 | 1 | Flowers St. 123, São Paulo/SP - Brazil |
---------------------------------------------------------
SQL由以下因素驱动:表、行和列
// database-prod.json
{
"users": [
"huid2d12bdh12b": {
"id": 1,
"name": "danielhe4rt",
"addresses": [
"jio32fsdyhis": {
"address": "Flowers St. 123, São Paulo/SP - Brazil"
}
]
}
]
}
NoSQL 由以下因素驱动:文档、集合和字段。
引起我注意的是 NoSQL 有大量很酷的功能可供研究,因为我们有 Key-Value、Document、Wide Column 作为可供研究的选项。
我选择宽列数据库来继续深入研究,因为我发现了两个很酷的主题,即 复制因子 和 一致性级别 ,我想研究一下,但首先我们需要讨论 CAP 定理。
4. 明智选择
基于数据库的CAP定理
有个叫 Eric Brewer 的家伙发现,分布式数据存储只能提供这三个保证中的两个:一致性、可用性和分区容错性。其实,如果你足够理性,你也可以全部满足,不过那是另一篇文章的主题了。
好吧,但这些项目是什么意思呢?比如,我为什么要关心这个?定理不是数学里那些无聊的东西吗?不,它不是,所以请跟我一起看!正如我所说,我们需要理解这些支柱:
- 可用性:您的数据位于不同的节点,如果其中几个节点发生故障,您仍然可以获得数据。
- 一致性:您更新了一些数据,但由于复制操作尚未在其他数据中心完成,因此无法保证这是最近的写入,但可以使用 一致性级别进行配置。
- 分区容错:如果副本/节点之间出现任何通信故障,我可以继续操作吗?
到目前为止,我们已经有很多概念需要理解并继续努力,但现在我们将看到最后一步以及我想要写这篇文章的原因:宽列数据库范式!
5. 最酷的数据库范式
没错,我认为最酷的数据库范式是宽列数据库,我将从四个主题来解释原因:
- 范例
- 基于此范例构建的数据库;
- 复制因子;
- 一致性级别。
5.1 范式
想象一下,您正在以列 而不是 SQL 语言所期望的行来建模 。由于这些列基于集合,因此非常灵活,因此我们可以说建模是灵活的,您需要一个模式来在其上运行查询。
说到查询:这种范式不应该是 NoSQL 吗?嗯,不完全是。有一种名为 Apache Cassandra 的数据库引入了 CQL 或 Cassandra Query Language
。所以它和查询有关,对吧?
SQL 支持连接,而 CQL 不支持。两种查询语言的查询编写方式类似。
5.2 Cassandra 和 ScyllaDB
最著名的使用宽列的数据库仍然是 Cassandra,此外,许多尚未遇到有力的 Cassandra 竞争对手 ScyllaDB 的开发人员仍然选择它。
有什么区别?它们使用相同的范例,所以应该差不多……对吧?
完全不是。Apache Cassandra 是一个使用 Java 和 ScyllaDB 构建的开源工具,其诞生是为了将这种数据库范式的读/写操作提升到一个全新的水平。
ScyllaDB 采用 C++ 编写,接近底层, 性能提升了 2 到 8 倍。按照这种方式,由于性能更高,维护成本也会更低。此外,ScyllaDB 使用 与 Cassandra相同的驱动程序 ,因此您可以轻松从 Cassandra 切换到 Scylla。
现在我们可以看看最酷的功能了:p
5.3 复制因子(RF)
Cassandra 和 ScyllaDB 支持的功能之一是复制因子,该标志允许您连续写入并将给定的数据复制到所有可用的下一个节点。
如果将 RF 设置为 3,则存储任何数据时,数据都会复制到接下来的三个节点,这样即使主节点丢失数据,也能保证数据安全。SimpleStrategy 标志 表示在本地集群中进行复制,而 NetworkTopologyStrategy 标志表示在多个数据中心中进行复制。
5.4 一致性级别
现在我们可以讨论写入操作的真实性,为此我们需要了解为什么一致性级别如此重要。
想象一下,您在法院里,在您讲述了自己对任何随机话题无辜的故事之后,当地和虚拟陪审团应该根据以下规则之一做出决定:ONE,QUORUIM,LOCAL_QUORUM 和 ALL。
- 如果法官判定规则是 “一”,那么陪审团中只有一人必须投票给你并宣称你无罪。
- 如果法官裁定规则是 QUORUM,那么 51% 的本地和远程陪审团必须投票支持您并宣称您无罪。
- 如果法官判定该规则是 LOCAL_QUORUM,那么 51% 的当地陪审团必须投票给你并宣称你无罪。
- 如果法官判定该规则是 全部,那么 100% 的本地和远程陪审团都必须投票给你并宣称你无罪,而你可能就完蛋了,哈哈。
数据库生态系统也同样如此。如果你在主数据库写入数据,并且你的CL是QUORUM,那么你必须写入其他磁盘,直到大多数磁盘都认为数据已写入。是不是很酷?
我写这些只是因为我喜欢这两件事结合在一起让你睡个好觉,因为你知道你的数据在各处都有副本,如果你配置得当,几乎没有丢失数据的机会。
6. 最后的考虑
即使经过这项研究,我仍然感觉我对数据库范例一无所知,但这里的想法是对这个主题进行挑衅,并在你研究并为该主题制作更多内容时让你感到好奇。
好了,感谢你读到这里。别忘了给你的水壶加满水!xD
文章来源:https://dev.to/scylladb/database-101-why-so-interesting-1344