构建高可用性架构的关键要素与实践
一、引言
随着技术的不断发展和业务需求的日益增长,高可用性(High Availability,简称HA)架构已成为企业和组织关注的重要领域。
高可用性架构旨在确保系统、网络或服务在面临硬件故障、软件错误、网络中断等情况下,仍能保持较高的稳定性和可用性。
本文将详细介绍构建高可用性架构的关键要素与实践,帮助读者了解如何实施高可用性实现方案。
二、高可用性架构的关键要素
1. 冗余设计
冗余设计是高可用性架构的核心思想之一。
通过增加额外的组件、设备或系统,以应对可能出现的故障。
例如,服务器集群、负载均衡器、热备系统等,均属于冗余设计的范畴。
当主节点出现故障时,冗余组件可以迅速接管工作,保证系统正常运行。
2. 负载均衡
负载均衡技术可以分散网络或系统的负载,避免单点压力过大导致的性能瓶颈或故障。
通过负载均衡器,可以将请求分发到多个服务器,实现负载的均衡分配。
动态路由、内容分发网络(CDN)等技术也有助于提高系统的可扩展性和可用性。
3. 自动化监控与故障恢复
高可用性架构需要实现自动化监控与故障恢复机制。
通过监控系统的运行状态,及时发现并处理潜在的问题。
当系统出现故障时,能够自动切换到备用系统或执行其他恢复操作,降低人工干预的需求。
4. 服务分解与微服务化
服务分解与微服务化是提高系统可用性的重要手段。
通过将系统划分为多个独立的微服务,每个服务都具有独立的功能和部署环境。
当某个服务出现故障时,其他服务仍然可以正常运行,从而提高系统的整体可用性。
三、高可用性实践方案
1. 设计分布式系统架构
分布式系统架构是实现高可用性的一种有效手段。
通过分布式的部署方式,将系统扩展到多个节点上,实现负载均衡和故障转移。
同时,采用消息队列、数据库分片等技术,提高系统的可扩展性和容错性。
2. 实施热备与冷备策略
热备策略是指主节点和备用节点同时运行,并实时同步数据。
当主节点出现故障时,备用节点可以迅速接管工作。
冷备策略则是指备用节点在正常情况下不参与工作,仅在主节点出现故障时被激活。
根据实际情况选择合适的备份策略,可以提高系统的可用性。
3. 采用容器化与云原生技术
容器化与云原生技术有助于提高系统的可靠性和弹性。
通过容器技术,可以实现应用的快速部署、扩展和管理。
云原生技术则可以使应用直接在云环境中运行,充分利用云计算的优势,提高系统的可用性和可扩展性。
4. 实施自动化运维与智能监控
自动化运维与智能监控是高可用性架构的重要组成部分。
通过自动化工具实现系统的部署、监控、故障排查和恢复等操作。
同时,利用智能监控技术实时分析系统的运行状态,预测潜在的问题,并采取相应的措施进行预防和处理。
四、总结与展望
高可用性架构是确保系统稳定运行的关键手段之一。
本文介绍了高可用性架构的关键要素与实践方案,包括冗余设计、负载均衡、自动化监控与故障恢复、服务分解与微服务化等方面的内容。
未来,随着技术的不断发展,高可用性架构将面临更多的挑战和机遇。
我们需要不断学习和探索新的技术与方法,以提高系统的可用性和稳定性,满足日益增长的业务需求。
什么是高可用
高可用
高可用是一种系统设计和运行的目标,旨在确保服务的持续可用性,即使面临硬件故障、软件故障或网络问题。
它旨在通过减少系统故障、快速恢复故障来最小化对用户使用的影响。
在分布式系统和在线服务领域,高可用性已成为重要的性能指标。
高可用性不仅仅是指服务的无故障运行时间的长短,还包括了快速响应和系统弹性能力的高低。
在实际应用场景中,高可用性的实现涉及多个方面。
首先,高可用性的核心在于系统的冗余设计和负载均衡策略。
通过冗余硬件和备份系统,当某个节点出现故障时,其他节点可以快速接管工作,从而避免服务中断。
负载均衡则能将工作负载分布到多个节点上,减少单一节点的压力,提高系统的整体性能。
此外,高可用性还包括了自动化的故障检测和恢复机制。
通过监控系统的运行状态,一旦检测到故障,系统能够自动进行故障定位、排除和恢复操作,减少人工干预的需要。
此外,高可用性的实现还需要考虑数据的可靠性和一致性。
通过数据备份和数据同步技术,确保数据的完整性和准确性,避免因数据丢失导致的服务中断。
为了实现高可用性,系统管理员需要对系统架构、技术选型、资源配置等关键要素进行细致规划和优化。
高可用性不仅是单一技术或组件的问题,更是一个涵盖软硬件、网络等多个层面的系统工程。
综上所述,高可用性是确保服务持续运行的关键要素,涵盖了冗余设计、负载均衡、自动故障检测与恢复、数据可靠性等多个方面,目的是提高系统应对各种故障的健壮性。
高可用性保证了用户使用体验和系统稳定性,是构建可靠服务的重要基础。
Postgresql集群高可用架构学习
PG集群高可用架构学习
PG集群的高可用性涉及流复制、自动故障转移、备份与恢复、监控和警报等关键要素。
本文从网络资源中整理出常用的高可用架构知识,进行学习归纳,包括Patroni、Repmgr、Pgpool-II、基于共享存储方案等。
Patroni是开源的PG集群管理工具,提供自动化高可用性和故障切换。
它基于zooKeeper、etcd或consul等分布式协调服务,监控主库状态并自动执行故障切换操作,确保PG集群的高可用性和连续性。
通过PG + etcd + Patroni + haproxy + keepalived实现高可用集群。
请求首先经过keepalived和haproxy负载均衡后转发。
Patroni监控和控制每个PG,将信息状态写入etcd。
Patroni通过读取etcd获取其他PG状态,判断是否可以作为主库,若能则尝试选举。
故障检测机制包括主库的patroni进程定期更新Leader key和TTL,如果异常导致更新失败,进行2次尝试。
若尝试无效且时间超过TTL,Leader key过期,触发新的选举。
库B和C的patroni在发现主库异常后,访问etcd创建密钥,C率先创建后执行promote,成为新主库,B成为新从库。
Repmgr用于管理和监控基于流复制的PG集群,主要提供repmgr和repmgrd工具。
在主库宕机时,备库通过多次尝试连接失败后,repmgrd在备库中选举候选备库提升为主库,其他备库连接新主。
选举候选备库顺序为LSN > Priority > Node_ID。
系统优先选举LSN较大的库,若LSN相同,根据Priority参数比较,优先级为0禁止提升。
若优先级一致,则比较库的Node ID,小者优先。
Pgpool-II作为客户端和PG数据库之间的中间件,提供管理和优化连接、高可用性、扩展性和负载均衡功能。
它在客户端与PG集群间增加一层,进一步处理请求。
共享存储方案
基于SAN(Storage Area Network)的方案,两台服务器共享磁盘,数据库数据文件存在共享文件系统上。
主/备库都可以访问此文件系统,主库文件系统挂载,备库未挂载。
主库故障时,备库挂载文件系统,完成切换。
高可用切换时,避免两台机器同时挂载,导致文件系统损坏,常用方法是让主库重启。
DRBD(Distributed Replicated Block Device)方案,实现主库数据变更自动复制到备库。
当主库发生故障,备库保留相同数据,继续使用。
主库接收数据后,DRBD检查数据,发现发往管理存储位置,复制另一份至本地存储。
主库故障时,备库在集群中成为新主库,存储接收到的数据,对外提供服务。
原主库恢复后,新主库将宕机后变动数据镜像到原主库,完成后返回成功/失败回应,分为三种复制模式。
开发自动化运维架构六要素
运维自动化是我们所渴望获得的,但是我们在一味强调自动化能力时,却忽略了影响自动化落地的一个关键因素。
那便是跟运维朝夕相处,让人又爱又恨的业务架构。
要点一:架构独立任何架构的产生都是为了满足特定的业务诉求,如果我们在满足业务要求的同时,能够兼顾运维对架构管理的非功能性要求。
那么我们有理由认为这样的架构是对运维友好的。
站在运维的角度,所诉求的架构独立包含四个方面:独立部署,独立测试,组件化和技术解耦。
独立部署指的是一份源代码,可以按照便于运维的管理要求去部署、升级、伸缩等,可通过配置来区分地域分布。
服务间相互调用通过接口请求实现,部署独立性也是运维独立性的前提。
独立测试运维能够通过一些便捷的测试用例或者工具,验证该业务架构或服务的可用性。
具备该能力的业务架构或服务让运维具备了独立上线的能力,而不需要每次发布或变更都需要开发或测试人员的参与。
组件规范指的是在同一个公司内对相关的技术能有很好的框架支持,从而避免不同的开发团队使用不同的技术栈或者组件,造成公司内部的技术架构失控。
这种做法能够限制运维对象的无序增加,让运维对生产环境始终保持着掌控。
同时也能够让运维保持更多的精力投入,来围绕着标准组件做更多的效率与质量的建设工作。
技术解耦指的是降低服务和服务之间相互依赖的关系,也包含了降低代码对配置文件的依赖。
这也是实现微服务的基础,实现独立部署、独立测试、组件化的基础。
要点二:部署友好DevOps 中有大量的篇幅讲述持续交付的技术实践,希望从端到端打通开发、测试、运维的所有技术环节,以实现快速部署和交付价值的目标。
可见,部署是运维日常工作很重要的组成部分,是属于计划内的工作,重复度高,必须提升效率。
实现高效可靠的部署能力,要做好全局规划,以保证部署以及运营阶段的全方位运维掌控。
有五个纬度的内容是与部署友好相关的:CMDB配置在每次部署操作前,运维需要清晰的掌握该应用与架构、与业务的关系,为了更好的全局理解和评估工作量和潜在风险。
在织云自动化运维平台中,我们习惯于将业务关系、集群管理、运营状态、重要级别、架构层等配置信息作为运维的管理对象纳管于CMDB配置管理数据库中。
这种管理办法的好处很明显,集中存储运维对象的配置信息,对日后涉及的运维操作、监控和告警等自动化能力建设,将提供大量的配置数据支撑和决策辅助的功效。
环境配置在运维标准化程度不高的企业中,阻碍部署交付效率的原罪之一便是环境配置,这也是容器化技术主要希望解决的运维痛点之一。
腾讯的运维实践中,对开发、测试、生产三大主要环境的标准化管理,通过枚举纳管与环境相关的资源集合与运维操作,结合自动初始化工具以实现标准环境管理的落地。
依赖管理解决应用软件对库、运营环境等依赖关系的管理。
在织云实践经验中,我们利用包管理,将依赖的库文件或环境的配置,通过整体打包和前后置执行脚本的方案,解决应用软件在不同环境部署的难题。
业界还有更轻量的容器化交付方法,也是不错的选择。
部署方式持续交付原则提到要打造可靠可重复的交付流水线,对应用软件的部署操作,我们也强烈按此目标来规划。
业界有很多案例可以参考,如Docker的Build、Ship、Run,如织云的通过配置描述、标准化流程的一键部署等等。
发布自测发布自测包含两部分:应用的轻量级测试;发布/变更内容的校对。
建设这两种能力以应对不同的运维场景需求,如在增量发布时,使用发布内容的校对能力,运维人员可快速的获取变更文件md5,或对相关的进程和端口的配置信息进行检查比对,确保每次发布变更的可靠。
同理,轻量级测试则是满足发布时对服务可用性检测的需求,此步骤可以检测服务的连通性,也可以跑些主干的测试用例。
灰度上线在《日常运维三十六计》中有这么一句话:对不可逆的删除或修改操作,尽量延迟或慢速执行。
这便是灰度的思想,无论是从用户、时间、服务器等纬度的灰度上线,都是希望尽量降低上线操作的风险,业务架构支持灰度发布的能力,让应用部署过程的风险降低,对运维更友好。
要点三:可运维性运维脑海中最理想的微服务架构,首当其冲的肯定是可运维性强的那类。
不具可运维性的应用或架构,对运维团队带来的不仅仅是黑锅,还有对他们职业发展的深深的伤害,因为维护一个没有可运维性的架构,简直就是在浪费运维人员的生命。
可运维性按操作规范和管理规范可以被归纳为以下七点:配置管理在微服务架构管理中,我们提议将应用的二进制文件与配置分离管理,以便于实现独立部署的目的。
被分离出来的应用配置,有三种管理办法:文件模式;配置项模式;分布式配置中心模式。
限于篇幅不就以上三种方式的优劣展开讨论。
不同的企业可选用最适用的配置管理办法,关键是要求各业务使用一致的方案,运维便可以有针对性的建设工具和系统来做好配置管理。
版本管理DevOps持续交付八大原则之一“把所有的东西都纳入版本控制”。
就运维对象而言,想要管理好它,就必须能够清晰的描述它。
和源代码管理的要求类似,运维也需要对日常操作的对象,如包、配置、脚本等都进行脚本化管理,以备在运维系统在完成自动化操作时,能够准确无误的选定被操作的对象和版本。
标准操作运维日常有大量重复度高的工作需要被执行,从精益思想的视角看,这里存在极大的浪费:学习成本、无价值操作、重复建设的脚本/工具、人肉执行的风险等等。
倘若能在企业内形成统一的运维操作规范,如文件传输、远程执行、应用启动停止等等操作都被规范化、集中化、一键化的操作,运维的效率和质量将得以极大的提升。
进程管理包括应用安装路径、目录结构、规范进程名、规范端口号、启停方式、监控方案等等,被收纳在进程管理的范畴。
做好进程管理的全局规划,能够极大的提升自动化运维程度,减少计划外任务的发生。
空间管理做好磁盘空间使用的管理,是为了保证业务数据的有序存放,也是降低计划外任务发生的有效手段。
要求提前做好的规划:备份策略、存储方案、容量预警、清理策略等,辅以行之有效的工具,让这些任务不再困扰运维。
日志管理日志规范的推行和贯彻需要研发密切配合,在实践中得出的经验,运维理想中的日志规范要包含这些要求:业务数据与日志分离日志与业务逻辑解耦日志格式统一返回码及注释清晰可获取业务指标(请求量/成功率/延时)定义关键事件输出级别管理方案(存放时长、压缩备份等)当具体上述条件的日志规范得以落地,开发、运维和业务都能相应的获得较好的监控分析能力。
集中管控运维的工作先天就容易被切割成不同的部分,发布变更、监控分析、故障处理、项目支持、多云管理等等,我们诉求一站式的运维管理平台,使得所有的工作信息能够衔接起来和传承经验,杜绝因为信息孤岛或人工传递信息而造成的运营风险,提升整体运维管控的效率和质量。
要点四:容错容灾在腾讯技术运营(运维)的四大职责:质量、效率、成本、安全。
质量是首要保障的阵地,转换成架构的视角,运维眼中理想的高可用架构架构设计应该包含以下几点:负载均衡无论是软件或硬件的负责均衡的方案,从运维的角度出发,我们总希望业务架构是无状态的,路由寻址是智能化的,集群容错是自动实现的。
在腾讯多年的路由软件实践中,软件的负载均衡方案被广泛应用,为业务架构实现高可用立下汗马功劳。
可调度性在移动互联网盛行的年代,可调度性是容灾容错的一项极其重要的运维手段。
在业务遭遇无法立刻解决的故障时,将用户或服务调离异常区域,是海量运营实践中屡试不爽的技巧,也是腾讯QQ和微信保障平台业务质量的核心运维能力之一。
结合域名、VIP、接入网关等技术,让架构支持调度的能力,丰富运维管理手段,有能力更从容的应对各种故障场景。
异地多活异地多活是数据高可用的诉求,是可调度性的前提。
针对不同的业务场景,技术实现的手段不限。
腾讯社交的实践可以参考周小军老师的文章“2亿QQ用户大调度背后的架构设计和高效运营”。
主从切换在数据库的高可用方案中,主从切换是最常见的容灾容错方案。
通过在业务逻辑中实现读写分离,再结合智能路由选择实现无人职守的主从切换自动化,无疑是架构设计对DBA最好的馈赠。
柔性可用“先扛住再优化”是腾讯海量运营思想之一,也为我们在做业务架构的高可用设计点明了方向。
如何在业务量突增的情况下,最大程度的保障业务可用?是做架构规划和设计时不可回避的问题。
巧妙的设置柔性开关,或者在架构中内置自动拒绝超额请求的逻辑,能够在关键时刻保证后端服务不雪崩,确保业务架构的高可用。
要点五:质量监控保障和提高业务质量是运维努力追逐的目标,而监控能力是我们实现目标的重要技术手段。
运维希望架构为质量监控提供便利和数据支持,要求实现以下几点:指标度量每个架构都必须能被指标度量,同时,我们希望的是最好只有唯一的指标度量。
对于业务日趋完善的立体化监控,监控指标的数量随之会成倍增长。
因此,架构的指标度量,我们希望的是最好只有唯一的指标度量。
基础监控指的是网络、专线、主机、系统等低层次的指标能力,这类监控点大多属于非侵入式,很容易实现数据的采集。
在自动化运维能力健全的企业,基础监控产生的告警数据绝大部分会被收敛掉。
同时,这部分监控数据将为高层次的业务监控提供数据支撑和决策依据,或者被包装成更贴近上层应用场景的业务监控数据使用,如容量、多维指标等。
组件监控腾讯习惯把开发框架、路由服务、中间件等都统称为组件,这类监控介于基础监控和业务监控之间,运维常寄希望于在组件中内嵌监控逻辑,通过组件的推广,让组件监控的覆盖度提高,获取数据的成本属中等。
如利用路由组件的监控,运维可以获得每个路由服务的请求量、延时等状态和质量指标。
业务监控业务监控的实现方法分主动和被动的监控,即可侵入式实现,又能以旁路的方式达到目的。
这类监控方案要求开发的配合,与编码和架构相关。
通常业务监控的指标都能归纳为请求量、成功率、延时3种指标。
实现手段很多,有日志监控、流数据监控、波测等等,业务监控属于高层次的监控,往往能直接反馈业务问题,但倘若要深入分析出问题的根源,就必须结合必要的运维监控管理规范,如返回码定义、日志协议等。
需要业务架构在设计时,前置考虑运维监控管理的诉求,全局规划好的范畴。
全链路监控基础、组件、业务的监控手段更多的是聚焦于点的监控,在分布式架构的业务场景中,要做好监控,我们必须要考虑到服务请求链路的监控。
基于唯一的交易ID或RPC的调用关系,通过技术手段还原调用关系链,再通过模型或事件触发监控告警,来反馈服务链路的状态和质量。
该监控手段属于监控的高阶应用,同样需要业务架构规划时做好前置规划和代码埋点。
。
质量考核任何监控能力的推进,质量的优化,都需要有管理的闭环,考核是一个不错的手段,从监控覆盖率、指标全面性、事件管理机制到报表考核打分,运维和开发可以携手打造一个持续反馈的质量管理闭环,让业务架构能够不断进化提升。
要点六:性能成本在腾讯,所有的技术运营人员都肩负着一个重要的职能,就是要确保业务运营成本的合理。
为此,我们必须对应用吞吐性能、业务容量规划和运营成本都要有相应的管理办法。
吞吐性能DevOps持续交付方法论中,在测试阶段进行的非功能需求测试,其中很重要一点便是对架构吞吐性能的压测,并以此确保应用上线后业务容量的健康。
在腾讯的实践中,不仅限于测试阶段会做性能压测,我们会结合路由组件的功能,对业务模块、业务SET进行真实请求的压测,以此建立业务容量模型的基准。
也从侧面提供数据论证该业务架构的吞吐性能是否达到成本考核的要求,利用不同业务间性能数据的对比,来推动架构性能的不断提高。
容量规划英文capacity一词可以翻译成:应用性能、服务容量、业务总请求量,运维的容量规划是指在应用性能达标的前提下,基于业务总请求量的合理的服务容量规划。
运营成本减少运营成本,是为公司减少现金流的投入,对企业的价值丝毫不弱于质量与效率的提升。
腾讯以社交、UGC、云计算、游戏、视频等富媒体业务为主,每年消耗在带宽、设备等运营成本的金额十分巨大。
运维想要优化运营成本,常常会涉及到产品功能和业务架构的优化。
因此,运维理想的业务架构设计需要有足够的成本意识,小结本文纯属个人以运维视角整理的对微服务架构设计的一些愚见,要实现运维价值最大化,要确保业务质量、效率、成本的全面提高,业务架构这块硬骨头是不得不啃的。
运维人需要有架构意识,能站在不同角度对业务架构提出建议或需求,这也是DevOps 精神所提倡的,开发和运维联手,持续优化出最好的业务架构。
专业高防云服务器,高防物理机!QQ262730666,VX:13943842618,因为专业所以专注!