我如何通过多台机器为django网站提供服务,这就是我如何使其分布的方式?

问题描述 投票:2回答:2

我有我的django网站,我想使它成为分布式的,我知道系统设计和分布式系统的所有概念,但是仍然无法弄清楚如何使用多台服务器为它提供服务。我正在尝试使我的系统分布式,以便可以从两台机器(这就是分布式系统的工作方式)为我的网站提供服务。我已经用Django编码了我的网站。我想知道使我的网站可以由2台机器提供服务的步骤。这就是两个系统如何相互了解,如何连接以及每当有请求进入服务器时,就会选择其中一个服务器来处理该请求。在这种情况下,我必须加入哪种软件或工具,以及哪种软件将接受请求,以便它可以决定将请求发送到哪台计算机以及在这种情况下应如何配置数据库?

P.S:我唯一知道的是如何使用一台服务器(从Linode,DigitalOcean获取机器实例)为django网站提供服务。我想为我的网站实施系统设计分布式系统概念,以便我可以亲自实施以学习系统设计的所有概念]

django server distributed-computing distributed-system system-design
2个回答
2
投票

从单服务器设置到分布式(高度可用)的步骤不是一个简单的步骤,与Django无关,而与常规服务器基础结构无关。但是,有很多资源可以帮助您入门。

考虑到您提到DigitalOcean,我相信他们网站上的以下教程将指导您正确的方向:Building for Production: Web Applications — Overview

在完全阅读该文章之前,请确保还阅读5 Common Server Setups For Your Web Application。它概述了常见的服务器设置,从单台服务器到所需状态。


2
投票

您正在尝试为您的应用程序实现分布式系统概念。为此,您需要了解分布式系统和系统设计的概念。 Django与将网站扩展到多个服务器无关。现在,所有这些都掌握在分布式系统技术和软件中。无论我在此答案中解释的内容如何,​​都可以使您对分布式系统的工作原理有一个基本而全面的理解。

我可以为您简要说明如何实现此目标。我假设您有两台服务器,您要在其中输入请求并由其中任何一台服务器提供服务(就像任何分布式系统的工作方式一样。)

首先,您应该熟悉负载均衡器,Web服务器,应用程序服务器,数据库服务器的概念。

[当我们拥有一台服务器时,一切都变得容易得多,我们有一台服务器来设置我们的Web服务器(例如apache),我们需要一些接口,以便我们的Web服务器和Web框架可以相互通信,因此我们进行了安装可以通过WSGI接口规范与Django通信的mod_wsgi apache模块。从那里开始,我们只需要编辑conf文件,我们就可以开始了。

现在,我们知道一个Web服务器不足以处理这些请求。我们购买了一台服务器以减少一台服务器的负载。您需要做的第一件事是将相同的Django网站代码复制到另一台服务器。这样两者都将运行相同的前端代码,并且我们的应用程序服务器(Django)可以处理请求。现在,当有请求进入时,我们需要将其转发到服务器中的任何一个,为达到此目的,我们配置了一个负载平衡器,以将请求一个接一个地发送给两个服务器(或者您可以使用其他算法)。现在,每当有请求进入时,负载均衡器便会接收该请求并将其转发到我们的任何服务器。您应该在两台计算机上都具有Web服务器(例如apache),因为此处的负载均衡器的任务只是将请求定向到任何一台服务器。负载平衡器是一台服务器(通常),它位于一组应用程序服务器的前面,并管理它们之间的流量。传入的Web流量通过负载均衡器在网络和应用程序服务器之间进行分配。

为了更好地理解,让我们理解此图,

enter image description here

其中有两个负载平衡器,但它们处于主动/被动对中,也称为HA(高可用性)对。让我们将它们视为一个(因为另一个是故障转移)。只有第一个失败时,另一个才会出现。它们的后面是两个Web服务器。这些可能是Apache Web服务器。负载平衡器具有应用程序服务器的内部IP。负载平衡器接受传入的请求,并将其转发到准备接受它们的服务器。负载均衡器仅执行接收初始请求并确保Web服务器能够回答它的功能。 Web服务器是一种软件,可通过信息响应请求。应用服务器通过网络服务器作为中介,对发出的请求进行处理,然后返回答复。应用服务器的例子可以是Ruby / Rails,PHP,Django等。这些服务器是应用程序执行代码的地方。缓存,正向和反向代理都是在Web服务器层之前执行的所有操作,以减轻Web服务器的压力。 其中一种技术是HAProxy,它是免费的开源软件,它为基于TCP和HTTP的应用程序提供了高可用性负载平衡器和代理服务器,该应用程序将请求分布在多个服务器之间。

现在进入数据库

部分,您可以将数据库托管在任何一台计算机上(使用MYSQL服务器),并使用您的数据库地址将这两个服务器连接到同一数据库。您可以拥有一个集中的数据库,您的应用程序框架将从该数据库中读取数据。数据将由数据库服务器(例如,MYSQL)提供服务,并且所有并发性和可用性概念将得到照顾,以防两个服务器同时请求访问同一数据。

还请注意,您的负载均衡器还将在运行该计算机的任何一台计算机上接收请求并将其转发到您的服务器中的任何一台。

当我们有多台服务器时,又出现了一个问题:

[当您的网站仅由一个Web服务器提供服务时,在客户端-服务器对中,将创建一个会话对象并将其保留在Web服务器的内存。来自客户端的所有请求都转到此Web服务器并更新此会话对象。如果需要一些数据在交互期间存储在会话对象中,它是存储在此会话对象中,并一直保持在那里存在。如果您的网站由多个Web服务器提供服务在负载均衡器后面,负载均衡器决定哪个实际(物理)Web服务器应将每个请求发送到。例如,如果有在负载均衡器后面有3个Web服务器A,B和C服务器A为www.mywebsite.com/index.jsp提供服务,www.mywebsite.com/login.jsp由服务器B和服务器C提供了www.mywebsite.com/accoutdetails.php。

现在,如果请求是从(物理上)3个不同服务器,每个服务器都为您创建了一个会话对象,因为这些会话对象位于三个独立的盒子上,没有知道会话对象中存在什么的直接方法其他。

有多种方法可以为会话维护同一服务器:

  • 通过存储会话:
  • 您必须将会话存储在公用存储中服务器可以访问,您可以将会话存储在文件中(通过NFS可供两台服务器访问),通常不建议这样做因为它很慢。您可以将会话存储在DB中。最好的方法是使用Redis / Memcached类型的设置来存储您的会话和检索它们,它们很快,可以在许多之间共享节点。

  • 使用粘性会话
  • 如果指示负载均衡器使用粘性会话,则所有即使在同一台物理服务器上也会发生交互其他服务器存在。因此,您的会话对象将是相同的与本网站的整个互动过程中。路由器或负载具有粘性会话支持的平衡器可以将单个服务器分配给一个特定用户,基于其HTTP会话或IP地址。的路由器会记住分配的服务器一定量的时间时间,以确保将来发送同一会话的所有请求到同一台服务器。

注:如果有人在答案中发现任何可能与实际概念不符的信息,请提出建议或在评论中回复,因为这将有助于相互理解分布式系统的概念。

© www.soinside.com 2019 - 2024. All rights reserved.