无论是在云计算、大数据处理、人工智能还是物联网领域,分布式系统都扮演着不可或缺的角色,它为我们提供了卓越的灵活性、可靠性和可扩展性。然而,随着规模和复杂性的不断增加,我们也面临着前所未有的挑战,如系统性能优化、资源管理、数据一致性以及通信效率等方面的问题。在 7 月 21 日,ArchSummit全球架构师峰会(深圳站)上,我们策划了《分布式系统的优化与效率》主题闭门会,以下内容为交流分享摘要。
在过去的一些年里,随着业务的不断调整和员工分类的变化,我们的系统接入设计有一些门槛问题。其中,员工有正式员工、外聘员工和外包员工合作伙伴,他们的权限等级不同,这影响了系统接入的设计。另外,集团类员工和非集团员工也需要接入我们的内部系统,例如腾讯音乐、微宝、微众等子公司,以及紧密合作的公司等。这些变化,引发了我们对架构的调整。
在接入网关方面,我们有一个内部称为智能网关的系统,它涉及不同角色使用不同的通道、泳道或片段的建设。另外,我们还在美国、西雅图、新加坡和欧洲法兰克福建立了接入点,将数据接入到广州和深圳的主要数据中心。在这个过程中,我主要负责监控告警、数据可视化和自动修复的工作。不过,随着系统拆分越来越分布式,涉及跨地域、跨集群、跨网站部署服务,我们也面临了一些挑战。特别是网络接入延时和跨云部署问题,这些都是令人烦恼的事情。
特别是在办公接入中可能会遇到较长的延时,尤其是与美国和欧洲的会议时。美国用户反馈说,他们在美国接入网关时,可能需要跳转到深圳进行鉴权,而鉴权服务涉及到另一个团队的员工身份验证系统,这会导致延时。虽然我们在这方面进行了优化,但仍然存在一些不可控的行为,特别是员工的多样化行为对应着多个系统,这也是我们在处理中的一个挑战。
之前使用类似 VPN 的方式建立点对点的连接,但现在我们转向了零信任模型。在这个模型下,每个请求都会被注入一个标记,员工和黑客都可以进入系统,但需要通过我们的客户端进行内网接入。这个客户端充当全流量代理,为用户提供了信任的身份认证,确保系统的安全性。简言之,我们通过零信任模型打破了过去黑名单和白名单的限制,实现更高级别的安全保障。
我们的问题是,在原始系统中,数据需要经过 A、B、C 三个节点才能达到目标。然而,实际上,数据可以直接与 C 节点进行交互,可以节省时间和资源。这里的解决方案是创建一个客户端,该客户端将预先获取一些类似注册用户的信息,然后在本地解析,最后直接与 C 节点进行交互。
原系统的调用过程是通过不同节点间的梯队,通过一个中间总线架,再录入到其他服务上面。这种调用方式让内部调用变成网络调研线,需要三跳,且需要 TOS 加密。
之前我们做了一次网络优化,在三台服务器的情况下,理论上有 30% 的流量是在本地节点就可以完成的,无需跳转到其他节点。但是为了实现无感知部署,我们在总线和客户端做了一些改动,优先考虑本地跳转,并使用本地的 UDS 连接来代替 TCP 连接。近两年,我们又面临同样的问题,而且比以前更复杂。我们正在考虑在分布式系统中,对传输层进行更多的优化。
虽然 HTTP/3 在全球范围内,如谷歌、Facebook、YouTube 等已在大量的使用,然而,这并不能代表 HTTP/3 在各种业务线或产品上都有大规模应用。
目前国内在流量大的业务(例如小视频、流媒体等)中,HTTP/3 的使用率相对较高,但在其他业务,如即时通信、游戏等,其应用并不广泛。如果从产品的角度考虑,HTTP/3 的使用在整体产品中占比可能不到 1%,可能在 2000 个产品中只有 20 个产品用到了 HTTP3。
此外,即便在使用了 HTTP/2 或 HTTP/3 的场合,这种应用更多的可能只是在接入层或用户端感知的层面,而在服务之间的通信,仍然多是使用简单的 HTTP,甚至连 HTTPS 都不太常用。在推广新标准方面,尽管安全部门做出了尝试,但业务部门对此并不热衷。因为对业务部门来说,他们更关注业务运行,对推广新的通信协议不太感兴趣。
镜像管理是一种关键的信息安全实践,包括对操作系统镜像(而非 Kubernetes 容器镜像)的安全审查。我们做了镜像管理,换句话说,在指定特定的机器可下载镜像;接下来是权限管理,这主要涉及对各类用户的角色和权限进行区分和管理,以防止不适当的数据访问或修改;监控和跟踪是另一个重要的部分,我们已经整合了诸如 Prometheus 和 Skywalking 等工具,并建立了一个中间件系统。这就像一个插件,可以插入到我们的任何项目中,以便实时监控系统的运行状况。
对于网络流量的管理,我们正在研究如何在网关进行拦截并进行数据包分析。例如,我们可以扫描通用的业务数据,找出过去存在漏洞或错误的数据,并创建过滤模板以进行流量拦截。在前后端通讯方面,我们已经开始使用 RSA 加密,这主要是为了解决明文传输的问题。
在数据脱敏方面,我们已经开发了一些插件,可以通过配置来指定特定的数据表和接口,对其进行脱敏处理。虽然这并不是专业的数据脱敏工具,但它已经对我们的应用层提供了一定的保护。
在我们的操作过程中,我们普遍采用了长连接策略以减小连接成本和降低数据传输量。我们的数据发送并非实时,而是选择每 10 秒、15 秒或 30 秒采集一次。如果我们只使用短连接,传输中的成本可能会超过实际的数据流量。因此,尽管使用长连接可能会增加服务器资源的使用,我们仍选择采用长连接策略。
长连接在分布式系统中的应用面临一些困难,尤其是在处理有状态的机器时。我们尝试过两种模式,一种是在前端设置一个代理,这个代理负责维护状态,然后再将连接转化为短连接;另一种是在内部使用异步消息,但这种方式存在一些问题。首先是与物联网设备的交互是一个挑战,因为这些设备的处理能力相对较弱。尽管它们使用 TCP 进行通信,但与它们的交互必须是一对一的,如果我们向设备发送多个命令,设备常常会不响应或只响应部分命令。
另一个挑战来自于保证交互的时序。如果我们需要进行多次交互,必须保证每次交互的时序是 100%正确的,而且在这个过程中不能被其他业务打断。这是使用异步消息难以实现的。
为了解决这些问题,我们将整个协议栈的驱动封装到一个服务中,这个服务只处理特定的连接。这个服务的接口已经不再是报文接口,而是业务接口。比如,如果我们需要进行设备升级,只需将升级包发给该设备,然后由协议驱动完成所有交互。然而,这种方式难以保证高可用性。如果容器发生故障,所有的连接都会断开,我们必须找出一种方法将它们迁移到新的服务器上。
初期,我们并不太关心这个问题,因为监控和调度命令不多。然而,当我们开始处理充电桩和车辆时,问题就出现了。我们必须保证充电桩 100%在线。最后,我们设计了一种联动策略,即在调度或升级之前通知设备,让设备主动连接到另一个节点,然后再断开原来的连接,从而解决做了这一问题。
在我们的团队中,我们运用了机器学习在监控和运维系统中实施预测和根源分析。例如,我们使用趋势预测来识别监控指标的异常,如果出现了与预期不符的趋势,我们会判断可能出现了故障。此外,我们还运用深度学习对故障的根源进行分析。经过一年左右的研发,我们的系统运行良好。在这个过程中,我们使用了 LSTM 深度神经网络,主要应用于腾讯服务器和腾讯云服务器上的流量和 CPU 阈值的智能判断。对于周期性流量,预测准确率高达 95%,但对于散点型的流量,其效果较一般。
在分布式系统的高可用性中,我们的平台分为故障发现、故障定位和故障修复三个部分。通过优化这三个环节,我们能够提高分布式系统的可用性。而弹性伸缩容在故障发现之后,我们还在预测领域努力研究如何更早地发现问题。我认为,这项技术在未来的工厂检测和调度方面有潜在的优势。这就像大模型能够在特定领域,比如疾病诊断中提供帮助一样,它能够像专家一样,对机器、服务、系统或软件出现的问题进行诊断。
我们的团队认识到,虽然很多算法能够学习并得到这些数据,但由于缺乏特定领域的数据,我们无法实施这些算法。所以,我们采取的解决方案是先利用系统层面的通用数据进行模型训练,例如 CPU 使用率和内存使用等,这方面我们取得了一定的成功。然后我们尝试与特定业务合作,比如广告系统或支付系统,因为他们拥有特定的业务数据。
这需要我们首先用通用数据取得一定的成果,如准确率达到 90% 以上,这将提升我们的口碑并成为我们的品牌。然后,我们可以使用他们的数据,对我们的模型进行调优,以得到他们需要的结果。
领取专属 10元无门槛券
私享最新 技术干货