分布式系统的设计几个要注意的地方

简介:

最近在做系统升级,由于当时设计的局限,导致系统不停服,保证服务的做法非常麻烦。当时再定方案的时候,由于自己在这方面没有经验,导致有些乐观。到了实际做的时候,预期时间至少比预想的多了一周的时间,要知道,在

互联网公司,一周的时间是个非常长的时间。而这一周,还包括了OT。

在这里总结一下分布式系统设计的大忌,本来想试着分一下级,但是还是算了,一来标准太多,无法制定一个合适的规则来界定;二来自己的经验也在增长,低调一下是自己也没详细的研究过超过5个分布式系统;三来做事情还是要严谨,不做没有十足把握的事情。

1. 服务接口的设计至关重要

   虽然大家口口声声说对于一个集群来说,每台机器都可能出故障。但是做方案设计的时候,某些资源却向用户直接暴漏了服务的实际地址。对于一个服务几年的服务器来说,故障的可能性非常大,尤其是如果这个服务器的平时负载比较高的话。我不清楚一台服务器的平均保修时间是多少,但是绝对不可能是几个小时能搞定的,这个时间少则一天,多则半个月甚至更长。对于一些高级的用户,它会使用本地的cache,或者其他的策略来屏蔽调用服务不可用带来的影响,但是,几天的停服对于用户方的影响是无论如何不可能忽略的。

这种问题发现后,可能简单的发布一个新版本的api,或者一个简单的配置文件就可以纠正。但是对于线上用户来说,他们运行的是一个一直都在running状态的服务。这个简单的改正可能需要他们服务重启,这对于一个大型的集群来说,带来的成本非常高。如果是因为这个服务的不可用导致了线上事故,那么应用方肯定会非常主动的去修正这个错误。但是如果使用架构方发现了这个问题,而主动推动应用方去修改,可能应用方会因为各种原因而推脱。

因此,设计服务的接口一定要注意,这个接口一定要是稳定的,而且后台服务的故障,升级等操作绝对对于用户要是透明的。不要将服务的实际地址暴漏给用户方:这台服务器终有一天会挂掉。尤其是对于C++等需要编译的api来说,这个接口就更加重要了。毕竟api的修改对于应用方来说意味着要重新编译;重新编译意味着要重新走一下发布流程:至少要提测吧。

2. 后台升级要做到对用户透明

这实际上是又是一句大家都知道的。但是设计时确实有时候会忽略。对于弹性计算系统来说,服务的伸缩是必须的,这个也是设计的目标之一。但是对于一些小规模的计算集群来说,可能大家认为伸缩不是最重要的feature。最重要的feature就是能够快速的完成系统设计和实现,为用户服务。但是实际上,这个通过一些简单的修改,就可以完成:Worker上带一个agent和master或者meta server通信,保持心跳。心跳超时的Worker会被下线,以后的服务都不会发送到这个Worker上来。而新加入的Worker则会加入集群接收计算任务。这个不单是应对服务的伸缩,也是为了应对机器的故障。因此不用太大的改动,就可以将一个系统从山寨提升到真正的可用。

一个系统的服务质量,不是说在一般情况下的服务是可靠的,除了网络丢包、网络传输造成的问题外,服务质量可以做到10000个请求至多有1个失败就是说这个系统是可用的。评价服务质量的另外一个重要指标是全年可服务时间。这个要将机器故障,机房故障考虑在内。如果依赖于运行环境没有问题,才能达到99.99,那么这个服务就有点山寨,对于重要的应用方来说,这种服务不可接受。

 

3. 应用方设计时候需要衡量后台服务失败的影响

如果服务的可靠性要求非常高,比如是直接面向互联网用户的,要求任何时间都能够对互联网用户提供服务,那么就需要在调用服务时做下服务不可用的预案。甚至做下超时机制:如果服务调用指定时间不返回,那么需要有其余的逻辑来替代。

 

当然了本次还遇到很多其他的痛点,每个都是设计上得小瑕疵,当时注意的话不会增加工作量,或者增加很少的工作量就可以做到可用。互联网强调快,那么底线应该是可用吧。易用可能是更要的要求。当然了这个可能可以一种互联网风格,就是一个事情可以快速做完,快速上线。当时上线时候也做了二期需要做的改进,但是后台发现上线效果好,符合预期。又去做其它高优先级的事情去了。导致原来设计的局限就永远的停留在那里了,这就是为后来人埋下一个坑。。

本次升级的时候,由于信息的不一致导致一台服务器停服,导致大面积的失败。后来为了避免其它的集群出现类似的问题,因此所有的信息都重新确认了一遍。而这带来了半天的枯燥工作。因此,自己做设计的时候,一定要注意,不求最好,但求可用,在机器故障,服务升级,对于用户来说,服务都可用。

BTW,正在做一个架构的设计,细节是魔鬼,正在和魔鬼做斗争。


目录
相关文章
|
11月前
|
存储 分布式计算 运维
大白话讲讲分布式存储系统的架构设计以及容错架构
分布式存储系统的架构设计旨在实现数据的分布式存储和负载均衡,通常采用数据分片和多节点存储的方式。容错架构则是为了提高系统的鲁棒性和可用性。在分布式存储系统中,容错架构常采用数据的冗余备份来应对节点故障或网络异常问题。通过复制数据到多个节点,即使某个节点发生故障,系统仍可以提供数据的可靠访问。此外,容错架构还包括故障检测和自动故障转移机制,用于及时检测节点故障,并将故障节点的任务转移给其他正常节点。这样可以保证系统在故障情况下仍能正常运行,并提供不间断的数据访问。通过合理的架构设计和有效的容错机制,分布式存储系统可以实现高可用性和数据可靠性,满足大规模数据存储和访问的需求。
658 0
大白话讲讲分布式存储系统的架构设计以及容错架构
|
存储 弹性计算 缓存
「分布式架构」“一切都是分布式”说最终一致性
「分布式架构」“一切都是分布式”说最终一致性
|
设计模式 前端开发 Java
Tomcat源码-换个角度看架构和核心流程
Tomcat源码-换个角度看架构和核心流程
Tomcat源码-换个角度看架构和核心流程
|
Web App开发 监控 UED
《分布式系统:概念与设计》一1.2 分布式系统的例子
本节书摘来华章计算机《分布式系统:概念与设计》一书中的第1章 ,第1.2节,(英) George Coulouris Jean DollimoreTim Kindberg Gordon Blair 著 金蓓弘 马应龙 等译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
3222 0
|
存储 运维 资源调度
二十一、HadoopHA工作机制(高可用)
二十一、HadoopHA工作机制(高可用)
二十一、HadoopHA工作机制(高可用)
|
前端开发 Java Devops
面试官:SOA 和微服务的区别?这回终于搞清楚了!
如果我们打开支付宝首页,去看我们的余额,它会展示你的总资产,昨日收益、累计收益等信息。假如这个页面所展示的信息,都来自各个不同的系统/应用,我们通过各个接口把这些数据展示出来。如果我们现在要在前端页面展示这几项数据的话,我们应该怎么去展示呢?
2065 0
面试官:SOA 和微服务的区别?这回终于搞清楚了!
|
设计模式 架构师 Cloud Native
架构设计的本质
实际上架构只是系统设计里面的一个重要环节,除了架构还包含了商业诉求,业务建模,系统分析,系统设计等重要领域。本文尝试从更高视角重新审视架构设计的工作,把架构设计的上升到系统设计的立体空间去探索,最终勾勒出系统设计的全域知识体系。
14094 0
架构设计的本质
|
存储 算法 NoSQL
分布式系统全局发号器的几点思考
云栖号资讯:【点击查看更多行业资讯】在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! 为什么需要发号器 在分布式系统中,经常需要对大量的数据、消息、http 请求等进行唯一标识,例如:对于分布式系统,服务间相互调用需要唯一标识,调用链路分析,日志追踪的时候需要使用这个唯一标识。
分布式系统全局发号器的几点思考
|
存储 缓存 NoSQL
详谈分布式系统缓存的设计细节
在分布式Web程序设计中,解决高并发以及内部解耦的关键技术离不开缓存和队列,而缓存角色类似计算机硬件中CPU的各级缓存。如今的业务规模稍大的互联网项目,即使在最初beta版的开发上,都会进行预留设计。但是在诸多应用场景里,也带来了某些高成本的技术问题,需要细致权衡。
1481 0
|
存储 消息中间件 缓存
[原创]分布式系统之缓存的微观应用经验谈(一) 【设计基础细节篇】
近几个月一直在忙些琐事,几乎年后都没怎么闲过。忙忙碌碌中就进入了2018年的秋天了,不得不感叹时间总是如白驹过隙,也不知道收获了什么和失去了什么。最近稍微休息,买了两本与技术无关的书,其一是Yann Martel 写的《The High Mountains of Portugal》(葡萄牙的高山),发现阅读此书是需要一些耐心的,对人生暗喻很深,也有足够的留白,有兴趣的朋友可以细品下。
1347 0