轻松搞懂数据一致性

发布时间 2023-06-05 10:05:05作者: 晓风晓浪

让数据库研究再次伟大!!!

目录

  • 1.序言

  • 2.比MySQL有更多的可能性

  • 3.SQL 与 NoSQL

  • 4.明智地选择

  • 5.最酷的数据库范例

  • 6.最后的考虑

TL:DR 在这篇文章中,我将分享我在数据库学习课程中学到的知识,了解到目前为止让我着迷的数据库主题。

(更多优质教程:java567.com,搜"mysql")

1.序言

在 2022 年底,当主题是数据库时,我决定把事情弄清楚,因为这总是一种痛苦,作为后端开发人员,很高兴讨厌复杂的数据库查询。考虑到这一点,我挑战自己从头开始,为了好玩而了解这个未被充分探索的世界。

2.比MySQL有很多可能性

我没有完成大学学业,在那里时我没有看到任何关于数据库的东西,所以我没有任何理论背景,在这 4 年的企业级编码中,我的重点完全在于:Clean Code, SOLID、 设计模式 和其他与代码相关的东西,而我唯一的数据库知识是关于 SQL/MySQL 和 缓存/ Redis的。

在前五分钟谷歌搜索东西,在 Twitter 上询问内容推荐,我刚刚登陆了这个名为 “7 个数据库范例”的视频 ,这让我大吃一惊。就像,除了键值和关系之外?瓦特

以下是范例列表和各自的具体实现:

  • 键值: Redis

  • 宽栏: Apache Cassandra、 ScyllaDB 和 DynamoDB

  • 文档: MongoDB

  • 图: Neo4J

  • 关系型: MySQL、 MariaDB、 PostgreSQL

  • 搜索引擎: 弹性搜索

  • 多模型: FaunaDB、 MongoDB、 Redis 等。

3. SQL 与 NoSQL

因为我们正在尝试迎接一个新的挑战,我的主要重点是脱离我觉得舒服的一切,研究我以前没见过的东西,它包括我在 NodeJS 世界中经常听到的 这个 词: 诺斯克。

我知道 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 如何有大量很酷的特性需要研究,因为我们有键值、文档、宽列作为研究选项。

我选择 Wide Column Database 来继续深入研究,因为我发现有两个很酷的主题,即我想研究的 复制因子一致性级别 ,但首先我们需要谈谈 CAP 定理。

4.明智地选择

基于数据库的CAP定理

https://res.cloudinary.com/practicaldev/image/fetch/s--RHyAcE9K--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/IIkBICD.png

一些名叫 Eric Brewer 的坏蛋认为分布式数据存储只能提供这 3 种保证中的 2 种:一致性、可用性和分区容错性。好吧,如果你足够合理,你可以拥有所有这些,但这是另一篇文章的主题。

好的,但是这些项目的含义是什么?比如,我为什么要关心这个?定理是不是一些数学上枯燥的东西?不,请在那个 PLZ 上跟我来!!!正如我所说,我们需要理解这些支柱:

  • 可用性:您在不同的节点中拥有数据,如果其中几个节点发生故障,您应该仍然可以使用数据。

  • 一致性:你更新了一些数据,但不能保证这是最近的写入,因为复制操作没有在其他数据中心完成,但它可以使用 Consistency Level进行配置。

  • Partition Tolerance:如果副本/节点之间的通信出现任何故障,我可以继续操作吗?

在这一点上,我们已经有很多概念需要理解并继续在我们的旅程中磨砺,但现在我们将看到最后一步以及我想写这篇文章的原因:宽列数据库范式!

5. 最酷的数据库范例?

没错,我认为最酷的数据库范例是宽列数据库,我将在四个主题中解释原因:

  • 范例

  • 建立在这种范式之上的数据库;

  • 复制因子;

  • 一致性级别。

5.1 范式

想象一下,您正在 按照 SQL 语言的预期在 而不是 行中建模思维。这些列是灵活的,因为它基于集合,我们可以说建模是灵活的,你需要一个模式来运行查询。

谈论查询:这种范式不应该是 NoSQL 吗?好吧,不完全是。有一个名为 Apache Cassandra 的数据库引入了 CQLCassandra Query Language. 那么有相关的查询吗?

在 SQL 中支持连接,在 CQL 中不支持。查询的编写方式在两种查询语言中看起来很相似。

5.2 Cassandra 和 ScyllaDB

最著名的使用 Wide Column 的数据库仍然是 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 。

https://res.cloudinary.com/practicaldev/image/fetch/s--VTY-k_-F--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/KvCxIE1.jpg

5.4 一致性等级

现在我们可以讨论写操作的真实性,为此我们需要理解为什么一致性级别如此重要。

想象一下,你在法庭上,当你讲述了你对任何随机话题都是无辜的故事后,本地和虚拟陪审团应该根据可以是以下规则之一的规则做出决定:ONE、QUORUIM、LOCAL_QUORUM 和全部。

  • 如果法官决定规则是 ONE,那么陪审团中只有一个人必须投票给你并声称你无罪。

  • 如果法官决定规则是 QUORUM,那么 51% 的本地和远程陪审团必须投票给你并声称你无罪。

  • 如果法官决定规则是 LOCAL_QUORUM,那么 51% 的当地陪审团必须投票给你并声明你无罪。

  • 如果法官决定规则是 ALL,那么 100% 的本地和远程陪审团必须投票给你并声称你无罪,你可能 fu 哈哈。

这同样适用于数据库生态系统。如果您在主数据库中写入并且您的 CL 是 QUORUM,则您必须在其他磁盘中写入,直到大多数人声称数据已写入。很酷,不是吗?

https://res.cloudinary.com/practicaldev/image/fetch/s--VNvSgxt6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.imgur.com/h2gER2C.jpg

我写下所有这些只是因为我喜欢这两个项目如何让你睡个好觉,因为你知道你的数据到处都有副本,如果配置得当,几乎没有丢失它的机会。

6. 最后的考虑

即使经过这项研究,我的感觉是我对数据库范式一无所知,但这里的想法是对这个主题进行挑衅,让你对你研究的点感到好奇,并为这个主题制作更多内容。

就是这样,感谢您阅读到这里。

(更多优质教程:java567.com,搜"mysql")