在Django中,真的只能使用一个数据库就能扩展吗?

5 投票
6 回答
1792 浏览
提问于 2025-04-15 18:24

Django的设置文件settings.py里只能使用一个数据库。这会不会影响你扩展应用的能力呢?比如说,面对数百万用户的时候。

6 个回答

3

要让数百万用户同时访问而不出问题,这其实不是数据库的问题,而是通过负载均衡和缓存等方法来解决的,具体可以参考上面的S. Lott。

而写入数据的扩展确实可能是数据库的问题。一个解决办法是“分片”,也就是把数据分散到多个数据库中,但在使用SQL时,这样做会比较复杂,因为要保持数据库之间的关系。现在比较流行的解决方案是新型的“nosql”数据库。不过,如果你真的遇到了这些问题,那就需要专业的专家来帮忙,而不是仅仅依靠Stackoverflow上的一些回答。:)

7

数据库并不是你的瓶颈。

仔细检查一下你的浏览器。

每次你发送一个HTML页面,平均还会发送8个其他文件,其中一些可能比较大。这些文件包括你的JavaScript、CSS、图形等。

真正的性能瓶颈在于浏览器请求这些文件,并且接受数据的速度非常慢。

为了提升性能,可以这样做:

  1. 使用多个前端,并用像wackamole这样的纯软件解决方案进行负载均衡。 http://www.backhand.org/wackamole/

  2. 使用像squid这样的代理服务器来发送“其他”文件。这些文件大部分是静态的。下载到客户端的工作量有七成是来自这里。确保这些设置得当。

  3. 使用多个并发的mod_wsgi/Django来创建基于数据库查询的动态HTML。这种动态内容比较少。确保mod_wsgi处于守护进程模式,这样你可以让多个Django服务器同时服务于Apache。根据需要建立尽可能多的这些服务器。它们都是一样的,都是并行工作的,并且都由Wackamole共享。

  4. 使用一个快速的数据库,比如MySQL,来处理那些必须从数据库获取的少量数据。MySQL可以利用服务器上的多个核心,所以它的扩展性很好,你只需要购买内存。把这个数据库放在一个单独的机器上,专门为它配置和优化。

你会发现这样扩展得很好。负载在squid、apache、Django守护进程和实际数据库之间分配得很均匀。你还会发现每个部分的负载(从无聊的静态部分到有趣的数据库查询)都是独立并行进行的。

最后,买一本Schlossnagle的书。 http://www.amazon.com/Scalable-Internet-Architectures-Theo-Schlossnagle/dp/067232699X

11

Django现在支持多个数据库的功能。

撰写回答