差不多三个月前,在托管本网站的数据中心以及巢穴中开始的火灾。在这篇文章中,我试图反思对我们的意义,以及它的后果。
我们的服务器在欧洲最大的云提供商OVH运行的数据中心托管。部分原因包括我期待最初是最初的最初活跃的用户靠近作者的事实,这结果是错误的(巢中最活跃的用户基于拉脱维亚,新西兰,法国和美国)。
托管我们的服务器的数据中心是斯特拉斯堡,并在2021年3月10日的清晨起火了。OVH火灾的确切原因仍在调查(截至6月初,2021年)。已知是由火灾前的UPS单元引起的,这是在火前的一天提供服务,但根据OVH,我们真的不知道为什么火没有足够快地检测到,或者它为什么这么快地扩展。
OVH是一个非常便宜的云/托管提供商,在很多方面都很便宜:因为他们已经过了20多年的托管提供商,然后作为“云”公司,他们积累了一些不同的GUI和API访问他们的服务,其中几个仍在运行中。这导致了一个相当不行的网站。但是,由于该公司作为一种极大的令人痛快的精神,所有API都很容易访问,合理地记录,以便编写自己的云工具,因为这些API被记录得很好。
火灾后,他们的反应已被广泛赞扬,因为它的透明度也受到批评,这对其所谓的设计的某些部分批评(尽管OVH发布的视频似乎与在该文章中的一些指控相矛盾)。有些人(包括我自己)已经了解到这次事故中,无论公司都是数据中心的大多数功能,都是商业秘密。不是那么令人惊讶的是,这是一个问题,许多用户的“云”的用户可能从未问过.Moureover,因为大保险金可能涉及,我怀疑有办法确切地知道在询问结束前发生了什么。他们回应的一个很酷的部分涉及八度克拉巴(OVH的主要股东)宣布他们的消防安全基础设施将是开放的。
鉴于Pijul和巢都被广告为实验,我们知道复制存储库需要自己的协议和算法,我们没有任何复制。我们有数据库的场外备份,使用RESTIC镜像到云端在OpenStack之上,但由于我在下面解释的原因,我们没有备份库。
在后视,只需设置一个FCRON作业,每天都会调用rsync即可将存储库同步到我的机器不会耗时,并且会让我恢复更快。无论如何,所有存储库占用的总磁盘空间都不是那么大。
火灾后,巢不可用两周,在此期间我开始在复制协议上工作。我也(重新)定义了备份策略。
复制不会替换备份,并服务于不同的目的:即使在发生火灾和许多其他问题的情况下也允许服务保持漂移。您仍然可以犯错并删除数据库,或者被黑客攻击,在这种情况下,备份仍然是必不可少的。
由于火灾和网络中断确实发生,因此有一整个称为分布式算法的计算机科学领域,致力于为这些事件提供鲁棒的服务。在我们的特定情况下,Pijul基本上是一个分布式数据存储,这使得它特别容易变成复制的系统。缺少的唯一缺少服务器的网络协议层,用于服务器,以告知其他人有关新的更改。
这是非常稳定的,现在已经生产了一周。巢现在有三个服务器在不同的地理位置(法国,Québec和新加坡),在CloudFlare代理后面送达。我会尝试在不同级别的堆栈中总结一些设计原则:
首先,帽定理,这不是特别令人惊讶的,也可以很容易地证明。期待解决艰难问题的年轻人,雄心勃勃的CS学生甚至可能认为它“琐碎”。如果像这样说,它当然很容易证明,如同锻炼。然而,解决艰难问题并不是数学和计算机科学研究的主要目标:主要目标是理解事物,我们知道命名的东西至少有99%的理解1。
在这种情况下,清楚地命名分布式系统的理想属性确实是作业的非常大的一部分,并且在实际实现系统时非常有用,因为您可以清楚地识别您尝试实现的属性,以及从那里立即告诉哪些可以获得,哪些不是。
更具体地,在帽定理的上下文中,网络分区确实发生,因此我们必须牺牲可用性或一致性。这给出了两个主要的算法类:CRDT和Blockchains牺牲了一致性,而筏子和PaxoS牺牲了可用性。
尝试和获得合理解决方案的另一种方法称为最终的一致性,其中服务最初牺牲一致性,但信任互联网不保持太久的划分。这也可以被视为分区公差特性的弱化。例如,在比特币的特定情况下,通过定期选举领导者(每十分钟左右,采矿)选举领导者来恢复一致性,并且希望在另一个领导者获得之前可以快速广播选举结果。在另一个领导者之前可以快速广播到整个互联网上选举(链条分裂前的意思)。如果这失败,比特币用户同意使用最长的链,这会导致数据丢失。
在我们的情况下,我们在群集中的每台计算机上都有一个“本地”数据库服务器,用于存储来自其他机器的更改。每次从用户收到新的更改时,我们都会尝试将其发送到集群的其他成员,并在成功后继续尝试两台其他机器:这两台机器又将其发送到其两个邻居,这是指数释放的快速传播。主要困难是处理所有类型的更改,包括未被修补程序(如频道创建,删除和重命名)建模的“元”的更改,以及诸如未记录修补程序的逆操作。
然后,负载平衡的技术细节。一个天真的负载平衡实现,您可以使用HAProxy在笔记本电脑上在家中实施,这只是多台服务器前面的代理。这很好,但具有相同的成本和服务器数量,您可以通过在地理位置的地理位置上传播服务器来为您的用户建立一个更快的网站。不幸的是,有些东西你只能在家里部分“在家”:将流量路由到最接近用户的服务器。您可以使用大多数域提供商执行的一个黑客攻击是托管自己的DNS服务器,每个区域设置一个,并使用DNS Anycast为您的用户提供不同的IP地址到DNS服务器的请求。这有两个问题:
您应该不能托管您自己的DNS服务器,主要是因为DNS服务器需要快速且具有零停机时间,并且因此有自己的冗余和网络系统,以及
有一种更好的方法:使用ip yourcast,允许多个服务器共享相同的IP。这将流量路由到IP的“最合适”服务器,并且如果一个服务器停止响应一个原因或另一个服务器,则允许网络将流量重新路由到另一台服务器。你不能这样做的“在家里”的原因是互联网的个人用户通常无法控制IP路由,而网络运营商,CDN和云公司是组织网络的,并且可以播放各种各样IP地址ICANN的技巧给了他们。
使用此解决方案,您的服务器仍然有自己的单独IP地址,您仍然可以将其SSH SSH到所需的确切机器:只有许多其他人分享其IP的代理。使用代理的另一个原因是缓存大部分内容,为您的用户提供更快的速度。
经过几次测试,包括OVH的负载均衡器,我决定使用CloudFlare的负载均衡器和代理,这不仅非常便宜,而且还有更多的终点,而不是我考虑的所有其他网络。它也可以充当CDN,这使我们可以在最糟糕地区的一个因素30中获得巢穴的响应时间的加速(例如,从新西兰使用的巢穴显然非常烦人)。
唯一的缺点是CloudFlare的合理价格仅适用于HTTP流量,并且不能代理IP流量,这对我们的SSH主机有所帮助,甚至将使用Quic(http 3)推动和拉动补丁。我们没有适当的解决方案:现在必须通过ssh.pijul.com推送到巢穴的东西(手册已相应更新)。
最后,复制数据库对运行许多解决方案存在的网站非常重要。两个主要的开源数据库服务器,MySQL / MariaDB和PostgreSQL,具有构建的算法来执行此操作。但是,它们在其中需要一个额外的图层,以组织故障转移当其中一个服务器失败时。该图层可以由领导者选举协议(例如RAFT)组成,以告诉哪些数据库服务器是领导者,并且是追随者,以及在领导者失败时组织故障转移。
例如,这是Patroni的。但是,在尝试使用Patroni几周后,看到它未能重新选出许多人,多次(经常在半夜)2,让我的服务器无法使用,我决定只使用自己的婴儿复制器超级基本策略,利用PostgreSQL 12(或更高版本)以及称为ETPD的战斗测试领先选举工具的现有流复制功能。
在火灾之前,备份是在与主服务器相同的数据中心中完成的,这是一个错误,也不会比使用不同的数据中心更便宜。数据库定期克隆到我的笔记本电脑(大约一周一次),并在OpenStack上使用RESTIC备份到该数据中心。但是,存储库未备份,主要是因为我认为存储库格式仍然可以更改并使备份无关紧要。我也没有仔细考虑复制(只有这么多的东西可以同时考虑)。但是,这些不是好的原因,因为格式变化绝对不会与火灾同时发生,如果我每天rsync的回归,我本可以在同一天重新启动一个服务器。
新的方式是每天rsync将存储库和数据库rsync和数据库到我的笔记本电脑,从那里保存到云中的云。由于我也从时间备份我的笔记本电脑到外部硬盘驱动器上,如果真的不好的事情发生,就应该能够快速回到轨道,例如所有三个服务器的全局中断,以及笔记本电脑盗窃备份服务器中的火灾。
由于FCRON作业很容易忘记,我在i3 bar中有一个指示灯显示备份成功的最新日期。
火灾提出的一个问题是,我们应该坚持ovh,还是改变提供者?由于这不是OVH基础设施的第一个主要停电,因此问题并不明显回答。中断与任何提供商有风险,只需要充分减轻。
在我们的案例中,我们有许多要求与我们主办的用户生成的内容相关联,我们知道我们的用户可能不希望受其他国家或组织的审查。自2018年以来,云行为直接使美国管理部门能够在托管公司在美国登记时,将美国法律执行到任何其他国家/地区的数据。我直接在那里写道,因为美国还有其他方式可以在外国公司实施自己的法律。欧盟有理论上的方式反对(称为阻止法规和Instex),但由于某种原因,他们似乎似乎是无用的,因此没有公司正在使用它们。
在这里,一群竞争对手值得在这里提到,特别是在欧洲,因为GDPR是世界上最严格的数据保护规定之一,就像云行为另一个方向一样,启发了其他国家调整自己的法律。欧盟的一些最大的云提供商是Hetzner,Dassault Systems和Scaleway。
但是,这些公司在政治上过于活跃,以满足我们的需求,无论是直接涉及审查员的行动还是由武装行业控制。在山上的特定情况下,最大的股东在法国政治中非常活跃(以购买主要的新闻出口),以及一方的声乐支持者,在过去的四年中,造成几个月的骚乱(仅限由Covid-19拦住)针对其同胞的民兵组织的民兵,使总统面谈向杂志转让给奴隶,并没有立即强烈地反对阿尔及利亚殖民化的军事政变“记忆中”的威胁。您是否同意其其余的政策(这不是本博客的主题),这只是一个不在“政治”领域的行动样本,从而认为他们不允许其他人自由和平地持有并表达相反的意见。这些事件使我很容易想象如果他们负责运行运行我的代码的硬件和网络,他们的支持者可以做些什么。
现在,这并不意味着这些服务不会适应自己的项目,只是巢无法真正实现它的使命,使其成为世界的简单和声音合作(“和平”和“尊重”,甚至不应该这里需要提及),而根据与这些人靠近政治的服务。
@rohan是Pijul最活跃的贡献者之一。他在差异化之外支持的数据编码时做了一个惊人的工作,而不将它们视为二进制文件,并教给南十字电缆,这是一个迷人的互联网基础架构。他使用的路线通过跨太平洋的那条电缆,然后是美国的一条路线,最后穿过大西洋和一些法国。现在他正在使用新加坡服务器,在奥克兰的Cloudflare缓存。
命名事物是自己的纪律的实现可能是20世纪最伟大的发现之一。颂歌可能开始了,通过重建数学基础(定义在他面前特别模糊),Wittgenstein建立了一个与哲学的联系,模糊了数学和哲学之间的区别。 Kuhn甚至在名称的科学家(他称为“革命者”)和其他人(“Normies”)之间区分了差异。 Deleuze将哲学家作为概念的创造者(也适用于科学外),或换句话说,作为专业名称。顺便说一下,计算机科学的历史充满了这样一个半哲学,半数学发现,其中命名几乎是一切:图灵机,通信复杂性,姚明的原则......↩︎
Patroni本身可能很好,但尝试在其后端中的完全普遍遵循生态系统中的所有演变:例如,Patronictl为我的ETCD 2工作了很好,但我永远不会使用etcd 3在群集中看到任何服务器。 ↩︎