介绍
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
结果之间数据库:
Output+--------------------+
| 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';
OutputQuery OK, 0 rows affected (0.01 sec)
刷新权限以确保实施更改:
FLUSH PRIVILEGES;
OutputQuery OK, 0 rows affected (0.00 sec)
退出MariaDB会话并通过键入以下命令返回shell:
exit
OutputBye
群集现在具有可以用于访问远程用户帐户playground
数据库。
设置MariaDB客户端Droplet
在设置负载均衡器之前,我们将配置MariaDB客户端Droplet并测试我们刚添加的远程数据库用户。 连接到客户端MariaDB的作为Droplet的sudo
用户。
我们将从默认的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;
Output+----+--------+-------+--------+
| 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
OutputBye
我们已验证客户端可以连接到单个集群成员。 现在我们准备在集群前面设置一个负载均衡器,以平衡每个节点之间的请求。
创建TCP负载平衡器
我们拥有创建DigitalOcean负载均衡器以管理与集群的连接所需的一切。
首先导航到DigitalOcean控制面板的负载平衡器部分。 在主菜单中点击网络 ,然后选择负载平衡器 :
接下来,通过单击创建负载平衡器创建一个新的负载均衡:
您将转到负载平衡器创建页面。 为您的负载均衡器选择一个名称。 这些可以由字母,数字,句点和破折号组成。
随后,每个加莱拉Droplet添加到在添加Droplet部分负载平衡器。 最简单的方法是开始键入每个Droplet的名称,然后选择它们。 这应该自动选择您的地区:
接下来,在转发规则部分,我们将修改现有规则。
点击第一个字段的下拉菜单来更改HTTP到TCP。 更改端口在两个负载平衡器侧,从80到3306的Droplet方面,MariaDB的监听端口:
接下来,点击高级设置部分中的编辑高级设置按钮:
在展开界面,在健康检查节,一个HTTP健康检查是默认定义。 由于Galera集群不使用HTTP,此健康检查将失败。
通过选择从下拉下来TCP在第一个字段修改健康检查。 在端口字段中,将值改为从80到3306:
当您完成后,单击创建负载均衡器按钮:
您的负载均衡器将开始创建过程。 这可能需要几分钟时间才能完成。
通过负载平衡器连接Galera集群
一旦负载均衡器可用,我们可以通过连接到负载均衡器连接到Galera集群。
您可以通过再次访问DigitalOcean控制面板中的负载均衡器索引页找到您的负载均衡器的公共IP地址。 在主菜单中点击网络 ,然后选择负载平衡器 。 将列出负载平衡器IP地址:
我们将执行两个单独的检查,以确保负载平衡器正常工作。
验证通过负载平衡器可以达到群集
在您的客户端MariaDB的Droplet ,连接到使用MariaDB的客户端负载平衡器的公网IP地址 。 我们将连接到playground
数据库再次使用相同的语法为最后一次:
mysql -u remoteuser -p -h load_balancer_IP playground
系统将提示您为remoteuser
密码。 之后,您将被放入一个交互式MariaDB会话。
验证您可以显示equipment
确切表内容你可以连接到直接加莱拉机时:
SELECT * FROM equipment;
Output+----+--------+-------+--------+
| 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
OutputBye
如果已连接到负载平衡器IP地址并且能够显示表内容,则负载平衡器正确转发流量。
在多个连接上验证后端轮换
接下来,我们应该验证负载均衡器正确地平衡了可用后端之间的请求。
为此,我们将重复连接到负载平衡器的IP地址,并要求它每次显示处理请求的节点。 如果负载平衡器正确地超出请求,则信息应反映不同的后端。
的wsrep_node_address
和wsrep_node_name
持有每个节点的加莱拉名称和IP地址。 我们可以通过键入以下内容查询此信息:
mysql -u remoteuser -p -h load_balancer_IP playground -e 'SHOW VARIABLES LIKE "wsrep_node%";'
系统将提示您为remoteuser
再次密码。 输入之后,您应该看到类似于以下内容的输出:
Output+-----------------------------+------------------+
| 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
密码。 这一次,结果应该反映一个新的后端:
Output+-----------------------------+------------------+
| 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服务器的信息:
Output+-----------------------------+------------------+
| Variable_name | Value |
+-----------------------------+------------------+
| wsrep_node_address | node1_IP_address |
| wsrep_node_incoming_address | AUTO |
| wsrep_node_name | node1 |
+-----------------------------+------------------+
当作出额外的请求时,该序列将重复。 这验证负载平衡器在我们的后端Droplet之间正确交替。
结论
本指南演示了如何平衡TCP流量与DigitalOcean负载平衡器。 我们设置一个Galera集群作为示例TCP应用程序,但负载均衡器的配置应该类似于其他TCP平衡任务。