HAProxy代理微服务和GaussDB请求验证任务心得

举报
zhangwei123 发表于 2024/12/09 21:24:32 2024/12/09
【摘要】 HAProxy是一个高可靠、高性能的反向代理。和他类似功能的软件还有LVS,Nginx,他们的功能各有侧重,网上有大量介绍对比资料。本次收到的任务,主要目的是验证HAProxy在鲲鹏环境下的部署,并通过HAProxy实现微服务网关和GaussDB的负载均衡。

背景介绍

HAProxy是一个高可靠、高性能的反向代理。和他类似功能的软件还有LVSNginx,他们的功能各有侧重,网上有大量介绍对比资料。本次收到的任务,主要目的是验证HAProxy在鲲鹏环境下的部署,并通过HAProxy实现微服务网关和GaussDB的负载均衡。

收到任务先看任务书,任务书要求在开源演示项目Demo的基础上,引入Haproxy实现两个反向代理。一是代理微服务网关的web访问,二是代理GuassDB的数据库访问。

磨刀不误砍柴工,上网搜下Haproxy了解下负载均衡和HAProxy的基本信息。熟悉这块的小伙伴就可以跳过了。

什么是负载均衡

负载均衡,英文名称为Load Balance简写LB是指建立在现有网络结构之上,并提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。其原理就是数据流量分摊到多个服务器上执行,减轻每台服务器的压力,多台服务器共同完成工作任务,从而提高了数据的吞吐量。

常见的负载均衡功能实现有软件方案和硬件方案。软件通常使用开源的LVSHaproxyNginx,硬件一般使用较多的有F5Array等设备。

HAProxy主要功能

负载均衡:可以根据多种算法(如轮询、最少连接数、源 IP 哈希等)将客户端请求分配到不同的后端服务器,均衡负载以提高整体性能。

高可用性:能够监控后端服务器的健康状态,并在检测到某台服务器故障时,自动将流量转移到健康的服务器上,确保服务的连续性。

反向代理:作为反向代理,将客户端的请求转发到后端服务器,同时隐藏后端服务器的实际 IP 地址。

访问控制和安全性:通过 ACL(访问控制列表),可以对请求进行精细的控制,如基于源 IPHTTP 头信息、URL 路径等进行过滤或重定向。

性能优化:软件非常轻量级,能够处理数十万甚至上百万的并发连接,且对系统资源的消耗非常低。

日志记录和监控:提供详细的日志记录功能,能够记录请求的详细信息,并通过集成监控工具来实时查看服务器的健康状态和流量情况。


部署Demo项目

基于任务书,了解开源演示项目Demo。这是一个体验项目,基于Apache ServiceComb Fence  , 并针对For Huawei场景进行了少量优化。它可以帮助开发者快速构建包含微服务后端、微服务前端和基础原子服务的项目工程。项目有详细的介绍和部署指导,这里就不赘述了。其部署示意图如下:

fork这个Demo项目的工程 ,在自己的gitcode账号下复制了这个项目的代码。华为云给开发者提供了整套的开发指导,其中就包括这个Demo项目的支撑文档,里面详细介绍了项目情况,还有具体部署的过程指导。

按项目指导,在华为云购买CodeArts(软件开发生产线)服务,创建开发项目,引入gitcodefork的工程,创建编译构建任务,编译出edge-serviceadmin-serviceadmin-websiteauthentication-serviceresource-service 5个程序,并直接打包成容器镜像,推送到SWR容器镜像仓库中。

在华为云购买CCE集群,将上面打包的5个镜像都作为无状态负载,部署到集群中。并为edge-service增加负载均衡服务,确保其可以通过ELB被公网访问。同时部署zookeeperGuassDB,支撑整个服务的运行。

部署后整体架构如下:

用户直接访问应用网关上绑定的ELB公网地址124.243.151.208,在浏览器中输入http: //124.243.151.208:9090/ui/admin/ 就可以进入到demo的显示页面。至此,Demo部署就完成了。

通过Haproxy代理微服务网关

部署完成,我们可以考虑这场景,如系统性能不足,需要扩容再增加一套集群或者系统需要为多租户服务,每个租户要用不同集群;又或者想要更高的可靠性,在不同region部署多个集群。这时多个集群就有多个入口IP,这就给用户访问带来不便此时,就需要引入我们这个任务的主角HAProxy作为web反向代理,给用户提供统一入口,并通过配置各种负载均衡策略,将用户流量引入到正确的集群中处理。这就是本次验证的第一个任务,用HAProxy代理微服务网关的web访问。我设想的架构就变成下面这个样子

通过在ECS中安装HAProxy,作为两个CCE集群的反向web代理,绑定公网EIP124.243.172.157,用户访问此IP后,HAProxy按照配置的负载均衡策略,将流量分到对应的CCE集群中。

正式操作开始。先购买ECS,规格选择鲲鹏服务器,部署华为Euler操作系统。然后登陆ECS安装HAProxy

安装HAProxy依赖包

yum  install -y gcc openssl-devel pcre-devel systemd-devel

源码安装Haproxy,直接到官网下载最新3.0.6版本。

cd /opt
wget https//www.haproxy.org/download/3.0/src/haproxy-3.0.6.tar.gz
tar zxf haproxy-3.0.6.tar.gz
cd /opt/haproxy-3.0.6

进行编译构建。

make clean
make -j 4 TARGET=linux-glibc USE_THREAD=1  USE_LIBCRYPT=1  USE_PCRE2=1 USE_PCRE2_JIT=1 
make install PREFIX=/usr/local/haproxy

将编译好的程序拷贝到运行目录中

cp /usr/local/haproxy/sbin/haproxy /usr/sbin

编辑Haproxy启动脚本

cp /opt/haproxy-3.0.6/examples/haproxy.init /etc/init.d/haproxy
chmod 755 /etc/init.d/haproxy

针对配置文件的路径创建以下用户和文件目录

useradd -r haproxy
mkdir /etc/haproxy
mkdir /var/lib/haproxy
mkdir /var/run/haproxy

编辑haproxy配置文件

vim /etc/haproxy/haproxy.cfg

配置文件内容如下::

global
    log 127.0.0.1 local3 info
    chroot /var/lib/haproxy
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode http
    option dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000

frontend haproxy_for_deom
    option httplog
    mode http
    bind *:80
    stats uri /haproxy?stats
    default_backend opensourcedemo

backend opensourcedemo
    option httpchk GET /ui/admin/ HTTP/1.1
    http-check send hdr Host 1.2.3.4
    balance roundrobin
    server demo1 192.168.0.11:9090 check inter 2000 rise 3 fall 3 weight 5
    server demo2 192.168.0.187:9090 check inter 2000 rise 3 fall 3 weight 5

启动HAProxy

/etc/init.d/haproxy start

访问haproxy的统计信息页面,说明HAProxy已经正确运行

直接访问haproxy的地址,haproxy会将流量分担到不同的集群中。配置中将Demo的首页访问地址作为检测集群是否可用的接口,并采用轮选的负荷均衡策略,实际项目中,会规划不同集群的访问路径,Haproxy根据访问的URL地址进行合理的流量分发。Haproxy丰富强大的7层负载均衡配置策略,可以支撑多种多样的业务诉求。

至此,第一阶段的验证就结束了。

通过Haproxy代理GuassDB

现在考虑第二个场景,如果业务压力过大,会导致数据库性能跟不上,这时,除了提升数据库本身能力(换更高配置规格,分布式数据库加更多节点等)之外,还可以通过增加多个数据库的方式来扩充数据库的性能。微服务访问数据库的流量如何被正确分配到多个数据库中,此时就需要HAProxy登场,做数据库的反向代理。这就是本次验证的第二个任务,通过Haproxy代理GuassDB目前业务通过TCP连接GuassDB数据库,HAProxy通过TCP代理来实现在多个数据之间的负载均衡。

设想的部署架构改造是下图这样:

为实现如上效果,需要修改HAProxy的配置文件。

vim /etc/haproxy/haproxy.cfg

在文件中增加如下配置:

listen sebfortcp
    option tcplog
    bind *:8000
    mode tcp
    balance roundrobin
    server guassdb 192.168.0.63:8000 check inter 2000 rise 3 fall 3 weight 5
    server guassdb 192.168.0.149:8000 check inter 2000 rise 3 fall 3 weight 5

完成配置后重启HAProxy服务。

/etc/init.d/haproxy restart

还需要修改演示项目中访问的数据库地址,将数据库的ip地址修改为Haproxy的地址。

访问业务网址,显示正常。关闭一个数据库后,仍能正常访问。至此,验证任务的第二个结束。

当然,上面的验证只解决了微服务访问数据库的路径问题,实际项目中还需要考虑数据库读写分离,数据库之间的数据同步等问题

本验证中,通过TCP联通检测来检查数据库是否可用,当GuassDB采用集中式部署时存在主备节点,默认配置下主备都有IP地址,并且都可以建立TCP连接,备节点可支持读操作,但进行写操作会失败。如果数据库作为读库,只需要把主备节点IP都配置到Haproxy上进行负荷分担即可。如果数据库是写库,这样配置会导致分流到备节点的写操作执行失败,而如果Haproxy上只配置主节点IP,当数据库主备切换时主IP地址发生变化,会导致Haproxy的检测出现问题,此时比较简单的策略就是设置数据库使用浮动IP,这样数据库在主备切换时IP地址不会发生变化。GuassDB的浮动IP的配置需要在购买数据库时,选择“单浮动IP策略”,注意这个选项只有创建数据库时才可以设置。如果GuassDB采用分布式部署,就只要把每个节点都配置到Haproxy上进行负荷均衡即可。

如果认为数据库的TCP连通性检测不能代表数据库是否正常运行,此时可以通过在Haproxy上增加external-check选项,直接调用脚本连接数据库,检查数据库的可用性,具体实现要根据实际项目需求来确定,这里不再赘述。


Haproxy的高可用部署

系统部署好后,从部署架构上可以明显看出承载HAProxyECS存在单点故障的风险,达不到高可用的要求。此时就需要考虑HAProxy进行集群部署。最常见的方案,可以采用购买ELB服务实现,设想方案如下:

从图中可以看出,由HaproxyECS集群组成的负载均衡设备,前面又加了一层负载均衡设备,感觉很搞笑,但实际项目中,这种使用情况还是比较普遍的。一般功能分层上会让第一层做L4负载均衡(简单转发,支持海量并发访问),第二层HaproxyL7负载均衡(实现丰富的负载均衡功能,通过多实例支持海量并发)虽然目前华为云的ELB负载均衡服务能力涵盖了L4L7层能力,但客户可能会在L7负载均衡上有特殊要求,要通过定制Haproxy来实现,或者客户上云前就已经有了Haproxy的负载均衡,搬到云上不愿改动。

实际华为云ELB的配置如下:


对于代理GuassDBHaproxy的高可用,虽然可以采用类似上面的方案,但此时两者都是L4负载均衡,放置两套负载均衡就完全没必要的。要么购买华为云的内网ELB服务,要么为Haproxy增加高可用。前一个方案和Haproxy无关,只关注后一个方案怎么实现。目前比较常见的实现方式,就是通过haproxy+keepalived实现高可用集群。

Keepalived软件可以通过vrrp协议,将两台机器组成主备模式,并对外呈现一个浮动ip供外部访问。主设备绑定浮动IP主设备故障,备设备自动升主,绑定浮动IP,开始处理业务

设想的架构如下:

Keepalived的配置过程可参考网上案例。这在本验证中不是重点,不再描述。

如果觉得备ECS不干活浪费资源,可以创建两个虚拟路由,同时存在两个浮动IP让两台ECS设备互为主备。并且基于这种扩展方式,还可以创建更多台ECS来分担流量,只要多配置浮动IP即可。当然有了多个浮动IP之后,又会遇到如何在多个浮动IP之前加负载均衡的问题,这就要根据具体情况分析了。很多时候,当用开源软件设计的方案覆盖很多可能场景后,会发现已经和公有云已有的负载均衡服务类似了,所以根据业务诉求找到性能、成本、可靠性等都适合的技术方案,才是做技术研究的乐趣所在吧。

总结

最后,整个演示项目是部署在一个VPC内部的,虽然演示起来方便,但实际项目中为了安全,不同安全层级的网络实体应该通过VPC隔离开,VPC之间通过对等连接或云连接互通,并通过配置ACL等手段只放通需要连接的IP,安全要求更高的项目还会在网络分区间放置防火墙安全设备整个项目设想的整体方案图如下:


整个验证项目下来花了一周期间不仅感觉到华为云上各种服务丰富功能,也体会到鲲鹏服务器,华为欧拉操作系统,以及GuassDB的使用便捷性,和以前用过的同类软件差不多,学习成本不高,喜欢技术研究的小伙伴都可以来试试。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。