此次携程事件导致携程网站和APP停止服务长达将近9个小时。至于什么原因引起的,截至到我写稿时还没有一个官方的答复。那些坊间的传闻这里我就不再多说,至于一点,携程的网站在停止服务9个小时内竟然没有一套备用站点快速的切换提供服务,这是不可理解的。
下面就这个事件,我设计了一个简单的场景,站点1(Blog01)是主站点,站点2(Blog02)是备用站点。我采用Traffic Manager将这两个站点做高可用负载平衡。
先来看下Microsoft Azure Traffic Manager 到底是什么东东。
使用 Microsoft Azure Traffic Manager 可以控制向指定的终结点(可能包括 Azure 云服务、网站和其他终结点)分配用户流量。Traffic Manager 的工作原理是将智能策略引擎应用到对 Internet 资源域名执行的域名系统 (DNS) 查询。Azure 云服务或网站可以在世界各地不同的数据中心内运行。
说的简单易懂点Traffic Manager就是一个智能的DNS解析。
能帮助我们做什么?
- 提高关键应用程序的可用性,当你的应用程序的某个节点出问题的时候,Traffic Manager可以通过智能的监视你的终结点(云服务、网站和其他角色)的服务状态,然后把流量迁移到正常的终结点。
- 提高应用程序的响应性,当你的应用程序客户遍布全国甚至是世界各地时,如何能够把流量引到离他们最近的数据中心,已达到最快的响应速度。这就是Traffic Manager需要做的事情。
- 大型复杂的流量分配,如果你有像淘宝、京东等这类网站时,你需要复杂的流量分配规则来满足用户的快速访问需求,使用嵌套的 Traffic Manager 配置文件(在其中的一个 Traffic Manager 配置文件可以将另一个 Traffic Manager 配置文件作为终结点),可以创建配置来优化更大、更复杂部署的性能和分布。
工作原理是啥?
我来根据这张图来解释下:
1. 首先客户端需要知道IP地址才能去访问应用,然后就发送域名解析请求到公网域名www.contoso.com(就是在公网域名服务商注册的域名)。
2. 请求发到公网DNS上进行解析,然后公网DNS根据你的配置的CNAME记录把请求发给Traffic Manager。
3. Traffic Manager会根据自己的配置文件(性能、循环法、故障转移),确定最佳终结点,选择好终结点后,把终结点的IP信息返回给客户端。
4. 客户端根据解析到的IP地址信息,直接发送请求道终结点。
怎么配置Traffic Manager?
Traffic Manager包含三种负载平衡方法:
- 故障转移:如果终结点位于相同或不同的 Azure 数据中心(在管理门户中称为区域)内,并且你希望对所有流量使用一个主终结点,但是希望在主终结点或备用终结点不可用时提供备份,请选择“故障转移”。
- 循环:如果要将负载分配到同一数据中心内的一组终结点或者分配到不同的数据中心,请选择“循环”。
- 性能:如果终结点位于不同的地理位置,并且你希望请求客户端使用“最靠近的”终结点(因为延迟最低),请选择“性能”。
三个不同的负载平衡方法,三个不同的选择,下面我主要就故障转移场景来演练,如何通过Powershell创建Traffic Manager,并进行基本的配置。
创建故障转移的负载平衡器
New-AzureTrafficManagerProfile -Name "cloudvip" -DomainName "cloudvip.trafficmanager.net" -LoadBalancingMethod "Failover" -Ttl 30 -MonitorProtocol "Http" -MonitorPort 80 -MonitorRelativePath "/"
表示我要创建一个cloudvip的Profile,域名为cloudvip.trafficmanager.net,负载平衡方法是故障转移,监视内容:协议http 端口 80 默认路径。
我们进入门户可以看到已经创建好该Traffic Manager。
加入终结点
这时我们的Traffic Manager并没有包含任何终结点,下面我开始通过Powershell把终结点加进来。
1.$TrafficManagerProfile = Get-AzureTrafficManagerProfile -Name "cloudvip" 2.Add-AzureTrafficManagerEndpoint -TrafficManagerProfile $TrafficManagerProfile -DomainName "blog01.cloudapp.net" -Status "Enabled" -Type "CloudService" | Set-AzureTrafficManagerProfile
第一个命令是使用Get-AzureTrafficManagerProfile得到cloudvip的参数然后存放在TrafficManagerProfile变量中。
第二个命令是添加域名为blog01.cloudapp.net的云服务,然后通过Set-AzureTrafficManagerProfile变更到azure中。
带有权重参数加入终结点
使用同样方法添加另外一个终结点,这次加上权重的参数。
Add-AzureTrafficManagerEndpoint -TrafficManagerProfile $TrafficManagerProfile -DomainName "blog02.cloudapp.net" -Status "Enabled" -Type "CloudService" -Weight 2 | Set-AzureTrafficManagerProfile
查看终结点详细信息
$TrafficManagerProfile.Endpoints | Format-List
使用PowerShell修改权重
可以使用Set-AzureTrafficManagerEndpoint重新设置终结点,我来演示把blog01节点的权重改成3.
Set-AzureTrafficManagerEndpoint -TrafficManagerProfile $TrafficManagerProfile -DomainName "blog01.cloudapp.net" -Status "Enabled" -Type "CloudService" -Weight 3 | Set-AzureTrafficManagerProfile
查看结果
最后我们在客户端进行测试
这时我们可以看到Traffic Manager把流量引入到blog01上了,这时我如果想把节点2(blog02)作为主节点,要怎么设置呢?你可以运行一下命令
1. $Profile = Get-AzureTrafficManagerProfile -Name "MyProfile" 2. $Profile.Endpoints[0],$Profile.Endpoints[1] = $Profile.Endpoints[1],$Profile.Endpoints[0] 3. Set-AzureTrafficManagerProfile -TrafficManagerProfile $PROFILE
从结果中我们可以看到,节点2变成了主节点,我们再来ping一下试试。
现在是节点2在提供服务。
总结:从上面的示例中,我们可以看到,一个网站设计成一个高可用架构,如果一个站点遭到毁灭性的攻击和破坏,我们可以快速的切换到备用站点,以提供服务。从而避免类似携程的事件发生。