将正在运行的服务器迁移到RAID

曾几何时,在Ubuntu 12.04上有一台LAMP服务器可在单个驱动器上工作。 因此,出现了确保将服务器转移到容错能力更高的配置RAID1的问题。 负责该服务器的同志安装了第二个磁盘,其余的磁盘分配给了我,仅通过ssh即可访问服务器,这使任务复杂化。

搜索之后,找到了指南 ,并开始在虚拟机中进行培训。 当我激动地达到期望的结果时,尽管如此,我还是成功地将上述服务器转移到RAID1并提前制定了必要的步骤。 我决定将在其中详细介绍传输过程的文章放在“ Habr”上。

磁盘的故障如下:

/dev/sda1 2048 1574911 786432 swap /dev/sda2 * 1574912 16254975 7340032 / /dev/sda3 16254976 31457279 7601152 /home 

由于第二个磁盘是新磁盘,因此不需要任何操作即可删除先前的分区。

/etc/default/grub中修改了第一件事:
GRUB_TIMEOUT = 5(使超时时间更短);
GRUB_RECORDFAIL_TIMEOUT = 10(添加,以便在发生错误的情况下系统可以启动,而无需交互式干预;超时即可尝试);
GRUB_CMDLINE_LINUX_DEFAULT =“ bootdegraded”(一定要添加“ bootdegraded”,以便系统可以从下级阵列引导);
#GRUB_HIDDEN_TIMEOUT_QUIET = true(必须注释掉,以便始终显示GRUB菜单)。

暂时禁用交换,使用fdisk将fdisk设置为/ dev / sda1分区(Linux raid autodetect),然后将第二个磁盘与第一个分区相同(所有操作均以超级用户权限执行):

 sfdisk –d /dev/sda | sfdisk –f /dev/sdb 

然后,我们开始逐步构建RAID:

 mdadm --create --verbose /dev/md0 --raid-devices=2 --level=1 --metadata=1.2 /dev/sda1 /dev/sdb1 

swap下创建一个部分:
 mkswap /dev/md0 

我们更正了/etc/fstab ,将第一个磁盘的分区替换为RAID分区,并将第六列中的数字(需要检查fsck)更改为零:

 /dev/sda1 → /dev/md0 # SWAP /dev/sda2 → /dev/md1 # / /dev/sda3 → /dev/md2 # /home 

激活swap
 swapon -a 

由于我们的服务器当前正在第一个磁盘上工作,因此到目前为止,我们仅使用第二个磁盘来创建RAID:

 mdadm --create --verbose /dev/md1 --raid-devices=2 --level=1 --metadata=1.2 missing /dev/sdb2 mkfs.ext4 /dev/md1 mdadm --create --verbose /dev/md2 --raid-devices=2 --level=1 --metadata=1.2 missing /dev/sdb3 mkfs.ext4 /dev/md2 

更新mdadm.conf配置:

 mdadm --examine --scan >> /etc/mdadm/mdadm.conf 

initramfs以便initramfs有关RAID的信息:

 update-initramfs -u 

接下来,最长的过程开始-数据同步。 由于我们的服务器执行某些任务,因此可能会发现,同步完成后,阵列部分上的部分信息将与工作磁盘上相应部分上的数据有所不同。 有几个选项:您可以选择负载最少的时间,可以在同步期间停止部分服务,或者可以忽略差异。 通常,我们挂载和同步:

 mount /dev/md1 /mnt/ && [tmux|screen] rsync -axu / /mnt mount /dev/md2 /mnt/home && [tmux|screen] rsync -axu /home/ /mnt/home 

为了防止由于ssh连接中的意外中断而导致同步中断,将不会使用终端多路复用器。

等待同步结束后,将系统目录挂载到新的根目录:

 mount --bind /proc /mnt/proc mount --bind /dev /mnt/dev mount --bind /var /mnt/var mount --bind /run /mnt/run mount --bind /sys /mnt/sys 

我们正在转向新系统
 chroot /mnt 
并在两个磁盘上安装引导程序

 grub-install -–recheck /dev/sda grub-install --recheck /dev/sdb 

我们更新了启动配置,以加载RAID( mdraid1x )所需的模块:

 update-grub 

我们返回原始系统,并在必要时重新同步各节:

 [tmux|screen] rsync -axu / /mnt [tmux|screen] rsync -axu /home/ /mnt/home 

由于我们既没有控制台或服务器的物理访问权,也无法选择要从中引导RAID的驱动器,因此我们使用了这一技巧:将准备好的引导加载程序配置转移到系统从其启动且不在RAID中的驱动器谁知道RAID。 将grub.cfg从RAID中的磁盘复制到我们当前的启动磁盘。 这将允许系统以/ dev / sda开头,但挂载阵列并继续从RAID中已经存在的分区启动。 首先,保存旧文件,如果无法从RAID引导,则在还原系统时可能需要该文件,然后复制“战斗”配置文件:

 cp -p /boot/grub/grub.cfg /boot/grub/grub.old cp -p /mnt/boot/grub/grub.cfg /boot/grub/grub.cfg 

此外,您可以比较这些文件,并确保在新的引导加载程序配置文件中,根分区已列在RAID上。

现在我们进入最重要的工作阶段,然后重新启动。 您可以在控制台中开始对服务器进行ping以使服务器何时可以再次使用变得清晰。 我们登录后,发现一切都按照我们想要的方式进行: lsblk显示//home目录位于RAID分区上。

开胃菜仍然是一件轻松而愉快的工作-在将第一个磁盘的两个分区设置为fdisk键入fd之后,将其添加到阵列中:

 mdadm /dev/md1 --add /dev/sda2 mdadm /dev/md2 --add /dev/sda3 

然后定期查看镜像同步的进行情况:

 watch -n 5 cat /proc/mdstat 

让我在这里结束,谢谢您的关注!

Source: https://habr.com/ru/post/zh-CN481818/


All Articles