构建健壮的大规模分布式系统

构建健壮的大规模分布式系统

实际的生产环境中,经常会由于机器故障、机房掉电、网络异常、软件bug等原因,造成整个系统中某台机器、某些集群异常,无法提供稳定的服务;而系统也可能因为某些突发事件、外部攻击等原因,出现流量瞬间的大幅度增长,超过系统承载能力。因此,在系统设计时,需要充分的考虑系统的优雅降级、流量控制等。最近阅读了不少相关的文档,本文进行了整理,列举了一些构建大规模分布式服务的design principle如下。

Design Target

在设计初期,就需要充分考虑可扩展性、系统的可用性、运维和管理的便捷性以及成本,几点说明如下:

  • Scalability : Resource usage increase linearly(or better!) with load
  • Availability : Resilience to partial failure, Graceful degradation, Recoverability from failure
  • Manageability : Simplicity, Maintainability, Diagnostics
  • Cost : Machine cost and Operation cost

System Availability

系统的可用度指标,需要明确两个指标MTBF和MTTR,定义如下

  • MTBR : Mean Time Between Failure (系统平均故障间隔时间)
  • MTTR : Mean Time To Repair(系统平均修复时间)

image

系统的可用度Availability = MTBF / (MTBF + MTTR),因此,要提高系统的可用度,一方面要降低故障概率(理论上可无限降低,但实际上肯定不会为0),更重要的一方面,需要提升系统的修复速度,如重启时间等。

Design for failure

实际生产环境中,由于硬件老化、机房掉电、网络拥塞等,任何可能情况就会出现。所有的操作,都有可能故障,读写文件、读写网络等等。在系统设计和开发时,需要考虑任何失败下的异常处理。

  • Assume every operation will fail and resource may be unavailable
  • Simple failure recovery path and tested frequently. never shutdown service normal, hard-fail for test.
  • Be restartable at any time, Start fast.
  • Decouple components, Fail fast, Isolate failures
  • Allow emergency human intervention

Partition the service

要构建强健的分布式服务,首先需要能够将整个服务进行拆分,分成不同的组件,进行故障隔离和恢复,动态的调整每个部件的容量,来保障服务的稳定性。

Functional Segmentation : Decouple different functional areas; Scale each component independently

Horizontal Split : Split strategies(Modulo,Range-based) ; Aggregation/Routing Proxy

Micro-partitions : load balancing, failure-recovery

Selective replication : Additional replicas to spread the load of hot partitions

Automation

大规模分布式集群管理中,自动化非常重要,随着集群规模的不断扩大,频繁的故障的异常、机器的上架与下架、服务部署和重启,这些工作是无法靠几个人手工完成的,需要自动化集群管理工具,来完成以上的工作,并保证系统的稳定。

  • Service fail more frequently with system scale-up/out
  • Automatic deployment and provisioning
    • Failover fast, deploy new instance
    • Configuration and code as a unit, keep deployment simple
  • Staged rollout—scale-unit
    • Split scale-unit with 1%, 5%, 10%, 20%, 50%, 100%
    • each rollout with a scale-unit
  • Automatic rollback when exception based on error-detection

Monitor Everything

监控的重要性非常重要,才能保证系统出现大规模异常的前期和初期,进行快速定位修复,避免更大的损失,以下列举需要监控的部分内容。

  • Performance of all operations and specific span
  • All the input data
  • Log with warn/fatal/error level
  • Fault tolerance mechanisms(系统中自动的一些降级操作等,也需要监控,明确当前系统的运行状态)
    • Retry
    • Turn-off/on advanced function
    • Drop request

为了支持这种完善这样的监控,需要系统在设计时充分考虑Trace的需求,具体可以参考Google的Dapper论文,而Twitter的Zipkin是基于这个论文的一个开源版本实现。

Failure Detection

除了数据监控,还需要通过日志等来进行实时预警发现系统中存在的异常,以及通过挖掘系统中的日志,寻找关联来发现更为深层次的原因,Ebay的Lessons给了我们一个样例:

  • Log requests, response, exception and external resource activity
  • Message broadcast on message bus
  • Listener automate failure detection and notification
    • Real-time state monitoring : exception and alert
    • Historical reports

image

Quick Diagnose

数据监控、异常报警都快速的告知我们当前系统的运行状态,以及存在出现了部分异常,而异常的原因定位则更为关键,只有定位了根本原因才能快速的修复,缩短MTTR时间。

  • Give the detail information to diagnose
    • 500 requests failed is bad
    • Here is the requests list and when they happened
  • Chain of evidence : The path from beginning to the end of request
  • Debugging in the production
    • Support online debug
    • Get the snapshot of specific modules, shipping it out of production
    • Configurable logging
  • Maintain and inspect interface
    • Restful interface based on http
    • Running data with key-value pair output

Audit

最后是系统的审计(即任何影响系统的改动,如自动的数据更新、手动的修改部署等,都需要明确的记录并且方便的Dashboard查看,任何故障都是有原因的,绝大多数情况下,如果某个操作和故障的起始时间点match,这个操作或更新的嫌疑就非常大了。

  • Configuration audit trail
    • Audit Configuration/Binary/Data changes
    • What, when, who, which instances
  • Dynamic data update history

Alert is an art

报警是一个非常需要好好把握尺度的事情,包括报警的阈值、报警的接收人等,需要绝对的保证不漏报,尽可能不误报,并且减少不必要的打扰。

  • Minimal receivers of alert
  • Alerts-to-trouble ticket ratio(with a goal of near one)
  • Number of systems health issues without corresponding alerts.

参考的文章列表如下:

On Designing and Deploying Internet-Scale ServicesLessons from eBayMicrosoft AutopilotGoogle Dapper


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分布式数据库系统的分布透明性是指用户或应用程序对分布式数据库系统不需要知道底层数据的分布情况,就可以像访问本地数据库一样访问分布式数据库中的任何一个数据。分布透明性是分布式数据库系统的一个重要特性,其目的是降低用户和应用程序访问分布式数据库的复杂度,提高分布式数据库系统的易用性和可靠性。 分布透明性包括以下几个方面: 1. 位置透明性:用户或应用程序不需要知道数据在分布式数据库系统中的物理位置,就可以访问数据。系统会自动将请求路由到正确的节点,从而实现透明的数据访问。 2. 访问透明性:用户或应用程序无需知道访问数据的方式和方法,系统会自动处理数据的访问请求并返回正确的结果。这使得用户和应用程序可以像访问本地数据库一样访问分布式数据。 3. 复制透明性:系统可以在多个节点之间自动复制数据,用户或应用程序无需知道数据是否被复制,也无需关心数据的一致性问题。系统会自动处理数据的复制和同步,保证数据的一致性和可用性。 4. 故障透明性:当系统中的某个节点出现故障或失效时,系统会自动将请求路由到其他可用节点上,从而保证系统的可用性和健壮性。用户或应用程序无需知道节点的状态或故障信息,系统会自动处理故障问题。 综上所述,分布透明性是分布式数据库系统的一个重要特性,它使得用户和应用程序可以无缝地访问分布式数据,而无需关心数据的物理位置、访问方式、复制和同步、故障处理等问题,从而提高了分布式数据库系统的易用性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值