我们都知道,相较于传统的数据中心,Pulic cloud也有劣势,比如说数据库的HA,很多熟悉公有云平台的读者都知道,因为出于安全性性考虑以及一些技术条件的限制,很多本地数据中心的mysql HA方法在云上并不适用,笔者大致地归纳了一下,主要有如下这三个瓶颈造成:

1.不能共享存储的问题

2.不支持组播问题

3.VIP的问题

关于第一个问题,很多用过Azure的读者会不禁要问,不对啊?我记得Azure是提供Azure file service服务的啊,确实,但是玩过的人都知道file service只能解决部分问题,而且有性能的瓶颈,所以在本次方案中,没有选用该方法;

关于第二个问题,我们都知道,公有云平台都是禁止组播与广播的,然而集群软件是需要组播进行同步的,这也就是为什么Oracle在云平台做不了RAC,就是这个原因,不过据说有方式可以实现,就是组播一出来就改为单播的方式去响应,有兴趣的读者可以去百度看看;

关于第三个问题,VIP在cluster的解决方案中,可以解决前端应用连接字符串的问题,但是云上是不支持组播与广播的的,所以ARP类似的协议都不能支持,造成传统的VIP模式不再适用

基于以上因素的考量,我们选择Azure ILB+DRBD+Corosync+pacemaker来实现HA,以此来解决以上部署中遇到的问题。

好,废话不多说,先贴一张架构图。

web服务器通过mysql client访问ILB,ILB转发3306端口到后台的mysql

从上面的架构图看以看出来

接下来我们来分析各个软件与机制的功能与作用

1:Azure ILB :WEB前端可以通过MySQL客户端访问Azure ILB的固定IP地址10.1.1.200端口3306,ILB会把mysql的相应的请求转发给相应mysql服务器,但是,无论mysql的服务迁移到哪一台服务器上,前端不需要在应用层面做任何改动,也就是说不需要改动然后连接字符串,用这种方式实现on-premise环境中VIP相同的效果。

2.DRBD:DRBD相当于网络级别的RAID1,在DRBD主节点上写入任何数据,都会通过网络马上同步到副节点。通过DRBD的公牛,可以实现两边数据的同步,这样就类似于共享存储的功能。

3.Corosync:其实所谓的Corosync和Pacemaker是Heartbeat的升级版。Corosync进行底层Message的通信,Pacemaker进行集群的选举和服务的编排。传统的Corosync是采用Multicast实现多台Cluster服务器的message通讯。但在新版本中支持Full Mesh的UDP Unicast,解决Azure不支持组播的问题。

4.Pacemaker:Pacemaker是整个集群的大脑,它决定做什么,以及何时做。这个集群的服务通过一个叫CRM的软件进行对Pacemaker的编排。在本方案中,Pacemaker需要完成如下几个工作:

第一,先要选择DRBD的master节点

第二,挂载DRBD的分区到指定目录

第三,启动MySQL的服务

第四,保证DRBD,File,MySQL三个服务在同一台master服务器上,这一点非常重要

第五,保证DRBD,File,MySQL三个服务按顺序启动

一般正常情况下,Pacemaker把编排好的各种服务在master上顺序启动时,在master上mysql写入任何数据,都会通过DRBD更新到slave服务器的DRBD secondary磁盘上,由于slave服务器上的mysql服务部位启动,所以它的3306端口不对外提供服务,这样ILB就会认为slave服务器没有对外提供服务,就不会将其加入到负载均衡集中,因此ILB只会把mysql的请求全部发给master服务器,如下图所示。

但是当主库出现问题的时候,这里就是10.1.1.6出现故障或需要执行重启动作的时候,这个时候Pacemaker和Corosync会把master迁移到10.1.1.7上,Pacemaker会在10.1.1.7启动之前上编排各种服务,mysql服务会在这台服务器上启动,这时3306端口会对外提供服务,这时候ILB会把10.1.1.7加入到负载均衡集中,这样所有前端的mysql请求都会发到这台服务器上,如下图所示。

这样的话,无论10.1.16还是10.1.1.7出现故障,整个系统都不需要人为地进行干预,系统都会自动切换到那台仍然活着的服务器上,对外继续提高服务。

讲到这里,我们仔细想想,这样真的就万无一失了嘛?好像还缺点什么,对就是“脑裂”问题,在实现Cluster的时候,往往最需要回避的问题就是脑裂问题,因为脑裂的问题带来的危害比out-of-service的危害还大,在刚刚场景中,细心的读者会发现,前面的方案中防止脑裂都是通过DRBD Corosync以及Pacemaker等软件自身机制实现的,但是在最后一个场景中,当10.1.1.6出现问题时,我们会把10.1.1.7加入到ILB中,但此时10.1.1.6仍然在ILB中!!!即使它出了故障,如果说在10.1.1.7在执行前端mysql的请求的时候,10.1.1.6的突然活过来了了,那TM就尴尬了,这时候就会产生脑裂。

基于这种情况的考虑,我们需要对ILB的做一些策略,来防止脑裂的发生,最好的情况就是任何时候Pacemaker选择某一台服务器作为master的时候,在Pacemaker服务的编排中,加入对ILB的控制,把另一台服务器从ILB中,且不考虑它是否活着,这样可以最大程度地阻止脑裂,最极端的情况就是两台服务器都认为自己是master,后一台启动Pacemaker的服务器会把另外一台服务器从ILB中移除,永远保证ILB中只有一台服务器,保证前端通过ILB只能访问到一台mysql服务器。

如何基于Azure平台实现MySQL HA(方法论篇)的更多相关文章

  1. 通过openswan基于Azure平台搭建VPN server

    用过Azure的读者都知道,Vnet一直是Azure比较自豪的地方,尤其是VPN,Azure提供了两种VPN以及专线来保证客户数据的安全性,S2S vpn(站点到站点的,基于IPsec的),P2S v ...

  2. 基于开源软件在Azure平台建立大规模系统的最佳实践

    作者 王枫 发布于2014年5月28日 前言 Microsoft Azure 是微软公有云的唯一解决方案.借助这一平台,用户可以以多种方式部署和发布自己的应用. 这是一个开放的平台,除了对于Windo ...

  3. 【Microsoft Azure 的1024种玩法】三.基于Azure云平台构建Discuz论坛

    [简介] Discuz!是一套通用社区论坛软件系统,用户在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能.很强负载能力和可高度定制的论坛服务. [前期文章] [操作步骤] ...

  4. 【Microsoft Azure 的1024种玩法】二.基于Azure云平台的安全攻防靶场系统构建

    简介 本篇文章将基于在Microsoft Azure云平台上使用Pikachu去构建安全攻防靶场,Pikachu使用世界上最好的语言PHP进行开发,数据库使用的是mysql,因此运行Pikachu需要 ...

  5. 理解 OpenStack 高可用(HA) (6): MySQL HA

    本系列会分析OpenStack 的高可用性(HA)概念和解决方案: (1)OpenStack 高可用方案概述 (2)Neutron L3 Agent HA - VRRP (虚拟路由冗余协议) (3)N ...

  6. 基于Azure构建PredictionIO和Spark的推荐引擎服务

    基于Azure构建PredictionIO和Spark的推荐引擎服务 1. 在Azure构建Ubuntu 16.04虚拟机 假设前提条件您已有 Azure 帐号,登陆 Azure https://po ...

  7. 基于android平台的斗地主AI

    本软件是基于android平台的斗地主AI,我们在源代码的基础之上,旨在改进AI的算法,使玩家具有更丰富的体验感,让NPC可以更为智能. (一)玩法解析: (1)发牌和叫牌:一副扑克54张,先为每个人 ...

  8. MySQL高可用解决方案(MySQL HA Solution)

    http://blog.sina.com.cn/s/blog_7e89c3f501012vtr.html 什么是高可用性?很多公司的服务都是24小时*365天不间断的.比如Call Center.这就 ...

  9. MapReduce编程模型详解(基于Windows平台Eclipse)

    本文基于Windows平台Eclipse,以使用MapReduce编程模型统计文本文件中相同单词的个数来详述了整个编程流程及需要注意的地方.不当之处还请留言指出. 前期准备 hadoop集群的搭建 编 ...

随机推荐

  1. BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 [treap hash]

    1862: [Zjoi2006]GameZ游戏排名系统 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1318  Solved: 498[Submit][ ...

  2. Life

    24小时热水.24小时无线WiFi.24小时空调:有人陪你,不孤单,不寂寞,不瞎想,不停的传播正能量

  3. VS2015下如何用编译、调试程序。

    VS2015下如何用编译.调试程序. (通过实践给出截图) 安装步骤: 下载安装网址[VS2015下载地址](http://www.ithome.com/html/win10/164028.htm) ...

  4. 调用altera IP核的仿真流程—上

    调用altera IP核的仿真流程—上 在学习本节内容之后,请详细阅读<基于modelsim-SE的简单仿真流程>,因为本节是基于<基于modelsim-SE的简单仿真流程>的 ...

  5. NIO服务器

    导语 NIO的出现是为服务器端编程而设计的.它的作用就是能够让一个线程为多个连接服务.NIO中的API都是非阻塞模式的,这样可以在服务器端采用异步的方式来处理多个请求.NIO中有两个重要的东西就是通道 ...

  6. javascript中的感叹号 "!"

    JavaScript中会经常遇到一个操作符:! 这是一个布尔操作符,用于将操作的值强制转换为布尔值并取反.常用场景如下: //条件判断中使用 var a; var b=null; if(!a){ co ...

  7. 分享一些自己的学习过程和学习方法(来自daimajia)

    每天,都会有人在微博上私信我,问我关于学习和成长的问题.这种问题我一般都不会回复某个j,毕竟每个人的情况不一样,每个人对待事物的性格也不一样,我不能夸下海口的说,你看某本书几个月就能如何如何,我能做的 ...

  8. Azure AD Connect 手动同步

    我们目前采用工具Azure AD Connect 目录同步工具将本地域控制器的用户信息同步至office365和Azure 在之前目录同步工具中使用Windows 任务计划程序或单独的 Windows ...

  9. RN中listView的每个item等高

    今天写ListView的每个Item的布局的时候发现,当文字太长时被截掉了不能完全显示,检查了很久发现没有设置固定高度都是可伸缩的为什么没有伸缩呢.看了很久才发现每个item是等高的,于是仔细检查才看 ...

  10. 纯css,编写菜单移入效果

    <!doctype html><html lang="en"><head> <meta charset="UTF-8" ...