AWS ELB NLB (Network Load Balancer) 创建 配置
AWS ELB NLB (Network Load Balancer) 创建 配置
20180723 Chenxin
ELB所在位置与创建前的准备
说明
ELB在EC2的导航栏中.
ELB分为3种,1为7层协议的HTTP和HTTPS.2为4层.3为old的方式的(aws最初的ELB).
这里我们一般选择network Load Banlancer(NLB).
建议您启用多个可用区。
原理说明: https://docs.aws.amazon.com/zh_cn/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html
准备
提前规划好对应的VPC,子网(3个子网分别位于a,b,c3个可用区),负载均衡的后端实例(a,b,c3个可用区各1个实例).
可以提前申请EIP(不申请的话,ELB也会拿到1个对应的DNS名称,客户端也是可以使用的).默认不用给静态EIP,浪费资源.
完成ELB后,创建对应的ELB后端端口侦听失效的报警机制,比如处于故障状态的实例数量=>1,就触发报警.
ELB的创建
EC2中的"负载均衡"分为2个创建步骤.
首先是"负载均衡器"的配置,然后是"目标群组".
创建中的步骤与具体参数说明
第一步,配置负载均衡器
负载均衡器管理的是:
名称(自命名的负载均衡器名称),
DNS(该ELB对应的自动生成的DNS名称,配置于游戏客户端.无论内网ELB,还是外网ELB,都会将该DNS发布至全球),
状态(active),
VPC-id,可用区(-1c),只能选择1个VPC.且每个可用区只能选择1个子网(对应的子网可以对接1个EIP,多个子网可以对应多个EIP.或者默认就不用EIP都可以).
类型(network),
侦听器,管理"侦听器"(侦听客户端,如玩家请求的端口.会将请求转发给后端的目标群组),如4399.这里是第一次填端口(侦听器),之后端口号可以修改
第二步,配置路由(目标群组,对应的EC2需要注册到这里来)
目标群组:
名称(自命名的目标群组名称),
端口(4399),这里是第二次填端口(路由),这个端口之后无法修改
协议(TCP),
目标类型(实例),可以是instance或者是IP两种模式.如果是实例模式,则对应是DR(后端可以获取玩家真实IP).若是IP模式,则是NAT模式(后端只能看到NLB的内网IP)
负载均衡器(绑定的负载均衡器名称,就是上面创建的那个),
VPC(VPC-id),
目标群组里的其他概念
已注册目标:就是注册到这个目标群组的实例,可以添加或删除.用于接收负载均衡器的请求的后端实例.目标状态可以是healthy,或者unhealthy.
取消注册延迟:意思就是将目标群组中的实例手动给剔除的时候,这个后端实例不会直接断开,而是出于一种不接收新请求了,等XXX秒就自动下线.(默认是300秒,取值范围0-3600秒).
运行状况检查:这里可以配置目标群组监听EC2端口的健康状况,默认跟转发端口一致.也可以手动配置,选择"编辑运行状况检查->端口->覆盖->输入端口号".这个端口只是作为检查后端EC2服务是否异常,如果正常,则不会通知ELB剔除该实例.那么如果这里配置的是4399,而目标注册的EC2那里配置4699,则ELB仍会把正常客户端请求发给这个实例(认为这个实例正常,其实这个实例并没有开4699的端口).
监控:略.
第三步,注册目标
这里选择需要加入到目标群组的哪些实例.这里对应的是各个EC2开放的各个端口(4399),这里是第三次填端口(注册目标),端口号可以修改
第四步,审核
略.
其他说明:
创建的ELB可以创建"删除保护"(ELB->属性).
跨区域负载均衡,ELB->属性->开启.(注意,这里的跨区域指的是垮可用区,当我们结合auto scaling使用的时候,选择a,b,c3个可用区的话,这里一定要打钩)(Route 53 使用负载均衡器节点之一的IP地址响应每个请求.这里是针对可用区而言的.跨区域开启的话,每个ELB会根据具体目标注册情况分配路由流量.不开启的话,a1和b1可能是平均分配流量,然后后端的注册目标数目不同,对实例造成的压力就不一样了.比如a1里1个EC2,b1里有9个EC2,那a1里的那个压力会非常大,会被分配50%的请求流量过来).
域名解析说明
aws会将域名发布到全球(即使是内网使用的ELB,其他非相关人员解析的时候,仍然能够解析到内网IP,比如10.X.X.X).
数据流说明(对应端口说明)
客户端访问ELB的4499端口->
侦听器4499ELB(第一次填的那个端口)接收请求->
转发给目标群组4399端口(第二次填的那个端口)->
分发给EC2实例,这里不同实例可以配不同端口,比如4399,4499,4599等(第三次填的那个端口)
服务器如何获取玩家源IP
源IP保留(目前默认instance模式,可以选择IP模式)
在创建ELB的第二步,配置路由(新建目标组)中,目标类型是否使用实例 ID 或私有 IP 地址注册目标.
如果您使用实例 ID 指定目标,则客户端的源 IP 地址将保留并提供给您的应用程序。
目前默认就是这样,已经测试.
删除
因为"目标群组"是绑定在"负载均衡器"上的,所以需要先删除ELB,才可以删除目标群组.否则会报错无法删除目标群组.
结合auto scaling.
跨VPC的ELB,应该会涉及到Route53.
遇到的"坑"
跨区域负载均衡
1.负载均衡选择了a,b,c3个可用区.只有a区有3台服务器提供服务.负载均衡器会在每个可用区给1个IP,ELB的域名会解析到这3个IP上(通过Route53).这里在"跨区域负载均衡"属性上一定要勾选,否则绑定到b,c的IP无法将请求发送到a区内的服务器(这个选项会额外收费).
NLB会将后端不正常的服务主机剔除,且Route53也会将不正常的服务对应可用区IP给剔除.但DNS生效需要时间.下面是取消"跨区域负载均衡"勾选后,不同地区的DNS服务器表现情况,可以看到,成都电信DNS有大概率(大约是10%左右)解析出错误的IP地址(可能需要更长的时间才会正常),而谷歌的DNS没有这个情况.
xbzj-nlb-consul-02-d68eed793aaef5cd.elb.us-east-1.amazonaws.com
服务器: ns.sc.cninfo.net
Address: 61.139.2.69
非权威应答:
名称: xbzj-nlb-consul-02-d68eed793aaef5cd.elb.us-east-1.amazonaws.com
Addresses: 10.10.0.227 #后端服务主机正常
10.10.2.124 #后端无服务主机,且已经是禁用了"垮区域负载均衡"
10.10.1.144 #同上
xbzj-nlb-consul-02-d68eed793aaef5cd.elb.us-east-1.amazonaws.com
服务器: google-public-dns-a.google.com
Address: 8.8.8.8
非权威应答:
名称: xbzj-nlb-consul-02-d68eed793aaef5cd.elb.us-east-1.amazonaws.com
Address: 10.10.0.227
2.启用和停用"跨区域负载均衡"大约有5分钟左右的生效时间.如果是内网的ELB,可以看到解析到不同可用区的IP地址段.
其他知识说明
连接空闲超时
对于客户端通过网络负载均衡器发出的每个请求,都将跟踪该连接的状态。
连接由目标终止。如果客户端或目标通过连接发送数据的间隔超过空闲超时期限,则连接将关闭。
如果客户端在空闲超时期限后发送数据,则会收到一个 TCP RST 数据包,以指示连接不再有效。
Elastic Load Balancing 将空闲超时值设为 350 秒。您不能修改此值。您的目标可以使用 TCP keepalive 数据包重置空闲超时值。
取消注册延迟
Elastic Load Balancing 停止将请求发送到正在取消注册的实例。
连接耗尽可确保进行中的请求在现有连接关闭前完成。
取消注册的目标的初始状态为 draining。默认情况下,取消注册的目标的状态在 300 秒后将变为 unused。
要更改 Elastic Load Balancing 在状态更改为 unused 之前等待的时间长度,请更新取消注册延迟值。
当将目标移到 Network Load Balancer 时,性能会下降
Classic Load Balancers 和 Application Load Balancers 两者都使用多路复用连接,但 Network Load Balancers 不使用。
因此,您的目标可能会在 Network Load Balancer 后面收到更多的 TCP 连接。请确保您的目标准备好处理它们可能会收到的连接请求量。