我怎样才能从多台机器上为我的 django 网站提供服务,那我怎样才能让它分布?

Far*_*med 8 django distributed-computing distributed-system system-design server

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

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

Him*_*dar 14

您要做的是为您的应用程序实现分布式系统概念。为此,您需要了解分布式系统和系统设计的概念。Django 与将您的网站扩展到多个服务器无关。现在一切都掌握在分布式系统技术和软件手中。无论我在这个答案中解释了什么,都可以让您对分布式系统的工作方式有一个基本而全面的了解。

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

首先你应该熟悉负载均衡器、Web 服务器、应用服务器、数据库服务器的概念。

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

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

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

在此处输入图片说明

其中有两个负载均衡器,但它们位于主动/被动对中 - 也称为 HA(高可用性)对。让我们将它们视为一个(因为另一个是故障转移)。另一个只有在第一个失败时才会出现。在它们后面是两个 Web 服务器。这些可能是 Apache Web 服务器。负载平衡器具有应用程序服务器的内部 IP。负载均衡器接受传入请求并将它们转发到准备接受它们的服务器。负载均衡器只是执行接收初始请求并确保它得到 Web 服务器响应的功能。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 和 www.mywebsite.com/accoutdetails。

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

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

  • 通过存储会话

您必须将会话存储在两个应用程序服务器都可以访问的公共存储中,您可以将会话存储在文件中(由 NFS 挂载,以便两个服务器都可以访问)这通常是不推荐的,因为它很慢。您可以将会话存储在 DB 中。最好的方法是使用 Redis/Memcached 类型的设置来存储您的会话并检索它们,它们速度很快,并且可以在许多节点之间共享。

  • 使用粘性会话

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

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


Jef*_*die 3

从单服务器设置到分布式(高可用)的步骤并不是一个非常简单的步骤,与 Django 没有太大关系,而是与通用服务器基础设施有更多关系。但是,有很多资源可以帮助您入门。

\n\n

考虑到您提到了 DigitalOcean,我相信他们网站上的以下教程将引导您走向正确的方向:构建生产:Web 应用程序 \xe2\x80\x94 概述

\n\n

在完整阅读该文章之前,请务必阅读适用于您的 Web 应用程序的 5 个常见服务器设置。它很好地概述了常见的服务器设置,从单个服务器到您所需的状态。

\n