嘉宾 | 戚俊 整理 | 吴林锋
出品 | CSDN云原生
2022年6月21日,在CSDN云原生系列在线峰会第10期“华为云HCDE专场暨分布式技术峰会”上,南京路特软件CTO戚俊针对云原生如何帮助SaaS类业务租户高效隔离进行了分享。
不论是SaaS类或是PaaS、IaaS类的厂商,租户隔离都是一个恒久的命题。从早期机房IDC时代到云计算时代、云原生时代,租户隔离一直扮演着商业模式命题人的角色。不同的隔离方式、隔离层次都会使商业模式发生改变。
IaaS层是最早的云厂商的初始阶段,它主要隔离所有用户的存储、算力、带宽、流量等,中后期的PaaS层隔离专用的服务池、服务的数量等。如今的SaaS层隔离的则是对展现量、数据量、用户量等进行隔离。我们会发现,从下向上距离数据越来越远,距用户越来越近。
为什么要做租户隔离呢?
在数据智能化改造的过程中,如果业务太过离散,公司的运营成本难以降低。当客户的服务成本变高后,公司也不能保证长期地为客户生产价值。所以在这样的背景下,服务厂商想尽一切办法节约成本、压缩预算,同时又要保证给客户带来更好的服务、更优秀的技术以及更好的用户体验。所以业务的集中化和规模化就显得尤为必要,与之而来就产生了租户隔离的需求。
我们因为“业务集中化和规模化”而产生租户隔离的需求,那么“业务集中化和规模化”会带来哪些优势呢?主要有以下四点。
降低运维成本。所有的业务在同一个系统环境下、网络环境下,从而降低了业务部署和运维的复杂程度、运维人员数量和成本。
加强数据汇聚能力。集中化天然带来数据的强汇聚属性,可以直接在业务层完成数据的汇入,也可以在底层进行统一收集,更好的建设自己的数据仓库。
强化敏捷开发效能。因为不存在环境差异性,所以在开发过程中没有历史包袱,能够更好地规划迭代和提高开发效率。
削峰填谷减低业务成本。通过集中资源配置,形成具有一定规模的资源池。单个业务很难触摸到资源/性能天花板,从而可以用更少的成本支撑更多的业务。
通过租户隔离改变原本的商业模式,也带来以下三个收益点。
收费分级。租户隔离后进行精准计费,从而实现相同业务、不同体量的租户支付不同的费用。
服务分级。针对不同体量的租户开通不同的功能清单、服务清单,实现相同业务、不同租户所用功能的差异化。
个性化增值。围绕不同租户的留存数据进行个性化的增值服务,比如:个性化分析、智能推荐、 BI服务等。
难点1:业务波动难以控制
在构建租户隔离模式时,最常见的一个问题是业务波动难以控制。举个例子:我们将客户的业务部署上云,使用同一套服务器集群部署。由于每个用户业务的用量都较为均匀、容易估算,所以其平时用量和持续用量均具有记录的临界点。
一旦遇到突然的实时热点爆发,内容生产及传播操作会变多。这种情况会使业务用量的峰值瞬间提升,产生业务波动,并且无法提前预测。
针对此种情况,我们提炼了一个公式:每个租户(P)的基准用量(A)为1,资源(R)提供量为10,支持10个租户的业务。
R = A * P
但“按比例超售(U≤1)”是几乎所有平台厂商的利润来源之一,所以我们实际支撑了15家客户,因为不可能所有用户的用量同时“打满”,从而产生了差价,也就是利润。
R = A * P * U
在这个模式下,最显著的问题是:当U的值越接近A,风险越小,当U的值负偏离A越多,风险越大。所以如何评估U的值,是平衡风险与收益的要点,也是我们在构建租户隔离模式上遇到的第一个难点。
难点2:无法实现精准计费
在构建租户隔离模式上,我们碰到的第二个难点是无法实现精准计费。
举个例子:假设我们的系统是一个SaaS化的电商平台,承载了成千上万家店铺,每家店铺都会在平台上存图片、视频、商品信息,产生数据存储的同时也会因为用户来访问而产生带宽跟流量成本。同时,每一家店铺每天会产生不同的用户访问量、不同的业务压力。
那么在这种情况下,我们应该如何获取每一家店铺的数据存储成本?业务压力成本?每天、每月、每年的流量带宽成本呢?
若能精确获取以上数据,不但可以帮助我们分析用户在店铺中是否做了正向产出,还可以分析每一家店铺所消耗的公司的成本,以此帮助公司完成更详尽的商业决策,这是我们遇到的第二个难点。
云原生时代,我们通过容器技术来改造业务。因为容器技术的广泛运用,我们拥有了:
更细的资源颗粒——可以在原本的VM级之下再细分一层资源;
更标准的交付产物——容器镜像的出现,树立了新的交付标准;
更简单的部署模式——容器部署脱离了环境制约,简化了部署流程。
随着容器编排及管理技术的提升,我们拥有了:
分布式业务架构——通过容器集群模式实现业务分布于多机,真正做到业务的均匀;
弹性缩扩容策略——无状态的业务可以动态响应缩扩容策略,快速适应业务节奏;
业务模板式创建——通过容器编排模板,可以快速部署一整套业务。
业务承载方面:从单一业务系统承载改造为按租户区分,部署不同的无状态容器服务组。
数据层面:从单一对象存储存放改造成按租户去区分,不同的Bucket或在Bucket中开辟不同租户的前缀去进行存储。
流量分析方面:原本是集中入口,无论是单机部署还是多机部署,其流量入口都是统一的,集中入口没有办法分析不同租户的流量情况。通过K8s集群负载区分不同的域名来路,并汇聚访问日志到大数据平台进行分析。
之前的难点中,我们分析了大多数SaaS业务出现业务波动的原因在于“超售”导致的资源无法及时响应的问题,并得到以下公式:
R = A * P * U
上面公式中的“P(租户数量)”、“ U(超售比例)”是无法改变的。那么我们的思路就是:
使用容器集群承载我们的业务,比如使用华为云的CCE服务构建或管理Kubernetes(K8s)集群;
通过部署容器监控服务,监控“A(租户基 准用量)” ;
当一定比例的租户用量大于阈值时,触发容器集群扩容;
通过容器调度策略,自动均匀排布容器到各节点,实现波动平抑。
有两种方式在华为云上进行业务资源弹性缩扩容,实现平抑业务波动。
第一种是使用华为云CCE自带的“节点弹性缩扩容”功能,第二种是结合华为云的AOM+AOS服务,实现对自建K8s集群进行缩扩容。
方式一: 针对华为云上的CCE容器集群,可以直接使用CCE自带的“节点弹性缩扩容”功能进行CPU及内存分配量指标监控进行节点缩扩容。
缺点:只能按CPU/内存的分配量进行缩扩容,不对业务实时资源消耗进行缩扩容,应变能力差。
方式二:针对业务过程中的突发性能问题导致的扩容,需要使用华为云AOM服务实时监控集群资源的占用情况,在到达阈值后触发AOS服务进行集群节点按模板扩容。
缺点:需要自己编写AOM+AOS+CCE弹性脚本。
在之前的难点中,我们想要清楚地知道每一家店铺的数据存储成本,业务压力成本,每天、每月、每年的流量带宽成本,从而帮助公司去实现商业决策,具体的操作思路如下。
使用容器集群承载我们的业务,比如Kubernetes(K8s)。
按租户区分,部署不同的无状态容器服务组,不同的租户级使用不同的资源量级。容器架构可以很好地进行限制。
按租户区分,不同的Bucket或在Bucket中开辟不同租户的前缀进行存储,收集对象存储的用量日志到大数据平台。
在K8s的Ingress层开启全量日志,区分不同的域名来路并汇聚访问日志到大数据平台。
最终在大数据平台进行离线分析,实现T+1级别的用量统计。
根据上述思路,我们使用华为云相关服务构建我们的精准计费能力,主要涉及到的服务有:OBS、ELB、LTS、DGC这4个服务,需要通过流程将这几个服务的数据串联起来,并进行计算。