mysql - NoSql 类型的解决方案在分布式时如何支持一致性?

标签 mysql database hadoop nosql hbase

如果这个问题有缺陷,我提前道歉。我对数据库很陌生(我已经设置了它们,但在我的开发学习中并没有太多使用它们)。

背景: 我有一个生成大量测试数据的过程,它基本上是一个哈希表,每天有几亿条记录(但在一天结束时我可以删除这些记录)。在一台机器上生成数据花费的时间太长,所以我将这个过程拆分到几个服务器上,这些服务器基本上需要查找一个数据库(或当前的哈希表),如果它存在则做一些工作,如果它不存在则添加它。我认为(到目前为止)我的需求是一个可以以一致的方式处理大量写入的数据库(即更新应该立即可用)并且数据库应该能够通过网络有效地将此表传输到其他工作节点(在创建表后,另一个基于它的作业运行,但我不认为单个服务器将 10+ gig 表服务器到多个服务器是有效的,所以我认为它需要分发)。

问题/问题: 如果我使用 NoSql 解决方案,例如 Hbase(我有一些设置经验),我的应用程序逻辑会工作吗?如果我有 2 个服务器写入分布式数据库,server1 是否有可能添加了一个条目,但是当 server2 查找它时却找不到它,因为它还没有通过集群复制?另外,有没有更好的方法来做我想做的事情?没有分发的单个服务器(我也在考虑只使用 mysql)会更好吗(我避免使用它是因为我想要一个解决方案,如果它太慢我可以简单地添加更多工作服务器来写入数据库,我不是确定如果我添加 100 个工作人员写入单个服务器,我的性能返回是否会减少)?

任何提示或建议都会很棒。

谢谢!

更新:我刚刚意识到 facebook 的消息基础设施使用 hbase。如果不一致,我在向 friend 发送消息时会出现疯狂的延迟。那么 hbase 是如何保持一致的(或者它真的不一致,而 facebook 如此之快以至于看起来是这样)?

最佳答案

If I have 2 servers writing to a distributed database, is there any chance that server1 added an entry but when server2 looks it up it can't find it because it hasn't replicated though the cluster yet?

尤其是 HBase,保证了一致性。这意味着一旦完成写入操作,写入的数据将可供所有客户端使用。但是,此写操作不会立即发生,因此必须考虑到这一点。

其他 NoSQL 数据库引擎,例如 Cassandra,支持所谓的“最终一致性”,即以绝对一致性换取写入速度。这意味着写入集群的一段数据最终将在节点之间保持一致,但这可能需要一些时间——通常这段时间非常短。可以找到有关这种权衡的更多信息 here .

我的假设是您更喜欢 HBase 的保证一致性。

Also, is there a better way to do what I'm trying to do?

这取决于您的记录的外观。您能否提供有关您将存储的数据的更多信息?如果您的数据字段符合文档模型——在访问给定键的数据时通常需要所有字段——那么您可以查看各种基于文档的数据存储,例如 MongoDB。 MongoDB 提供各种级别的一致性(默认情况下,相当方便,是像 HBase 一样保证一致性)。

如果您经常要查找每个键存储的字段的某些子集,那么 HBase 将允许您指定希望从扫描或获取。

Would a single server... with no distribution work better(I was avoiding it because I wanted a solution that if was too slow I could simply add more worker servers to write to a database, I'm not sure if my performance returns would diminish if I add 100 workers to write to a single server)?

分布式数据库引擎在并发读/写下肯定会表现更好。由于上述特性,HBase 被认为在读取繁重的场景中很强大(写入在联合之前不会生效),而 Cassandra 和其他最终一致的数据库引擎被认为在写入繁重的场景中很强大(尽管 Cassandra 的最新版本有在阅读方面取得了显着的性能提升)。

当读/写负载增加时,在单个服务器上运行的传统数据库将受到影响,因为一旦传入连接和磁盘操作达到其预期速率限制,它就必须对它们进行排队。我相信 HBase(或 MongoDB,如果您决定文档存储适合您)最适合您对一致性的需求。

关于mysql - NoSql 类型的解决方案在分布式时如何支持一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296072/

相关文章:

mysql - 关于使用电子邮件地址作为主键的想法

mysql - 如何在mySQL表中插入点

Cassandra 数据克隆到另一个 cassandra 数据库(不同服务器)

spring - 如何从文件名中删除数字?

java - 如何在Java中使用hadoop-core的配置来配置客户端

php - Mysql连接3个具有多个字段的表

php - 无鉴别器映射的 Doctrine 单表继承

php - 这是什么语言或格式?

database - 来自 pg_dumpall (Ubuntu) 的 PostgreSQL 备份

hadoop - hadoop 0.20.2 中不支持通用选项 -D 吗?