在Azure上实现Linux Server故障转移
要充分利用公有云的弹性扩展和高可用, 首先要在应用系统层面支持横向扩展(scale out),这个说起来很容易,或者说对新开发的应用系统而言已经成为标配。但是对已有的、老旧的应用系统来说,这就比较困难了,不是每个应用系统都能实现/支持横向扩展的。从客户的角度来说,基本上很难接受为了把应用系统迁移到公有云上而去额外投入修改应用系统代码。虽然我们都心知肚明,本质上这是在“偿还技术债”,修改应用系统代码也是为了更好地利用公有云的优势...
对于应用系统的横向扩展而言,“状态”是最大的拦路虎,要支持横向扩展,首先要实现stateless。最常见的“状态”就是web应用中的session。此外还有一些tcp通讯,socket通讯之类的应用也是需要“有状态”的。还有一些商业软件这样那样的限制,总是就是不允许、也不能通过同时运行多个应用程序实例来实现横向扩展和高可用。
上述现状直接导致的后果就是:客户将应用系统迁移到公有云上之后,却完全体验不到公有云应有的优势,和本地部署没有任何区别,甚至还不如本地部署方便、划算。
在传统的IT环境(on-premises)中,Linux Server有很多成熟的高可用方案,例如:LVS,Heartbeat,Keepalived...但这些方案都需要一个虚拟的IP地址来对外提供服务。在公有云上,无论是公网IP地址还是内网IP地址,都是被统一管理和分配的,凭空冒出来的一个IP地址是不会被识别和使用的。所以用户千万不要在虚拟机里面随便修改网卡的IP地址,以免造成虚拟机无法连接。
Azure的Loadbalancer有一个“Direct Server Return”选项,新版的Portal中改名为:“EnableFloatingIP”。
一直以来,官方文档中只是说这个选项只有在做SQL Server Always-on集群的时候才会用到。其实DSR并非是Azure Loadbalancer专属的一个属性,这个概念在硬件负载均衡设备中很常见。我们来看一段关于DSR的介绍:
Direct Routing aka. Direct Server Return (DSR) is a great load balancing method, the idea being that incoming traffic comes into the Virtual IP (VIP) on the load balancer.
Then all the load balancer does is change the destination MAC address of the packet (to one of the destination real servers in the pool) and flips it back to the switch which duefully delivers the packets to the selected real server.
这个DSR就可以支持我们需要的虚拟IP地址!无论是自动还是手工分配给启用了DSR的Loadbalancer的IP地址,都相当于设置了一个虚拟IP地址,这个IP地址可以根据需要附加到位于Loadbalancer之后的虚拟机上。通过这个虚拟IP地址过来的请求会直接到达在Loadbalancer后面的、绑定了虚拟IP地址的虚拟机。
基本原理就是这样了,原来我们一直都忽略了Azure的这一“独门秘笈”,目前我暂时还没有发现其他的公有云提供DSR支持!
下面我们使用CentOS 6.7镜像创建两个虚拟机,在Azure中国版上配置一个Linux Server故障转移集群。
前置准备工作:
1、把两个虚拟机放在同一个云服务中,而且必须使用standard类型的虚拟机。
2、为虚拟机分配固定的内网IP地址(DIP)和公网IP地址(Reserved VIP)。
3、创建一个新的负载均衡端点并启用DSR。
安装keepalived:
不要直接使用yum里面的Keepalived,那个版本太低,不能支持单播。还有就是一定要彻底关闭SELINUX(这个家伙到哪都不讨人喜欢)。
wget http://www.keepalived.org/software/keepalived-1.2.20.tar.gz
sudo yum install make gcc openssl-devel
tar xvf keepalived-1.2..tar.gz
cd keepalived-1.2.
./configure --prefix=/usr/local/keepalived
sudo make install
sudo cp /usr/local/keepalived/etc/rc.d/init.d/keepalived /etc/rc.d/init.d/
sudo cp /usr/local/keepalived/etc/sysconfig/keepalived /etc/sysconfig/
sudo cp /usr/local/keepalived/sbin/keepalived /usr/sbin/
配置Keepalived:
#创建配置文件目录
mkdir /etc/keepalived
#创建配置文件
sudo vim keepalived.conf
#创建动作脚本
sudo vim keepalived-action.sh
#创建服务检查脚本
sudo vim keepalived-check-appsvc.sh #给上述三个文件添加读取权限(chmod +r)
配置文件内容: keepalived-check-appsvc.sh
--------------------------------
#!/bin/bash
exit #这个脚本用于检查本机的服务或者进程的运行状态。为了简化演示过程,我们临时让这个文件返回状态码“”,即代表本地服务或者进程的运行状态是正常的。
#在生产环境中,必须根据实际的业务需求对服务或进程的健康状态进行检查。
#返回非“”表示检查失败,会触发故障转移。
#如果主机(MASTER)重启或者操作系统崩溃,也会触发故障转移,即:BACKUP提升为MASTER。
#因此,这里我们直接返回“”,若主机(MASTER)重启或者操作系统崩溃,依然可以触发故障转移动作。 keepalived-action.sh
--------------------------------
#!/bin/bash TYPE=$
NAME=$
STATE=$ case $STATE in
"MASTER")
service httpd start
exit
;;
"BACKUP"|"STOP")
exit
;;
"FAULT")
exit
;;
*)
exit
;;
esac #当某个服务器成为MASTER的时候,启动httpd服务。(本例中我们用Apache服务进行演示) keepalived.conf -- 主机(MASTER)
-------------------------------
vrrp_script chk_appsvc {
script /etc/keepalived/keepalived-check-appsvc.sh
interval
fall
rise
} vrrp_instance VI_1 { interface eth0 authentication {
auth_type PASS
auth_pass secr3t
} virtual_router_id virtual_ipaddress {
42.159.241.126 #Azure Loadbalancer的公网IP地址(VIP)
} track_script {
chk_appsvc
} state MASTER
priority unicast_src_ip 10.11.12.4 #本机地址,Azure虚拟机的内网IP地址(DIP)
unicast_peer {
10.11.12.5 #对端地址,Azure虚拟机的内网IP地址(DIP)
} notify /etc/keepalived/keepalived-action.sh
}
keepalived.conf -- 备机(BACKUP)
-------------------------------
vrrp_script chk_appsvc {
script /etc/keepalived/keepalived-check-appsvc.sh
interval 1
fall 2
rise 2
} vrrp_instance VI_1 { interface eth0 authentication {
auth_type PASS
auth_pass secr3t
} virtual_router_id 51 virtual_ipaddress {
42.159.241.126 #Azure Loadbalancer的公网IP地址(VIP)
} track_script {
chk_appsvc
} state BACKUP
priority 100 unicast_src_ip 10.11.12.5 #本机地址,Azure虚拟机的内网IP地址(DIP)
unicast_peer {
10.11.12.4 #对端地址,Azure虚拟机的内网IP地址(DIP)
} notify /etc/keepalived/keepalived-action.sh
}
除了keepalived.conf文件之外,其他的操作和配置文件在两个服务器上(MASTER和BACKUP)都是一样的。
最后一项设置是修改Linux操作系统的一个网络配置参数
vim /etc/sysctl.conf
#在末尾追加一行:net.ipv4.ip_nonlocal_bind=1 #保存后使更改生效
sudo sysctl -p
因为本例中使用Apache来作为故障转移演示,因此我们需要同时在两个服务器上安装Apache服务,并修改Apache的Listen端口与Azure Loadbalancer端口保持一致。
sudo yum install httpd
sudo vim /etc/httpd/conf/httpd.conf
Apache安装配置完成后,先不要启动httpd服务,因为即便启动httpd服务,也没法通过Azure Loadbalancer访问到,原因就是Azure Loadbalancer已经启用了DSR,而在Azure Loadbalancer之后的虚拟机上却没有绑定相应的虚拟机IP地址。
至此,所有的配置都已经完成了。我们来测试一下效果:
在MASTER上启动Keepalived服务,随后使用:"ps -el | grep httpd"命令可以看到Apache服务已经启动了。这时通过Azure Loadbalancer的公网IP地址就能访问到MASTER上的web界面了。虚拟IP地址已经成功的绑定到MASTER上,并且已经生效。
sudo service keepalived start
在MASTER上执行重启命令:“sudo reboot”,模拟MASTER故障。然后到BACKUP上执行"ps -el | grep httpd",可以看到BACKUP上的Apache已经被启动了。这时依然可以通过Azure Loadbalancer的公网IP地址访问到web页面,但此时访问到的web页面已经是由BACKUP在提供服务了。因为MASTER重启后,位于MASTER上的Apache并没有被随之启动。
在Azure上使用Keepalived创建Linux Server故障转移集群已经成功!
不过这仅仅是一个开始,在正式的生产环境中,还有很多需要调整和优化的配置。特别是服务状态检测脚本(track script)和故障转移动作脚本(notify script),有很大的发挥和想象空间,例如:我们可以在脚本中通过调用Azure CLI来动态创建或者销毁Azure资源...
BTW:Windows Server Failover Cluster其实也是通过虚拟IP对外提供服务的,因此在Azure上也同样可以部署WSFC,这样在Azure上部署类似SAP ECC的应用就可以实现高可用了。
在Azure上实现Linux Server故障转移的更多相关文章
- 在Azure上部署Windows Server Core
作为服务器操作系统,图形界面真心有些多余了,这也是很多人喜欢Linux服务器的原因之一.从Windows Server 2008开始,微软提供了Server Core版本,其实就是一个没有图形界面的服 ...
- SQL Server故障转移集群
在XenServer集群上给客户搭建一个应用服务,要求有负载均衡,Web服务器用Windows Server 2008 R2 + IIS,数据库Sql Server 2008 R2,并且使用SAN存储 ...
- 004.Windows Server 故障转移群集 (WSFC)简介
一 WSFC 简介 1.1 WSFC 概述 “Windows Server 故障转移群集”(WSFC) 群集是一组独立的服务器,它们共同协作以提高应用程序和服务的可用性.SQL Server 2012 ...
- 连接到 Azure 上的 SQL Server 虚拟机(经典部署)
概述 本主题介绍如何连接到运行于 Azure 虚拟机的 SQL Server 实例. 它介绍了一些常规连接方案,并提供了在 Azure VM 中配置 SQL Server 连接的详细步骤. Impor ...
- 快速学习使用 Windows Azure 上的 SharePoint Server 2013
为了在当今的企业环境中占据一席之地,您需要能够迅速顺应变化和应对挑战.有时,需要及时调整您的SharePoint 基础结构以保持竞争优势. 基础结构即服务可通过随时使用.即付即用的解决方案应对这 ...
- 从Azure上构建Linux应用程序映像
下图描述了总体的虚拟机的VHD映像生成以及发布到 Azure Azure 镜像市场的全过程: 具体步骤如下: 从Azure管理平台上Linux申请虚拟机, 安装和配置您要发布的应用软件产品,制作成映像 ...
- AlwaysOn可用性组功能测试(二)--SQL Server群集故障转移对AlwaysOn可用性组的影响
三. SQL Server群集故障转移对AlwaysOn可用性组的影响 1. 主副本在SQL Server群集CLUSTEST03/CLUSTEST03上 1.1将节点转移Server02.以下是故障 ...
- SQL Server 2012故障转移的looksalive check和is alive check
什么是looksalive check和is alive check SQL Server故障转移集群是建立在windows集群服务上的一种热备的高可用方案.在集群运行过程中,windows集群服务定 ...
- 在Windows Server 2012 R2中搭建SQL Server 2012故障转移集群
需要说明的是我们搭建的SQL Server故障转移集群(SQL Server Failover Cluster)是可用性集群,而不是负载均衡集群,其目的是为了保证服务的连续性和可用性,而不是为了提高服 ...
随机推荐
- Unity实现滑页嵌套(解决ScrollRect嵌套冲突问题)
简介 由于项目需要+有网友咨询,所以做了个横向滑页+某一横向滑页中有竖向滑页的demo,实现有点绕弯子,但基本功能还是比较完善,发上来共享一下. 效果 思路 第一步的思路是自己判断触屏拖动位置,然后控 ...
- css遮罩代码(已验证)
#mask { background-color: rgb(0, 0, 0); display:none; opacity: 0.0; /* Safari, Opera */ -moz-opacity ...
- php rsa加密解密实例
1.加密解密的第一步是生成公钥.私钥对,私钥加密的内容能通过公钥解密(反过来亦可以) 下载开源RSA密钥生成工具openssl(通常Linux系统都自带该程序),解压缩至独立的文件夹,进入其中的bin ...
- Linux查看CPU和内存使用情况(转)
在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...
- Java中的字符串
Java语言中,把字符串作为对象来处理,类String就可以用来表示字符串(类名首字母都是大写的). 1.字符串常量 字符串常量是用双引号括住的一串字符. 例如:"Hello World&q ...
- java web学习总结(十五) -------------------JSP基础语法
任何语言都有自己的语法,JAVA中有,JSP虽然是在JAVA上的一种应用,但是依然有其自己扩充的语法,而且在JSP中,所有的JAVA语句都可以使用. 一.JSP模版元素 JSP页面中的HTML内容称之 ...
- iOS隐私政策
隐私政策 本应用尊重并保护所有使用服务用户的个人隐私权.为了给您提供更准确.更有个性化的服务,本应用会按照本隐私权政策的规定使用和披露您的个人信息.但本应用将以高度的勤勉.审慎义务对待这些信息.除本隐 ...
- hadoop 集群的配置
在经过几天折腾,终于将hadoop环境搭建成功,整个过程中遇到各种坑,反复了很多遍,光虚拟机就重新安装了4.5次,接下来就把搭建的过程详细叙述一下 0.相关工具: 1,系统环境说明: 我这边给出我的集 ...
- 从CSS实现正片叠底看=>混合模式mix-blend-mode
兼容性:这个东西说多了也没意思,像HTML5和CSS3这种兼容性时刻变化的东东,我们最好在自己支持的设备上实验,不支持,就在想办法呗,这个东西就是为了方便和好玩 所有属性: mix-blend-mod ...
- jquery在线五子棋
在线五子棋试玩地址:http://keleyi.com/game/12/ 以下是完整代码,保存到html文件打开也可以玩: <!DOCTYPE html> <html> < ...