MySQL百分之百高可用性架构 使用nginx plus和galera cluster实现

  • A+
所属分类:MySQL

在本文中,我们将使用MySQL Galera Cluster和nginx plus r5的TCP负载均衡来创建和测试数据库高可用集群。同时将展示适当的nginx的负载平衡配置,处理相互冲突的写操作和访问数据库集群失败的技术

Galera Cluster

Galera Cluster介绍

Galera Cluster在之前的文章中有介绍,可以去看看《MySQL/Galera集群-多主高可用性负载均衡》。

Galera Cluster是集群MySQL数据库服务器的同步复制解决方案。数据库写操作立即复制到其他Galera cluster节点上,且所有的服务器充当主节点。

负载均衡的Galera集群可以用在一个需要非常高的可用性的关键业务上。

Galera集群也支持MariaDB 和 Percona XtrDB Cluster。

首先,我们来创建一个测试表:

Galera Cluster的搭建就不在此处累述了,大家可以看看之前的文档或看看官方文档。

Nginx Plus的TCP负载均衡配置

轮询连接三台数据库。

然后通过Nginx Plus连接到数据库,并检查连接到后台哪个实例上:

当前连接到db2服务器上。如果我们重新连接,可能轮询到其他台服务器上的。

测试数据库集群

为了测试数据库集群,我们需要向刚才建立的表中插入数据并进行有意义的数据冲突碰撞。如果发生冲突,计数值加1。

下面的脚本query1.pl是插入100条数据,并打印出每条数据发送到哪台服务器上。

我们观察到,UPDATE操作轮询的访问数据库,并没有发生冲突。 当我们并行执行UPDATE操作时,计数值是这样的:

处理并行更新的问题

将表删除,重新创建。

并行执行20个更新操作:

会收到下面的报错信息:

检查表数据显示很少的条目计数器已经增加到20了:

这是Galera复制过程的后果,当在并行的情况下更新相同的记录,可能会发生死锁数据库会拒绝交易。

在某些情况下,这种行为是可以接受的。如果应用程序不太可能并行提交冲突的更新,应用程序代码可以优雅地处理这些非常罕见的拒绝交易(例如返回一个错误给用户),那么这可能不是一个严重的问题。

如果这是不可接受的,最简单的解决方案是指定上游服务器组的一个成员为主要的数据库实例,通过标记其他成员为backup和down状态,如下所示:

采用这样配置,所有的交易都路由到db1上。如果db1失败,当前建立的连接将丢弃,Nginx plus实现故障转移,将新连接到db2。请注意,DB3作为集群中的沉默的伙伴,仅接收来自db1和DB2的更新。

如果测试这个配置,你会发现在每个数据库实例,数据都会存在,并且有正确的计数值20。然而,如果在测试过程中db1发生失败,少数交易将会丢失。

更好的MySQL高可用性解决方案

交易可能因各种原因失败。如果需要一个非常高的程度的保护,需要确保我们的应用程序可以检测和重试失败的交易。

对于测试脚本,需要进行错误捕获,并短暂休息后重新提交交易。query2.pl脚本如下所示:

这一修改,我们可以回到原来的负载均衡方法(3活动数据库)和重新测试并行更新。常见的死锁错误检测和相应的事务重试。计数器正确的递增和该系统被证明是可靠的具有多个活动的主。

抵御数据库失败

我们可以模拟故障,关闭一个或多个数据库服务器在向集群并行提交多个更新。

请注意,proxy_connect_timeout值降低到1秒,Nginx可以快速检测连接失败

正如预期的那样客户端代码得到的误差范围数据库被关闭和重新启动的交易,信息如下所示:

尽管有这些错误广泛的测试中,没有单一的交易被丢失,也没有执行多次,而且三台数据库的数据依然保持一致性的。

适当的应用逻辑相结合,Nginx plus负载均衡和Galera Cluster相结合,可以提供一个可靠的高性能的,100%可靠的MySQL数据库集群。

是不是如上所说的100%可靠的,大家在应用中拭目以待吧。

参考资料:http://nginx.com/blog/mysql-high-availability-with-nginx-plus-and-galera-cluster/

weinxin
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  2   博主  0

    • 运维生存时间 7

      是哟

      • 十字路口 9

        这个不错啊,可以考虑试试