我将如何为读写操作实现单独的数据库?
Posted
技术标签:
【中文标题】我将如何为读写操作实现单独的数据库?【英文标题】:How would I implement separate databases for reading and writing operations? 【发布时间】:2011-02-24 06:33:14 【问题描述】:我有兴趣实现一种架构,该架构具有两个数据库,一个用于读取操作,另一个用于写入。我从来没有实现过这样的东西,并且总是构建单一数据库、高度规范化的系统,所以我不太确定从哪里开始。我对这个问题有几个部分。 1.什么是了解有关此架构的更多信息的好资源?2.这只是在两个相同架构之间复制的问题,还是您的架构会因操作而异,规范化也会有所不同?3.如何确保写入一个数据库的数据可以立即从第二个数据库读取?
任何进一步的帮助、提示、资源将不胜感激。谢谢。
编辑 经过一番研究,我发现这篇文章对那些感兴趣的人来说非常有用。
http://www.codefutures.com/database-sharding/
我发现这种高可扩展性 article 非常有用
【问题讨论】:
我很好奇为什么。不要误会我的意思,我并不是说这是一个坏主意,但我从未听说过这样的设计模式,而且我很好奇为什么这是一个很好的实现模式。 (当然,我意识到这可能是我以前从未遇到过的常见设计模式。) 您是否认为它更像是一个用于正常使用的数据库,以及一个用于报告目的的只读数据库?因为这是一个更常见的场景。拥有只写访问的数据库几乎没有可行的用例。 如果数据库是同步的,我不确定它们是如何独立的数据库。您可能想了解文件系统日志之类的内容。 @David @Agent @WhirlWind 我认为读/写主数据库和只读从数据库模式比你想象的更常见。 @David Stratton @Agent_9191 @WhirlWind @Pascal Thivent 〜我认为他打算做类似命令查询分离的事情〜这是正确的@Matt 吗? en.wikipedia.org/wiki/Command-query_separation 【参考方案1】:我不是专家,但读/写主数据库和只读从属模式是一种“常见”模式,尤其是对于主要执行读取访问或数据仓库的大型应用程序: p>
它允许扩展(如果需要,您可以添加更多只读从站) 它允许以不同方式调整数据库(高效读取或高效写入)什么是了解有关此架构的更多信息的好资源?
互联网上有很多很好的资源。例如:
Highscalability.com 有很好的例子(例如Wikimedia architecture、master-slave 类别...) Handling Data in Mega Scale Systems(从幻灯片 29 开始) mysql Scale-Out approach for better performance and scalability as a key factor for Wikipedia’s growth Chapter 24. High Availability and Load Balancing 在 PostgreSQL 文档中 Chapter 16. Replication 在 MySQL 文档中 http://www.google.com/search?q=read%2Fwrite+master+database+and+read-only+slaves这只是两个相同架构之间复制的问题,还是您的架构会因操作而异,规范化也会有所不同?
我不确定 - 我渴望阅读专家的答案 - 但我认为这些模式在传统复制方案中是相同的(但调整可能会有所不同)。也许人们正在做更多奇特的事情,但我想知道在这种情况下他们是否依赖数据库复制,这听起来更像是“实时 ETL”。
您如何确保写入一个数据库的数据可以立即从第二个数据库读取?
我猜你需要 同步复制 (这当然比异步慢)。虽然有些数据库确实支持这种模式,但并非所有数据库都支持 AFAIK。但是请查看this answer 或this one 的 SQL Server。
【讨论】:
@Pascal Thivent ~ 这不是en.wikipedia.org/wiki/Command-query_separation @drachenstern:我不确定 CQS 是否暗示了您存储数据的方式。不过谢谢,这是一个非常有趣的链接。 @Pascal Thivent ~ 我更多地考虑在两者之间建立一个 pub/sub 同步架构的参考。当我盲链接时,我还认为该文章有图像:udidahan.com/2008/08/11/command-query-separation-and-soa @drachenstern:啊,是的,没有检查该链接,我将阅读该链接。再次感谢。 @drachenstern:我浏览了第二个链接,我看到了“关系”,但认为没有等价性(你可以用单个数据库做 CQS,恕我直言,CQS 更像是一个纯粹的 OOP 原则) .不过读起来很有趣。【参考方案2】:您可能会查找数据仓库。 这些用作“规范化报告”类型的数据库,而您可以保留规范化的 OLTP 样式实例以进行数据维护。
我认为“立即”等效的想法不会成为现实。将新数据和更改迁移到另一个系统时会有一些延迟。时间表和范围将是您在这里做出的重大决定。
【讨论】:
+1。 Matt - 查找 OLTP 和 OLAP。使用一个数据库来支持快速事务性工作(例如支持应用程序),并根据需要将 ETL 数据传输到另一个构建为报告的数据库。由于它们是分开的,因此您不会对一个影响另一个的性能造成影响。在数据库之间移动数据本身就是一个复杂的问题 - 取决于要移动的数据量和频率;当人们说他们想要在来源之间进行“实时”复制时,他们的实际意思是什么(您需要验证),因为计算机的实时比人类的“实时”要快得多。【参考方案3】:关于问题 2:
这实际上取决于您通过拥有两个数据库来实现的目标。如果是出于性能原因(我怀疑可能是这样),我建议您根据性能需要考虑对只读数据库进行非规范化。如果性能不是问题,那么我不会弄乱只读模式。
我曾在类似的系统上工作过,其中会有一个读/写数据库,仅由管理用户少量使用。然后,该数据库将在夜间过程中复制到只读数据库。
问题 3: 我们在这里谈论的有多直接?不到一秒? 10秒?分钟?
【讨论】:
以上是关于我将如何为读写操作实现单独的数据库?的主要内容,如果未能解决你的问题,请参考以下文章
我将如何为bringSubviewToFront 编写 UIView 淡入动画