草庐IT

云服务故障的基本对策

佚名 2023-03-28 原文
其实,云服务也会出现中断故障。云服务中断故障意味着一个云数据中心或整个地区的基本服务(如存储、计算能力或中间件)中断。随着后端和业务应用程序在云中应用的普及,如今这种故障影响的不仅仅是面向客户的网页和在线商店,所有应用程序都会受到影响,整个企业将陷入停顿,所有员工,无论是财务、人力资源、销售、生产、客户服务还是物流的员工都无法工作。

此外,中断可能不仅仅是暂时的。如果一个数据中心烧坏了,服务器和里面的所有数据也就永远消失了。因此,首席信息官(CIO)、首席信息安全官(CISO)和董事会必须决定在灾难恢复和业务连续性规划中接受哪些风险以及需要解决哪些风险。

传统的业务连续性管理(BCM)涵盖了物理领域的挑战:大量员工的缺席(例如,由于大流行病)或洪水和火灾摧毁了办公大楼和数据中心。云服务中断则是一种新的情况——解决这些问题需要深入理解各种技术和设计模式并将其纳入组织的企业架构。

公共云服务故障

故障发生时,云中断BCM设计必须确保以下资源的可用性。

  • 存储和计算等资源
  • 数据和应用。
  • 云服务应用(除了SaaS应用)的一个特别之处在于,这些应用是以下列业务逻辑和数据的形式组成:
  • 基础设施即服务(IaaS)工作负载与虚拟机
  • 平台即服务(Platform-as-a-Service)工作负载,包括(不仅仅包括)对象存储或数据库即服务
公共云提供了在更广泛故障出现时的生存功能。尽管如此,IT部门和风险管理人员仍然必须了解这些机制,并为潜在的公共云中断做好准备。我们在下文里就来看看所选定的微软Azure概念,尽管其他云(如GCP或AWS)都非常相似。

Azure划分了分区服务、区域服务和全球永久在线服务(下图)。分区服务在一个数据中心运行——最具代表性的分区服务是Azure虚拟机。如果你订购了这样的虚拟机,Azure就会启动一个虚拟机分配给你。因此,如果这个数据中心发生故障,你的虚拟机就会挂掉。没有任何冗余。

区域服务是第一类有一定冗余的服务。许多Azure中用于存储数据或数据库即服务产品的Azure服务属于这一类。这些区域服务在一个区域内的多个分区运行(因此提供了冗余)。例如,Azure苏黎世区域由苏黎世市附近的三个分区组成。某个本地事件(例如飞机坠毁在一个数据中心)不会导致区域服务的瘫痪。所以,区域服务可以提供有限的韧性。然而,区域服务并不能提供对大规模事件的保护,例如瑞士各地都停电几天。

全球永久在线服务(如DNS或Azure活动目录)则属于另一个档次。Azure保证全球永久在线服务的可用性,无论世界上发生什么事情。客户不需要在全球云中断的情况下计划和准备灾难恢复。不过问题是属于这一类的服务非常少。大多数服务都只是区域性的,甚至只是分区性的,特别是与运行应用程序代码和处理数据有关的服务。

为云中断做准备意味着要在提高韧性的成本与中断的概率和影响之间取得平衡。你是否真的需要区域性或全球性服务?或是分区性服务(加上其他地方的一些备份)就足够了(下图)?所有需要的和使用的服务都能满足这些需求吗?如果一个应用在发生区域性灾难时也必须继续运行,那么很容易知道单个虚拟机显然不可行。在这样的场景里服务SLA和服务描述都不符合业务需求。

增强韧性

在面临云中断的情况下,韧性是至关重要的。当一项服务不能满足韧性需求时,韧性模式其实很简单:就是在不同的分区或区域复制服务。如果一个虚拟机上的应用程序在数据中心挂掉仍然必须继续运行,那么你就需要在一个隔得稍远的第二个数据中心运行另一个虚拟机。如果你要求苏黎世周围的区域停电不影响你的应用程序,那么就必须在日内瓦、芬兰或澳大利亚增加一个虚拟机。只需考虑两个细节:成本和改路由。

在苏黎世数据中心以外的地方运行额外的虚拟机只是为了应付紧急情况,但如果不能针对发来的请求改路由就帮不上忙。解决方案:负载平衡器。负载平衡器是一种区域性服务,即便苏黎世周围的一个数据中心完全崩溃,负载平衡器还是可以继续运行。负载平衡服务在运行初始虚拟机的数据中心崩溃时将流量重新分配到仍在运行的数据中心的虚拟机上。如果你必须在整个区域发生故障时重定向流量,那么诸如DNS或Azure前门(Azure Front Door)等始终在线的服务就是正确的选择。

有些选定的区域服务具有地理冗余功能,可以缓解问题或令问题复杂化。例如,Azure Cosmos数据库服务可以备份到不同区域并从这些备份恢复(下图A),甚至允许工程师将该服务配置为地理冗余(下图B)。

我们看看从两个维度(数据和资源容量)的角度设计故障转移系统(下图)会有所受益的。最昂贵的设计是在两个数据中心建立起运行日常操作的全部容量。一半的虚拟机(和其他容量)运行日常操作,另一半则是闲置的,希望不出故障永远不用这一半闲置的服务和容量。闲置的容量只是为了在故障转移的情况下存在。由于成本问题,一众公司只会对最关键的任务系统实施这种架构。

另一个极端是完全没有留出故障转移的能力。换句话说,IT部门是赌一赌,想靠云供应商有足够的容量来应对灾难情况,从而接受供应商可能并没有应对灾难情况容量的风险,或者只在遥远的数据中心有高延时的容量。当采用这种方法时,你永远不应该忘记一个事实:典型的云中断会影响成千上万的客户。云供应商不可能在同一区域的其他数据中心有这么多没人日常使用(和支付)的闲置虚拟机或服务能力。而且,在这两个极端(所有的东西都有重复的资源或对任何东西都没有容量保留)之间有很多选择。

设计故障转移系统时的第二个维度是数据备份和复制的可用性和及时性。两个主要的复制模式是 “异步复制”和“同步复制”。后一种模式是在确认写操作成功之前更新各个数据中心的所有数据副本。同步复制的好处是,所有的数据副本总是最新的,应用程序可以在第二个数据中心待命并处于活动状态(活动/活动)。

数据中心崩溃不会造成任何数据损失或服务中断。缺点是:由于延迟,可能造成吞吐量损失。最慢的数据中心决定了吞吐量。因此,典型的同步复制是一个区域内的复制,例如,苏黎世周围的各个数据中心,但不是从苏黎世到弗吉尼亚的美东1区域。对于区域之间的复制,异步复制是一个典型的选择。

异步复制意味着云服务(或你的应用程序)在本地区域提交更新;当异步复制服务将更新推送到同一个或另一个大陆的不同区域时,应用程序继续运行。更新传播时的延迟不会损害你的应用程序的性能。然而,发生故障时尚未转发的变化会丢失。第三种,最传统和最便宜的选择是配置定期备份而不是设置复制。在这最后一种情况下,云服务执行备份,例如,每4小时或每天一次。

所以,复制和冗余的选择会影响到一个公司在云计算数据中心中断甚至是区域性云计算中断时的生存能力。事实上,业界公司必须明确他们能接受哪些风险以及要为哪些风险做准备。这里的挑战在于,在后一种情况下如何设计一个一致的灾难恢复架构。云服务有不同的冗余选项。云架构师必须为建立在五个或十个云服务上的应用挖掘各种细节,即使所有的云服务都来自同一个云供应商,也要为云中断做好准备。董事会最终是希望IT部门能够交付云计算的主要营销承诺之一:在云中无服务中断,由于云计算可以提供冗余、复制和备份等神话般的功能。

有关云服务故障的基本对策的更多相关文章

  1. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  8. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  9. ruby-on-rails - 使用 HTTParty 的非常基本的 Rails 4.1 API 调用 - 2

    Rails相对较新。我正在尝试调用一个API,它应该向我返回一个唯一的URL。我的应用程序中捆绑了HTTParty。我已经创建了一个UniqueNumberController,并且我已经阅读了几个HTTParty指南,直到我想要什么,但也许我只是有点迷路,真的不知道该怎么做。基本上,我需要做的就是调用API,获取它返回的URL,然后将该URL插入到用户的数据库中。谁能给我指出正确的方向或与我分享一些代码? 最佳答案 假设API为JSON格式并返回如下数据:{"url":"http://example.com/unique-url"

  10. ruby - 我的 Ruby IRC 机器人没有连接到 IRC 服务器。我究竟做错了什么? - 2

    require"socket"server="irc.rizon.net"port="6667"nick="RubyIRCBot"channel="#0x40"s=TCPSocket.open(server,port)s.print("USERTesting",0)s.print("NICK#{nick}",0)s.print("JOIN#{channel}",0)这个IRC机器人没有连接到IRC服务器,我做错了什么? 最佳答案 失败并显示此消息::irc.shakeababy.net461*USER:Notenoughparame

随机推荐