Azure负载均衡机制与会话粘滞需求

简介:

其实写这个博客的时候想先小小吐槽一下咱们的博客系统,我觉得第一希望我们的编辑器系统能够升级一下,现在这个真算不上好用啊,例如贴图只能上传;如果用微软Windows Live Writer连接MetaWebBlog方式格式转换也不是很准确;另外类型选择上我觉得应该与时俱进,云计算,大数据,自动化这些内容都应该逐渐加入进来,这些部分真希望能够得到改进!

好了,言归正传;先说说Azure的负载均衡模式,Azure最初的设计Cloud Service是一种云计算可扩展结构PAAS服务,前端是Web接入层可以有多个实例,工作实例层次可以实现应用松耦合逻辑处理;接入层都是可以通过互联网接入的每个外网服务部署都是通过外部软件负载均衡器的外网连接的;因此发展至今提供了虚拟机的IAAS层服务,这个服务实际也是通过Cloud Service云服务包裹的,在创建虚拟机时都会加入或者创建一个新的Cloud Service,创建的Cloud Service内通可用性集实现多个实例的高可用,那么外部连接也希望实现网络层次的高可用,这个当然需要网络负载均衡器的支持;这也就是Azure的负载均衡器存在的意义。


这个内置的负载均衡器的特性和配置方法,可以参考MSDN Azure Load Balancer文档,但是从这里我们也可以看出这个负载均衡器算法策略比较简单,就是一个五元组哈希负载均衡器(通过源端口+IP地址,协议TCP或UDP,目标端口+IP地址)分布到后端虚拟机节点;当然也提供了探测策略例如探测指定健康检查网页并且根据返回状态(例如IIS返回状态不是200)判断是否转发。但是这里可以看出有两个局限性,首先如果健康检查希望实现一些高级功能例如插入脚本实现超时判断等,另外一个关键的问题就是是否可以实现高级例如硬件提供的负载均衡器实现的会话粘滞功能;例如有些服务类似FTP或视频服务,通常有个TCP控制端口有个传输UDP端口,如果不能实现会话粘滞根据五元组策略将会被转发到不同的节点,这样就有问题了。现在提供的五元组粘滞方式是基于会话Session的。同一个TCP或者UDP的会话会被转发到后端的同一个虚拟机,当客户端从同一个原地址关闭或重新打开连接并建立新的会话,那么 如果原端口改变也会因为5元组Hash计算后的不同被转发到另一个后端虚拟机节点。


所以原来提供的解决方式是通过在WEB Farm负载前面通过Microsoft Application Request Routing (ARR)实现负载均衡,通过与现在开源很流行的Nginx或HAproxy很类似的"Cookie Insertion" 技术实现会话粘滞, 将所有需要作为负载均衡的负载连接通过Azure负载均衡器全部转发ARR服务器,因为ARR部署在客户端与后端虚拟机之间,可以截获所有转发请求,在根据负载均衡策略(ARR提供的负载均衡方式也比较丰富而不仅仅是轮询方式,可以参考Microsoft Application Request Routing (ARR))选择后端虚拟机,然后将在后端虚拟机服务器的响应中插入定制 包含虚拟机哈希值的HTTP Cookie,这样后继的客户端连接都会根据这个Cookie返回的值发送到ARR再有ARR转发到同一个后端虚拟机,这样就实现了会话粘滞功能。通常部署方式如下图。

为了防止单点故障,因为Azure提供的负载均衡器是高可用的,自己部署ARR也希望通过负载均衡高可用的话也需要通过构建ARR的可用性集,因此构建起来并不轻松。而且这种方式如果连接IIS环境的话需要IIS 7以上的版本;因此有没有折中的方式呢?现在Azure负载均衡器已经开放了一种新的二元组方式了。

二元组方式实现的会话粘滞也称为IP亲和性策略方式,这种方式下的Azure提供的负载均衡器只提供基于源IP地址和目标IP地址或源IP地址和目标IP地址加协议哈希转发到后端。通过这种IP亲和性策略可以实现同一个客户端连接请求总是被转发到指定的后端虚拟机(当然后端虚拟机状态是OK的前提下)。

之所以要叫做折中方式是因为目前这种方式也有局限性,后端虚拟机节点变化都会造成哈希节点重新计算,因此同一个客户端新的请求仍然会因为这一改变被转发到其他节点。另外,由于二元组策略的天然局限性,如果多个客户端通过NAT或者Proxy连接都会被视为同一个源地址而容易造成这些请求总被转发到指定节点造成不均衡负载的情况。

配置Azure二元组方式负载均衡器有三种途径:

  • 通过Powershell或者Service Management API配置虚拟机端点负载均衡策略方式

  • 通过Powershell或者Service Management API配置负载均衡端点集合

  • 如果是PAAS Cloud Service实现的Web/Worker角色可以通过service model.进行配置。

通过Powershell的配置方法比较简单,首先确保已经更新了最新的Powershell Azure Module

对已有虚拟机Azure端点配置负载均衡策略:

1
Get-AzureVM  -ServiceName "TestService1"  -Name "TestNode1"  Add-AzureEndpoint  -Name "HttpIn"  -Protocol "tcp"  -PublicPort80 -LocalPort80 LoadBalancerDistribution  "sourceIP" Update-AzureVM

LoadBalancerDistribution有三个参数

  • sourceIP为二元组

  • sourceIPProtocol为三元组

  • none为默认五元组。

也可以通过直接设置以后的已有负载均衡集的方式修改:

1
Set-AzureLoadBalancedEndpoint  -ServiceName "TestService1"  -LBSetName "TestSet1"  -Protocol tcp -LocalPort80 -ProbeProtocolTCP -ProbePort80 LoadBalancerDistribution "sourceIP"









本文转自 翟老猫 51CTO博客,原文链接:http://blog.51cto.com/3387405/1599114,如需转载请自行联系原作者
相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
|
负载均衡 算法 数据库
从银行柜台小姐姐聊负载均衡中的会话粘滞
从银行柜台小姐姐聊负载均衡中的会话粘滞
109 0
|
负载均衡
负载均衡-会话保持cookie内容说明
负载均衡http监听采用植入cookie时,默认会加入一个cookie,他的具体含义是什么呢? SERVERID=abd77a4088910c05c7d6517601bb198d|1570633089|1570632657;Path=/" 其中SERVERID这个cookie是负载均衡内部使用,建...
1580 0
|
Web App开发 存储 Apache