我们都知道,相较于传统的数据中心,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. Duplicate entry 'javajavajav' for key 'username'

    org.apache.ibatis.exceptions.PersistenceException: ### Error updating database.  Cause: com.mysql.jd ...

  2. IDEA 中生成 Hibernate 逆向工程实践

    谈起 Hibernate 应该得知道 Gavin King 大叔,他构建了 Hibernate ,并将其捐献给了开源社区. Hibernate 对象关系映射解决方案,为面向对象的领域模型到传统的关系型 ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. JavaScript中实现extend()方法

    var male = { sex: "male" }; var xiaoming = { name: "xiaoming", school: "xin ...

  5. framebuffer line_length 參數

    以下是在 trace 關機充電動畫所遇到一個疑惑, 關於 framebuffer device 的屬性 line_length 大小值, 一個 display panel,1920 × 1080, 每 ...

  6. JavaScript面向对象的程序设计

    ECMAScript支持面对对象(oo)编程,但不使用类或接口.对象可以在代码执行过程中创建和增强,因此具有动态性而非严格定义的实体.在没有类的情况下,可以此采用下列模式创建对象. 工厂模式,使用简单 ...

  7. redis 命令

    添加数据 p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo } span.s1 { } set key value //添加多条数据 ...

  8. ISO

  9. POJ Minimum Cut

    Minimum Cut Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 9302   Accepted: 3902 Case ...

  10. js控制Bootstrap 模态框(Modal)插件

    js控制Bootstrap 模态框(Modal)插件 http://www.cnblogs.com/zzjeny/p/5564400.html