服务器群集(Django,Apache,Nginx,Postgres)

我有一个与Django,Apache,Nginx和Postgres部署的项目。 该项目要求客户可以查看实时数据。 项目要点是:1.现场设备login后向服务器发送数据(设备也类似网站用户)。 2.有postgres导入上传数据的后台导入过程。 3.系统的networking用户使用这些数据,并可以向设备发送命令,设备在login时读取这些命令。 4.还有对数据运行的背景分析例程。

上述所有设置和系统都部署在一台亚马逊EC2云计算机上。 该项目目前支持600多个设备和400个用户。 但随着设备数量的不断增加,服务器的性能正在下降。

我们想扩展这个项目,以便它可以支持越来越多的设备。 我最初的想法是,我们将创build一个像当前的服务器,并将其中的设备分为服务器。 但是,我们需要一个中央的用户和设备pipe理点,虽然Django的pipe理。

有任何想法吗? 创build可伸缩体系结构的最佳方式是什么? 如果可能的话,如何创build一个Postgres集群并在Django中使用它?

你的问题是短暂的细节和长时间的挥手,但这听起来像你最初的想法是一个很好的开始。 您的应用程序听起来与Zenoss监视套件非常相似,它使用基本上相同的负载分布架构来扩展:多个监视主机共享数据收集工作负载,具有单个pipe理界面,以及pipe理主机上的数据库或单独的系统。

如果你的瓶颈在第一点(设备发送数据到你的服务器),那么将这些任务分到第二台机器上,应该为负载增长腾出空间。 最大的实现障碍通常是如何pipe理多个Django服务器上的任务。 Celery,一个分配的任务队列引擎,可能是目前最好的select。 它最初是围绕Djangodevise的,对你有好处,它有非常活跃和有用的开发者和用户社区。

如果点#2和#4是你目前的限制,但是,你可能在谈论数据库的可伸缩性。 总的来说,这只是一个难题:没有代码透明,负载中立且便宜的方法来扩展数据库容量。

如果你只需要获得更多的数据库“读取”IO容量,复制就可能成功。 Postgres使用名为Slony-I的外部工具支持复制。 这是单主复制,具有多个只读“从”主机,获得在主服务器上执行的语句副本。 所有应用程序的写入操作(UPDATE,INSERT,DELETE …)都会通过单主控主机,但是您将在主控和所有从控制器之间分配您的读取(SELECT …)。

分布式读取所需的代码修改通常非常简单。 Django最近增加了对复制数据库的支持,我还没有用过,但它应该是相当不错的。

如果你需要更多的数据库写入IO容量,分片将可能工作。 每个主机都保留每个数据库表的独立块。 数据库客户端使用确定性函数来决定任何给定logging应该驻留的位置,因此负载分布实际上是无状态的,并且可以扩展到大量的数据库服务器。 Django的新的多数据库支持(与上面相同的链接)也支持分片。 你需要更改代码,痛苦应该是有限的。

另外,我想提一下Memcached,它似乎是今天(Facebook,Google,Twitter …)上互联网上所有高度可扩展的Web应用程序的一部分。 一个好的caching实现可以将您的数据库需求减less到原始大小的一小部分,将昂贵的缓慢的数据库查找转换为便宜,快速的caching查找。 现在,Django已经支持了Memcached的整合。

我意识到这些都不是太具体,但它应该给你一个很好的起点去搞清楚细节。 祝你的项目好运。

首先你必须认识到,你的酒店在哪里? 应用层的问题? 数据层访问? 你的访问模式是什么? 大部分是读? 或者也许主要是写?

对于应用层:

  • 增加更多的应用服务器
  • 一些动作可以放入工作队列中,而无需用户等待完成(例如对设备的命令)

对于数据层有一些方法,你可以遵循:

  • 想想你的工作量? 你能减less一些疑问吗? 你能改变你的模式吗? 也许增加一些非规范化(预计算统计,聚合数据)。 对于非常大的表格,您可能会添加垂直分区
  • 为了读取扩展,您可以使用复制,如Ryan B. Lynch
  • 用memcached或类似的东西caching。 但请记住: “计算机科学中只有两件难事:caching失效和命名事物。”
  • 我不build议分片(水平分区),因为pipe理分片数据库是痛苦的。 这里是关于分片的不错文章 。
  • 将您的数据分成不同的数据后端。 这里是很好的文章描述这个想法。