Answers:
在实际使用任何一种MySQL代理之前,请阅读我对这个问题的其他答案。如果您有2个CMS正在写入的主-主服务器,以及仅从其中读取的10个httpd,则可以,但是(并非总是如此)(并非如此)。您已被警告。
MySQL Proxy是一个简单的程序,位于您的客户端和MySQL服务器之间,可以监视,分析或转换其通信。它的灵活性允许无限使用;常见的包括:负载平衡;故障转移 查询分析;查询过滤和修改;还有很多。
。
HAProxy是一种免费,非常快速且可靠的解决方案,可为基于TCP和HTTP的应用程序提供高可用性,负载平衡和代理
如果您将其以TCP模式运行,它甚至可能比Wackamole更好。如果必须在它们之间进行选择,则可以使用HAProxy。HAProxy也可以有很多后端,Waclamole只能有2个后端。请注意,HAProxy是“哑巴”,它连接套接字时无需查看流中的内容-专用的MySQL Proxy可以选择将各种请求指向指定的服务器。
也许值得一提的是,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
主-主复制不如您想像的那样,循环代理和类似的“简单”解决方案也是如此。如果您以足够快的速度(比服务器之间的延迟(生产服务器上的延迟可能长达一秒钟*
))将冲突数据提交到单独的服务器,则两者都将接受数据。如果您有拍卖服务器,则您只卖了同一辆车两次。谁买的?这取决于您要问哪个数据库!
应用程序必须知道实际上有2个数据库,并且必须知道它们的两个IP地址。如果您想“出售”,您应该
DB_number = `auction_number` % `number_of_databases`
(%
是modulo
)
...并将其提交到DB_number数据库。如果您遇到连接错误,则可以与另一个连接一起执行(但是如果是拍卖服务器,我只会显示一个错误)。
另外,两个服务器之间的IP地址应为wackamole -d。在灾难情况下,一台数据库服务器在高峰使用时间内关闭了几个小时,您会发现该应用程序将尝试连接到不存在的服务器并挂起,直到TIMEOUT,例如3s。突然,您的查询运行时间增加了3秒钟(它们最终都进入了同一数据库-这并没有使其比灾难发生前的运行速度更快)。这并不能使您的httpd满意,因为它的并发请求处理程序线程的连接池可能有限...
*
生产服务器上的复制延迟可能高达一整秒 -我已经在远程托管和数据中心中进行了测试,并且有99%的时间是0,但有时mysql显示为1。在大量流量下,由于客户端应用程序发出两个请求导致两个查询(插入和选择),我遇到了很多冲突。对于某些情况下,该行只是不在那里还没有,所以我们使用用户ID的哈希值,并将其固定的问题
我希望你能从我的错误中学习;-)
负载平衡的MySQL(或其他)数据库集群非常无用。如果要写入多个服务器,则会遇到麻烦,或者使用同步复制(MySQL仍然不支持),这会严重损害性能,因为它需要同步锁。
我建议您拆分读/写负载,并在mysql从属设备之间平衡读取的负载,并具有一个用于写入的主服务器,或对主服务器使用主动/被动故障转移对。
本质上,您不能通过将更多服务器作为从服务器放置在数据库中来扩展写入,因为每个服务器仍必须写入应用程序的整个写入负载。
要扩展写入,您需要通过分区或“分片”等方式在多个服务器之间逻辑上拆分数据。这通常需要对应用程序进行不重要的更改(认为很难测试),因此除非您真的需要,否则您不希望这样做需要它。
当然,如果您确实需要,也可以使用MySQL集群,但是它是一个完全不同的引擎,具有自己的功能和缺点-设置起来有点复杂,但是确实在商用硬件上提供了HA负载平衡数据库。使用同步复制仍然会遭受写入性能的损失,但是由于它具有跨服务器分区的内置功能,因此确实可以扩展写入。
我发现了与此主题有关的另一本好指南...
http://www.dancryer.com/2010/01/mysql-circular-replication
这是三个帖子系列的第1部分:
MySQL负载均衡群集指南–第1部分-自行设置服务器并配置MySQL复制。
MySQL负载均衡集群指南–第2部分–设置脚本以监视MySQL集群节点的状态,我们将在下一指南中使用该脚本来设置代理。
MySQL负载均衡集群指南–第3部分-使用监视脚本通过HAProxy设置负载均衡器
Connector / J能够在多个服务器之间实现查询负载平衡。这主要用于MySQL NDB Cluster,其中所有SQL节点将具有一致的数据视图,但是如果可以确保两个master数据库在这两个master之间保持合理的一致性,则对于您的应用程序可能是安全的。
连接字符串如下所示:
jdbc:mysql:loadbalance:// host-1,host-2,... host-n / dbname?loadBalanceStrategy =“ random”&loadBalanceBlacklistTimeout = 5000
拆分写入不会减轻服务器的负担,因为仍然必须复制写入。
如果仅使用2台服务器,则将心跳与drbd一起使用,并让drbd处理复制。如果第一台服务器发生故障,第二台服务器将接管。如果要使用第二台服务器,可以在drbd上使用gfs,然后以只读方式运行第二台服务器并将其用作读取服务器。当发生故障转移时,然后将服务器更改为读/写。
回复:wackamole-wackamole不仅限于2台服务器
我正在研究涵盖此内容的教程系列,但是设置起来确实很简单。
为了给该问题提供最新的答案,在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群集解决方案。