对任何一个上线系统来说,高可用设计是不可或缺的一个环节,这样才可以确保应用可以持续、稳定的运行,而不是频繁的掉线、停机。高可用设计的核心思路很简单,就是消除一切单点故障,将单点链路或者节点升级为多点。比如,对于Web类型的应用,可以利用Web集群和负载均衡器实现多活,而对于数据库、文件服务这类服务,一般较难配置为多活,于是常采用主备切换的方式,即备机上的服务处于离线状态,当主机故障时,备机升级为主机,继续提供服务。

要实现主备切换,需要在几个层面做好准备:

  • 数据的转移:将主节点的数据实时复制到备机,确保主节点死掉后备机拥有最新的数据。一般有三种实现机制:共享磁盘、磁盘层复制、应用层复制
  • 服务的转移:主节点服务死掉后,备机上的服务能立即启动。这需要一些第三方软件的支持,进行主机状态的监控,并进行自动化切换。
  • 端点的转移:主备切换发生后,服务运行的位置发生了变化。为了让客户端能够继续连接服务,需要为客户端提供透明的访问机制,常用的做法有:IP地址漂移、动态路由

以Linux上的Mysql为例,其通常的配置方式如下:

  • 数据转移:磁盘级复制一般采用DRBD,应用层复制采用Replication。由于磁盘级复制性能更高,一般Mysql采用磁盘级复制进行主备复制,采用Replication进行主从复制(从数据库处理读请求)
  • 服务的转移:一般采用heartbeat
  • 端点的转移:一般采用VIP漂移,也是利用heartbeat实现

其中heartbeat是一个自动化软件,能够自动检测服务状态,在故障时进行服务和IP的切换。DRBD+heartbeat方案需要两台Mysql服务器,一主一备,各有一个IP地址,主机还有额外一个VIP,作为客户端连接地址,两台服务器无需共享磁盘,DRBD实时复制所有的磁盘数据到备机。MySQL服务只在主机上运行。heartbeat检测主机上Mysql服务的状态,如果Mysql死掉,则heartbeat会将主机上的所有服务停止(包括DRBD复制),释放VIP,然后将备机提升为主机,启动原备机上的MySQL,进行备机上的DRBD反向复制,最后在新的主机上启用VIP。整个切换过程都是自动化的,对用户也是透明的,而且可以支持自动的回切,无需人工干预。客户端在切换过程中会有一定时间的中断。示意图如下

在Windows Azure上,要配置这种主备集群,会有一个困难,就是无法配置VIP。Azure上所有的IP地址都是系统管理的,用户无法自行管理IP地址,而且每个VM只有一个网卡,一个IP。为了配置主备切换,我们可以采用几种方法。

第一种方法,是利用Azure提供的负载均衡功能进行主备选择。集群的配置跟传统方式类似,只是在heartbeat上不需要配置VIP,也就是说,heartbeat只管理DRBD和mysql的切换,而不去管IP的切换。由于heartbeat保证同一时刻只有一个Mysql实例存活,那么两台VM的Mysql端口也只有一个开放。Azure的负载均衡器可以自动检测端口状态,它只会将请求发给活的端口,当两个VM都作为负载均衡的转发目标时,只有当前的主节点会接收请求。示意图如下:

第二种方法,是自己采用负载均衡手段,进行主节点的路由。示意图如下。该方法需要在每个客户端上配置Mysql的路由器。其好处是少了一个网络转发的层次,所有流量都可以在内网发生,坏处是配置较为复杂,在每个客户端上都要维护MySQL节点列表。Mysql路由器的选择有多种,比如用通用的负载均衡软件LVS,HAProxy等,或者用Mysql专用的Mysql Proxy

下面,我们看下采用第一种方法进行配置的实际例子。

首先,我们在Azure上建立两台Linux虚拟机,OS为CentOS 6.3。需要注意的是,建立第一台虚拟机的时候,需要建立可用性集

建立第二台虚拟机的时候,要加入第一台虚拟机的云服务,这样才能为他们配置负载均衡;同时也要加入第一个虚拟机建立的可用性集,这样Azure才会为这两台虚拟机提供SLA(Azure目前不提供单台虚拟机的SLA),这样设置的主备切换才有意义。

虚拟机建立好以后,还需要为他们各自挂载一块磁盘,作为Mysql的数据文件存储盘

挂载后的磁盘在VM里面的位置是/dev/sdc

接下来,就可以安装正常的步骤安装配置DRBD和Heartbeat了。这里有一个详细的步骤 http://www.linuxidc.com/Linux/2012-11/73833.htm

配置时,有几个地方需要注意下:

1. 安装kmod-drdb时,需要升级内核。升级时,需要用到163的yum源。原步骤里面有一步是

mv CentOS6-Base-163.repo / /etc/yum.repos.d 应该改成mv CentOS6-Base-163.repo /etc/yum.repos.d,另外,需要将/etc/yum.repos.d里面的CentOS-Base.repo移出该目录,否则Base库会有多个源。

2. 执行yum操作时,有时会遇到找不到更新包的情况。在Azure的CentOS里面屏蔽了核心包的安装,为了安装核心包,可以在yum命令后加上--disableexcludes=main参数,或者修改/etc/yum.conf,将exclude=kernel*去掉。另外,也可以试试yum clean metadata清楚本地包缓存

3. 升级完内核后需重启

4. 不需要配置hosts文件,Azure可以直接解析主机名为内网地址

5. drbd.conf配置文件里面,disk地址改为/dev/sdc

6. drbd测试好后,分别在主备机上安装mysql,配置my.conf将datadir指向/drbd/mysql。暂时不要启动mysql服务,也不要加入自启动

7. heartbeat配置haresources时,不要管理IP地址,即去掉IPaddr::192.168.159.250/24/eth0。另外,最后面的nginx改为mysqld

DRBD+heartbeat+mysql配置完成后,可以进行测试,可以看看mysql是不是可以自动切换

最后,开始配置Azure负载均衡。进入虚拟机1的端点页,点击页面底部的添加

在对话框中选择“添加独立终结点”。在第二步中输入mysql。注意要选中页面底部的“创建负载平衡集”

在第三步中,设置端口检测的参数。

创建完成后,进入第二台虚拟机的端口配置页面,添加端口,然后在第一步中选择“将终结点添加到现有负载平衡集”,选中第一台虚拟机定义的负载平衡集

至此,配置完毕。

下面,可以进行客户端测试。客户端连接的是外网地址,也就是云服务的URL

mysql可以正常工作。此时连接的是主节点msyql1。我们在mysql1上可以看到msyql进程

接下来,我们模拟mysql1死掉的情形。模拟方法是直接重启mysql1。同时,我们在mysql2上监控heartbeat的状态

可以看到,mysql2上进行了接管,启动了mysql服务。此时仍然访问mysql的外网地址,仍然可以连上,此时连接的是Mysql2上的mysql实例

在Windows Azure上配置VM主备切换(1)——Linux篇的更多相关文章

  1. 在Azure云上实现postgres主备切换

    以下是工作上实现postgres主备切换功能所用到的代码和步骤,中间走了不少弯路,在此记录下.所用到的操作系统为centos 7.5,安装了两台服务器,hostname为VM7的为Master,VM8 ...

  2. Windows Azure 上传 VM

    One of the great features of Windows Azure is VHD mobility. Simply put it means you can upload and d ...

  3. 在 Windows Azure 上部署预配置 Oracle VM

    Microsoft 和 Oracle 近期宣布建立战略合作伙伴关系,基于此,我们将通过 Windows Azure 镜像库推出多种常用的 Oracle 软件配置.即日起,客户可以在 Windows S ...

  4. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...

  5. 为在Windows Azure上的网站配置自定义域名

    本篇体验给Windows Azure上的网站自定义域名,首先"CNAME"和"A记录"是必须了解的概念. 假设,在Windows Azure上的网站域名是:x. ...

  6. 在 Windows Azure 上设计多租户应用程序

    作者:Suren Machiraju 和 Ralph Squillace 审校:Christian Martinez.James Podgorski.Valery Mizonov 和 Michael ...

  7. 在 Windows Azure 上部署并定制化 FreeBSD 虚拟机镜像

     发布于 2014-12-11 作者 陈阳 FreeBSD 基础镜像现已登陆中国的 VM Depot! 对于青睐 BSD 而非 Linux 的开源爱好者来说,这无疑是个好消息.同时,随着该基础镜像 ...

  8. 如何将SQL Server运行到Windows Azure上

    从2012年6月6日开始,Windows Azure上一些强大的新功能现在可用于预览,包括新的Windows Azure虚拟机(VM).其中有关Windows Azure虚拟机最强大的一件事是他们利用 ...

  9. Windows Azure 上的 Symfony,适用于 PHP 开发者的强大组合

     发布于 2014-06-13 作者 陈 忠岳 Symfony 是针对 PHP 开发者的流行开源 Web 应用框架.现在,您可以更轻松地在 Windows Azure 上使用它,这都归功于 Ben ...

随机推荐

  1. Java基础知识强化30:String类之String的特点(String为什么是final)

    1. String字符串特点: 一旦被赋值,字符串值就不能改变. 这里String是final修饰的,具有不可继承性. 2. 为什么String是final? 主要是为了"效率"  ...

  2. LSI SAS 2208 配置操作

    配置LSISAS2208 介绍LSISAS2208扣卡的配置方法. 2.1 登录CU界面 介绍登录LSISAS2208的CU配置界面的方法,以及CU界面的主要功能. 2.2 创建RAID 介绍创建RA ...

  3. linux groupmems命令

    Because users group membership is defined in two different locations, it can be difficult to find ou ...

  4. SGU131--NYOJ435

    参考blog http://m.blog.csdn.net/blog/u012760629/36927465 http://www.cppblog.com/menrowitianya/archive/ ...

  5. Error prompt:“wget: unable to resolve host address”---Solution

    //Situation System prompts that:"wget: unable to resolve host address".   //Analysis   Una ...

  6. linux的df命令

    man df可以查看磁盘的使用情况以及文件系统被挂载的位置 df -lh命令效果如下

  7. 'swap file "xx" exists' linux

    solution: 1)swap to another tty, kill processes using 'sudo kill -9 pid' 2)'Recover' the 'warn-openn ...

  8. 自动加载类PHP中spl_autoload_register函数的用法

    spl_autoload_register(PHP 5 >= 5.1.2) spl_autoload_register — 注册__autoload()函数 说明bool spl_autoloa ...

  9. C#操作MYSQL遇到0000-00-00日期报错的原因

    今天在做一个C#连接MYSQL数据库,并读取数据库的内容,遇到了0000-00-00日期转换报错:unable to convert MySQL date/time value to System.D ...

  10. jdk与cglib的动态代理

    JDK动态代理中包含一个类和一个接口: InvocationHandler接口: public interface InvocationHandler { public Object invoke(O ...