BestEcsCandidateMonitor
BestEcsCandidateMonitor(简称 BEC)用于定期从阿里云查询指定配置的 ECS 规格的价格信息,并从中选择价格最低的实例。它会在内存中记录以下两个信息
- 当前最佳实例 best candidate,i.e. 满足配置要求的最低价格实例
- 候选实例表 candidates,i.e. 满足配置要求的所有实例的列表
其中当前最佳实例会被用来在生产环境中创建实例(作为默认选择),以优化成本。候选实例表仅供参考,无其它作用。
配置
- PollIntervalSec:轮询时间间隔,单位秒,建议不低于 60,因为查询实例的过程网络请求较密集,可能会占用较多时间
- MemChoices:一个数组,用于表示所有可以接受的内存大小,单位为 GiB。例如
[4, 8]的值表示可以接受 4GiB 和 8GiB 运行内存的实例类型 - CpuCoreCountChoices:一个数组,用于表示所有可以接受的虚拟 CPU 个数。例如
[4, 8]的值表示可以接受核数为 4 或者 8 的实例类型 - CacheFile:用于存储 best candidate 的本地缓存文件地址,必须是一个
.json。一般设置为best_candidate.json即可。 - Filters:过滤配置
- MaxTradePrice:一个 float32,表示可以接受的最大成交额,单位 CNY。由于精度原因不建议卡点设置。成交额高于(>)该值的实例会被过滤
- InstanceTypeExclusion:一个字符串表示的正则表达式(首尾不需要加
//,建议加^$),能够匹配该正则表达式的实例规格会被过滤
BEC 从阿里云查询到的实例规格是由 MemChoices 和 CpuCoreCountChoices 决定的,Filters 的内容则是对获得的实例规格数组的过滤条件。因此前两者对 BEC 一次查询流程的耗时影响最大。
MemChoices 和 CpuCoreCountChoices 在实际查询会进行排列组合,因此请不要包含冗余的值以减少不必要的查询。
MemChoices 的值建议设置为常见值,如 4、8、16、32 等(而不要设置为 3、5、7、12 等不太常见的内存值,会导致冗余查询)。MemChoices 的值与 CpuCoreCountChoices 的值建议满足 2:1、4:1、8:1 等常见比例关系。这两个配置项比较常用的设置例如
mem_choices = [4, 8]
cpu_core_count_choices = [2, 4]
# 会查询2c4g、2c8g、4c4g(一般不存在)、4c8g四种配置的规格
InstanceTypeExclusion 这个正则表达式的作用是过滤掉一些不会需要的实例规格(因为它们不适合用来开 Minecraft 服务器),例如 ecs.e*(经济型,便宜,资源是共享的)、ecs.t*(突发性能)等。可以到官方文档 https://help.aliyun.com/zh/ecs/user-guide/overview-of-instance-families 查看所有实例规格族,找到那些不需要的实例规格。下面是一个示例
instance_type_exclusion = "^ecs\\.(e|s6|xn4|n4|mn4|e4|t|d).*$"
根据 Minecraft 的特点,我们可以将其概括为对内存和单核性能要求较大的程序。可以考虑以下四类规格
- 通用型(g)
- 通用算力型(u1)
- 内存型(r)
- 高主频计算型(hf)
不同的实例规格会有不同的特点以及优势,其成本也不同。在选择某个特定规格之前,建议先在阿里云文档中做了解并在 ECS 创建页面查看其抢占式价格,评估后再采用。如果盲选建议 u1。
流程
每一轮查询,执行下面的流程
缓存
缓存文件的作用是使得每次启动服务时无需等待耗时的查询流程,直接沿用最后的查询结果用于执行创建实例等需要拿到 best candidate 的任务。如果没有缓存文件,那么 go-aliyunmc 每次启动之后都必须等待首次查询流程结束后才能执行创建实例任务。
缓存会在启动的时候被读取,实例类型发生变化时被写入。
注意,在 BEC 中只有当实例的规格、可用区、价格等字段均相等时才认为实例类型未变化。