我有一个使用postgres的django项目,其中85%以上的用途发生在局域网内。其他15%来自互联网。有时,WAN使用案例在给定的小时或几小时内最多可达90%。
该项目只是一个通用社区应用程序,服务于纽约州中部的一个小镇(New Paltz)。
通过我们当地的54Mbps传送大型文件或流媒体非常棒;我们很快就会喜欢公共电视和收音机。
表现不是唯一的问题;我们还希望能够在完全没有互联网连接的情况下使用该应用程序。这主要是学术练习,但并非完全:在风暴期间,我们每年都会失去几次连接,我们仍然希望能够继续学习。
这是我想要的部署场景(我认为):我想在本地和机架空间运行django项目。我希望在这两个地方托管静态内容 - 显然本地用户将获得本地版本,其他人将获得rackspace托管版本。
我希望rackspace实例允许数据库写入,但是只要方便就将它们传输到我的本地数据库,将本地数据库保持为权威数据库。
这可行吗?这是好习惯吗?它有详细记录吗?有更好的简单方法吗?
答案 0 :(得分:1)
<强>可行吗 当然。
良好做法? 如果您能够承受仅限机架空间部署的成本/速度,我只需在云中运行它。
记录良好? 各种部分(复制,自动部署等)是。您必须将它们组合在一起才能获得具体的用例。
有更好的方法吗? 取决于......我看到的唯一主要痛点是保持数据库同步。一种可能的方法是让机架空间服务器通过某些防火墙/ vpning指向您的LAN数据库。然后,您只需在云中使用部署脚本中的Web服务器即可进行所有必要的更新。问题是,如果你的内部网络出现故障,那你就搞砸了。如果这仅供内部公司使用,则可以接受停机时间。在不知道具体用例的情况下很难说。
答案 1 :(得分:1)
我认为你没有得到你想要的答案的原因是因为你描述的部署确实听起来像为边际收益(性能)增加了很大的复杂性。此外,您还没有提到它是什么类型的应用程序,或者您运行的数据库服务器的风格。
话虽如此,这里有一些一般的建议。
如果您不希望使用外部提供商托管应用程序的唯一原因是速度(对于本地用户),那么请考虑一些方法来使您的应用程序运行得更快,无论它在何处部署。
我通过几个简单的步骤看到了Django应用程序性能的大量改进:
使用django-debug-toolbar分析数据库查询,确保您已在WHERE子句中出现的所有列上创建了索引(除非这些列特别重写)
确保您的服务器内存未被过度分配(在Linux上免费使用-m,请查看第二行)。
确保您“长期缓存”静态内容(最好是从CDN投放)。
如果您的云托管服务提供商提供数据库服务器,请尝试使用它们。它们可能比你自己VPS上的速度快几百倍。
再次使用django-debug-toolbar,查看哪些SQL查询需要很长时间才能运行。考虑一下,这些查询是否可以缓存?如果是这样,请使用django的低级缓存API来防止不必要地重新运行昂贵的数据库查询。
此外,如果可能的话 - 选择一个地理位置靠近您的云托管服务。 300毫秒延迟和8毫秒延迟之间的差异是巨大的。
完成所有这些操作后,如果您仍需要远程数据库的本地镜像,则可以完成此操作。
首先,查看数据库复制功能;添加不必要的复杂性要非常谨慎。对只读数据库的单向数据库复制几乎比其他任何数据都简单。
Django允许您为每个模型和每个读/写配置database routers。但是,从一个数据库读取并写入另一个数据库的路径是非常谨慎的;没有数据库复制方案可以保证足够低的延迟,以免造成数据不一致。
但是,您可能会发现通过在读/写数据库上运行contrib.auth应用程序(用户,会话),以及在只读镜像上运行其他更多“报告”类型的应用程序,您可以获得实用的结果。 / p>
我希望能给你一些想法。
编辑:由于您不断添加/更改问题。我要为你澄清一些事情:
这可行吗?
是。如果有足够的时间和金钱,一切皆有可能。
这是好的做法吗?
通常可以通过一些思想测试来判断良好实践。一个这样的测试是,“这是否能够满足要求,而不会过度简化要求?”。
我会说不,这不是好的做法,只是因为它可能不是最简单的东西,可以满足你的要求。寻找处于类似情况的人,与他们联系,并询问他们是如何做到的。
是否有详细记录?
罕见的部署很少有详细记录,这绝对是一个不常见的提议。
有更好的简单方法吗?
是的,绝对的。复杂性是你的敌人。根据经验,每次添加一个额外的复杂程度时,您需要将安全更改应用程序所需的测试加倍。是的,你可以自动化这些测试,但编写测试也是很多工作。最好首先避免复杂性。
结束思考
您的问题已经从“我可以运行两个地理位置分散的网站实例,每个网站都拥有自己的数据库 - 但只有一个权威”更复杂的事情发展而来。
事实上,这是一个复杂的问题,告诉我你需要简化你对实际需求的思考。如果你实现了必须提供的好处,你能想到一个你的系统将通过的测试,它今天不会吗?