新东方的负载均衡架构探索和实践

本文由4月12日晚姜江,新东方运维工程师所作的技术分享整理而成。html

姜江,一名伪SRE。十余年IT运维从业经历,早年在金融行业从事linux,AIX,Oracle的运维支持,如今专一于运维自动化、容器和cloud native相关技术的研究和落地。目前就任于新东方,负责新东方容器云平台的探索和实践。mysql

搜索微信号RancherLabsChina,添加Rancher小助手为好友,可加入官方技术交流群,实时参加下一次分享~linux

你们好!话说加入Rancher官方微信群也有三年多了,天天在群里看着你们讨论技术问题给我不少启发 。 我今天也来和你们分享一下我在rancher上的一些实践,但愿能为各位的实践提供一些参考。nginx

为了不你们歧义,下面说的Rancher指的Rancher 1.6 上的cattle引擎sql

摘要

Rancher是一个对用户很友好的产品,吸引了大批的用户和粉丝。在实际落地过程当中,你们可能已经注意到Rancher组件之间的耦合存在单点。那么如何部署才能提升Rancher的可用性和可扩展性呢?Rancher在官方文档中给出了一些指导方案,用户能够根据本身的须要选择合适的方案落地。我今天和你们分享的是新东方在Rancher全组件负载均衡架构的实践,供你们在探索本身的高可用方案时作个参考。docker

输入图片说明

1. Rancher的部署架构演变

Rancher 1.6是一套小巧而实用的容器管理平台,我我的认为Rancher的定位应该是容器编排引擎的后台支撑系统, 或者说是编排引擎的系统,所以Rancher1.6的架构并非分布式架构,而是传统的C/S架构。 无数的client(agent)链接到一个中心的Server ,中心的Server链接一个数据库作持久化。这种架构就必然会涉及一个老话题,如何加强C/S之间的高可用性、可扩展性和解耦问题。我今天和你们聊内容是:Rancher 1.6 全组件负载均衡设计。数据库

通常Rancher的简单部署方案是这样的: 输入图片说明 一个server,一些节点 ,一个mysql数据库。从这张图上就能够发现Rancher在部署上的一些问题:centos

  1. SPOF问题,Server的单点,数据库的单点等。浏览器

  2. 扩展性问题,单server能带动的client数量有限。tomcat

  3. 强耦合问题,server 写死数据库地址,client写死server地址等等。

总结下来就是下面这个图: 输入图片说明

下面就对这个架构进行优化,咱们的目标是达到Server/Client 和数据库三个组件的自由扩展,如何作到呢? Rancher官方文档中已经给了答案,只须要在C/S 中间增长一层负载均衡方案,在数据库一侧增长高可用方案便可。

整体架构就演变为这样:

输入图片说明

咱们看到,Server一侧使用Rancher Server HA方案,将server扩展为多个。

中间增长一层负载均衡,这个负载均衡常见的私有云方案有LVS+Nginx或者F5, 在公有云中可使用阿里云的SLB或者AWSELB等等。Rancher的数据量并不算太大,能够简单的使用Mysql的主从方案。

优化到这步已经能够知足平常工做须要了,这里你们会注意到mysql主从仍是会影响server的可靠性。 一旦出现主库问题,Mysql切换的时候server确定就down了, 切换也须要必定的时间,启动后还须要重启server等等。若是但愿更进一步提升server的可靠性,或者但愿数据库切换对Rancher Server透明,那就须要使用更高级的数据库高可用方案。

咱们的DBA推荐使用Maxscale中间件+Galera 集群的方案, Galera为多主库的分布式数据方案,发生写入操做后Galera会同步数据到其余数据库中,直到同步都完成后返回完成写入操做。MaxScale是数据库中间件,它经过解析mysql协议判断读写操做,能够将读写操做分离。一旦数据库发生故障整个数据库集群的切换对外界是无感知的。

这个方案的部署图是这样的: 输入图片说明

每一个组件都介绍一下, 负载均衡采用互联网最经常使用的LVS-DR+Nginx方案。数据库采用Galera集群作多主库的数据库复制,经过Maxscale中间件来作高可用和读写分离。

这就是咱们如今最终的架构, 这个架构的好处有几点:

  1. 可靠性大大增长, 全部组件均可以扩展,server, client,数据库和负载均衡自己。

  2. 每一个组件的扩展并不影响其余组件,全部组件的扩展均可以在线进行。

  3. 配置解耦,经过域名映射的方式,server链接数据库的域名映射为maxsacle中间件的ip, client链接server的域名映射为负载均衡的Vip。

  4. 故障切换透明,对其余组件无感知。数据库故障,server故障均可以在线解决,解决后从新加入集群。

顺便提一下,这个架构中的数据库部分还能够进一步优化为: 输入图片说明

MaxScale前增长一层LVS四层负载均衡(设备可复用c/s之间的负载均衡),那么这个方案就能够说是全模块无死角的负载均衡架构了。 可是咱们实际实施的时候并无采用这样的方案,考虑到 Rancher Server 和 Client断开一段时间后并不会影响主机上的容器运行。

这段时间彻底能够作一些维护, 采用 Galera和Maxscale后已经大大的减小了数据库切换时间,而且实测MaxScale的稳定性很好,感受没有必要再投入更多资源在MaxScale上。更况且加入更多的组件会使得整个系统的复杂度上升,这实际上增长了维护成本而且扩展了故障域,可靠性有可能不升反降。所以这个方案也只是停留在纸面上了。

那么说到这里你们对总体架构就有了初步认识,下面说说实现。

篇幅和时间缘由,我这里只是点一下配置的要点,具体的实践过程能够关注个人工做笔记 http://jiangjiang.space

2. Rancher各个组件负载均衡的配置

2.1 LVS-DR + Nginx

LVS-DR设置:

LVS1 : 配置keepalived,配置虚拟ip,配置到Nginx1和Nginx2的四层转发

LVS2 : 配置keepalived,配置虚拟ip,配置到Nginx1和Nginx2的四层转发

Nginx1 :配置nginx 到 rancher server 8080 上的七层转发

Nginx2 :配置nginx 到 rancher server 8080 上的七层转发

**A. 安装keepalived 和 ipvsadmin **

LVS从2.6内核开始就已是内核的一部分了,所以只须要安装ipvsadmin和keepalived,经过yum安装或者源码安装均可以,步骤略过。

B. 配置keepalived.conf

vi /etc/keepalived/conf/rancher.conf

输入图片说明 输入图片说明 输入图片说明

**C. Nginx节点配置 **

Nginx节点配置分为两部分:

1.虚拟IP(VIP)设置到回环设备上(lo),当接收到lvs发来的包后本机网卡才会处理这些包。

2.设置Nginx的Websocket转发到rancher server的8080端口上。

VIP配置在lo上的配置: 输入图片说明 输入图片说明 输入图片说明

下面设置Nginx的Websocket转发到Rancher server的8080端口上。 安装nginx过程略过,在conf.d中增长虚拟主机配置。 vi /usr/local/nginx/conf/conf.d/rancher.conf

输入图片说明

配置好后,直接访问 http://VIP:80 应该就能够看到Rancher控制台界面了。若是没有则是配置错误,继续调整。

参考文档:

http://www.javashuo.com/article/p-owhdiesx-bh.html

https://rancher.com/docs/rancher/v1.6/en/installing-rancher/installing-server/basic-ssl-config/#example-nginx￾configuration

2.2 galera 和 Maxscale

如下步骤摘自新东方资深DBA傅少峰的文档。

https://mariadb.com/downloads 下载并安装mariadb 10.2

安装以下rpm包

MariaDB-client-10.2.11-1.el7.centos.x86_64

MariaDB-devel-10.2.11-1.el7.centos.x86_64

MariaDB-server-10.2.11-1.el7.centos.x86_64

MariaDB-common-10.2.11-1.el7.centos.x86_64

MariaDB-compat-10.2.11-1.el7.centos.x86_64

galera-25.3.22-1.rhel7.el7.centos.x86_64.rpm

jemalloc-3.6.0-1.el7.x86_64.rpm

jemalloc-devel-3.6.0-1.el7.x86_64.rpm

maxscale-2.1.16-1.centos.7.x86_64.rpm

maxscale-devel-2.1.16-1.centos.7.x86_64.rpm

maxscale能够复用其中一个数据库节点或者单独部署到一个机器。

mysql配置注意的地方,其余参数省略。 输入图片说明

galera配置 输入图片说明

执行: 输入图片说明

创建cattle数据库和用户(链接任何一个galera实例执行): 输入图片说明

建立maxscale监控用户(链接任何一个galera实例执行): 输入图片说明

数据库准备完毕,下面是配置MaxScale。

MaxScale配置

配置文件: /etc/maxscale.cnf

输入图片说明 输入图片说明

启动 maxscale

输入图片说明

参考资料:

https://www.jianshu.com/p/772e17c10e08

https://rancher.com/docs/rancher/v1.6/en/installing-rancher/installing-server/#single-container-external-database

https://linux.cn/article-5767-1.html#3_2234

2.3 server 、client 和 数据库的链接和设置

数据库准备好了,下面就能够启动server了。启动过程很是简单,只须要修改rancher server的启动参数以下: 输入图片说明

逐条解释一下: 输入图片说明 输入图片说明

Server启动后就能够增长client了,登录Rancher管理控制台,选择infrastructure->Hosts->Add Host 输入图片说明

这样一个完整的负载均衡的Rancher就搭建完成了。

3 应用交付和负载均衡

如今说最后一个话题,应用交付和负载均衡。 所谓应用交付说的是如何将Rancher上的一个应用公布到公网上给用户使用。为了能在前方接住大量的用户请求,通常都会统一搭建站点级别的入口负载均衡。示意图以下: 输入图片说明

如图所示,用户请求从公网进来后,经过各路ISP接入设备到达站点边缘,链接经过各类防护设备到达入口负载均衡(LVS+Keepalived+Nginx),再由入口负载均衡统一代理到内部源站点上,这就是常见的应用交付过程。

在Rancher上的应用对接入口负载均衡通常采用Traefik, Traefik是一个容器化7层代理软件,性能接近Nginx。 以前群里也有多位大拿分享过Traefik的应用, 我这里就不重复介绍了,你们能够参考爱医康架构师张新峰的分享:《关于高可用负载均衡的探索》

我下面要讲的是 traefik与 LVS+Nginx负载均衡的对接和我对traefik的一些实践。

利用traefik交付应用的整个过程我总结为下图: 输入图片说明

  1. 用户在浏览器中输入www.myxdf.com,经过DNS查询到这个域名对应的公网ip地址。

  2. 这个公网ip地址指向咱们站点的入口负载均衡(LVS+Nginx),入口负载均衡收到请求后根据域名的设置,将请求转发给Rancher 上的Traefik节点,我称这些节点为Ranhcer edge。

  3. traefik收到请求后,根据traefik.frontend.rule将请求转给打了标记的容器(或者rancher lb)

根据这个流程咱们须要作如下几个配置。

3.1 定义边界(rancher edge host)

什么是边界? 边界就是Rancher cluster中对外转发的中转站,边界是特殊的一个Rancher host,边界上只跑treafik,其余什么容器都不跑,边界最好也不要接入任何存储(好比Rancher nfs),边界须要作严格的安全加固。 固然也能够不将边界放在专门的host上,能够将边界混合到整个Rancher 集群中,这样的好处是节省计算资源,两种模式均可以。

下面介绍如何将host定义为专门的边界节点:在Ranhcer 控制台上, 打开 infrastructure ,点击Hosts中。找到做为边界的host点击Edit: 输入图片说明

在Labels中增长label,增长这个label后traefik就会自动运行在这台host上。 输入图片说明

在 Required Container Label 中随便增长一个lable不用给值, 我这里写的cn.xdf.edge 输入图片说明

这个lable加入后,这个节点上就不会被调度任何其余容器了。这样一个边界节点就制做好了。

3.2 启动traefik 到 边界节点

在社区商店中找到这个可爱的小交警,启动traefik。 输入图片说明

配置说明以下: 输入图片说明

好了启动traefik后,容器已经在edge Host 上启动了! 输入图片说明

登录管理界面看看: 输入图片说明

3.3 在traefik上发布应用服务

假设如今要把mydockerapp04.myxdf.com这个域名的应用发布出去。 首先将mydockerapp04.myxdf.com这个域名匹配到对应的Rancher stack上面去。

输入图片说明

这个就是咱们的mydockerapp04应用, 它是一些tomcat容器和一个内部lb组成的。

输入图片说明

按照traefik的文档,只须要将label打到容器上便可,这里个人作法是增长了一个内部的lb,直接将label打在lb上。这里必须的label是:

输入图片说明

label加入后应用就发布到traefik中了。

3.4 从站点入口负载均衡转发到Traefik

在站点入口负载均衡上作转发配置,转发到treafik边界节点。 负载均衡上全部源站都是经过80端口转发,经过设置不通的server_name来区分转发目的地。将server_name设置为*.myxdf.com 。意思是全部 myxdf.com的二级域名所有转发给traefik,这样作是为了跳过在入口负载均衡上配置明细转发规则(好比mydockerapp01转发到哪里这样的一条一条的规则),全部明细的转发规则所有交给traefik来管理。

这样作有很大的优点,咱们以前也看到了traefik设置转发规则很是简单,只须要在容器或者ranhcer lb上打label便可。若是须要修改或者删除规则,也只须要修改或删除对应的label便可,管理灵活又免去了每次都要手动到入口负载均衡上刷新配置的麻烦。

Nginx配置以下: 输入图片说明 输入图片说明

3.5 在DNS上设置域名指向站点入口负载均衡

在DNS上添加域名指向, 这里就没有办法偷懒了,须要把全部明细域名都写上。 输入图片说明

若是你不是公网应用,也可使用dnsmasq或者bind 甚至 AD域的DNS 等在内网创建DNS指向,DNS指向的IP为内网LVS的vip。

Rancher里面也有修改DNS的APP,好比aliyun DNS、Gandi.net 等等。这些APP有的是自动添加DNS记录的,有的是根据label添加,你们有兴趣能够继续研究下。

至此, 整个转发过程就完成了。 用户已经能够经过外网访问这个应用了。

经过浏览器:打开 mydockerapp04.myxdf.com

输入图片说明

固然这个域名其实并不存在,是我瞎掰的,只为了方便你们理解这个过程。那么今天的分享也就结束了。

相关文章
相关标签/搜索