这是一个新手问题。当流量通过负载平衡器转发时会发生什么?我一直以为负载平衡器只是将客户端的连接转发到一组服务器中的一台,而没有进行太多的解释。
我有一个应用程序需要 mysql 连接才能使旧库正常运行。数据库仅用于短期作业跟踪数据 - 如果数据丢失,那就没用了。它不是记录系统。负载很小。即使磁盘大小小于 10G。但如果该连接消失,旧库就会非常不高兴。
公司政策阻止我使用 RDS,而且我在设置 HA 集群时遇到了一些麻烦 - 特别是因为我不关心通常的数据备份、复制等。
我们的其他服务器都使用 Ec2 自动扩展组部署到 AWS。大多数情况下,每台服务器都是单例,我们使用 ASG 来确保其中一台服务器基本正常运行 - 健康检查大约需要 10 到 20 分钟。
我也想将 mysql 实例放入 ASG,但在通过相关 LB 传输流量时遇到了麻烦。我从 Google 了解到,您不能直接将 LB 放在 mysql 实例前面,但我认为这是为了解决数据质量问题。
我可以使用 DNS 完全忽略 LB,因此它不是一个硬拦截器,而且在更难的系统中,这无论如何都是错误的答案。但我不明白为什么在协议级别上流量没有通过。
负载均衡器端口配置:
3306(TCP)转发到 3306(TCP)
========== 更新。实际上,这里的问题似乎是 LB 配置。切换到内部 LB 并重新启动客户端后,一切正常。
我确实也必须在数据库上刷新主机,仍然不明白坏连接来自哪里。
答案1
我确实也必须在数据库上刷新主机,仍然不明白坏连接来自哪里。
很快你又得这么做了,除非你增加max_connect_errors
在服务器配置中,因为ELB 健康检查将被 MySQL 解释为连接不良,因为 ELB 无需身份验证即可连接和断开连接。如果出现足够多的此类错误,入站连接将再次被拒绝。在安全的环境中,出现严重连接错误的主机实际上不会对服务器构成重大威胁,因此增加max_connect_errors
,以解决这个问题应该没问题。
您可以SET GLOBAL LOG_WARNINGS = 2;
登录 MySQL 服务器,然后检查 MySQL 错误日志(SHOW GLOBAL VARIABLES LIKE 'log_error';
以找到错误日志的路径)。此值 (2) 实际上是一个很好的默认设置,可以一直使用log_warnings
。
否则,是的,您可以通过 ELB 或任何其他 TCP 负载平衡器将 TCP 连接代理到 MySQL,但“您失去什么”的答案是,您失去了发起连接的主机(IP 地址和端口)的身份,而 MySQL 将看到 ELB 的 IP 地址……因此,如果您在 MySQL 层的身份验证要求某些用户来自特定的 IP 地址或范围,那么 MySQL 将看不到这一点。ELB 支持该PROXY
协议,这使得该源 IP 和端口信息在 TCP 连接上再次可用,但 MySQL 不支持该PROXY
协议,因此这是不可能的。
MySQL 的另一种负载均衡器是 HAProxy,它对 MySQL 协议有足够的了解,可以在执行健康检查时尝试登录服务器,然后再次断开连接。(我与该产品或项目没有任何关系,但广泛使用它。)与 ELB 不同,它支持“备份”服务器的概念,除非主服务器关闭,否则不会上线。考虑到这一点,我能够编写一个“虚拟 MySQL 服务器”作为最后的备份服务器,它只会返回一个错误,MySQL 客户端会将其识别为来自 MySQL 服务器的有效消息……这样当遇到这种情况时,应用程序就会失败迅速地并且果断(没有长时间超时),在应用程序日志中显示一条消息,向 DevOps 指出问题的性质。当没有可用的服务器时,我会用一个假错误进行响应(除了消息之外,错误代码是可配置的,但如果由翻译错误代码的客户端库解释,则此错误代码表示“服务器正在关闭”):
$ mysql --host x.x.x.x --port xxxxx
ERROR 1053 (HY000): No healthy MySQL servers are available to provide the requested service (but the connection to the load balancer was successful)
$ mysqldump --host x.x.x.x --port xxxx --all-databases
mysqldump: Got error: 1053: No healthy MySQL servers are available to provide the requested service (but the connection to the load balancer was successful) when trying to connect
很棒吧?
答案2
通常不可能“转发” TCP 连接。负载均衡器会终止来自客户端的连接并打开与原始服务器的新连接,因此负载均衡器未收集并传递给原始服务器的任何特定于连接的信息都会丢失 - 最明显的是源 IP 地址(通常使用 X-Forwarded-For 标头传递给原始服务器)和源端口号。
Amazon Elastic Load Balancer 的超时时间也很短,这通常会阻止它们用于持久数据库连接,因为客户端希望连接保持打开状态并可用。他们最近推出了自定义超时时间的功能,最长可达 3600 秒(一小时),这对您来说可能足够了。