我正在启动一个实例来托管 Cassandra 节点,并且正在测试一些关闭和启动脚本。该实例是从 datastax PV AMI“ami-8932ccfe”启动的。我为 root 添加了 8GB 的 SSD EBS 存储并启动了它。在初始启动时,实例存储(临时驱动器)已连接,一切正常。我停止了实例并重新启动它,但实例存储不见了,登录时显示以下错误消息:
ERROR mount -a:
接下来,我终止了实例,重新启动了相同的 AMI 和设置,然后我创建了一个快照 AMI 并在其中添加了实例存储,试图将其“嵌入”到实例中。然而,在停止和启动时,我遇到了同样的问题。
我的问题是,我只有停止和启动实例的权限,我无法自己创建它们,所以我不得不一直麻烦大学帮我启动它们。我希望能够在一天结束时停止实例,并在早上(即在工作时间)重新启动它,以降低任何成本。有问题的服务器只是一个开发实例,所以我不担心数据丢失,我在启动时需要运行的只是一些脚本来创建表。但是,由于实例存储不会在启动时自动附加,因此 Cassandra 不会安装。
有人能告诉我如何创建一个实例,以便在停止和启动后自动连接实例存储吗?
启动实例后,我使用以下命令获取一些元数据(如果有帮助):
curl http://169.254.169.254/latest/meta-data/block-device-mapping/
ami
ephemeral0
root
curl http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0
sdb
干杯,Alexei Blue。
答案1
每次停止实例时,都会删除实例存储卷。我不确定 datastax 正在运行什么分发,但正确的方法是创建一个初始化脚本,它将:
- 检查是否已安装
- 如果没有,则从元数据中获取 ephemeral0 驱动器信息
- 如果没有,请格式化卷并安装它
如果你不想编写一个初始化脚本来做这件事,你可以插入几行来/etc/rc.local
实现同样的效果。比如:
mount | awk '{print $3}' | grep -sq /mnt
test $? && exit 0
curl -s http://169.254.169.254/latest/meta-data/block-device-mapping/ | grep -sq ephemeral0
test $? && DEV=`curl -s http://169.254.169.254/latest/meta-data/block-device-mapping/ephemeral0`
test -n "$DEV" && mkfs -t ext4 /dev/$DEV
test $? && mount /dev/$DEV /mnt
此脚本非常可靠,不会因任何错误而偏离。您可能想编写一个更强大的脚本。
答案2
@dialtOne 的脚本引导我进行了一些新的研究,我发现了这一点脚本在 github 上。
本质上我的实例使用了不同的设备架构约定xvdb
我需要修改这个脚本的第 62 行:
mdadm --create --verbose /dev/md0 --level=0 -c256 --raid-devices=$ephemeral_count $drives
以下也是如此:
mdadm --create --verbose /dev/md0 --level=0 -c256 --force --raid-devices=$ephemeral_count $drives
如果您的实例有一个像我的一样的临时驱动器,那么您必须使用--force
它来运行命令。
脚本完成后我很高兴看到这一点:
df -h
...
/dev/md0 30G 173M 28G 1% /mnt
再次感谢您的回答@dialtOne。
干杯,Alexei Blue