如何平衡TCP流量与DigitalOcean负载平衡器

DigitalOcean负载平衡器可用于在Droplet池中分配流量,以提高性能和可用性。虽然许多应用程序使用HTTP或HTTPS进行通信,但它的安全变体,有大量应用程序使用...

介绍

DigitalOcean负载平衡器可用于在Droplet池中分配流量,以提高性能和可用性。 虽然许多应用程序使用HTTP或HTTPS(其安全变体)进行通信,但是存在使用TCP接口的大量应用程序。

在本指南中,我们将演示如何使用DigitalOcean负载平衡器设置TCP平衡。 例如,我们将平衡到MariaDB Galera集群的流量,但负载平衡步骤将适用于更广泛的软件。

先决条件

如上所述,我们将使用Galera集群来演示TCP平衡。 在开始之前,你需要按照我们在Ubuntu 16.04 MariaDB的Galera Cluster设置三台服务器集群。

按照上面的教程,你将有:

  • 一个Galera群跨越三个Droplet
  • 样本数据库称为playground包含一个equipment
  • 一个sudo每个Droplet用户
  • 允许三个节点之间的群集通信的防火墙策略

您还需要一个客户机通过负载均衡器连接到群集 我们将使用Ubuntu 16.04 Droplet。 成立了sudo遵循此计算机上的用户的Ubuntu 16.04服务器初始设置指南

一旦您的服务器启动并运行,您应该准备好继续下面。

配置外部数据库用户

在将负载平衡器配置为Galera集群的前端之前,我们需要在数据库上配置远程访问。 我们将添加一个远程用户有权访问playground里的那个前提条件创建的数据库。

首先,登录到您的加莱拉Droplet的一个 sudo用户。

通过键入以下命令来启动MariaDB的交互式shell:

mysql -u root -p

你会被要求提供的MariaDB的密码root帐户。 正确输入后,您将被放入一个交互式MariaDB shell中。

验证playground数据库可通过键入:

SHOW DATABASES;

您应该看到playground结果之间数据库:

+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| playground         |
+--------------------+
4 rows in set (0.00 sec)

接下来,我们将创建一个具有该数据库完全访问权限的新远程用户。 由于DigitalOcean负载平衡器是具有自动故障转移的高可用性服务,因此来自负载平衡器的连接可能并不总是来自相同的IP地址。

因此,我们需要创建相当宽松的用户,而不受远程连接地址的限制。 我们将创建一个remoteuser帐户,并给它完全访问playground数据库。 请谨慎选择此帐户的强密码:

GRANT ALL ON playground.* TO 'remoteuser'@'%' IDENTIFIED BY 'strong_password';
Query OK, 0 rows affected (0.01 sec)

刷新权限以确保实施更改:

FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

退出MariaDB会话并通过键入以下命令返回shell:

exit
Bye

群集现在具有可以用于访问远程用户帐户playground数据库。

设置MariaDB客户端Droplet

在设置负载均衡器之前,我们将配置MariaDB客户端Droplet并测试我们刚添加的远程数据库用户。 连接到客户端MariaDB的作为Dropletsudo用户。

我们将从默认的Ubuntu存储库安装MariaDB客户端软件,以便我们可以连接到集群中的节点。 更新本地软件包索引并通过键入以下内容安装客户端:

sudo apt-get update
sudo apt-get install mariadb-client

安装完成后,我们将进行测试,以确保我们在Galera集群上设置的远程用户正常工作。

连接到playground上的任何与客户MariaDB的命令加莱拉服务器的公网IP地址的数据库:

mysql -u remoteuser -p -h galera_server_IP playground

系统将提示您为remoteuser ,你在最后一节设定的密码。 之后,您将被放入一个交互式会话。

显示的内容equipment表,确认一切正常:

SELECT * FROM equipment;
+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  4 | slide  |     2 | blue   |
|  8 | swing  |    10 | yellow |
| 12 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.00 sec)

验证对数据库的访问后,通过键入以下命令退回到shell:

exit
Bye

我们已验证客户端可以连接到单个集群成员。 现在我们准备在集群前面设置一个负载均衡器,以平衡每个节点之间的请求。

创建TCP负载平衡器

我们拥有创建DigitalOcean负载均衡器以管理与集群的连接所需的一切。

首先导航到DigitalOcean控制面板的负载平衡器部分。 在主菜单中点击网络 ,然后选择负载平衡器

DigitalOcean负载平衡器

接下来,通过单击创建负载平衡器创建一个新的负载均衡:

创建新的DigitalOcean负载均衡器按钮

您将转到负载平衡器创建页面。 为您的负载均衡器选择一个名称。 这些可以由字母,数字,句点和破折号组成。

随后,每个加莱拉Droplet添加到在添加Droplet部分负载平衡器。 最简单的方法是开始键入每个Droplet的名称,然后选择它们。 这应该自动选择您的地区:

将Galera节点添加到负载平衡器

接下来,在转发规则部分,我们将修改现有规则。

点击第一个字段的下拉菜单来更改HTTP到TCP。 更改端口在两个负载平衡器侧,从80到3306的Droplet方面,MariaDB的监听端口:

更改DigitalOcean负载平衡器中的默认转发规则

接下来,点击高级设置部分中的编辑高级设置按钮:

编辑DigitalOcean负载平衡器中的高级设置

在展开界面,在健康检查节,一个HTTP健康检查是默认定义。 由于Galera集群不使用HTTP,此健康检查将失败。

通过选择从下拉下来TCP在第一个字段修改健康检查。 端口字段中,将值改为从80到3306:

更改DigitalOcean负载平衡器运行状况检查

当您完成后,单击创建负载均衡器按钮:

创建DigitalOcean负载均衡器按钮

您的负载均衡器将开始创建过程。 这可能需要几分钟时间才能完成。

通过负载平衡器连接Galera集群

一旦负载均衡器可用,我们可以通过连接到负载均衡器连接到Galera集群。

您可以通过再次访问DigitalOcean控制面板中的负载均衡器索引页找到您的负载均衡器的公共IP地址。 在主菜单中点击网络 ,然后选择负载平衡器 将列出负载平衡器IP地址:

查找DigitalOcean负载均衡器IP地址

我们将执行两个单独的检查,以确保负载平衡器正常工作。

验证通过负载平衡器可以达到群集

在您的客户端MariaDB的Droplet ,连接到使用MariaDB的客户端负载平衡器的公网IP地址 我们将连接到playground数据库再次使用相同的语法为最后一次:

mysql -u remoteuser -p -h load_balancer_IP playground

系统将提示您为remoteuser密码。 之后,您将被放入一个交互式MariaDB会话。

验证您可以显示equipment确切表内容你可以连接到直接加莱拉机时:

SELECT * FROM equipment;
+----+--------+-------+--------+
| id | type   | quant | color  |
+----+--------+-------+--------+
|  4 | slide  |     2 | blue   |
|  8 | swing  |    10 | yellow |
| 12 | seesaw |     3 | green  |
+----+--------+-------+--------+
3 rows in set (0.00 sec)

键入以下命令退出MariaDB会话:

exit
Bye

如果已连接到负载平衡器IP地址并且能够显示表内容,则负载平衡器正确转发流量。

在多个连接上验证后端轮换

接下来,我们应该验证负载均衡器正确地平衡了可用后端之间的请求。

为此,我们将重复连接到负载平衡器的IP地址,并要求它每次显示处理请求的节点。 如果负载平衡器正确地超出请求,则信息应反映不同的后端。

wsrep_node_addresswsrep_node_name持有每个节点的加莱拉名称和IP地址。 我们可以通过键入以下内容查询此信息:

mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'

系统将提示您为remoteuser再次密码。 输入之后,您应该看到类似于以下内容的输出:

+-----------------------------+------------------+
| Variable_name               | Value            |
+-----------------------------+------------------+
| wsrep_node_address          | node2_IP_address |
| wsrep_node_incoming_address | AUTO             |
| wsrep_node_name             | node2            |
+-----------------------------+------------------+

您看到的节点名称和IP地址将反映响应请求的Galera群集节点的值。

要验证负载平衡器是否在后端服务器之间分发请求,请再次发出请求:

mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'

同样,你会被提示输入remoteuser密码。 这一次,结果应该反映一个新的后端:

+-----------------------------+------------------+
| Variable_name               | Value            |
+-----------------------------+------------------+
| wsrep_node_address          | node3_IP_address |
| wsrep_node_incoming_address | AUTO             |
| wsrep_node_name             | node3            |
+-----------------------------+------------------+

再次发出相同的命令:

mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'

输入密码后,您应该会看到最后一个Galera服务器的信息:

+-----------------------------+------------------+
| Variable_name               | Value            |
+-----------------------------+------------------+
| wsrep_node_address          | node1_IP_address |
| wsrep_node_incoming_address | AUTO             |
| wsrep_node_name             | node1            |
+-----------------------------+------------------+

当作出额外的请求时,该序列将重复。 这验证负载平衡器在我们的后端Droplet之间正确交替。

结论

本指南演示了如何平衡TCP流量与DigitalOcean负载平衡器。 我们设置一个Galera集群作为示例TCP应用程序,但负载均衡器的配置应该类似于其他TCP平衡任务。