2024年3月

作者:来自 vivo 互联网服务器团队

本文根据甘青、黄荣杰老师在“2023 vivo开发者大会"现场演讲内容整理而成。

伴随 vivo 互联网业务的高速发展,数据中心的规模不断扩大,成本问题日益突出。在离线混部技术可以在保证服务质量的同时,极大的提升数据中心资源利用率,降低成本。混部技术涉及任务调度、资源隔离、运维观测等一系列技术难题,本文将介绍 vivo 在混部技术方面的实践和探索,为读者提供借鉴和参考

一、在离线混部技术背景

1.1 为什么混部

图片

数据中心运行的服务可以分为在线服务和离线任务两大类,它们具有不同的资源使用特征。

在线服务是指那些长时间运行、对时延非常敏感的服务,如电商、游戏等,在线服务的资源利用率存在明显的波峰波谷现象,平均利用率较低。离线任务是指那些运行周期短,有容错性,对实时性要求低的服务,如数据转换、模型训练等,离线任务在执行过程中资源利用率很高。

在混部之前,在线和离线都是分开独立部署,机器不共享,无法形成有效的资源互补,这导致数据中心整体资源利用率不高,却要不断购买新机器,造成了资源浪费。

1.2 混部技术定义

图片

通过混部技术,我们可以将在线和离线部署到同一台物理机上,形成资源互补,提升物理机的资源利用率,降低成本。混部技术最早由谷歌在2015年提出,经过多年的发展,混部技术已经趋于成熟,目前业内利用混部技术可以将数据中心的CPU利用率提升至40%左右 。

vivo在2020年开始调研混部技术,2023年混部平台投入生产,目前我们已经将部分混部集群的CPU利用率提升至25%(最新已达30%)左右。相较业界标杆这还有一定的差距,但随着混部规模的扩大,我们将挑战更高的目标。

二、在离线混部平台实践

2.1 混部平台产品能力

图片

混部平台必须具备两个产品能力:

  • 第一、强大的调度、隔离能力

  • 第二、完善的监控、运维能力

强大的调度能力解决了,我们如何将离线任务高效、合理的调度到在线服务所在的物理机上。而强大的隔离能力保障了在线服务的质量不受离线任务干扰。完善的监控和运维能力则可以让我们洞悉整个混部平台的运行情况,及时发现潜在风险,帮助运维人员更高效的完成系统和业务的运维工作,保障集群的高稳定性。

2.2 混部差异化资源视图

图片

混部首先要解决的一个问题是离线使用哪一部分资源。

在vivo混部系统中在线和离线看到的资源视图是不同的:

  • 在线可用资源为 整机资源

  • 离线可用资源为 整机资源减去 在线实际使用的资源

同时为了避免整机负载太高影响系统的稳定性,我们设置一个安全水位线,用于调节离线可用资源大小。

2.3 混部QoS等级

图片

为了保障混部系统的slo,我们将服务分为三个等级:
高、中,低

不同等级的服务对物理资源如:CPU、内存 使用时有不同的优先级。高优先级服务支持绑定CPU模式,适用对延时非常敏感的在线服务。一般的在线服务可设置为中优先级。离线任务设置为低优先级,通过这样的等级划分,我们很好的实现在线对离线的资源压制和隔离,保障了在线服务质量。

2.4 混部核心组件架构

图片

我们所有的混部组件都是以插件方式独立运行,对原生K8s无侵入。我们实现了一个混部调度器,在线和离线统一使用这个调度器,避免了多调度器资源账本冲突的问题。

每台物理机上都会部署一个混部agent,它可以实时采集容器资源使用数据,并根据安全水位线对离线任务进行压制、驱逐等操作。

内核层面我们使用了龙蜥OS,它具备强大的资源隔离能力,可以帮助我们更好的隔离在线、离线资源使用,保障在线服务质量。

2.5 混部组件功能

图片

我们把混部组件分为管控组件和单机组件两大类。

管控组件
主要负责调度和控制,根据vivo业务使用场景,我们对调度器做了一些增强,提供了numa感知、负载感知,热点打散,批量调度等能力。

混部控制器主要提供了一些配置管理能力:如资源画像统计、node slo配置、node扩展资源变更等。

2.6 混部可视化监控

图片

我们为混部建立一套完整的可视化监控体系。

针对在线服务我们提供了:容器资源使用指标,受离线干扰指标、业务混部收益指标等监控能力。

针对离线任务,我们提供了离线可用资源、任务异常状态等监控能力。

在平台层面上我们提供了节点、内核,核心组件的监控,通过这些监控可及时发现平台潜在的风险。

2.7 混部平台运维

图片

为了简化运维操作,提升运维效率,我们对混部集群搭建和节点扩缩容操作进行了白屏化改造,开发了资源池管理功能,简化了物理机接入流程,运维效率大幅提升。

在运维平台上运维人员可以快速调整混部隔离、水位线等参数,如果发现在线服务受到干扰,运维人员可以一键关闭混部,驱逐离线任务,保障在线服务质量。

2.8 问题与挑战

2.8.1 apiServer拆分

图片

通过混部产品能力的建设,我们很好的实现了容器混部能力,但是在实践中我们还是遇到一些新的挑战:相对于普通K8s集群,混部集群中运行着更多的容器,而且离线任务由于生命周期短,容器创建销毁更为频繁,这对K8s apiServer 产生了很大的压力。

所以我们拆分了apiServer ,离线任务使用独立的apiServer ,保障了集群apiServer 负载一直处于一个安全水平。

2.8.2 监控架构优化

图片

同样混部之后由于采集了更多的监控指标,导致Prometheus内存消耗过多,无法满足平台指标 采集需求。针对这个问题,我们优化了监控架构,将在线和离线监控组件分开部署,离线改用性能更好的vmagent,通过这个优化,监控组件内存消耗减少到原来的十分之一。

2.9 利用率提升

图片

混部初期虽然集群CPU利用率有所提升,但是还是没有达到我们的预期,主要
原因
有:

  • 一、部分低配置机器资源本身较少。

  • 二、Java 类应用堆会固定占用大量内存,导致可提供给离线使用内存资源不足。

针对这些问题,我们开发了定时调整安全水位线功能,在业务低峰期上调安全水位线,释放更多的资源给离线使用。通过一系列的优化手段,我们将其中一个混部集群的CPU利用率由13%提升到了25%左右,几乎翻倍,混部效果得到了有效的验证。

三、Spark on K8s 弹性调度实践

3.1 方案选型

图片

在大方向的技术选型上,我们选择了 Spark on K8s,在业内,也有一些公司采用了 YARN on K8s的方案。我们也对这两种方案进行过对比。

从业务适用性来说,YARN on K8s 是通用的,可以兼容Hive、Spark、Flink这些引擎,它不需要频繁创建Nodemanager pod,对K8s的压力比较小。这些都是它的优点,但另一方面,Nodemanager ESS服务是对磁盘有容量和读写性能要求的,混部机器磁盘一般难以满足。所以我们要支持不同引擎的remote shuffle service。

如果计算引擎有不同的版本,那么RSS也要支持不同版本,比如Spark2,Spark3。如果你有不同的引擎,不同的版本,很可能一种RSS还满足不了需求。另外Nodemanager需要根据K8s混部节点的剩余资源,动态调整可用的vcore和内存,所以还需要一个额外的组件来做这个事情,这需要较高的改造成本。在资源利用上,NM的资源粒度相对大,自身也会占用一些资源,存在一定的浪费。在资源紧张的情况下,Nodemanager作为整体被驱逐,会影响多个任务。这些是YARN on K8s的劣势。

作为对比,Spark on K8s 劣势有哪些?

首先这个特性在Spark 3.1以上版本才正式可用。Spark on K8s由于会频繁的创建、查询、销毁大量的executor pod,对K8s的调度能力以及master节点会造成比较大的压力。另一方面,它的优势在于只需要能支持spark3.X的RSS,这有较多的开源产品可选择。而且改造成本比较低,不需要额外的组件。资源粒度小,更有利于充分利用集群资源。在资源紧张时,会逐个pod进行驱逐,任务的稳定性会更高。

两方案各有优劣势,为什么我们选择了Spark on K8s?一方面因为Spark3.X是vivo当前及未来2~3年的主流离线引擎,另一方面vivo内部对K8s研发比较深入,能有力支持我们。基于以上原因,我们最终决定使用spark on K8s

3.2 三步走战略

图片

确定了方案选型,那在vivo我们是如何推进spark on K8s大规模的应用落地呢?回顾总结我们走过的路,可以大致归纳为三步走的战略。

  • 第一,是任务跑通跑顺的初期阶段

  • 第二,是任务跑稳、跑稳的中期阶段

  • 最后,是任务跑得智能的成熟阶段

接下来的内容,我们将对每个阶段展开细说。

3.2.1 任务跑通跑顺

图片

在任务跑通、跑顺的第一阶段,我们要解决的是怎么将任务提交K8s集群,同时要求易用性、便利性方面能够达到与on YARN 一致的用户体验。将我们最后采用的方案架构简化一下,就如同这张图所示。

首先,为了降低任务提交的复杂性、避免用户改造任务的成本。我们在任务调度管理平台做到了对原有Spark任务的兼容,通过vivo内部的容器开放API-这个代理层,我们不需要维护额外的K8s client环境,就可以轻松实现任务提交,提交后也能近实时获取任务的状态和日志信息。

另外一个关键点是,我们选用了Spark Operator作为Spark任务容器化的方案。Spark Operator是谷歌基于K8s Operator模式开发的一款的工具,用于通过声明式的方式向K8s集群提交Spark作业。

Spark Operator的方式还有其他优点:

  • Operator方式对K8s更友好,支持更灵活、更全面的配置项

  • 使用上更简单易用

  • 内置Metrics,有利于我们做集中管理

要达到阶段一的目标,让任务跑通、跑顺。我们主要克服了哪些
关键问题和挑战

图片

第一个是日志查看,因为Spark Operator方式并没有提供已结束作业的日志查看方式,包括driver和executor日志。在Driver侧,我们通过定期请求容器开放API,能准实时地获取Driver Pod状态与日志。在Executor侧,我们参考了on yarn的方式,Executor Pod结束后,日志上传HDFS,与YARN日志聚合类似。

另一方面,我们也在Spark HistoryServer做了二次开发工作,增加了on K8s方式的日志查看接口。用户查看已完成的Executor日志时,不再请求JobHistory Server,而是请求Spark HistoryServer接口。在体验上做到了基本与yarn一致。

在混部K8s集群,我们也做了三方面能力的
加强

  • 一是,确保分配能力能支持离线任务频繁建删pod的需求,在优化后我们离线Pod分配能力达到数百pod/秒。

  • 二是,在K8s侧提升了spark内部的Driver优先级,确保了在驱逐时Driver稳定性高于Executor。

  • 最后一个是,发现并修复了spark-operator的一个bug,这个bu是Operator在多副本部署时,slave副本webhook处理有一点概率出现pod 找不到的问题。

3.2.2 任务跑稳跑准

图片

在第二阶段,我们要保障的是任务跑稳,数据跑准,因此,我们有两个
关键的举措

  • 大规模双跑,目的是确保Spark任务迁移到K8s集群后是兼容的,任务成功率有保障;任务执行时长是稳定的,不会明显变慢;数据是准确的,跟on YARN保持一致性。为此,我们需要对任务进行on YARN和on K8s两种模式下的双跑测试,我们分批次总共进行了7轮双跑,覆盖了2万+的线上正式任务。最终也取得了我们想要的结果:我们双跑最终达成的任务成功率超过了99.5%,绝大部分的任务在两种模式下的时长波动在25%以内,数据一致性是100%。

  • 混部集群的压力联调,目的是确保混部集群的承载容量能够支撑大规模的离线任务调度,通过模拟未来1年的任务量来给混部集群做压力测试,充分发现和检测K8s集群可能存在的性能问题。最终,通过我们多轮压测和问题解决,我们在单个K8s集群能够支撑150+同时运行的Spark任务,1万+同时在运行的Pod数量。

图片


第二阶段
,我们主要面临三个方面的
问题和挑战

首先是我们需要为Spark选择一个外部的shuffle服务,经过技术选型和比较,我们最终选择开源的celeborn作为我们的remote shuffle service组件。我们通过对机型和参数的测试调优,使celeborn的性能达到我们的预期需求。在大规模的应用场景中,我们还发现了会存在大任务会阻塞小任务,导致shufle read变慢的问题,我们对这种情况做了参数和代码上的优化,当前社区也针对shuffle read的问题有一些待优化的改进。另外celeborn进行了容器化部署,在提升自动化运维能力的同时,也可以为混部集群提供额外的计算资源。

其次,在任务稳定性方面,我们也解决了一系列的问题。

  1. 在双跑的时候,我们发现有不少任务在on K8s模式下很容易OOM,这是因为在on YARN模式下申请的container内存大小,不止是由Spark任务本身的内存参数决定,还会被YARN的资源粒度参数所影响。所以这块要做一些适配对标工作。

  2. 在任务量比较大的情况下,Spark operator的吞吐能力会遇到瓶颈,需要我们将并发worker数量、队列的相关参数调大。

  3. CoreDNS因为Spark任务频繁的域名解释请求,导致压力增大,甚至可能影响在线服务。这个可以通过访问ip而不是域名的方式来规避,比如namenode节点、driver和executor。

  4. 横向扩展namespace,这样可以避免单namespace的瓶颈,也防止etcd出现问题。

  5. 我们K8s apiserver的压力随着任务量增长压力也会逐渐增大,这会影响整个集群的稳定性。我们主要通过优化Spark driver list pod接口、使用hostnetwork方式两个优化手段,有效降低了apiserver的压力。

最后要说的是数据一致性,关键点是要做到行级记录的MD5校验,发现有不一致的Case,我们做到100%的分析覆盖。排除了因为时间戳随机函数等一些预期内的不一致,我们发现并修复两种case会偶发导致不一致的问题:

  • celeborn Bug导致不一致,具体可参考CELEBORN-383解决

  • Java版本不一致导致的问题

3.2.3 任务跑得智能

图片


第三阶段,我们需要解决的问题是让任务跑得智能,怎么定义智能
,我想用三个词来概括弹性、健壮、业务需求。这是我们弹性调度的架构图,细节我就不讲了,这里我介绍下我们的调度系统重点支持的功能。

图片

在弹性方面,我们需要做到实时根据混部集群资源闲忙,智能提交至混部集群或者Hadoop集群。在前期我们K8s集群的资源相对Hadoop是小头,通过合理的水位线控制,防止大量任务同时调度到K8s导致饿死。

健壮,就是要保证任务的高可用。

我们建设的能力包括:

  • 任务双跑成功后再混部

  • 支持离线任务失败自动回滚到Hadoop集群执行

  • 支持用户自主决定任务是否可调度至K8s集群

  • 初期剔除重要核心任务、剔除不可重试任务

目的是在用户任务迁移时做到让用户无感。

在满足业务需求方面,我们支持优先调度本业务的离线任务, 优先满足业务部门的离线任务资源需求;支持只在指定时间段里调度离线任务,支持在出现异常情况下一键终止调度K8s。这些是为了确保在线服务的高可用性,免除在线业务的后顾之忧。

3.3 混部效果

图片

克服了三步走过程中的磕磕碰碰,我们终于可以将离线任务大规模混布到K8s混部集群了。但是我们很快发现,混部集群的整体利用率并没有达到我们的预期,主要有三方面的
原因

  1. 初期的Spark任务不足,这个我们通过加快双跑,迁移低版本的Spark任务,迁移Hive SQL任务来解决。

  2. 在混部的时候,我们也观察到,离线任务的pod cpu利用率其实没那么高。比如我们申请一个核,通常只能利用0.6个核,存在浪费的情况。我们上线了CPU资源超分的能力,目前是静态的固定比例超分,通过这个措施,我们能将pod的实际cpu利用率打到80%以上。

  3. 另外就是混部集群中的机器配置不均,部分机器cpu资源充足,但是内存不够。我们通过在调度侧控制可调度任务的资源粒度,尽量调度对内存资源需求较小的任务。

通过我们在任务调度侧,以及之前甘青提到过的其他措施。混部集群利用率得到了进一步的提升。

图片

最后,我向大家同步下,当前我们达成的
混部效果

我们目前可供调度的任务接近2万个,这些任务每天调度的次数已经超过了4万次。在凌晨的高峰期,我们通过混部,能为离线任务额外增加2万核、50TB内存的计算资源。这个收益是相当可观的,我们也希望在未来的2到3年,将可调度的任务规模提升到6万个,弹性资源能够为离线计算总资源贡献20%的份额。

通过继续深度推进在离线混部技术,我们期望能够为vivo增效降本工作持续地贡献力量。

以上就是本次分享的全部内容。

相较传统IDC,云计算的快速迭代增加了维持良好架构的难度。云应用需关注稳定性、安全性、性能和成本。阿里云通过多年经验,发展了一套名为"Alibaba Cloud Well-Architected Framework"的优秀架构框架,以协助用户构建出色的云架构。

关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。

file

一、卓越架构介绍

相比于传统IDC环境,云计算的基础设施和服务在不断快速迭代和演进,对云用户而言,在上云、用云、管云过程中持续维持良好的云上架构变得极具挑战。对云上应用来说,稳定、安全、性能、成本是架构设计中最通用领域的抽象,也是组织层面最需要关注的几个维度。

基于多年服务各行各业客户的经验总结,我们将阿里云上的架构设计最佳实践总结为一系列的方法论和设计原则,形成阿里云卓越架构框架(Alibaba Cloud Well-Architected Framework),以帮助云用户构建良好直至卓越的云上架构。

(应用上云规划-应用上云实施-图5)..jpeg

阿里云卓越架构包含以下五个架构最佳实践支柱:

  • 安全合规:识别企业内部、外部的安全要求和监管诉求,在云环境中针对网络安全、身份安全、主机安全、数据安全等全方位地进行规划和实施,同时持续对威胁进行检测和快速响应。

  • 稳定性:无论在何种环境都无法避免单个组件故障的发生。稳定性的目标就是要尽量降低单个组件故障对业务带来的整体影响。该支柱侧重于如何让业务系统利用现代云平台的基础设施达到高可用,做到面向失败设计,具备一定容灾性的能力。同时把控应用系统的变更流程、部署架构、配置规范等,制定企业应用治理规范,设定应用层面的治理标准。

  • 成本优化:通过技术手段了解云资源的成本分布,帮助企业平衡业务目标与云上成本,通过充分高效使用云服务来构建业务应用,尽可能提升云环境和业务需求之间的契合度,通过持续优化来避免资源浪费,减少不必要的云上开支并提升运营效率。

  • 卓越运营:侧重于应用研发态、运行态相关工具与系统的构建和使用,同时也需要考虑组织内如何对应用、工作负载、资源、事件等进行响应,定义日常操作流程,指引企业构建自己的运营模型。

  • 高效性能:根据性能监控指标自动触发弹性伸缩能力,通过云平台的资源储备应对流量高峰,建立完备的可观测性体系协助定位性能瓶颈。通过性能测试手段建立性能基线,验证架构设计目标并持续优化。

基于这五大支柱,卓越架构提供相应的设计原则和最佳实践,以及可落地的方案。同时,卓越架构还提供了免费的架构评估工具和度量模型,来评估当前架构设计与期望值的差距,并提供相应的改进指引和方案。在设计和实施过程中,阿里云提供了专家服务和认证的合作伙伴,协助架构的演进。

阿里云卓越架构框架面向的是首席技术官(CTO)、架构师、运维、安全、研发等角色。通过了解卓越架构中定义的最佳实践和解决方案,组织中的这些职能角色能够不断的将应用架构和卓越架构中的最佳实践进行比较,并不断进行架构的迭代和改进,从而降低风险、控制成本、提升效率,为业务的高速发展提供坚实的基础。

二、安全合规

2.1 概述

安全管理的目的是风险管理,企业选择将业务迁移到云上,并不意味着安全风险的降低,也并不表示企业的安全要由云供应商来承担。

云安全的责任模型是共担的责任模型,基于云的客户应用,云供应商要保障云平台自身安全并提供相应的安全能力和产品给云上的客户。客户则负责基于云供应商提供的服务或原子化能力构建保障应用系统或业务的安全体系。

随着企业上云的节奏越来越快,以及网络攻击的成本越来越低,安全的建设已经跟不上业务的发展。所以更应该在上云之初就规划安全体系的建设和设计,不要等到业务已经运行起来后在考虑安全建设。

2.2 安全责任模型

基于阿里云的客户应用,其安全责任由双方共同承担:阿里云要保障云平台自身安全并提供安全产品和能力给云上客户,客户负责基于阿里云服务构建的应用系统的安全。

安全责任模型示意如下图所示:

image..png

阿里云负责基础设施(包括跨地域、多可用区部署的数据中心,以及阿里云骨干传输网络)和物理设备(包括计算、存储和网络设备)的物理和硬件安全,并负责运行在飞天分布式云操作系统之上的虚拟化层和云产品层的安全。同时,阿里云负责平台侧的身份管理和访问控制、监控和运营,从而为客户提供高可用和高安全的云服务平台。

客户负责以安全的方式配置和使用各种云上产品,并基于这些云产品的安全能力以安全可控的方式构建自己的云上应用和业务,保障云上安全。阿里云基于阿里巴巴集团多年攻防技术积累,为客户提供云原生的安全服务,保护客户的云上业务和应用系统。

2.3 云平台数据安全和隐私保障体系

数据安全是为了推动数据可以被高效流动而核心打造的是一套信任机制。不碰用户数据是阿里云的红线,也是最低要求。阿里云数据安全体系的核心是赋予数据权利和义务,让其所有者、共享者、监管者可以基于这些信任,释放数据的价值,这是阿里云数据安全的理念。

阿里云已经完整覆盖了基于地域和可用区概念,构建的基础设施和平台层的数据风险收敛能力。平台之上,围绕安全、合规、隐私三大命题,阿里云为用户提供原生的、高度自动化、高透明度的保护能力,致力构建值得信任的安全计算环境,促进数据在被保护的状态下流动起来、使用起来。信任的基础是明确其中的权利和义务。在分类分级的前提下,我们对数据的所有权、归属权、使用规范、删除权等做了细粒度约定,并通过法律法规、资质认证等多种手段保障权利和义务的履行。因此,阿里云也是亚太区拥有最全合规和隐私资质的云厂商。

image.png

2.4 规划和设计

安全是需要设计和规划的,应在构建基于云或本地数据中心的同时,建设安全系统和相关控制措施,建立配套安全管理流程和机制,建立安全意识管理体系等。并将技术控制措施、管理流程、人员组织配套的融入云基础设施的构建、业务开发,应用上线和日常运营当中。
file

三、稳定性

系统稳定性是指系统在运行过程中面对各种非预期事件影响下能够持续提供可靠服务的能力,是系统建设的重中之重。但随着各公司业务范围的扩展和软件系统架构持续迭代升级,系统的复杂度随之增加,面对更多的非预期事件风险,如各类软硬件故障、错误的变更、突发流量,甚至到光纤挖断、自然灾害等引起的整个机房不可用情况,如何保障系统稳定性具有很大挑战。

一个稳定的分布式系统需要能够快速适应变化,及时发现和解决问题,并且能够保持系统的一致性和可靠性。稳定性通常包含系统可用性、可靠性、可观测性、可运维性、可扩展性、可维护性等。使用云计算平台服务可以更好的构建系统稳定性,例如云计算平台可以根据系统的实际需求,动态分配和释放计算资源,使得系统更容易扩展,降低系统负载压力,从而提高系统的可扩展性。再者云计算平台会提供冗余存储和备份能力,避免系统因为硬件故障或其他原因导致的停机或数据丢失。这种备份机制可以提高系统的可靠性。

3.1责任共担模型

阿里云平台提供高可用的基础设施,并提供应用稳定性相关工具体系。用户可以基于阿里云提供的产品及本框架中定义的最佳实践入手,来建设云上应用的稳定性。

(应用上云规划-应用上云实施-图5)  备份.jpg

在分布式系统中,需要考虑的稳定性问题比较复杂,贯穿软件系统设计态、研发态、运维态、运行态,覆盖从IaaS、PaaS到上层SaaS系统,所有这些都可能会影响系统的稳定性。为了确保系统能够持续稳定地工作,建议遵循以下设计原则。

3.2面向失败的架构设计原则

众所周知,系统异常事件是不可避免的,如网络延迟、硬件故障、软件错误、突峰流量等,建议在系统设计阶段就要从这些异常事件引起的系统执行“失败”出发,提供冗余、隔离、降级、弹性等能力,旨在确保系统的高可用性和高可靠性,以应对不可避免的故障和意外发生。

3.3面向精细的运维管控原则

由于业务的扩展和系统服务进一步拆分,分布式系统的复杂度剧增。再加上产品迭代加快,版本繁多,同时某些业务对实时性有较高要求,运维的不确定性和复杂性大幅增加。建议通过精细化的管理和可观测手段,如版本控制、灰度发布、监控告警、自动巡检等手段,旨在提高运维效率、确定性和稳定性。

3.4面向风险的应急快恢原则

在一些场景下,即使设计了各种技术手段去提高系统的冗余、保持业务的高可用,但还是避免不了生产系统故障的发生,所以需要面对故障建立一个高效的故障应急流程机制和稳定的技术平台,实现故障风险实时发现、应急团队有效协同、处理过程准确记录、故障快速止损和恢复以及后续故障复盘,旨在提高故障应急效率,减小故障影响,降低类似故障的再次发生,提升系统整体高可用性。

基于稳定性支柱设计原则,整体稳定性设计方案可参考如下:

(应用上云规划-应用上云实施-图5)  备份 2 2.jpg

3.5 架构设计原则

软件系统从所有的功能都在一个应用程序内运行的单体应用架构,到不同的功能模块分别部署在不同的服务器上的传统分布式应用架构,再到服务细分通过轻量级的通信机制进行互相调用的微服务架构,到现在将云计算、容器化、微服务架构等技术结合起来的云原生架构。在软件系统架构演进中不变的是系统的基本属性,包含存储、计算和网络,变的是存储、计算和网络的实现方式和规模,往大规模、高性能、高可靠、易扩展等方向迭代演进,所以对架构稳定性提出了更高的要求。

系统可预见的稳定性风险包含软硬件故障和不可预期的流量,小到线程级风险,大到地域级灾难,从此出发可通过容灾、容错、容量三方面建立系统架构稳定性。

变更设计原则

在企业的运维管理与运行过程中,就会有变更产生。变更是指添加、修改或删除任何可能对服务产生直接或间接影响的内容。当变更失败时可能会带来严重后果:业务中断、客户舆情等等一系列问题。为了降低变更带来的业务风险,需要遵循变更设计原则:
可灰度、可监控、可回滚。

应急响应机制

应急响应机制的关键点在于事件发生后,有标准的操作流程和动作。阿里巴巴在过去十几年的安全生产过程中,沉淀了一套故障应急响应机制,简称应急响应1-5-10。是指在1分钟内发现故障,5分钟内组织相关人员进行初步排查,10分钟内开展故障恢复和处理工作。企业在设计应急响应机制时,可以参考该方式明确响应期间的标准动作和流程,确保在事件发生时,相关干系人都能够明确自身职责和所需要采取的措施。

演练常态化

故障演练提供了一种端到端的测试理念与工具框架,本质是通过主动引入故障来充分验证软件质量的脆弱性。从提前发现系统风险、提升测试质量、完善风险预案、加强监控告警、提升故障应急效率等方面做到故障发生前有效预防,故障发生时及时应对,故障恢复后回归验证。基于故障本身打造分布式系统韧性,持续提升软件质量,增强团队对软件生产运行的信心。故障演练可分为方案验证的容灾演练、稳定性验收的红蓝攻防,以及故障应急验证的突袭演练。

四、成本优化

云计算能够为企业IT基础设施带来敏捷性和效率提升,随着云上业务体量和业务场景复杂度不断增加,企业在云上资源配置不合理或配置过渡的现象普遍存在。与此同时,企业在多组织成本管理效率、成本可控、平衡业务目标与成本等方面均面临巨大挑战。

成本优化支柱提供了云上成本管理及优化的设计原则和最佳实践,帮助企业高效地使用云服务来构建业务应用,减少不必要的开支并提升运营效率,让企业在云上更具经济效益。成本优化并不意味着只追求低价格,在过程中需要进行必要的权衡取舍,关键在于提升成本管理效率、合理选择云资源及避免成本浪费,并在业务目标、安全合规、稳定性等方面与成本之间达成平衡。

成本优化贯穿企业整个上云用云全生命周期,本支柱从云财务规划及管理、成本可视化及分摊、成本监控、云服务及计费方式选择、应用负载成本优化等方面进行阐述,为企业在云上以最优成本达成业务目标提供深入指导。
“云成本管理与优化”不是一蹴而就的项目,是一个涵盖企业上云用云全生命周期,关系到企业内部管理机制的体系化工程,是一个反复迭代和持续运营的过程。

根据FinOps官网《What is FinOps》的描述,“FinOps 是一种不断发展的云财务管理学科和文化实践,通过帮助工程师、财务、技术和业务团队协作制定数据驱动的支出决策,使组织能够获得最大的业务价值。”

FinOps 是“Finance”和“DevOps”的合成词,强调业务团队与工程师团队之间的沟通和协作。

FinOps通过Inform、Optimize、Operate三个生命周期阶段实现云成本的可视、优化与持续运营,鼓励实践6大FinOps原则,将众多FinOps能力划分为6大领域,最终通过Crawl(爬行)、Walk(行走)、Run(奔跑)3个程度来衡量实践的成熟度。

“FinOps”在行业中常见的别名有 “云成本管理(cloud cost management)”、“云成本优化(cloud cost optimization) ”、 “云财务管理(cloud financial management)”等。

阿里云云成本管理与优化框架

阿里云在FinOps核心理念基础上,融合自身实践经验,提出更加细化落地的本土化“云上成本管理实施框架”,供企业客户参考实施。

image.png

云上成本管理贯穿上云用云全生命周期

从企业上云及用云的历程看,大致可以分为用云计划、用云执行、监控分析、成本优化等阶段,成本管理贯穿各个阶段,每个阶段的关注点各有不同。

用云计划阶段
:场景包括企业首次上云、增量上云、存量复购。

用云执行阶段
:场景包括采购执行、用云管云规则执行(包括财务规则设置、资源配额设置等)、商务履约执行(包括对账、充值、开票等)。在用云执行阶段,从财务管理和资源管理两个视角做好成本管理。

监控分析阶段
:对应FinOps的Inform阶段,主要解决成本分摊与成本可视化问题。

成本优化阶段
:对应FinOps的Optimize阶段,主要通过计费方式优化、资源使用优化和架构优化来落地执行。

持续运营
:云上成本管理是一个反复迭代和持续运营的过程,企业应持续循环以上四个阶段,形成长效运作机制,使云上成本可以有效管控、持续优化。

五、卓越运营

云计算能够为企业IT基础设施带来敏捷性和效率提升,随着云上业务体量和业务场景复杂度不断增加,企业在云上资源配置不合理或配置过渡的现象普遍存在。与此同时,企业在多组织成本管理效率、成本可控、平衡业务目标与成本等方面均面临巨大挑战。

成本优化支柱提供了云上成本管理及优化的设计原则和最佳实践,帮助企业高效地使用云服务来构建业务应用,减少不必要的开支并提升运营效率,让企业在云上更具经济效益。成本优化并不意味着只追求低价格,在过程中需要进行必要的权衡取舍,关键在于提升成本管理效率、合理选择云资源及避免成本浪费,并在业务目标、安全合规、稳定性等方面与成本之间达成平衡。

成本优化贯穿企业整个上云用云全生命周期,本支柱从云财务规划及管理、成本可视化及分摊、成本监控、云服务及计费方式选择、应用负载成本优化等方面进行阐述,为企业在云上以最优成本达成业务目标提供深入指导。

构建运营模型

运营模型是指组织和业务团队使用云计算平台支持业务的过程中,根据业务需求、企业架构、组织文化、现有的技术水平和工具等构建的模型。每个企业的运营模型都是独特的,本文将介绍四种常见的运营模型以供参考。

构建运营模型的目的是为了实现更高效、更灵活的基于云计算平台的管理和运营。具体来说,构建运营模型的目的包括以下几个方面:

1. 实现快速部署和扩容:通过云计算平台构建标准的发布工程,实现快读部署和扩容,提高服务的响应速度和灵活性。

2. 提升决策的有效性:通过构建可观测系统,从而以高度统筹与整合的方式将业务数字化操作所产生的可观测数据进行反馈并创造决策循环,提高组织决策有效性。

3. 优化资源配置和利用效率:通过对云计算平台中各种资源(如计算、存储、网络等)的实时监控,配合一些优化措施,能够提高资源的利用效率,降低云服务的成本。

4. 提高业务的稳定性和可靠性:基于云平台提供的监测和专业技术能力,可以协助企业提升故障响应速度,缩短故障诊断时间,提高业务的稳定性和可靠性。

云卓越中心CCoE运营模型

云卓越中心CCoE是驱动云转型的最佳实践。企业通常至少有一个云管理团队,或由相关负责人组建一个云卓越中心(Cloud Center of Excellence,简称CCoE)负责规划和对接上云的整体方案,包括在组织层面确认上云的整体计划、步骤,以及收集组织的具体需求。

image.png

云卓越中心运营模型组织通常包括:

  • 企业管理层:企业管理层需要明确云在公司的战略地位以及各个团队应该如何使用云。

  • 云卓越中心:该团队可以是虚拟的组织,设计云服务的供给模式和管理体系,并提供相应的技术准备。其中的成员包括:


    • 架构师和专业技术人员,负责上云架构设计和业务上云迁移工作;

    • 安全、合规等领域专家,负责设计企业IT治理方案、预估风险和制定治理规则;

    • 财务专家,负责制定财务的管理流程和成本分摊规则。

  • 云管理团队:在企业业务全面上云之后,持续优化云上架构,为新业务提供云上环境。建立企业云上运维体系,搭建运维平台,以及通过自动化运维的方式,对云上环境进行持续治理和管理。根据新业务需求,分配所需云资源和所需权限,并对资源进行初始化配置后交付。应用团队只需用云,无需关注基础设施搭建。

六、高效性能

性能度量了系统在单元环境内承载工作负载的效率,系统性能通常可以由 QPS、并发和RT(响应时间)等典型指标来衡量。在传统 IT 环境中,系统的容量评估和规划是系统设计的重要环节,通常会基于系统对峰值负载表现出来的性能承载能力来给系统选择合适的节点数量规划,在双活系统中考虑到 failover 会需要给单节点设计更大的冗余,对于过载的场景也需要有过载控制相关功能模块来避免整体宕机。这个设计的环节是相对固定和长周期的工作,因为往往节点的部署和交付都是相对长周期的工作。

在云的基础设施环境中,灵活的弹性功能很好地解决了传统 IT 环境中的痛点,将容量评估和线上扩容变得相对简单,同时也为高性能设计带来了更多选项和复杂性。除了设计层面的容量评估和灵活弹性,实现层面的性能测试、性能监控和性能优化之外,充分发挥云产品因为技术迭代带来的性能红利同样成为高性能系统需要考量的重要因素。本章节会全面描述基于云基础设施的高性能系统设计、实施和优化等环节,包括如下主要内容:

  • 高性能架构设计:包括高性能架构常见设计准则、业务适应规格和类型、可伸缩和可扩展、性能层面部分架构设计最佳实践和挑战和注意事项等内容。

  • 性能测试:包括性能测试介绍、性能测试的适用场景和性能测试最佳实践等内容。

  • 性能监控:包括为什么需要性能监控、什么是性能监控和性能监控最佳实践等内容。

  • 常见性能优化手段:包括弹性计算优化、网络优化、数据库优化和架构优化等内容。

性能是系统的一个重要指标,如果性能无法达到用户预期,会造成大量的用户流失。而很多时候性能问题和系统最初的架构设计相关(当然系统架构是可以持续演进和迭代的),任何架构设计都必须考虑可能带来的性能问题。

因为性能问题几乎无处不在,所以优化性能的手段也非常多,从用户浏览器到数据库,影响用户请求的所有应用相关环节都可以进行性能优化。随着云计算在IT支出占比的不断提升,越来越多的用户核心业务系统跑在云上,云的架构设计和选型也对性能非常重要。基于云的特点,云架构中有关性能设计的方面,有以下注意事项和基本原则:

有效的云资源选型

作为一个软件系统,应用层面有很多性能优化和架构设计的考虑点,但是一个系统的性能基石其实是底层计算和存储资源的性能,这个是原子能力。当系统使用的计算和存储资源性能越好,越有利于上层应用进行整体性能调优和优化,所谓“工欲善其事必先利其器”。

在大规模分布式系统不断发展的趋势下,计算场景和对算力的需求越来越丰富。比如在很多通用计算的场景下,最关心的其实是计算集群的规模,对计算节点本身的单节点能力并没有高要求(比如短时大量计算请求的峰值场景);而在现在火热的AI模型训练场景下,则必须使用类似A100 GPU计算卡的裸金属机器来快速满足大规模AI训练的要求。同时云资源大都是按可用区维度进行部署的,一旦选择可用区进行大量资源部署后迁移和改造成本会很高,因此选择有效的可用区也非常重要。在选择可用区时,需要综合考虑延时,库存,资源类型等因素。

即在场景越来越丰富的情况下,云资源的资源选型从一开始就能很大程度影响最终的系统性能。因此从云架构的实际角度来看,云资源的选型非常重要,具体选型的原则可以参考
评估合适的云服务

可伸缩、可扩展的云架构

大型系统需要面对大量用户的高并发访问和存储海量数据,不可能只用固定数量的服务器来处理全部用户请求,这样既不经济,也没有办法有效应对灵活的业务访问。通过集群的方式将计算资源和存储资源等组成一个整体提供服务,在需要的场景下,可以及时通过调整计算和存储资源来缓解高并发带来的计算和存储压力,从而实现在访问峰值场景下可以向用户有效提供稳定的服务,在访问低谷的时期又可以释放不必要的资源或保持系统的低位运行来节省IT支出。

对于一个严格设计的系统来说,存在不同功能的计算节点,如应用服务器集群、缓存服务器集群、数据库集群等。应用服务器集群如果是无状态的场景下(数据保存在另外的节点上),那么伸缩机器是比较简单直接的;对于缓存服务器集群来说,新加入的计算节点则需要进行相关缓存刷新或预热等来保证数据的可访问性;对于数据库来说,实时的伸缩是比较困难的,需要提前做好数据备份和数据同步等方式,辅助路由手段等提升数据库集群的整体可用性和性能。

云上架构设计的部分最佳实践

在云计算高度发展的今天,公共云上已经运行了大量的核心业务系统。这些业务系统从设计到逻辑等方面都考虑了云本身带来的便利性,同时公共云的发展也不断吸取这些业务系统的需求来不断优化自身的产品设计,并推出更适配业务需求的云产品。因此在一些比较有特点的场景下形成了最佳实践,借助这些最佳实践预期可以有效提升云架构设计初期的架构设计能力,提升系统整体性能,具体可以参考每个云产品文档中的最佳实践相关内容,以及阿里云
最佳实践频道

关注架构设计的注意事项

性能并不需要盲目地追求极致,在高性能架构设计的过程中,还需要关注性能设计中的一些挑战和注意事项,避免引起不必要的资源浪费和研发投入。具体可以参考
挑战和注意事项

关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年互联网服务架构、AI产品研发经验、团队管理经验,同济本复旦硕,复旦机器人智能实验室成员,阿里云认证的资深架构师,项目管理专业人士,上亿营收AI产品研发负责人。
如有帮助,请多关注
TeahLead KrisChang,10+年的互联网和人工智能从业经验,10年+技术和业务团队管理经验,同济软件工程本科,复旦工程管理硕士,阿里云认证云服务资深架构师,上亿营收AI产品业务负责人。

本文介绍在
Win10
电脑中,安装
Anaconda
环境与
Python
语言的方法。

在这里需要注意,本文介绍的方法是在电脑自身原本不含有
Python
的情况下进行的;如果大家电脑中原本就下载、安装过
Python
语言,需要首先将原本安装
Python
时的设置的环境变量删除。

首先,先进行
Anaconda
环境的安装。

我们可以在Anaconda的
官方网站
进行下载,但是官网下载时可能网速较慢。

image

因此,我们可以在清华大学开源软件镜像站进行
下载

image

下载后,双击打开下载好的
.exe
文件,即可开始安装。

其中,在“
Select Installation Type
”一栏中,建议大家选择“
All Users
”,从而使得当前计算机中的全部用户都可以使用
Anaconda

接下来,需要选择安装的目标文件夹。这里建议大家如果
C
盘剩余空间大的话,就选择在软件默认的路径安装,这样子在后期使用
Anaconda
时,可以免除出现很多小错误的麻烦;但一般情况下,
C
盘空间都是很宝贵的,大家自行选择安装在其他盘符下即可。

这里请注意,需要记得自己安装
Anaconda
的路径,也就是上述“
Destination Folder
”中的路径,以供后续操作使用。

随后,在弹出的“
Adavanced Installation Options
”一栏中,不选第一项,选中第二项。其中,第一项是将
Anaconda
的安装路径自动设置为环境变量,但是这样做可能会带来一些问题,我们后续手动设置环境变量即可;第二项是将
Anaconda
中一并下载的
Python
版本作为系统默认的
Python

随后,即可开始安装。

稍等片刻,完成安装。取消勾选最终界面中的两个选项,点击“
Finish
”即可。

接下来,我们需要设置环境变量。按照
Windows电脑环境变量(用户变量、系统变量)的修改
中介绍的方法,我们将与
Anaconda
有关的几个路径进行环境变量的设置。

在这里需要注意,按照
Anaconda
官网的说法,由于我们前期选择了为所有用户(“
All Users
”)安装
Anaconda
,所以这里就选择“
环境变量
”中的“
系统变量
”里的“
Path
”(如上图);若是前期选择了为“
Just Me
”安装,这里就可以选择“
用户变量
”中的“
Path
”(如下图)。

在这里,为了保证安装操作的正确,我是将两种环境变量类型里的“
Path
”都进行了设置。

我们首先到刚刚安装
Anaconda
时的安装路径,复制路径地址。

将其放入环境变量中。

按照上述方法,将下图红框中的四个路径放入环境变量中。请注意,由于安装路径不同,大家所选择的这四个路径地址前半段可能和我的不一致,主要是确保后续文件夹是正确的即可。

对系统变量和用户变量都进行设置。

以上即完成了
Anaconda

Python
的下载与安装。接下来,我们需要检查二者是否安装正确。

在开始菜单中输入
cmd
,打开“
命令提示符
”。

输入
python
,并查看命令提示符的输出情况。

若可以显示出
Python
的具体版本,说明我们的
Python
已经安装完毕。

接下来,重新打开一个命令提示符窗口,输入
conda --version

这里请注意,不要在刚刚的命令提示符窗口中直接输入新的语句,因为刚刚输入
Python
后已经进入了
Python
的环境,我们需要退出这一环境,否则可能会出现类似下图所示的错误。

显示出
conda
的版本,即说明
Anaconda
安装正确。

此外,还可以输入
conda info

这同样可以检查
Anaconda
的安装情况;出现下图所示内容即说明安装无误。

此时,在开始菜单,我们可以看到安装好的
Anaconda
软件及其相关应用。

我们可以分别打开
Anaconda Navigator (Anaconda3)

Spyder (Anaconda3)
进行尝试。

二者打开均无误,可以正常使用。

前言:

在本篇 Taurus.MVC WebMVC 入门开发教程的第六篇文章中,

我们将讨论如何配置路由并映射到控制器和操作方法。

路由是决定应用程序如何响应客户端请求的重要组成部分,因此在 Web 开发中非常重要。

我们将继续使用 Taurus.Mvc 命名空间,并探讨如何在应用程序中配置路由。

步骤1:了解路由

在 Taurus.MVC WebMVC 中,路由是用于确定请求应该映射到哪个控制器和操作方法的机制。

每个路由都有一个 URL 模板,用于匹配请求的 URL,并将其映射到相应的控制器和操作方法。

例如,URL
/Home/Index
可以映射到
HomeController
类的
Index
方法,这样就可以显示主页视图。

步骤2:配置路由

在 Taurus.MVC WebMVC 中,通常使用默认:/控制器/方法名 的默认机制。

当然,除了默认的机制,还有其它几种机制,可以变更路由。

A、通过特性配置:RoutePrefix 路由前缀,改变控制器映射

[RoutePrefix("my")]public classHomeController : Taurus.Mvc.Controller
{
public voidIndex()
{

}
}

以上代码,它可以变更原来的访问地址: /home/index 为 /my/index

RoutePrefix 支持配置多个,以支持多个路径映射,虽然感觉没啥意义,但框架仍然支持它。

同时,使用路径变更前缀时,默认原有请求路径将被禁用。

如果仍然想保留使用旧路径,可以使用第二个参数 IsKeepOriginalPath 启用它:

[RoutePrefix("my",true)]

B、通过特性配置:Route 路由前缀,改变方法映射

[RoutePrefix("my")]public classHomeController : Taurus.Mvc.Controller
{
[Route(
"home")]public voidIndex()
{

}

}

可以变更原来的访问地址: /home/index 为 /my/home

注意,上述代码中:Route 的映射地址,不以 / 开头。

如果以 / 开头,则会成忽略控制器前缀,独立成地址,你需要配置成:

[Route("/my/home")]

上述代码示例,是比较简单的应用,但已满足日常开发所需要。

当然框架也提供了代码的方式,可以使用代码来动态自定义路由。

步骤3:自定义路由

如果以上的方式都无法满足您的需求,您可能是需要在运行时动态改变路由地址:

那么您可以看一下路由的详细介绍篇:
Taurus.MVC WebAPI 入门开发教程3:路由类型和路由映射

上述链接的文章中,更详细介绍了框架中的路由的相关知识。

通过本篇文章,和路由详情篇的学习,您将对框架的路由有深刻的认识,并掌握其使用和操作方法。

步骤4:运行应用程序

最后,运行应用程序并在浏览器中输入不同的 URL,观察路由的映射效果。

您可以尝试输入
/Home/Index

/my/index
等 URL,查看不同的控制器和操作方法如何响应请求。

总结

通过本篇教程,我们学习了如何在 Taurus.MVC WebMVC 中配置路由并将其映射到控制器和操作方法。

我们学习了默认路由和自定义路由的创建方法,并了解了不同 URL 对控制器和操作方法的影响。

本系列的目录大纲为:

Taurus.MVC WebMVC 入门开发教程1:框架下载环境配置与运行

Taurus.MVC WebMVC 入门开发教程2:一个简单的页面呈现

Taurus.MVC WebMVC 入门开发教程3:数据绑定Model

Taurus.MVC WebMVC 入门开发教程4:数据列表绑定List<Model>

Taurus.MVC WebMVC 入门开发教程5:表单提交与数据验证

Taurus.MVC WebMVC 入门开发教程6:路由配置与路由映射

Taurus.MVC WebMVC 入门开发教程7:部分视图和页面片段

linux服务器文件实时同步

1 背景说明

在做系统集群部署时,涉及到两个或多个服务器之间文件同步.在软件层面linux服务环境找到以下两种同步方式

  • 利用linux NFS功能将网络共享文件挂载成本地目录
  • 采用文件监听,实时推送

服务器资源如下

  • 服务器1 10.2.4.51 ,作为主服务器
  • 服务器2 10.2.4.52 ,作为从服务器

2 NFS网络共享配置

2.1 主服务器

2.1.1 安装应用包
yum install -y nfs-utils rpcbind #nfs安装命令 author: herbert qq:464884492
systemctl enable nfs #将nfs设置开机启动
systemctl enable rpcbind #将rpcbind设置开机启动
2.1.2 共享配置

主服务建立需要共享的文件夹

mkdir /home/nfs_data # 主服务需要共享的目录 

配置从服务可以访问主服务器

vi /etc/exports #author: herbert qq:464884492

设置内容为

/home/nfs_data/ 10.2.4.52(rw,sync,no_root_squash)

重启服务,注意一定要先启动 rpcbind

systemctl stop nfs 
systemctl stop rpcbind
systemctl start rpcbind 
systemctl start nfs
showmount -e # 可以检查NFS配置是否生效
# 配置正确后,会有一下提示信息
Export list for hk51:
/home/nfs_data 10.2.4.52
2.1.3 防火墙配置

如果服务器需要开启防火墙,需要在防火墙添加服务,可以通过
firewall-cmd --state
防火墙开启状态

firewall-cmd --add-service=nfs --permanent --zone=public
firewall-cmd --add-service=mountd --permanent --zone=public
firewall-cmd --add-service=rpc-bind --permanent --zone=public
firewall-cmd --reload #重新载入配置,使其生效

2.2 从服务器

2.2.1 应用包安装
yum -y install nfs-utils 
2.2.2 挂载配置

在相同的路径建立同样的目录

mkdir /home/nfs_data # 从服务需要共享的目录

挂载目录

mount -t nfs -o sync,noac 10.2.4.51:/home/nfs_data /home/nfs_data #目录挂载

检查挂载

 df -h #查看挂载

配置开机启动挂载

vi /etc/fstab #追加内容 10.2.4.51:/home/nfs_data /home/nfs_data/ nfs sync,noac 0 0

3 文件实时监听同步

3.1 SSH互信配置

主服务器和从服务分别生成自己的公钥,命令如下

ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa  # 生成证书
cd ~/.ssh/ #切换目录
touch authorized_keys #生成认证文件
cat id_rsa.pub >>authorized_keys #复制公钥到认证文件
scp authorized_keys 10.2.4.52:/root/.ssh #远程复制自己公钥到对方服务器
service sshd restart #重启SSH服务

主服务器和从服务器 authorized_keys 文件,保存所有
需要免密登录
服务器的公钥信息即
id_rsa.pub
文件中的值

3.2 同步软件安装

主服务器和从服务器同时安装应用包

yum -y install inotify-tools 
yum -y install unison #author: herbert qq:464884492

主服务器从服务器在相同路径建立需要实时共享的目录

mkdir /home/sync_data

3.3 同步脚本编写

主服务器(10.2.4.51)监听同步脚本,文件名 /home/runfilesync.sh

#/bin/bash
dstIp="10.2.4.52"
src="/home/sync_data"
dst="/home/sync_data"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do
/usr/bin/unison -batch $src ssh://$dstIp/$dst
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done   

从服务器(10.2.4.52)监听同步脚本,文件名 /home/runfilesync.sh

#/bin/bash
dstIp="10.2.4.51"
src="/home/sync_data"
dst="/home/sync_data"
/usr/bin/inotifywait -mrq -e create,delete,modify,move $src | while read line; do
/usr/bin/unison -batch $src ssh://$dstIp/$dst
echo -n "$line " >> /var/log/inotify.log
echo `date | cut -d " " -f1-4` >> /var/log/inotify.log
done  

3.4 运行脚本,开机自起

脚本需要后台运行,启动命令如下

nohup sh /home/runfilesync.sh & 
ps -aux | grep runfilesync #检查脚本是否在运行
#设置开机启动 author: herbert qq:464884492
crontab -e #追加内容  @reboot  /home/runfilesync.sh

4 效果测试

  1. 在主服务器 /home/nfs_data 和 /home/sync_data 两个文件夹中分别添加
    touch 地心侠士.txt
    ,然后ssh到从服务,可以在从服务器这两个文件夹中找到
    地心侠士.text
  2. 在从服务器 /home/nfs_data 和 /home/sync_data 两个文件夹中分别添加
    touch 小院不小.txt
    ,然后ssh到主服务,可以在主服务器这两个文件夹中找到
    小院不小.text

5 总结

通过软件或者协议实现实时同步,以上两种方法各有优劣.采用NFS网络共享协议,必须指定一个网络主节点.采用inotify+unison方式,有点分布式的感觉,无需指定主节点,但同步效果方面和稳定性方面会差一些
文件监听同步软件
inotify

unison
安装需要编译环境,安装时比较麻烦.我这里提供了
rpm
安装包以及对应依赖包(安装命令
rpm -ivh xxx.rpm
).如果需要请关注公众号[
小院不小
],回复
sync
获取下载连接,或者添加QQ:464884492,获取
小院不小
闲暇之余,做了一款有趣耐玩的消除类微信小游戏
地心侠士
,有兴趣可到微信搜索
地心侠士
玩玩,感谢支持