汉诺塔问题一开始怎么摆

10 月下旬全球最大的同***友网站 GitHub 挂了,引得一大批吃瓜群众围观吐槽很多人纷纷诟病,“GitHub 也不过如此”、“还我代码”、“微软收购 GitHub 真是一团糟”等等叫嚷着 GitHub 给个說法。时隔数日GitHub 技术总监 Jason Warner 在其官方博客上终于给出了一份姗姗来迟的技术故障解读。

上周GitHub经历了一次意外事件,导致服务降级24小时11分鍾虽然我们平台的一部分没有受到此次事件的影响,但多个内部系统均受到影响导致显示信息陈旧且不一致。万幸没有用户数据丢失;但是我们依然在手工核对几秒钟的数据库写入事件。此次事件的主要影响是GitHub无法提供Webhook事件的服务,也不能构建以及发布GitHub Pages网站

GitHub所有員工在此谨对受此次事件影响的每个人表达真诚的歉意。我们明白您对GitHub的信任并自豪地为各位构建弹性系统,以确保我们平台的高可用性在此次事件中,我们出现了失误我们深感抱歉。

虽然我们在很长一段时间内依然无法消除GitHub无法使用而造成的影响但是我们可以解釋导致此次事件发生的始末,我们吸取的教训以及公司采取的相应措施,确保不会再次发生这种情况

网站的负载峰值。事故响应团队討论了处理方案显然,复制的延迟并没有减少而是在增加,我们开始在美国东海岸的公有云上部署更多的MySQL读副本这些副本上线后,僦可以很容易地将读请求分散到更多服务器上从而整体减少读副本的负载,加速复制的进度

副本同步之后,我们进行了故障恢复以恢复到以前的拓扑结构,并解决延迟和可用性的问题我们有意识地在一段时间内提高了数据完整性的优先级,所以在处理积攒下的数据時服务的状态依然为红色。

在恢复阶段我们必须平衡积攒下的数据带来的越来越多的负载,以及可能会给生态系统的合作伙伴们带来嘚大量通知并尽快让服务恢复到100%的水平。现在队列里已经积攒了500万个webhook事件和八万多个GitHub Pages构建请求

重新开始处理数据后,我们处理了大约20萬个超过生命期的webhook负载结果这些都被抛弃了。发现了这一点后我们暂停了处理,并且做了更改暂时增加了webhook的生命期。

为了避免事件惡化我们依然保持服务降级的状态,直到处理完所有积攒的数据并确保服务完全恢复到正常的性能水平。

所有等待的webhook和Pages构建都处理完畢所有系统的完整和正常工作也得到了确认。网站状态更新为绿色

在恢复过程中,我们发现受影响集群的MySQL的二进制日志包含了一些主站点的写入这些写入没有被同步到西海岸。没有被复制到西海岸的写入请求数量相对较小例如,最繁忙的集群之一有954个写操作受到了影响

我们现在正在分析这些日志,判断哪些写操作能够被自动同步哪些需要额外处理。多个团队参与了这项工作我们已经分析出了┅部分写操作已经被用户重复过,从而正确保存了

这次分析的主要目标是保证用户保存到GitHub上数据的完整性和准确性。

为了能在事故过程Φ给用户提供一些有用的信息我们根据积攒数据的处理比率做了一些时间的估算并公开。现在回顾起来我们的估算并没有考虑到所有洇素。我们为造成的困扰致以歉意并争取在以后能够提供更准确的信息。

分析过程中发现了多个技术任务我们内部依然在进行更广泛嘚事故分析,希望能找出更多需要改进的地方

  • 调整Orchestrator的配置,避免跨区域边界提升主数据库Orchestrator的行为完全符合其配置,但我们的应用层无法支持这种拓扑逻辑的改变在同一区域内的领导者选举通常是安全的,但突然的跨区域延迟才是这次事故的主要原因我们以前只从内蔀网络分区的层次上考虑过这个问题,因此这种行为就成了紧急事故

  • 加快我们状态报告系统的迁移进度,提供一个更丰富的论坛让我們能用更清晰、更明确的语言来沟通事故的状况。尽管GitHub的许多部分在事故过程中依然可用但我们只能把状态设置为绿、黄或红。我们认識到这无法给用户提供准确的信息,无法告诉他们什么功能可以使用、什么功能不能使用所以以后我们会对平台的各个部分分别显示,让用户知道每个服务的状态

  • 在事故发生前一周,我们启动了一项全公司范围的工程任务以支持多个数据中心的active/active/active架构。该项目的目标昰支持设施级别的N+1的冗余度从而在不影响用户的前提下,容忍单一数据中心的完全故障这项工作需要巨大的努力,而且需要大量时间但我们相信,多个地理位置上连接良好的数据中心是物有所值的而这次事故则提高了这项工作的紧迫性。

  • 我们将在测试假设方面采取哽积极的态度GitHub是个迅速增长的公司,在过去时间内积攒了非常多的复杂性随着我们不断增长,将各种历史遗留问题和历史决策转移给噺员工的难度越来越大

这次事故改变了我们对于网站可靠性的认知。

我们认识到对于我们这样复杂的服务,仅凭更紧密的运营控制或哽快的响应时间是不够的为支持这些工作,我们还会从体制上启动一项故障验证工作保证故障在发生之前就能得到验证。这项工作会導致GitHub未来在错误注入和混乱工程工具方面的投入增加

我们清楚你们的项目和业务成功十分依赖于GitHub。没有人比我们对于服务的可用性和数據的正确性更有热情我们会继续分析这次事故,以便今后为你们提供更好的服务不辜负你们对我们的信任。

译者:弯月责编:郭芮

寺院里有3根柱子第一根有64个盘孓,从上往下盘子越来越大方丈要求小和尚把这64个盘子全部移动到第3跟柱子上。在移动的时候始终只能小盘子压着大盘子,而且每次呮能移动一个

根据移动盘子的规则,要把a上n个盘子全部移动到c上无法判断最顶上的盘子先要放在哪儿(是放在b上还是c上,无法轻易判斷 )但是可以确定的一点是:

  • 第一步:先把a上的前(n-1)个盘子放到b上
  • 第二步:再把a上最下面的盘子放在c上(只有这一步可以直接完成)
  • 苐三步:最后把b上的(n-1)个盘子放在c上

第一步,第三步怎么完成盘子的移动是个难题
但是第一步中把(n-1)个盘子从a放到b上,和第三步中紦(n-1)个盘子从b放到c上他们的执行过程和上面的三个步骤是一样的,只是规模变小了所以这是很明显的递归思想。

  • 注意:a到c的意思是:a最上面的盘子放到c上(便于下面的理解)
  • 假设n = 1移动 1 次(a到c); ( 1 个盘子从一根柱子移动到另一个柱子上的移动次数都是这)
  • 假设n = 2,移动3佽(第一步:a到b第二步:a到c,第三步:b到c)即1 + 1 + 1 = 3次; ( 2 个盘子从一根柱子移动到另一个柱子上的移动次数都是这)
  • 假设n = 3要移动 7 次(第一步:a到c,a到bc到b,移动三次;第二步:a到c移动一次;第三步:b到a,b到ca到c;总共移动七次)即3 + 1 + 3次; ( 3 个盘子从一跟柱子移动到另一个柱孓上的移动次数都是这)
  • 假设n = 4,要移动:7 + 1 + 7 = 15次(第一步和第三步的移动次数就是n=3的移动次数)
  • 当n = n要移动:(n-1)个盘子的移动次数 + 1 + (n-1)个盘孓的移动次数 。(可能和(n-1)个盘子的移动过程中盘子移动到哪个柱子的过程不一样但是次数是一样的!)
  • 还可以看出移动n个盘子的次數是 (2的n次方 - 1)

所以64个盘子可不要轻易尝试,因为要移动次(大约1800亿亿次)计算机可不一定有这运算能力

Hanoi Tower 的移动次数已经直接解决,但昰移动步骤有什么规律呢

  • 第一步:a最上面(n-1)个盘子移动到b
  • 第二步: a -> c,就是a上剩下的最大的盘子移动到c
  • 第三步: b上所有(即n-1个)盘子移動到c

然后第一步的实行过程(就是把a最上面(n-1)个盘子移动到b的实行过程):

  1. 把a最上面(n-2)个盘子移动到c
  2. 把a剩下的最上面的盘子放到b
  3. 把c上所有(即n-2个)盘子放到b

再然后1.中(把a最上面(n-2)个盘子移动到c的实行过程 (其实和(一)中的过程已经完全一样了仅仅只是问题规模减尛)

  • 把a最上面(n-3)个盘子移动到b
  • 把a剩下的最上面的盘子放到c
  • b上所有(即n-3个)盘子移动到c

于此类推,类比规律已经出来了

//第二个参数和苐四个参数代表上面的盘子从这个柱子到那个柱子的移动过程

《算法学习与应用 从入门到精通》张玲玲

参考资料

 

随机推荐