我们在为自动缩放的EC2实例生成名称时遇到竞争条件问题。
对于特定自动缩放组中的每个实例,我们希望在该实例上设置Name标记(并在Route53中添加dns条目),该标记与公认的模式匹配。例如。 server1.example.com , server2.example.com 等。
我们的自动缩放组配置了一个在启动时执行Ruby脚本的映像。使用Ruby AWS SDK,这个Ruby脚本:
例如,如果找到 server1.example.com 和 server2.example.com ,则会将其自己的标记/ dns条目设置为 server3 .example.com的
问题是典型的竞争条件。如果实例在彼此的某个时间窗口内出现,我们会得到重复的名称。例如,如果将自动调节组配置为零实例,并且我将其更改为强制该组具有3个实例,则大多数情况下我将使用 server1.example.com 和两个 server2.example.com 。
使用事务数据库,我们可以通过锁定我们正在更改的行来解决此问题。如果这是多线程程序中的变量,我们还会对共享数据进行某种锁定。但在这里我们使用的是EC2标签数据库,我在研究中发现没有任何内容表明我们可以在更改时锁定帐户中的特定标签。
我提出的唯一实用解决方案是创建一个单独的数据库来存储这些标记值。由于RDS Mysql实例支持行锁定,因此可行。但是为此目的创建数据库感觉就像是矫枉过正。
还有其他想法吗?