【发布时间】:2012-01-19 05:09:25
【问题描述】:
我知道这是一个非常笼统和主观的问题,所以如果它不符合 StackOverflow 网络礼节,请随时投票关闭它。但对我来说,值得尝试 ;)
从现在开始,我再也没有构建过高流量的应用程序,所以我不知道(除了一些在网络上阅读的内容)有关扩展实践的信息。
如何设计一个数据库,在需要扩展时,我不必重构数据库结构或应用程序代码?
我知道开发(和优化)应该循序渐进,在瓶颈发生时对其进行优化,并且当您不知道您将拥有多少用户以及如何使用时,几乎不可能设计出完美的结构他们使用数据库(例如读/写比率),我只是在寻找一个好的基础。
使结构几乎可以使用partitioning 和sharding 进行缩放的最佳做法是什么?必须绝对避免使用hacks?
编辑关于我的应用程序的一些细节:
- 应用程序将作为多站点行为运行
- 我将为每个应用程序版本(db_0_0_1、db_0_0_2 等)创建一个数据库*
- 每个“站点”都将在数据库中拥有一个架构*和一个只能访问自己的架构的角色
- 应用程序代码将主要是 PHP 和 Python 中的一些东西(守护程序和维护的东西)
- Web 服务器可能是 Nginx 和 lighttpd 或 node.js,以支持长轮询任务(例如聊天)
- 缓存将使用 memcached 完成(加上 apc 用于与 php 代码严格相关的内容,因为它可以在 php 之外使用)
【问题讨论】:
-
我为您在设计上的超前思考而不是仅仅潜入并希望获得最好的结果而鼓掌。然而,我能给你的最好的建议是,当你第一次认为你需要分片或分区时:不要!真正查看您的数据库使用模式,您可能会发现这是对数据库的不良使用,而不是需要“扩展”。太多次,我看到人们试图通过分片来扩展糟糕的代码。它来自“把硬件扔到问题上”的想法。现在他们有更多的硬件需要维护,一个共享的基础设施,剩下的代码仍然很糟糕。
-
@MatthewWood 我已经完成了一个“最好的祝愿”的项目构建,它应该是一个“个人”项目,但后来成长为中小型......数据库(和代码)是维护的噩梦;)我不想犯同样的错误两次;)我同意你的观点,大部分优化应该首先出现在代码中,硬件扩展是最后一次尝试
标签: database postgresql optimization scaling