使用一些技术比如:熔断(circuit breaker)、超时设定(timeouts)、握手信号(handshaking)、舱壁(bulkheads)来帮助我们保护这些系统集成之前的问题。
熔断模式(circuit breaker)如电路熔断,如果一条线路电压过高,保险丝会熔断,防止火灾。放到我们的系统中,如果某个目标服务调用慢或者有大量超时,此时,熔断该服务的调用,对于后续调用请求,不在继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。
舱壁模式(bulkheads)该模式像舱壁一样对资源或失败单元进行隔离,如果一个船舱破了进水,只损失一个船舱。比如采用微服务是首选,比如Docker。Docker是进程隔离的,单个 Docker失效不会影响其他Docker容器。或者把大的并行处理工作,由多个线程池来负荷分担。
当然,如果当它开始工作的时候,说明我们的系统出现了比较大的问题,需要我们去调查分析。
注意那些不能看到代码的组件、依懒项以及共享的资源。除了有正确的开发和测试流程以外,还应该尽量使用和真实生产环境一样的数据、以及硬件网络配置来进行测试。
跟踪系统的响应来防止一些比较常见的问题比如服务不可用的情况,留意系统的平均响应时间,当它有异常的时候需要寻找原因以及采取相应的行动。
搭建日志、监控、以及系统操作的自动化操作平台。由于微服务相对来说较独立,可以更方便检测失败 所以监控起来会更容易一些。一些比较不错的方式是在收集和分析日志的时候使用关联ID、通用日志数据格式等。注意日志数据可能会非常庞大,所以要审核日志的时间周期,定义对日志进行归档。另外还有一些不错的工具可以将数据可视化在页面中,可以更直观的看到一些重要的进程。
为了保证服务的更新不会影响客户端的使用,对于服务的版本控制也是非常重要的。有些情况下同时运行不同版本的服务也是很常见的情形,我们要做好长期向后兼容的准备。
务必要记住的事情
大多数情况下我们并不是从零开始去构建,而是在现有的系统上继续添砖加瓦,而原有的系统在开发、运维、以及架构灵活性上都存在一些问题。想必很多优秀的开发人员在经历这样的情况的时候,都会想去拆解、重构整个系统,但是我们需要谨慎地来完成这个事情。当系统以错误的方式成拆分成组件或者服务单元之后也是一件很危险的事情 。
大多数系统在一开始的时候都是一个单体应用,后来不断地被拆解成为微服务。下面有一些基本的理念可以在我们做拆解地时候当作基准:
在开始拆分前了解具体的业务需求和业务领域
注意一些和其它业务共享的功能和数据,它们需要被正确地模块化
这种迁移和升级适合一步一步、一点一点地来完成,仅仅做当前最合适的事情
在开始之前很好地理解业务领域的范围及边界,因为对边界的调整将是非常昂贵的
对于改造有清晰的结构此次会涉及到哪些团队的调整
人、团队、和组织的影响
这个话题太大,大到我们需要专门写一篇文章来细述。在这里简单地概括一下,在本文中我们所提到的架构的灵活性以及稳健的开发、测试、运维等流程都会影响企业的组织结构。合适的组织结构能够给团队更大的灵活性并且更有机会持续地创新,在这种组织结构下,团队可以根据自己的节奏来工作。
组织不应该按技术来拆分团队,比如前端团队、移动端团队、后端团队或者根据不同的技术语言拆分团队等,而是应该按照微服务来拆分团队(也可以理解为按独立的业务单元来拆分)。这样在一个团队里面就会包含各种不同的技术,可以用不同的语言来实现服务,这也给团队更多的自由和自主权。
如何实践?
Docker
Docker Swarm
Kubernetes
Mesos
Serf
Nomad
Jenkins
Terraform
Vagrant
Packer
Otto
Chef、Puppet、 Ansible
Edda
Archaius
Decider
ZooKeeper
Eureka
Prana
Finagle
ZooKeeper
Consul
Denominator
Zuul
Netty
Ribbon
HAProxy
NGINX
Hystrix
Consul health checks
Zipkin
Pytheus
SALP
Elasticsearch logstash
Protocol Buffers
Thrift
JSON/XML/Other text
一些关于以上工具的介绍
由于本文涉及到大量的开源组件,下面简单列举一些以借鉴(部分内容来自于互联网)。
Swarm发布于2014.12的DockerCon,用以管理Docker集群,并将其抽象为一个虚拟整体暴露给用户。其架构以及命令比较简单,同时也为希望管理Docker集群的Docker爱好者降低了学习和使用门槛。
Kubernetes是Google开源的容器集群管理系统,其提供应用部署、维护、 扩展机制等功能,利用Kubernetes能方便地管理跨机器运行容器化的应用。
Apache Mesos是由加州大学伯克利分校的AMPLab首先开发的一款开源群集管理软件,支持Hadoop、ElasticSearch、Spark、Storm 和Kafka等应用架构。
Aurora 也是Apache的开源项目之一,是长期运行服务和计划作业的 Mesos 框架。Aurora 通过一个共享机器池运行应用和服务,并且负责保持它们的运行,知直到永远。当机器失效的时候,Aurora 会智能的重新规划这些作业到健康的机器上。
Vagrant是一个基于Ruby的工具,用于创建和部署虚拟化开发环境。它 使用Oracle的开源VirtualBox虚拟化系统,使用 Chef创建自动化虚拟环境。
Packer是一个开源工具,用于从单一配置来源为多平台创建相同的机器映像。目前支持的平台包括Amazon EC2、DigitalOcean、OpenStack、VirtualBox和VMware。
Terraform 是一个安全和高效的用来构建、更改和合并基础架构的工具。采用 Go 语言开发。Terraform 可管理已有的流行的服务,并提供自定义解决方案。
Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较为简单。Consul用Golang实现,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。
Eureka 是一个基于 REST 的服务,它主要是用于定位服务,以实现 AWS 云端的负载均衡和中间层服务器的故障转移。
Ribbon 是 Netflix 发布的云中间层服务开源项目,其主要功能是提供客户侧软件负载均衡算法。
Zuul 是提供动态路由,监控,弹性,安全等的边缘服务。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。Zuul 可以适当的对多个 Amazon Auto Scaling Groups 进行路由请求。
Finagle是Twitter基于Netty开发的支持容错的、协议无关的RPC框架,该框架支撑了Twitter的核心服务。
Zipkin 是 Twitter 的一个开源项目,允许开发者收集 Twitter 各个服务上的监控数据,并提供查询接口。该系统让开发者可通过一个 Web 前端轻松的收集和分析数据,例如用户每次请求服务的处理时间等,可方便的监测系统中存在的瓶颈。
Hystrix旨在通过控制那些访问远程系统、服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。Hystrix具备拥有回退机制和断路器功能的线程和信号隔离,请求缓存和请求打包(request collapsing,即自动批处理,译者注),以及监控和配置等功能。Hystrix源于Netflix API团队在2011year启动的弹性工程工作,而目前它在Netflix每天处理着数百亿的隔离线程以及数千亿的隔离信号调用。Hystrix是基于Apache License 2.0协议的开源的程序库,目前托管在GitHub上。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
etcd是一个高可用的键值存储系统,主要用于共享配置和服务发现。etcd是由CoreOS开发并维护的,灵感来自于 ZooKeeper 和 Doozer,它使用Go语言编写,并通过Raft一致性算法处理日志复制以保证强一致性。Raft是一个来自Stanford的新的一致性算法,适用于分布式系统的日志复制,Raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader。Google的容器集群管理系统Kubernetes、开源PaaS平台Cloud Foundry和CoreOS的Fleet都广泛使用了etcd。
Protocol Buffers是Google公司开发的一种数据描述语言,类似于XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它不依赖于语言和平台并且可扩展性极强。现阶段官方支持C++、JAVA、Python等三种编程语言,但可以找到大量的几乎涵盖所有语言的第三方拓展包。
通过它,你可以定义你的数据的结构,并生成基于各种语言的代码。这些你定义的数据流可以轻松地在传递并不破坏你已有的程序。并且你也可以更新这些数据而现有的程序也不会受到任何的影响。
Thrift是一种可伸缩的跨语言服务的发展软件框架。它结合了功能强大的软件堆栈的代码生成引擎,以建设服务,工作效率和无缝地与C + +,C#,Java,Python和PHP和Ruby结合。thrift是facebook开发的,我们现在把它作为开源软件使用。thrift允许你定义一个简单的定义文件中的数据类型和服务接口。以作为输入文件,编译器生成代码用来方便地生成RPC客户端和服务器通信的无缝跨编程语言。
本文翻译自Alena,经作者授权,聊聊架构进行了全文翻译。原文地址http://lenadroid.github.io/posts/adjustable-flexible-architecture.html
号外号外
有人认为运维的过程像是消防,7*24小时响应异常和危情。事实上,无论做什么运维,最基本的职责都是保证业务稳定运行。运维以技术为基础,通过技术保障来提供更高质量的服务。而服务监控技术亦是运维技术的重要组成部分,对服务运行的状态进行实时的监控,对基础设施性能进行分析,对App和API进行性能监控,以及对用户体验的监控等多种方式来发觉服务隐患。
QCon大会运维与监控专场邀请了好雨云祁世垚、逸创云客服CEO叶翔、云智慧VP刘志达,和听云研发总监杨金全共同分享他们为客户提供性能优化服务方面克服过的难关,在技术选型方面的经验。点击阅读原文链接,立即免费参与。