对于 Web 应用程序的简单负载平衡,我需要哪种 MySQL 配置?
Which MySQL configuration do I want for simple load balancing for a web application?
我们正在构建一个将在多个客户站点上使用的小型广告平台。我们想要设置多个服务器和负载平衡(使用 Amazon Elastic Load Balancer)以帮助防止停机。
我们的基本功能包括呈现 HTML 广告、记录点击信息(IP、用户代理、位置等)、使用点击 ID 作为跟踪变量重定向流量 (?click_id=XX),为客户提供基础数据分析。非常重要的是,两次不同的点击不会以相同的点击 ID 结束。
我了解负载平衡的基础知识,但我不确定如何设置 MySQL 服务器。
似乎有很多选择:master-master、master-slave、集群、分片。
我正在尝试找出最适合我们的方法。我们正在寻找的最重要的方面是:
- 正常运行时间 - 如果一台服务器出现故障,另一台服务器会自动接管。
- 负载共享 - 保持 CPU 和 RAM 使用分散。
根据我的阅读,听起来我最好的选择可能是拥有 2 个或更多奴隶的主人。 Master 不负责任何 HTTP 流量,这些流量只会流向 slaves。因此,主服务器将只负责数据库写入。
这会减慢我们的点击脚本吗?由于我们必须先插入以在重定向之前获取点击 ID,因此从服务器必须联系主服务器,然后 return 获取数据。现在我们的点击脚本快如闪电,我想保持这种状态。
另外,如果 Master 宕机了怎么办?在 Master 重新上线之前,slave 是否可以充当 Master?
如果您使用 Amazon 的托管数据库服务,RDS,这将大大减轻管理数据库的痛苦。
您可以 select 您的主数据库实例上的 multi-AZ option 以在另一个可用区中提供冗余的、同步复制的从数据库。如果实例或整个可用区发生故障,Amazon 会自动将指向您的主实例的 A 记录翻转到备份 AZ 中的从属实例。在 vanilla MySQL 或 MariaDB 上,此过程可能需要几分钟时间,在此期间您的应用程序将无法写入数据库。
您还可以配置最多 5 个 read replicas for a MySQL or MariaDB instance that will replicate from the master asynchronously. You could then use an Elastic Load Balancer (or other TCP load balancer such as HAProxy or MariaDB's MaxScale 以获得更多 MySQL 感知选项)以在只读副本之间分配流量。默认情况下,这些只读副本中的每一个都将拥有主数据集的完整副本,但如果您愿意,可以尝试手动将数据分片到这些副本中。不过,您的应用程序或负载均衡器中必须有一些更复杂的逻辑才能确定在哪里可以找到数据集的相关分片。
您可以选择将只读副本提升为独立的主服务器,这将中断对主服务器的复制并为您提供一个独立的集群,然后可以根据您之前的设置重新配置(或者如果您需要,可以进行不同的配置)只需使用您在推广时拥有的数据集)。不过,这听起来不像是您需要在这里做的事情。
另一种选择是在 RDS 上使用亚马逊自己的 MySQL、Aurora。 Aurora 完全 MySQL 有线兼容,因此您可以使用您的应用程序已使用的任何 MySQL 驱动程序与其通信。 Aurora 将允许最多 15 个只读副本和完全透明的负载平衡。您只需为您的应用程序提供 Aurora 集群端点,然后任何写入都将发生在主节点上,并且任何读取都将在集群中拥有的许多只读副本之间进行平衡。在我的有限测试中,Aurora 在实例之间的故障转移也几乎是即时的,因此可以最大限度地减少发生故障时的停机时间。
我们正在构建一个将在多个客户站点上使用的小型广告平台。我们想要设置多个服务器和负载平衡(使用 Amazon Elastic Load Balancer)以帮助防止停机。
我们的基本功能包括呈现 HTML 广告、记录点击信息(IP、用户代理、位置等)、使用点击 ID 作为跟踪变量重定向流量 (?click_id=XX),为客户提供基础数据分析。非常重要的是,两次不同的点击不会以相同的点击 ID 结束。
我了解负载平衡的基础知识,但我不确定如何设置 MySQL 服务器。
似乎有很多选择:master-master、master-slave、集群、分片。
我正在尝试找出最适合我们的方法。我们正在寻找的最重要的方面是:
- 正常运行时间 - 如果一台服务器出现故障,另一台服务器会自动接管。
- 负载共享 - 保持 CPU 和 RAM 使用分散。
根据我的阅读,听起来我最好的选择可能是拥有 2 个或更多奴隶的主人。 Master 不负责任何 HTTP 流量,这些流量只会流向 slaves。因此,主服务器将只负责数据库写入。
这会减慢我们的点击脚本吗?由于我们必须先插入以在重定向之前获取点击 ID,因此从服务器必须联系主服务器,然后 return 获取数据。现在我们的点击脚本快如闪电,我想保持这种状态。
另外,如果 Master 宕机了怎么办?在 Master 重新上线之前,slave 是否可以充当 Master?
如果您使用 Amazon 的托管数据库服务,RDS,这将大大减轻管理数据库的痛苦。
您可以 select 您的主数据库实例上的 multi-AZ option 以在另一个可用区中提供冗余的、同步复制的从数据库。如果实例或整个可用区发生故障,Amazon 会自动将指向您的主实例的 A 记录翻转到备份 AZ 中的从属实例。在 vanilla MySQL 或 MariaDB 上,此过程可能需要几分钟时间,在此期间您的应用程序将无法写入数据库。
您还可以配置最多 5 个 read replicas for a MySQL or MariaDB instance that will replicate from the master asynchronously. You could then use an Elastic Load Balancer (or other TCP load balancer such as HAProxy or MariaDB's MaxScale 以获得更多 MySQL 感知选项)以在只读副本之间分配流量。默认情况下,这些只读副本中的每一个都将拥有主数据集的完整副本,但如果您愿意,可以尝试手动将数据分片到这些副本中。不过,您的应用程序或负载均衡器中必须有一些更复杂的逻辑才能确定在哪里可以找到数据集的相关分片。
您可以选择将只读副本提升为独立的主服务器,这将中断对主服务器的复制并为您提供一个独立的集群,然后可以根据您之前的设置重新配置(或者如果您需要,可以进行不同的配置)只需使用您在推广时拥有的数据集)。不过,这听起来不像是您需要在这里做的事情。
另一种选择是在 RDS 上使用亚马逊自己的 MySQL、Aurora。 Aurora 完全 MySQL 有线兼容,因此您可以使用您的应用程序已使用的任何 MySQL 驱动程序与其通信。 Aurora 将允许最多 15 个只读副本和完全透明的负载平衡。您只需为您的应用程序提供 Aurora 集群端点,然后任何写入都将发生在主节点上,并且任何读取都将在集群中拥有的许多只读副本之间进行平衡。在我的有限测试中,Aurora 在实例之间的故障转移也几乎是即时的,因此可以最大限度地减少发生故障时的停机时间。