你真的可以用 Django 扩大规模吗……鉴于你只能使用一个数据库? (在 models.py 和 settings.py 中)
Posted
技术标签:
【中文标题】你真的可以用 Django 扩大规模吗……鉴于你只能使用一个数据库? (在 models.py 和 settings.py 中)【英文标题】:Can you really scale up with Django...given that you can only use one database? (In the models.py and settings.py) 【发布时间】:2011-01-08 18:47:30 【问题描述】:Django 只允许你在 settings.py 中使用一个数据库。 这会阻止您扩大规模吗? (数百万用户)
【问题讨论】:
如果您真的关心最大性能,您根本不想使用框架。 @Code Duck - 请注意在可扩展性和最大性能之间存在差异。大多数时候,框架对可扩展性的帮助可能大于对它的伤害,因为它们允许您专注于更高级别的问题。并且有许多大型企业使用 django 进行扩展。 毫无疑问它有助于发展。但是,我听说过很多网站在流量真正腾飞后不得不重写以提高性能。在我对一个简单站点的测试中,使用相同的数据库,没有缓存的直接 php 可以提供 3 倍于使用 memached 的 Django 的请求/秒。 @Code Duck - 你的评论没有多大意义。如果我们都关心“最大性能”,我们会在汇编程序中编写我们的 Web 应用程序。不过,开发人员效率和原始性能之间存在合理的权衡。 为什么是的,有一个权衡......无论如何,有时网站必须在没有框架的情况下甚至在 C 中重写部分以提高效率,无论缺点如何,由于使用带来的额外开销一个标准的框架。我正在考虑一个特别是在 Django 中开始但在每月大约 2 亿页时必须重做大部分内容的方法。当然,99.5% 的网站从来没有这个问题。我猜你总是可以在 DB 层上工作,或者只是在问题上投入更多的硬件。 【参考方案1】:Django 现在有support for multiple databases。
【讨论】:
【参考方案2】:数据库不是你的瓶颈。
仔细检查您的浏览器。
对于每个 html 页面,您(平均)发送 8 个其他文件,其中一些可能非常大。这些是您的 JS、CSS、图形等。
实际的性能瓶颈是浏览器请求这些文件并接受字节 s... l... o... w... l... y...
那么,要进行扩展,请执行此操作。
使用与 wackamole 等纯软件解决方案平衡的多个前端。 http://www.backhand.org/wackamole/
使用像 squid 这样的代理服务器来发送“其他”文件。它们基本上是静态的。这是完成下载到客户端的 7/8 工作的地方。不要吝啬把这些做好。
使用多个并发的 mod_wsgi/Django 来创建基于 DB 查询的——罕见的——动态 HTML 片段。确保 mod_wsgi 处于守护程序模式,以便您可以有多个 Django 服务器可供 Apache 使用。根据需要构建尽可能多的这些。它们都是相同的,都是并行的,并且都由 Wackamole 共享。
使用单一、快速的数据库(如 mysql)来处理一些必须来自数据库的事情。 MySQL 将在其服务器上使用多个内核,因此它可以很好地扩展,而您无需做任何事情,只需购买内存。把它放在一个单独的盒子里,完全独立,专门为此而调整。
你会发现这很好地扩展了。您会发现负载在 squid、apache、Django 守护程序和实际数据库之间很好地共享。您还会发现负载的每一部分(从枯燥的静态部分到有趣的数据库查询)都是单独并同时发生的。
最后,买 Schlossnagle 的书。 http://www.amazon.com/Scalable-Internet-Architectures-Theo-Schlossnagle/dp/067232699X
【讨论】:
这是一个很好的建议,但它似乎有些情景。在某一点上,拥有单个数据库是可伸缩性问题的一个秘诀。当然,达到这一点的难易程度取决于具体情况。 @Jason Baker:我不明白为什么必须限制单个数据库。使用 Oracle 和 DB2 等商业产品,您可以拥有一个跨多个处理器(每个处理器具有多个内核)的数据库。为什么单一数据库有限制? @S.Lott - 单个 anything 是可扩展性方面的限制。首先,对于单个数据库,您会遇到单点故障。其次,限制数据库的不仅仅是 CPU 时间。还有 I/O 问题需要处理。也就是说,很有可能(甚至很可能)您不需要扩展到成为问题的地步。但它确实在某个时候成为一个问题。 @Jason Baker:我很确定当您说“单一”数据库时,您并不是在查看来自各种来源的集群解决方案。 mysql.com/products/database/cluster 它在您的应用程序中显示为“单一”数据库。我不确定您在说什么,因为您已经从可扩展性转向可靠性。但我认为您忽略了解决此问题的产品。 数据库一直是限制我的东西。我在 20 多个 nginx 网络服务器和大约 5 个 postgres 服务器上运行。目前正在尝试使用 hbase 和 oracle。正如 S.Lott 提到的,我也会检查 mysqlcluster。太糟糕了,postgres 没有类似的东西。【参考方案3】:如果您发现数据库是您的应用程序的瓶颈,并且它们现在已经解决了(例如使用缓存),那么您也应该扩展您的数据库。 Django与此无关
【讨论】:
【参考方案4】:读取扩展到数百万用户不是数据库问题,而是通过负载平衡和缓存等解决,参见上面的 S. Lott。
写入扩展确实是一个数据库问题。 “分片”和拥有多个数据库可能是一种解决方案,但在保留数据库的关系性的同时,使用 SQL 很难做到这一点。流行的解决方案是新型“nosql”数据库。但如果你真的有这些问题,那么你需要认真的专家帮助,而不仅仅是来自 *** 的家伙的答案。 :)
【讨论】:
我已经尝试了一段时间的 nosql 解决方案。我的一个项目是我们将它的旧部分重写为 hbase / redis 解决方案,以将我们的数据库从过多的写入中解放出来。是的,这是一个很好的问题,但这不是一个非常有趣的过程!【参考方案5】:已经有一些很好的答案(例如 S. Lott),但是我认为我应该加入更多的东西:
确保不要将数据库用于逻辑操作
我理解Order By
或SQL Procedures
的吸引力,但是您只有一个数据库,但您有多个 django 服务器,如果可以的话,让服务器来处理。
当然,如果您只想要根据某个标准(日期)的最后十行,那么一定要在请求中精确它;)只要确保不要使用可以在其他地方处理的操作来使您的数据库过载.
为问题增加更多硬件
MySQL 和 Oracle 在硬件方面的扩展性非常好,如果您有一个小的性能问题,您可以从添加更多硬件开始。
拆分你的数据库
我知道对于关系和所有您必须一起管理一些表,但是如果您遇到负载问题,请尝试对您的表进行分组,例如,如果您有一个“历史”表组,也许它可以在没有其他人的情况下工作并在单独的服务器上。
请考虑调整,并注意您的请求/索引
您在这里需要专家的建议,但我可以从经验中看出,即使是一个调整不当的请求也会造成严重破坏......而且很难找到。您可以考虑以Ask Tom website 为例进行诊断/微调。
不要孤立地决定你的表架构,但要考虑请求
分层请求和多个连接可能非常昂贵。您不必构建完全规范化的关系模式,并且可以考虑进行一些非规范化以更好地适应数据库将面临的请求类型。
只是一些想法:)
【讨论】:
【参考方案6】:一些杂项建议:
我很惊讶还没有人提到这一点。使用内存缓存。如果您收到大量重复类型的查询(大多数 web 应用都会这样做),这可能会产生巨大的影响。
考虑使用 Oracle 的 failover and load balancing。它允许您在单个数据库连接上添加对多个数据库的支持。
要考虑的另一件事是使用system similar to FriendFeed's。这解决了“我们如何在不中断世界的情况下对数据库进行更改?”的问题。比什么都重要。
【讨论】:
以上是关于你真的可以用 Django 扩大规模吗……鉴于你只能使用一个数据库? (在 models.py 和 settings.py 中)的主要内容,如果未能解决你的问题,请参考以下文章