在这篇文章中,我将分享我在数据库学习课程中学到的知识,了解到目前为止让我着迷的数据库主题。
1:序言
在 2022 年底,当主题是数据库时,我决定把事情弄清楚,因为这总是一种痛苦,作为后端开发人员,很高兴讨厌复杂的数据库查询。考虑到这一点,我挑战自己从头开始,为了好玩而了解这个未被充分探索的世界。
2:MySQL不是唯一的选择
我没有完成大学学业,在那里时我没有看到任何关于数据库的东西,所以我没有任何理论背景,在这 4 年的企业级编码中,我的重点完全在于:Clean Code, SOLID、 设计模式 和其他与代码相关的东西,而我唯一的数据库知识是关于 SQL/MySQL 和 缓存/ Redis的。
在前五分钟的搜索和在 Twitter 上询问推荐的内容后,我看到了这个名为“7 个数据库范例”的视频,这彻底颠覆了我的认知。原来不仅有键值和关系型数据库?这是怎么回事?
以下是不同范式及其具体实现的列表:
-
键值(Key Value):Redis
-
宽列(Wide Column):Apache Cassandra、ScyllaDB 和 DynamoDB
-
文档(Document):MongoDB
-
图(Graph):Neo4J
-
关系(Relational):MySQL、MariaDB、PostgreSQL
-
搜索引擎(Search Engine):ElasticSearch
-
多模型(Multi-model):FaunaDB、MongoDB、Redis 等。
3:SQL 与 NoSQL
由于我们正在尝试接受新的挑战,因此我的主要重点是脱离我感到舒适的一切,研究我以前从未见过的东西,其中包括我在NodeJS世界中经常听到的这个词:NoSQL。
我知道SQL(结构化查询语言)被MySQL、OracleDB、SQLServer等使用,但我从未试图理解为什么会有这样一种“反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 有许多很酷的功能可以研究,因为我们有键值对、文档和列式数据库等选项可供研究。
我选择了列式数据库作为深入研究的对象,因为我发现了两个很酷的主题,即复制因子和一致性级别,我想探讨一下,但首先我们需要谈谈 CAP 定理。
4:明智的选择
基于数据库的CAP定理
一位叫做 Eric Brewer 的大佬指出,分布式数据存储只能提供以下三种保证中的两种:一致性、可用性和分区容忍性。好吧,如果你足够理智,你可以同时拥有所有三个特性,但这是另一篇文章的主题。
好吧,这些东西有什么意义?为什么我应该关心它们?这定理不是一些无聊的数学东西吗?不,不是,所以请跟我走!就像我所说的,我们需要理解这些基石:
-
可用性:你的数据存储在不同的节点上,如果其中几个节点失败了,你仍应该能够使用这些数据。
-
一致性:你更新了一些数据,但没有保证这是最近的写入,因为复制操作还没有在其他数据中心完成,但可以使用一致性级别进行配置。
-
分区容忍性:如果副本/节点之间的通信出现故障,我还能继续操作吗?
到这里,我们已经有了很多概念需要理解,并在我们的旅程中不断努力,但现在我们将看到最后一步和我想要写这篇文章的原因:宽列数据库范例!
5:最酷的数据库范例
没错,我认为最酷的数据库范式是宽列数据库(Wide Column Database),并且我将用四个主题来解释为什么:
-
范式;
-
基于这个范例构建的数据库;
-
复制因子;
-
一致性级别。
5.1 范式
想象一下,你在建模时不是按 SQL 语言所期望的行进行思考,而是按列进行思考。这些列是灵活的,因为它们基于集合,我们可以说建模是灵活的,并且您需要模式来运行查询。
说到查询:这个范式不应该是 NoSQL 吗?嗯,并不完全是。有一个叫做 Apache Cassandra 的数据库引入了 CQL 或 Cassandra Query Language。那么它们之间有查询的联系吗?
在 SQL 中支持联接,而在 CQL 中不支持。查询语言的编写看起来在两种查询语言中都很相似。
5.2 Cassandra 和 ScyllaDB
使用 Wide Column 的最著名的数据库仍然是 Cassandra,尽管还有很多开发人员选择它,因为他们还没有遇到像 ScyllaDB 这样值得的 Cassandra 竞争对手。
它们之间有什么区别?它们使用相同的范式,所以它们应该是差不多的... 对吧?
并不是这样。Apache Cassandra 是一个使用 Java 构建的开源工具,而 ScyllaDB 是出于改进这个数据库范式的读写操作的需要而产生的全新级别的工具。
ScyllaDB 是用 C++ 编写的,这接近于低级语言,因此性能提高了 2 倍到 8 倍。沿着这条路走,它必须更便宜,因为它更高效。此外,ScyllaDB 使用与 Cassandra 相同的驱动程序,因此您可以轻松从 Cassandra 切换到 ScyllaDB。
现在我们可以去了解最酷的功能了。
5.3 复制因子(RF)
Cassandra和ScyllaDB支持的一个功能是复制因子,这是一个标志,允许你在一行中写入并将给定的数据复制到所有可用的下一个节点。
如果你将RF设置为3,当你存储任何数据时,它应该被复制到三个下一个节点,并保证即使主节点丢失数据,你仍然拥有数据。有SimpleStrategy标志,表示在本地集群中复制,NetworkTopologyStrategy表示在多个数据中心中复制。
5.4 一致性级别
现在我们可以谈论关于写入操作的真实性,为此我们需要理解为什么一致性级别如此重要。
想象一下你在法庭上,你讲述关于你对任意一个随机话题的清白,当地和虚拟陪审团应该根据规则做出决定,规则可以是以下之一:ONE、QUORUM、LOCAL_QUORUM和ALL。
-
如果法官决定规则是ONE,那么只有一个陪审团成员需要投票支持你的清白。
-
如果法官决定规则是QUORUM,则需要51%的当地和远程陪审团投票支持你的清白。
-
如果法官决定规则是LOCAL_QUORUM,则需要51%的当地陪审团投票支持你的清白。
-
如果法官决定规则是ALL,则需要100%的当地和远程陪审团投票支持你的清白,你可能就惨了。
同样的原则可以应用于数据库生态系统。如果你在主数据库中写入数据,并且你的CL是QUORUM,则必须在其他磁盘上写入数据,直到占多数为止,才能将数据标记为已写入。酷毙了,不是吗?
我写这篇文章的原因只是因为我喜欢这两个特性如何结合起来可以让你安心睡觉,因为你知道你的数据在各处都有副本,如果你配置得当,几乎不会丢失。
作者:Daniel Reis
更多技术干货请关注公众号“云原生数据库”