【问题标题】:MySQL Load BalancingMySQL 负载均衡
【发布时间】:2016-11-29 20:48:18
【问题描述】:

我们有 6 台服务器(4 台应用服务器和 2 台数据库服务器)

我们正在使用 HAProxy 在应用程序和 API 服务器之间进行负载平衡 (2/2)

现在我遇到的问题是系统管理员在 MySQL 上设置了主/从,但它总是失败,直到现在我们无法使用从属,因为大多数数据总是损坏,我们总是需要修复它,每个时间我们得到不同的错误。

我们尝试为读/写(在 master 上写入,在 slave 上读取)进行某种负载平衡,但我们无法使用它,因为 slave 数据并不总是正确的。

我想知道的是,在处理高负载服务器时,您总是需要数据准确且不能冒任何风险,大佬们是如何处理的?

谁能告诉我他自己的经历和他用的什么?

我发现了什么:Percona XtraDB Cluster,但在进入这个方向之前需要输入...

谢谢!!

【问题讨论】:

  • 如果应用程序数据模型很简单,您可以考虑使用数据库分片,但这样做时要小心,有时问题会更大,因为您需要在业务逻辑中处理所有这些分片。
  • “它总是失败,直到现在我们无法使用从属服务器,因为大多数数据总是被破坏” 如果是这样,那么它的设置不正确。正确设置后,MySQL 复制可以正常工作。
  • @Michael-sqlbot 我同意,但我们总是遇到错误,例如查询时出现错误“表 'xxxxx' 已满”。默认数据库:'xxxxx'。查询:'ALTER TABLE xxxxx ADD INDEX IX_fill_empty_xxx_cron (type_id, e_id, model_id) 所以在我们 100% 完成之前,奴隶不会崩溃,我们不能使用那个东西
  • 您可以根据需要从自动化系统中安全地发出查询SHOW SLAVE STATUS;,以主动监控复制并更快地发现问题。这个例子表明从服务器没有足够的磁盘空间。通常,从属服务器需要与主服务器相同或更多或所有的东西——磁盘大小、I/O 性能、CPU 内核速度(尽管更少的 CPU 内核可能没问题)——并且运行相同或稍有较新的 版本的 MySQL 本身。我怀疑深入了解根本问题最终对你来说比改变策略更好。
  • @Michael-sqlbot 他们具有完全相同的规格。 ,我认为这是导致问题的混乱配置。

标签: mysql load-balancing haproxy master-slave database-cluster


【解决方案1】:

您可以选择 MySQL/MariaDB+ Percona + HAproxy。这种组合支持 Master-Master 同步和数据同步工作得非常好。大多数实时数据同步都存在主键和外键问题。你也可以使用 Percona 来避免这些问题。加油,祝你好运

【讨论】:

    【解决方案2】:

    “表已满”错误意味着您的从站没有足够的空间来执行 ALTER TABLE。您需要获得更大的磁盘来解决该错误。

    但潜台词是没有人在监视您的数据库服务器,这是一个更大的问题。你需要找一个数据库管理员,或者找一个专业的服务来做。

    我想知道的是,在处理高负载服务器时,您总是需要准确的数据并且不能冒任何风险,大佬们是如何处理的?

    首先,请不要忘记任何系统都没有风险。如果您打算使用该系统,那是不可能的。您无法消除错误的可能性,但您可以准备好从错误中无缝恢复。

    大佬们会做以下事情:

    1. 聘请系统管理员、网络管理员、数据库管理员等运营人员来管理服务器。

    2. 监控一切。使用软件连续跟踪系统负载、磁盘空间、错误和许多其他事情。最好的选择是New Relic。对于 MySQL 从站完整性,请使用 pt-table-checksum 之类的工具。

    3. 冗余。创建备用系统和数据,以便在(而不是如果)主系统发生故障时接管。

    您可能想了解高可用性架构领域。看看这个演讲:Scalable Internet Architectures

    【讨论】:

    • 很好的答案比尔,问题是资源不足,我们必须是程序员 + 数据库管理员,我们已经安装了 New Relic,我还编写了一个脚本来检查复制是否正常工作,已经阅读有关 pt-table-checksum 但尚未安装的信息!
    • 对于“表已满”,这不是空间问题,我们在执行 df -h 时该服务器上有足够的磁盘空间,最高使用率为 40%
    • 但是 ALTER TABLE 可以在复制表时利用额外的磁盘空间。一旦 ALTER TABLE 失败,MySQL 就会清理它正在使用的临时空间。您需要尽可能多的可用磁盘空间来临时保存要更改的最大表的副本。
    • “表已满”还有另一种解释——表已达到其最大大小,或已填满固定大小的表空间文件。阅读dev.mysql.com/doc/refman/5.7/en/full-table.htmldev.mysql.com/doc/refman/5.7/en/table-size-limit.html
    【解决方案3】:

    上亚马逊 ec2。您可以同时启动 4 个应用服务器和 2 个数据库服务器,并使用 aws 工程功能设置负载平衡。

    http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/elb-getting-started.html#define-load-balancer

    https://aws.amazon.com/articles/1639

    【讨论】: