2011-05-16 100 views
8

我最近一直在学习RavenDB并希望能够使用它。RavenDB - 规划可扩展性

我想知道人们在可扩展的方式下构建系统时有什么建议或建议,特别是分散在不同服务器上的数据,但可以在单个服务器上启动,只能根据需要增长。

建议,甚至可能在单个实例上创建多个数据库并在其上实施分片。那么扩展它只是将这些数据库分布在机器上的问题?

我的第一印象是这种方法可行,但我会很乐意听到别人的意见和经验。

更新1:

我一直在想这个问题。我认为我之后“整理出来”的方法的问题在于,在这种情况下,在我看来很难在整个服务器上均匀分布数据。我不会有一个字符串键,我可以在范围内(A-E,F-M ..)它将用数字完成。

这留下了两个选项,我可以看到。要么在边界上分解它,所以1-50000在碎片1上,50001-100000在碎片2上,但是随着年龄的增加,像这样说,你的原始碎片将会减少很多工作。或者,如果您需要将文档移动到新的分片,它会更改密钥并打破使用该密钥的URL,但是一个轮回盗取分片并将分片ID放入密钥的策略会受到影响。

所以我的新想法,我再次发表评论,将从第一天开始创建一个分拣系统。它的作用就像将碎片ID填充到密钥中一样,但是你可以从一个很大的数字开始,比如说1000,它可以平均分配。然后,当需要将负载分成碎片时,可以说将存储区501-1000移动到新的服务器上,并写入碎片逻辑,使1-500进入碎片1,501-1000进入碎片2.然后,当第三台服务器联机后,您可以选择另一个存储桶并进行调整。

在我看来,这使您能够分裂成最初创建桶的尽可能多的碎片,从数量和年龄两方面均匀分布载荷。无需更改密钥。

想法?

回答

4

这是可能的,但真的没有必要。您可以开始使用一个实例,然后在需要时通过设置分片进行缩放。

另见:

http://ravendb.net/documentation/docs-sharding

http://ayende.com/blog/4830/ravendb-auto-sharding-bundle-design-early-thoughts

http://ravendb.net/documentation/replication/sharding

+0

感谢您的自动分片链接,我没有看到。我想我后来把它整理出来的麻烦在于,我想要一种能够在服务器之间平衡数据的策略,而不是一个填满一台服务器的策略,然后再转移到下一个。这引发了在添加新文件时在分片之间移动文档的问题。所以我想在可能的情况下提前做出规划。 – 2011-05-16 08:10:10

+0

我用这个主题的新思想更新了这个问题。你对这种方法有什么想法? – 2011-05-17 05:17:38

+0

我不确定你为什么需要这一点。您可以随后添加分片,并且RavenDB将为您完成这项工作。 – synhershko 2011-05-17 07:52:29

1

我认为一个好的解决方案是使用虚拟碎片。您可以从一台服务器开始,将所有虚拟分片指向一台服务器。在增量ID上使用模块来平均分配虚拟碎片中的行。借助Amazon RDS,您可以选择将一个从设备变为主设备,因此,在更改分区配置(将更多虚拟分区指向新服务器)之前,应该将从设备设为主设备,然后更新配置文件,然后删除所有使用modulu的新主记录不符合您用于新实​​例的碎片范围。

您还需要从原来的服务器中删除的行,但现在所有ID的新数据被mo​​dulu基于新的虚拟分片范围将指向新的服务器。因此,您实际上不需要移动数据,但可以利用Amazon RDS服务器升级功能。

然后,您可以将副本从原始服务器上删除。您创建一个唯一的ID为:碎片ID +表格类型ID +增量编号。所以当你查询数据库时,你知道要去哪个分片并从中获取数据。

我不知道它是如何可能的RavenDB做到这一点,但它可以与亚马逊RDS工作得很好,因为亚马逊已经为您提供复制和服务器促销功能。

我同意他们应该是一个解决方案,从一开始就提供无缝的社交,而不是告诉开发者的时候出现的问题进行排序。此外,我发现很多NoSQL解决方案均匀地分布在分片上,需要在低延迟的集群中工作。所以你必须考虑到这一点。我试过用两台不同的EC2机器(不是专用的亚马逊集群)使用Couchbase,数据平衡非常慢。这也增加了整体成本。

我也想补充一点,什么Pinterest的做了,解决他们的可扩展性问题,采用虚拟4096个碎片。

您还应该查看许多NoSQL数据库的分页问题。采用这种方法,您可以很容易地分页数据,但可能不是最有效的方式,因为您可能需要查询多个数据库。另一个问题是改变模式。 Pinterest通过将所有数据放入MySQL中的JSON Blob来解决此问题。当您想要添加新列时,可以使用新列数据+键创建一个新表,并且可以在该列上使用索引。如果您需要查询数据(例如通过电子邮件),则可以使用电子邮件+ ID创建另一个表并在电子邮件列中添加索引。计数器是另一个问题,我的意思是原子计数器。因此,最好从JSON中取出这些计数器,并将它们放在一列中,以便增加计数器值。

这里有很棒的解决方案,但是在一天结束时你会发现它们可能非常昂贵。我更愿意花时间构建我自己的分片解决方案,并防止自己后来头痛。如果你选择其他途径,有很多公司等着你惹麻烦,并要求相当多的钱来解决你的问题。因为在你需要他们的那一刻,他们知道你会付出一切努力让你的项目再次运作。这是从我自己的经验,这就是为什么我打破我的头,使用你的方法建立我自己的分片解决方案,这也是便宜得多。

另一种选择是为ScaleBase或DBshards等MySQL使用中间件解决方案。所以你可以继续使用MySQL,但是在你需要扩展的时候,他们有很好的解决方案。而成本可能会低于替代方案。

另一个技巧:当你创建了碎片的配置,把接受或真或假一write_lock属性。所以当它为false时,数据将不会写入该分片,因此当您为特定表类型(即用户)获取分片列表时,它将只写入其他分片的相同类型。这对备份也很有用,所以当您想要在备份所有数据时锁定所有分片以获得所有分片的时间点快照时,您可以为访问者显示友好的错误。尽管我认为您可以发送全局请求以使用Amazon RDS快照所有数据库并使用时间点备份。

的事情是,大多数公司不会花时间与DIY分片解决方案时,他们会更愿意支付ScaleBase。这些解决方案来自单个开发人员,他们可以从一开始就为可扩展解决方案提供支付,但要确保在达到他们所需的程度时,他们就有了解决方案。只要看看那里的价格,你就会发现它会花费你很多。一旦完成,我会很乐意与您分享我的代码。在我看来,你将走上最佳路径,这完全取决于你的应用程序逻辑。我的数据库建模很简单,没有连接,也没有复杂的聚合查询 - 这解决了我的许多问题。将来您可以使用Map Reduce来解决这些大数据查询需求。