华为云ELB负载均衡配置

华为云ELB负载均衡配置

叠个甲,鉴于我个人水平有限,以下都是我个人的理解与好恶,如果错漏的地方,大家理解。我喜欢和不喜欢那也是个人喜好,不代表这个东西好与不好。

背景

这篇博客也算是上一篇微信小游戏支付的后续吧,因为支付接口做好了,肯定得部署上云,既然是支付模块,那肯定得保证稳定性,负载均衡还是必须得上的。但是之所以要写一篇博客来讲这个事情,还是因为华为云的负载均衡在配置的时候踩了很多坑,甚至和华为云的技术支持整到了大半夜才配置好。

其实云商的负载均衡之前也是用过、配置过的,但是当初我是用的阿里云的,说实话我感觉华为云的ELB配置起来比阿里云的复杂不少,也正是因为这一点,才想着写博客记录一下,以免以后再踩一遍坑。

另外需要说一下的是,我考虑部署的架构。ELB + 2 ECS + 1 MySQL(华为云RDS,高可用主备) + 1 Redis(单机)。两台ECS一台高配,承担70%的负载,另外一台配置相对较低,承担30%的负载。同时,高配的ECS上运行了Django写的管理后台,用于查询和做各种配置。这个方案也是我以前用过的方案,对于支付系统其实完全足够,我个人认为撑个200的RPS一点问题没有,当然我在压测时跑到50RPS就开始报错,但是错误率在0.1%上下,我分析这也是因为带宽是固定的5M,压测的时候带宽基本稳定在400+KB/s,带宽确实接近跑满。

需求

1、ELB按比例分发请求到2台ECS;
2、ELB分发admin管理后台的请求和静态资源请求到ECS1。

技术选型

1、华为云ELB
2、华为云ECS
3、Django – 管理后台
4、springboot3 – 后端接口

ELB购买和配置

这篇文章主要是记录ELB的配置,对于ECS的购买、配置搭建等就不涉及了。

ELB的分类

华为云的ELB有两种,分别是 独享型和共享型。两种类型的区别大家可以自行查看华为云的文档。这里我要提到的一点,也就是我踩的一个坑,那就是共享型的负载均衡,不能复用后端服务器组。具体情况后续我会讲到。

也正是因为我感觉支付系统一般来说压力不大,我买的是共享型的ELB。5M固定带宽,一个月130+出头。

买了ELB之后,可以进入ELB的控制台,查看ELB的配置。

配置监听器

点击ELB名称,进入该ELB的详情页面。可以看到,这里可以查看基本信息和监控,还有实时的访问日志。最重要的是可以配置监听器。

监听器这个东西,你可以看华为云的文档去了解,我个人认为,简单来说这就是配置指定端口的转发规则。这里也正好说一句,其实各大云商的负载均衡,我感觉就是用的Nginx吧,就算不是用的Nginx,那也是参照它做的,因为你ELB上配置的东西,其实在Nginx里面都有对应的配置,甚至Nginx功能肯定更多。

我的接口是支持HTTPS的,所以443端口的监听肯定要,虽然HTTP我是不支持的,但是为了了解ELB的配置,我也是配置并调通过。而且最主要的是,这俩的配置方式跟我想象的完全不一样,这也是为什么我自己看文档进行配置不成功的原因。我也不确定是不是我springboot代码写不对。

配置HTTP监听器

点击添加监听器,你会看到如下界面:

我一开始自己配置选择的前端协议为:HTTP – 这难道不是理所当然的事情吗???
但是实际上我配置之后,它是不通的,我不确定是不是我配置有问题,但是最终我按华为云的技术支持说的,配置成TCP是能提供HTTP服务的。
端口选择80,名称随意,一般来说还是开启获取客户端ip,访问控制,一般你对外提供服务的话肯定是允许所有ip了。

下一步,继续配置后端协议和后端服务器组。

这里就会遇到我前面说的共享型的一个坑,就是不能复用后端服务器组。我选择使用已有的时候,里面的下拉菜单,死活就是不显示已有的组。连华为云的技术支持也不知道为什么,他去问了他们的产品才知道共享型的不能复用后端服务器组。所以这里只能选择新建(这就会导致新建很多个服务器组,所以记得把服务器组的命名写规范,不然后面你分不出来的)。
协议选择TCP,也只有TCP可选。分配策略根据需要自行选择,这些策略也很简单。关于会话保持,华为云的说明如下,根据需要自行勾选:

四层协议的会话保持转发支持源IP地址类型,即来自同一IP地址的访问请求转发到同一台后端服务器上。
七层协议的会话保持转发支持负载均衡器cookie和应用程序 cookie类型。用户可根据自身需求选择相应的会话保持方式来分配用户访问流量,提升负载均衡能力。
如果您需要从专线、VPN、云连接访问ELB,请您使用源IP负载均衡算法代替会话保持功能。

下一步,继续配置后端服务器和健康检查。

这里添加后端服务器就是在你刚刚创建的服务器组中,选择哪些ECS可以被分发到请求。这里的重点配置在于业务端口和权重。

如果两台ECS上,你的接口使用的是不同的端口号,这里可以配置成不同的,权重就是每台服务器分发的请求占比了,很简单,不多说。我的端口用的是8888,这里演示随便配置成不同的了。

添加了服务器之后,你要重点关注健康检查。这里的配置不能出错,因为如果出错,健康检查不通过,ELB就不会把请求分发到这台ECS上。甚至如果你的这个服务器组只有一台ECS,那么你的接口就挂了,我记得是报501。
当然,比较骚的路子就是不开健康检查,就一定会分发,但是如果ELB背后的那个ECS挂了,请求也一样会分发到该ECS上,服务就不可用,所以,除非你做测试,一般还是要开健康检查的。

点击健康检查的参数设置,如图配置健康检查。我是选择的使用特定端口,技术支持也是让我这样子配置的,不过我觉得使用 使用后端服务器默认业务端口 应该也可以,当然配置指定端口肯定是不会错的。

之后就是确认配置,进行提交生效。这个时候,你的HTTP请求应该就可以正常分发到对应ECS上了,如果你有多台,可以通过ECS的日志,看看分发到哪一台上面去了,看看权重是否生效。

配置HTTPS监听器

配置HTTPS监听器和配置HTTP监听器的大部分都相同,只是前端协议类型,要选择HTTPS,端口换为443。并且要配置HTTPS证书,这里你可以先去证书管理里面去上传证书,也可以在创建监听器的时候去上传。这个证书一定要和你的域名对上哈。一般选择 单向认证 ,可能也是因为我一直做的各种客户端请求,都没有带在本地配置证书,这个根据具体需求来。

同样的新建服务器组,后端协议选择HTTP,也只有HTTP可以选。同样勾选服务器组中哪些服务器进行分发,健康检查还是要选择TCP协议,端口号我依旧使用指定端口,8888。最后提交生效。

此时,你的接口便可以通过域名进行HTTPS请求了。

配置转发策略


可以看到,我的HTTPS监听器有4条转发策略(默认有一条,不算在内,4条都是我自己配置的,其实一共有五条,见下图),3个服务器组。

转发策略,简单来说就是Nginx中的路径匹配规则。共享型ELB的转发策略,只支持域名和路径两种,但是对于我来说够用(也幸好够用,不然我还得重新买独享型)。

路径匹配又分为:精确匹配、前缀匹配、正则匹配。这三个见名知意,也就不多说了。我这里使用的是正则匹配和精确匹配两种。
在前面的截图中也能看到,我使用精确匹配转发了隐私协议和用户协议两个html的静态文件请求。
使用了正则匹配转发了Django管理后台的接口和js、css等静态文件的请求。

而这里的服务器组和前面针对端口(也就是监听器)配置中的服务器组是不同的。你在这里不能勾选到那些(监听器)服务器组。这里又的重新创建服务器组,并把ECS添加进去。
说明一下,虽然你在后端服务器组一栏中能看到所有的服务器组,但是在监听器和转发策略中,你只能使用各自添加的服务器组。我这里分别称它们为:监听器服务器组和转发策略服务器组。(这也是华为云坑的地方,我困惑了非常久。)

由于我这里需要转发的静态html和Django管理后台的接口和静态文件,都是HTTP的,在添加转发策略服务器组时,后端协议选择HTTP,健康检查静态文件选择HTTP,Django的8000端口选择TCP,健康检查这里需要特别说明一下。

我使用了指定域名和指定端口,因为我的Django配置了只有指定域名可以访问,所以这里必须使用指定域名(健康检查的请求会使用你指定的域名来模拟请求),你如果只是普通接口没有限制,可以不指定域名。至于端口,根据你的提供服务的端口填入即可,比如Django的管理后台接口转发,你可能需要配置成8000。我这里需要提供的html转发,可能是配置成80,都是根据具体情况来的。

另外需要说明的一点,html的静态文件对外提供,你可以通过Nginx配置来代理,也可以通过其他http服务来提供,我图省事,用了1panel的网站配置(静态网站),当然走的是80端口。总之,你得有个静态文件的代理服务程序,不管是宝塔、1panel,Nginx还是httpd等都行。

至此,我的静态html和Django管理后台的接口,包括最重要的支付接口,都已经可以对外提供服务了。

补充

当我配置好html和Django接口转发策略之后,我访问Django的管理后台,发现js、css全都拉取失败,界面样式全丢。而我的静态资源转发也确实配置了的,并且和html的转发服务器组都是一样的。

最后才发现,Django收集好的静态文件,我忘记上传到80端口去了。
最终1panel的网站文件配置如下,记得要套一层admin文件夹!

总结

以上就是我配置华为云ELB的一些过程和遇到的问题,包括其中一些我难以理解但是也只能照做的配置。说实话,我觉得造成我配置ELB这么麻烦的原因,也是因为我对网络协议,包括分层的理解不够深,都是半罐子的水平。而且由于时间原因,也没有认真去读完华为云的ELB文档导致的。所以,这篇博客,是记录过程,也是给自己做个备忘录,方便后续再配置。不过抽时间多看看文档,才是正道。希望我还能想起看文档这个事儿吧,哈哈哈哈哈。