为了实现性能最大化,我们采用了特定的配置选项。然而,在开发实时迁移功能时,这一选项带来了诸多挑战。
在测试环境中,源主机和目标主机是两台相同的计算机。但在现实世界中,我们的硬件集群并非完全一致,计算机间的配置差异可能导致不同的CPU标记。这至关重要,因为程序被加载到Linode的操作系统后,系统会向程序展示CPU标记,以便程序优化内存中的特定部分。如果Linode实例被迁移到不支持相应CPU标记的目标计算机,程序可能会崩溃,进而导致来宾操作系统崩溃,甚至Linode重启。
因此,在实现实时迁移时,我们必须防止因CPU标记不匹配导致的程序崩溃。我们有两个可行的选项:
- 让QEMU模拟CPU标记。但这可能导致软件运行速度变慢,且难以找出原因。
- 收集源计算机的CPU标记列表,并确保目标计算机具备相同的标记,之后再进行迁移。这种方法更复杂,但不会影响用户程序的运行速度。我们最终选择了这种方法。
在决定对源和目标的CPU标记进行匹配后,我们结合使用了以下两种方法来实现目标:
- 第一种方法较为简单。将源硬件的所有CPU标记发送给目标硬件,目标硬件在设置新的QEMU实例时,会检查以确保至少拥有与源Linode实例相同的标记。如果发现不匹配,则不执行实时迁移。
- 第二种方法更复杂,但可以避免因CPU标记不匹配导致的迁移失败。在实施迁移前,我们会创建一个具备兼容CPU标记的硬件列表,并从中选择硬件来构建目标计算机。
第二种方法必须快速执行,并使我们的工作更加复杂。在某些情况下,我们需要检查超过900台计算机上的最多226个CPU标记。编写并维护用于检查这些标记的代码非常困难。但Linode的创始人Chris Aker提出了一个创新的想法来解决这个问题。关键在于创建一个CPU标记的列表,并将其表示为一个二进制字符串。然后,使用按位与运算来比较这些字符串。
对于实时迁移,CPU标记的完整列表被表示为一个二进制字符串,其中每一位代表一个标记。如果位为"0",则表示对应的标记不存在;如果位为"1",则表示标记存在。例如,一个位可能代表AES标记,另一个位可能代表MMX标记。这些标记在二进制字符串中的位置会被维护并记录,用于数据中心内的所有计算机。
与维护一组if语句来检查CPU标记相比,维护这种列表显然更简单、更高效。例如,假设需要追踪并检查7个CPU标记,这些标记可以存储在一个8位数字中(额外的一位用于未来扩展)。例如,这样的字符串可能类似于***,最右侧的一位代表AES已启用,右数第二位代表MMX已启用,以此类推。
实时迁移操作会在源和目标计算机上对CPU标记字符串执行按位与操作。如果两个计算机的CPU标记字符串运算结果相等,意味着目标计算机是兼容的。我们的内部工具可以使用上述算法得到的结果为可兼容的硬件构建一个列表。该列表会展示给我们的客户支持和硬件运维团队,这些团队可以使用我们的内部工具来编排不同的运维任务。
随着技术的不断进步,Linode会增加新功能,我们需要继续努力确保实时迁移能够兼容这些新功能。在引入某些新功能时,可能无需围绕实时迁移执行新的开发工作,但我们仍需测试该功能是否能正常工作。对于其他功能,则可能需要在开发早期阶段进行必要的兼容性测试和相关工作。
像其他软件一样,对于同一问题,总有更好的实现方法。例如,长远来看,开发更多模块化的实时迁移集成方法无疑可以降低维护负担。或者,我们甚至可能将实时迁移的相关功能集成到底层代码中,使其成为Linode的一项即插即用功能。
欢迎点击这里注册Linode免费试用账户,并通过强大高效的实时迁移功能,体验灵活性和可扩展性更高的云平台如何帮助您保障业务连续性、优化资源使用和负载均衡、改善容灾和故障恢复能力。同时,也可以借此机会了解Linode云服务如何帮助您降低云计算使用成本,触及全球更广泛的客户群体。
发表评论 取消回复