我在 Amazon EC2 上配置了一个新的 MySQL 服务器,并决定将数据存储在 EBS RAID0 阵列上。到目前为止一切顺利,并且我已经使用 ec2-consistent-snapshot 测试了这些设备的快照,效果很好。
现在,如何根据这些快照快速地在新实例上重建阵列?
当您使用 ec2-consistent-snapshot 创建多个卷的快照时,您无法分辨 RAID 中每个设备使用了哪个卷。我可能完全错了,但由于您要跨卷分条数据,因此理所当然地,您必须将每个新卷放在 RAID 上与创建快照的卷相同的位置。
一个例子:
- RAID0 配置中的 3x200gb 卷。
- vol-1 是 RAID 中的 /dev/sdh 设备 0
- vol-2 是 RAID 中的 /dev/sdh1 设备 1
- vol-3 是 RAID 中的 /dev/sdh2 设备 2
您使用以下命令创建 ec2 快照:ec2-consistent-snapshot <options> vol-1 vol-2 vol-3
。
您现在有 3 个快照,追溯它们是哪个设备的唯一方法是查看源卷 id,然后查看源卷 id 在实例上安装为哪个设备,然后检查源卷实例上的 RAID 配置的详细信息。
这显然是极其手动的......并且不快(如果另一个 mysql 实例失败,这显然很难快速启动一个新的 mysql 实例。更不用说,您必须在快照时记录 RAID 上的设备位置,因为如果源卷实例崩溃,您就无法获得 RAID 配置)。
因此,总结一下:
- 我是否遗漏了 ec2-consistent-snapshot 和软件 RAID0 阵列的工作原理?
- 如果没有,是否有任何已知的解决方案/最佳实践来解决不知道快照属于 RAID 阵列中的哪个设备/位置的问题?
我希望这清楚了,感谢您的帮助!
答案1
由于您要跨卷分条数据,因此理所当然地,您必须将每个新卷放在 RAID 上与创建快照的卷相同的位置。
我测试了你的前提,虽然它看上去合乎逻辑,但观察结果却并非如此。
让我详细说明一下:
我和你有同样的要求。但是我使用的 RAID0 只有 2 个卷。
我正在使用 Ubuntu 10,并有 2 个 EBS 设备形成用 XFS 格式化的 RAID0 设备。
raid0 设备使用以下命令创建:
sudo mdadm --create /dev/md0 --level 0 --metadata=1.1 --raid-devices 2 /dev/sdg /dev/sdh
我已经安装了 MYSQL 和一堆其他软件,它们配置为使用 /dev/md0 来存储它们的数据文件。
使用相同的卷:完成后,我卸载所有内容,停止 Raid 并像这样重新组装:
sudo mdadm --assemble /dev/md0 /dev/sdh /dev/sdg
事实是,无论顺序如何/dev/sdg /dev/sgh
,RAID 都会正确地重建。
使用快照:发布此内容后,我用来ec2-consistent-snapshot
同时创建 2 个 EBS 磁盘的快照。然后,我从此磁盘创建卷,将其附加到新实例(已为软件配置),重新组装 RAID(我也尝试过交换 EBS 卷的顺序),安装它,然后就可以开始了。
听起来很奇怪,但它确实有效。
答案2
我运行了类似的配置(4 个 EBS 卷上的 RAID0),因此也有同样的担忧,即从使用创建的快照重建 RAID 阵列ec2 一致快照。
幸运的是,RAID 阵列中的每个设备都包含元数据(在超级块中),记录其在阵列中的位置、阵列的 UUID 和阵列级别(例如 RAID0)。要在任何设备上查询此超级块,请运行以下命令(匹配的行'^这个'描述所查询的设备):
$ sudo mdadm --examine /dev/sdb1
/dev/sdb1:
Magic : a92b4efc
Version : 00.90.00
UUID : 2ca96b4a:9a1f1fbd:2f3c176d:b2b9da7c
Creation Time : Mon Mar 28 23:31:41 2011
Raid Level : raid0
Used Dev Size : 0
Raid Devices : 4
Total Devices : 4
Preferred Minor : 0
Update Time : Mon Mar 28 23:31:41 2011
State : active
Active Devices : 4
Working Devices : 4
Failed Devices : 0
Spare Devices : 0
Checksum : ed10058a - correct
Events : 1
Chunk Size : 256K
Number Major Minor RaidDevice State
this 0 202 17 0 active sync /dev/sdb1
0 0 202 17 0 active sync /dev/sdb1
1 1 202 18 1 active sync /dev/sdb2
2 2 202 19 2 active sync /dev/sdb3
3 3 202 20 3 active sync /dev/sdb4
如果您在不属于阵列的设备上执行相同的查询,您将获得:
$ sudo mdadm --examine /dev/sda1
mdadm: No md superblock detected on /dev/sda1.
这证明该命令确实依赖于设备本身存储的信息而不是某些配置文件。
您还可以从 RAID 设备开始检查 RAID 阵列的设备,检索类似的信息:
$ sudo mdadm --detail /dev/md0
我使用后者以及ec2-描述-卷为 ec2-consistent-snapshot 构建卷列表(-n和- 调试允许在不创建快照的情况下测试此命令)。以下命令假定目录/mysql是卷的挂载点,并且 AWS 区域是美国西部-1:
$ sudo -E ec2-consistent-snapshot --region us-west-1 --mysql --freeze-filesystem /mysql --mysql-master-status-file /mysql/master-info --description "$(date +'%Y/%m/%d %H:%M:%S') - ASR2 RAID0 (4 volumes) Snapshot" --debug -n $(ec2-describe-volumes --region us-west-1 | grep $(wget http://169.254.169.254/latest/meta-data/instance-id -O - -q) | egrep $(sudo mdadm --detail $(awk '{if($2=="/mysql") print $1}' /etc/fstab) | awk '/ \/dev\//{printf "%s ", $7}' | sed -e 's# /#|/#g') | awk '{printf "%s ", $2}')
答案3
我知道这不能回答您的问题,但我正在做一些类似的事情,但使用的是亚马逊的基本 ec2-create-snapshot 工具和一个 cron 脚本。它不如 ec2-consistent-snapshot 快,但我获得了所需的额外控制:fsync、锁定写入,最重要的是,适当地命名快照,以便可以按正确的顺序重建它们。