没有负载均衡器的负载均衡MySQL集群


10

我希望创建一个负载平衡的MySQL群集,但没有实际的负载平衡器,以免增加故障点或复杂性。

我当时想的是:

  1. 具有MySQL的主从设置

  2. 在每个客户端上,放置一个简单的轮询代理,它将在服务器之间轮换请求。

这可能吗?还是有更好的方法来实现这一目标?

mysql 

我很好奇,您打算用它做什么?

我试图将HA添加到我们的解决方案中,而不涉及负载平衡器和类似内容。

Answers:


3

在实际使用任何一种MySQL代理之前,阅读我对这个问题的其他答案。如果您有2个CMS正在写入的主-主服务器,以及仅从其中读取的10个httpd,则可以,但是(并非总是如此)(并非如此)。您已被警告。

MySQL Proxy是一个简单的程序,位于您的客户端和MySQL服务器之间,可以监视,分析或转换其通信。它的灵活性允许无限使用;常见的包括:负载平衡;故障转移 查询分析;查询过滤和修改;还有很多。

HAProxy是一种免费,非常快速且可靠的解决方案,可为基于TCP和HTTP的应用程序提供高可用性,负载平衡和代理

如果您将其以TCP模式运行,它甚至可能比Wackamole更好。如果必须在它们之间进行选择,则可以使用HAProxy。HAProxy也可以有很多后端,Waclamole只能有2个后端。请注意,HAProxy是“哑巴”,它连接套接字时无需查看流中的内容-专用的MySQL Proxy可以选择将各种请求指向指定的服务器。


只是为了验证一下:1)HAProxy将需要额外的计算机/ 2台用于HA的计算机2)Wackamole每次安装只能支持2个服务器吗?问候。

Wackamole的标准使用模式(实际上是我所知道的唯一一种)是让serverA和serverB互相监视,并在死掉时获取对方的IP。Wackamole网站说,它可以用来保护一组IP ...但是我必须说Wackamole并没有像人们希望的那样提供稳定性,所以我不建议这样做。关于HAProxy,您可以将其中的2个放在两台专用计算机上以实现冗余,或者甚至可以按照问题中的说明在每个节点上放置一个。如果您的查询大多在阅读,那么我认为它会很好地工作。

嗨礁。关于Wackamole的最后一点-根据您的经验,在两台计算机上还不够稳定吗?

两台机器可以互相ping通,但其中一台可以负载200,所有cpu的使用率均为100%,所有ram都使用。MySQL崩溃了。<-wackamole在那儿将无法使用。HAProxy可以检查远程APPLICATION是否已启动,仅当服务器已启动并且application_uptime <server_uptime时才检查Wackamole。我们有很多情况下,我们依赖wackamole,这让我们失望了。

4

也许值得一提的是,Galera Replication for MySQL提供了真正的多主MySQL设置。Galera是一种同步复制协议,因此应用程序可以读取和写入任何MySQL服务器。这是一个快速教程:http : //www.severalnines.com/clustercontrol-mysql-galera-tutorial

至于MySQL服务器前面的负载平衡器,请使用支持此功能的MySQL连接器(例如Java的Connector / J或php的Mysqlnd)。

如果您没有可以执行此操作的连接器,请使用HA代理之类的方法。该脚本会自动设置HA代理并维护良好的MySQL服务器列表:https : //github.com/severalnines/haproxy

最好的祝福,

维奈

www.severalnines.com


非常重要的一点是,非常清楚地披露与您推荐的产品的关联。另外,此网站不用于自我宣传。如果您发布的产品可以解决问题,那就太好了!如果您所有的答案都围绕您的产品,那么您可能想与某人谈谈获取广告空间而不是发布答案。请查看我们的常见问题解答
JNK 2012年

3

主-主复制不如您想像的那样,循环代理和类似的“简单”解决方案也是如此。如果您以足够快的速度(比服务器之间的延迟(生产服务器上的延迟可能长达一秒钟*))将冲突数据提交到单独的服务器,则两者都将接受数据。如果您有拍卖服务器,则您只卖了同一辆车两次。谁买的?这取决于您要问哪个数据库!

应用程序必须知道实际上有2个数据库,并且必须知道它们的两个IP地址。如果您想“出售”,您应该

DB_number = `auction_number` % `number_of_databases`

%modulo

...并将其提交到DB_number数据库。如果您遇到连接错误,则可以与另一个连接一起执行(但是如果是拍卖服务器,我只会显示一个错误)。

另外,两个服务器之间的IP地址应为wackamole -d。在灾难情况下,一台数据库服务器在高峰使用时间内关闭了几个小时,您会发现该应用程序将尝试连接到不存在的服务器并挂起,直到TIMEOUT,例如3s。突然,您的查询运行时间增加了3秒钟(它们最终都进入了同一数据库-这并没有使其比灾难发生前的运行速度更快)。这并不能使您的httpd满意,因为它的并发请求处理程序线程的连接池可能有限...

* 生产服务器上的复制延迟可能高达一整秒 -我已经在远程托管和数据中心中进行了测试,并且有99%的时间是0,但有时mysql显示为1。在大量流量下,由于客户端应用程序发出两个请求导致两个查询(插入和选择),我遇到了很多冲突。对于某些情况下,该行只是不在那里还没有,所以我们使用用户ID的哈希值,并将其固定的问题

我希望你能从我的错误中学习;-)


你好 感谢分享。我想到了Wackamole,这实际上对HA很有用。我的问题是,所有负载都将放在一台主服务器上,而第二台将处于空闲状态,基本上是在创建主动/主动式,而我正在寻找主动/主动。也许最好在每个客户端上放置一些轻型LB解决方案,以使其能够在服务器之间切换请求?知道是否存在这样的工具吗?

如果您需要冗余,那么“一个工作,一个空闲”是好的。假设两台服务器中的一台死了(我提醒您,您购买了另一台服务器,所以如果第一个服务器坏了,您仍然可以运行)。如果第二台服务器不能处理所有流量,则用于扩展,而不用于HA!另外:仅依靠Wackamole是一个不好的解决方案(ping ok!= mysqld ok)。

3

负载平衡的MySQL(或其他)数据库集群非常无用。如果要写入多个服务器,则会遇到麻烦,或者使用同步复制(MySQL仍然不支持),这会严重损害性能,因为它需要同步锁。

我建议您拆分读/写负载,并在mysql从属设备之间平衡读取的负载,并具有一个用于写入的主服务器,或对主服务器使用主动/被动故障转移对。

本质上,您不能通过将更多服务器作为从服务器放置在数据库中来扩展写入,因为每个服务器仍必须写入应用程序的整个写入负载。

要扩展写入,您需要通过分区或“分片”等方式在多个服务器之间逻辑上拆分数据。这通常需要对应用程序进行不重要的更改(认为很难测试),因此除非您真的需要,否则您不希望这样做需要它。


当然,如果您确实需要,也可以使用MySQL集群,但是它是一个完全不同的引擎,具有自己的功能和缺点-设置起来有点复杂,但是确实在商用硬件上提供了HA负载平衡数据库。使用同步复制仍然会遭受写入性能的损失,但是由于它具有跨服务器分区的内置功能,因此确实可以扩展写入。


3

我发现了与此主题有关的另一本好指南...

http://www.dancryer.com/2010/01/mysql-circular-replication

这是三个帖子系列的第1部分:

  • MySQL负载均衡群集指南–第1部分-自行设置服务器并配置MySQL复制。

  • MySQL负载均衡集群指南–第2部分–设置脚本以监视MySQL集群节点的状态,我们将在下一指南中使用该脚本来设置代理。

  • MySQL负载均衡集群指南–第3部分-使用监视脚本通过HAProxy设置负载均衡器


2

就个人而言,更好的方法是使用负载平衡器!

是的,它确实增加了另一个故障点,但是您放置或安装在每个客户端上的任何例程都比标准负载平衡器增加了更多的复杂性。


这是有道理的,但问题是单点故障-即使有2个LB也是如此...万一其中一个客户端发生故障,只会造成影响,而没有其他客户端。

很难在每个节点上维护LB。如果您在12台服务器上安装了LB,然后您想更改某些内容(其中一个DB的地址或添加一个DB或其他内容)-您会发现麻烦。是的

1

Connector / J能够在多个服务器之间实现查询负载平衡。这主要用于MySQL NDB Cluster,其中所有SQL节点将具有一致的数据视图,但是如果可以确保两个master数据库在这两个master之间保持合理的一致性,则对于您的应用程序可能是安全的。

连接字符串如下所示:

jdbc:mysql:loadbalance:// host-1,host-2,... host-n / dbname?loadBalanceStrategy =“ random”&loadBalanceBlacklistTimeout = 5000


0

拆分写入不会减轻服务器的负担,因为仍然必须复制写入。

如果仅使用2台服务器,则将心跳与drbd一起使用,并让drbd处理复制。如果第一台服务器发生故障,第二台服务器将接管。如果要使用第二台服务器,可以在drbd上使用gfs,然后以只读方式运行第二台服务器并将其用作读取服务器。当发生故障转移时,然后将服务器更改为读/写。

回复:wackamole-wackamole不仅限于2台服务器

我正在研究涵盖此内容的教程系列,但是设置起来确实很简单。


是的,从理论上讲,wackamole可以支持2台以上的服务器,但是您是否曾经在生产中尝试过这种方法?我们做到了。我们现在感到遗憾。

到目前为止,我没有任何问题,除了我无法在centos 5 64位下进行编译

0

为了给该问题提供最新的答案,在MySQL 5.6版中,它引入了GTID(全局事务标识符),其目的是使异步复制更加健壮,并使MySQL再次进入HA(高可用性)的竞争。

本节说明使用全局事务标识符(GTID)的基于事务的复制。使用GTID时,每个事务都可以在提交到原始服务器上并由任何从属应用时进行标识和跟踪。这意味着在启动新的从属服务器或故障转移到新的主服务器时,不必使用GTID引用日志文件或这些文件中的位置,从而极大地简化了这些任务。由于基于GTID的复制完全基于事务,因此可以轻松确定主服务器和从服务器是否一致。只要在主服务器上提交的所有事务也都在从服务器上提交,则可以保证两者之间的一致性。您可以对GTID使用基于语句的复制或基于行的复制(请参见第16.2.1节“复制格式”);但是,为了获得最佳效果,

参考:16.1.3使用全局事务标识符进行复制(MySQL文档)

我认为使用HAProxy进行负载平衡查询会引入SPOF(单点故障),并且添加心跳会使该解决方案变得麻烦。

一个更简单的解决方案是通过Java连接器JConnector连接,该连接器旨在通过jdbc url与所有MySQL节点进行负载平衡查询。它可以处理主/从主/主设置。

这样就可以使用MySQL开箱即用地设置HA群集解决方案。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.