编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

记一次有惊无险的服务器扩容(服务器扩容需要多长时间)

wxchong 2024-07-16 10:26:45 开源技术 27 ℃ 0 评论

家里的服务器主分区一直是2块4T盘做的RAID1, 为了避免同批次硬盘同时出问题的可能, 特地选了1块希捷酷狼和1块西数紫盘. 大概8月份把OS换成了Proxmox VE, 主要是虚拟化更方便了, KVM/LXC/Docker可以同时支持, 外加一些其他优点, 例如基于LVM的磁盘管理, 比之前灵活很多. 之前是Ubuntu LTS, 用的技术栈都是步枪级别, 而且关机的时候大概率会卡在一个服务那里, 最终只能断电, 因为屏幕日志完全没提供什么有用的信息, 所以至今无果, 很是不爽. 换了PVE后, 第一次用Debian, 感觉比Ubuntu清爽不少, 印象还不错.

跑了3个月左右, 没出过什么问题, 只是硬盘用的差不多了. 虽然数据LV是thin pool, 可以实现分配空间大于总可用空间, 但是创建新LV时系统仍会检查, 如果发现总分配超过总可用了, 会给你个警告. 之前查过这个问题, 万一磁盘用满了会怎样, 结果很不好: 系统挂起, 不关机也不报错, 会卡住上层应用, 直到你完成扩容. 这个策略可能对于机房里有专人运维或者云存储厂商是很合适的, 因为到达阈值报警后会有备用的磁盘等着, 手动或者是自动把新盘挂上去继续跑, 很短的时间即可完成扩容, 弹性很好. 但是我这种的就不行了, 万一哪天报警了, 我得赶紧买盘, 加上快递的时间, 快递到了我万一不在家又得等. 如果时间来不及, 服务就停了, 这对于一个程序员来说是不可忍受的. 所以干脆, 提前加吧, 而且新家装完入住后还要接入2路监控视频, 至少要预留500GB的NVR存储, 早晚的事, 升级, 开干.

买盘没什么波折, 1块西数HC320 8T, 1块东芝MG06 8T, 都是全新国行企业级硬盘, 5年联保, 过保后咸鱼出个二手, 算下来花不了多少钱. 买硬盘, 最重要的就是质保. 换下来的2块4T盘, 卖一块留一块, 正好备份分区也用的差不多了, 再给扩4T吧. 备份分区是用mergerfs把盘叠起来用的, 没有冗余, 哪块盘坏了只丢一个盘的数据, 里面数据都是可再生的, 丢了不伤心. 备份分区扩容很简单, 没什么难度.

等了2天, 西数HC320到驿站了, 骑上心爱的小电动马上取回来. 开局肯定是全盘慢扫, 8T容量, 肯定过夜了. 第二天起床一看, SB Win10为了升级给我强制重启了, 都怪我昨天点了个下载, 因为组策略已经配置了不让他自动升级, 我还以为不点安装就没事呢, 结果还是败给巨硬的硬度人了. 顺便发现Win10的自动升级重启威力太大了, 我手动点个重启, 如果哪个应用不退, Win10还在那死等我处理呢, 结果这自动的可好, 不知道昨晚重启的时候是卡在哪了, 好几个程序都没正常退出, Vmware的虚机都是断电状态, 再一次问候硬度同行. 估摸着重启前应该扫了50%+了, 直接从50%继续扫, 晚上终于扫完了, 查完官网保修, 标签拍完照片留底, 就塞进机箱了.

先测个速吧, 因为Windows下是用的USB硬盘盒, 只能放到服务器再测. 之前都是简单用hdparm测一下, 这次感觉应该再进一步, 顺序读写/随机读写都测一下, 试试7200RPM比我之前的5900RPM有多大提升. 想起了之前运维同事用过一个叫fio的工具, 看了看介绍, 感觉挺强大就装上了, 噩梦就从fio这个东西开始了. 新买的硬盘怎么读写都没事, 空的嘛, 随便搞, fio跑了几圈, 感觉速度还可以, 能和值友的帖子对的上, 测速成功完成.

之前主分区是LVM的RAID1模式, 新硬盘当然是加进去, 然后同步完成后删除一块4T, 等另外一块8T加进去, 同步完成再把另外一块4T删除.

#lvconvert --type raid1 -m 2 pve/root /dev/sda3 # 新盘是sda

类似的, 把所有LV都同步完. 同步时间也很长, 第二天上午才完.

主分区包含3个分区, LVM分区同步完, BIOS和EFI分区直接dd过去:

#dd if=/dev/sdb1 of=/dev/sda1 bs=1M

#dd if=/dev/sdb2 of=/dev/sda2 bs=1M

注意MBR扇区也要拷过去, 否则会引导失败, 而且只能用PVE的, syslinux的不行:

#dd if=/dev/sdb of=/dev/sda bs=1 count=512 # 只拷贝第一个扇区即可, MBR分区表也在里面

考完后, 先把第一块4T, 也就是不打算卖的酷狼删除, 因为还没过保:

#lvconvert --type raid1 -m 1 pve/root /dev/sdb3 # 酷狼是sdb

直接格成XFS, 顺手就给备份分区加上了. 现在主分区数据是4T西数+8T西数冗余, 一切还在掌握中.

东芝8T收到后, 全盘慢扫, 拍照留念, 就打算推进去测速. 推之前琢磨, 反正4T西数是要取出来的, 不如这次直接取出来, 只开一次机箱就够了, 风险就是4T西数删除后到东芝8T同步完之前, 只有8T西数一个盘携带数据, 期间大概8-12小时, 主分区无冷备. 没事没事, 能有啥事, 就这么整.

#lvconvert --type linear pve/data /dev/sda3 # RAID1转linear

所有LV都转换完后, 删除西数4T:

#vgreduce pve /dev/sdc3 # sdc是4T西数

#pvremove /dev/sdc3

关机换盘, 开机先测速, 新盘没问题, 符合预期, 然后突然萌生一个想法: 要不要让2块8T对比一下, 毕竟步调一致效果好么. 怎么测? fio啊. 我心里当然是有顾虑的, 毕竟现在只有8T西数带数据, 别测出事来. 但是又看了一眼拆下来的4T西数想: 虽然你被pvremove了, 但是数据没被删的, 只是把LVM的元数据改了, 嘿嘿我懂, 数据有备份就好. 测测测.

对了, fio不会把我原来数据抹掉吧, 查查先, 嗯, man上没说啥, 而且正经程序如果要抹数据, 肯定会给个警告让你二次确认的吧, 比如mkfs.xxx/pvcreate/fdisk, 就连ffmpeg如果替换文件还要让你确认呢, 像hdparm不会删数据, 他就没提示, 没事.

测完第一次顺序写-rw=write, 我还dmesg看了眼有没有报错, 因为根分区和内核镜像都在磁盘前面, 如果抹肯定先抹他们. 没报错, 继续测, 虽然还是有点担心. 当我测了6-7次左右, 突然发现内核开始报错了, 而且之前没运行过的一些命令也提示找不到了(因为还没缓存), 不要慌不要慌, 我还有块西数4T呢, 虽然LVM元数据没了.

没法子了, reboot吧, 果然BIOS报错了, 找不到OS. 嗯, 赶紧拿出西数4T装上, 开机选择从这块盘启动:

Error: disk ‘lvmid/xxx/yyy’ not found. # 这里xxx是VG的UUID, yyy是根分区的UUID

没丢数据的时候感觉丢个LVM元数据不算啥, 真让我去恢复, 真蒙了. 查资料吧.

找到篇文章, 和我情况类似, 他是磁盘损坏导致元数据丢失, 而我是手贱:

#pvcreate /dev/sdb -u "xxx" --restorefile /etc/lvm/backup/datavg

嗯, xxx肯定是PV的UUID了, 而且最好都用之前的, 要和EFI里对的上才行, 这个得去根分区里找. 还有restore file呢, 也是在根分区. 可是根分区也是个LV啊, 陷入死循环了.

我和老婆二十年的数据, 我毛4年半的数据, 还有不少客户的数据, 继续想办法吧.

现在知道要谨慎了, 先把西数4T数据同步到刚刚抹掉的西数8T吧, 多个冗余多份保障, 关键一会做恢复的时候万一失败了还能继续试.

根分区是XFS文件系统, 只要能找到这个文件系统就行. 查查XFS有什么标识, 还好, XFS超级块前4B是个magic: XFSB, 全盘搜这个吧. 幸好没用EXT4, EXT4就没这么明显的magic, 找起来会更麻烦. 怎么搜最快呢, 4个T啊, grep/hexdump/sed都太慢了, 而且CPU高IOPS低. 算了不找了, 自己写一个吧. 不到50行代码, 性能还不错, IOPS能跑满, 200MB左右.

开始的时候记错了, 印象中查询lvs时记得根分区被LVM放到后面半块盘了, 于是就先fseek到2T开始找, 找了3个小时, 结果里筛选了一下都不对, 要么超级块字段对不上, 要么文件系统大小不对. 又开始从磁盘开头搜, 加了些过滤条件, 结果更加精准. 又是3个小时, 这次搜到了, 一共找到4个, 每隔8GB一个, 但是只有第一个的超级块字段全对, 32GB的LV, 后面的只有前几个字段对, 不知道是什么. 这时我在祈祷LVM千万不要把同一个LV分成多段不连续去存储, 毕竟只有32GB, 而且我也没lvextend过. 先dd取出来再说吧. 保险起见, 取了34GB:

#dd if=/dev/sda3 of=root.xfs bs=1M count=34816 skip=16393

挂载试试:

#mount root.xfs /opt

多谢上苍显灵, 没有报错, 赶紧去找etc/lvm/backup/pve. 好消息是文件还在, 坏消息是文件不全, 猜测是lvconvert移除这块盘的时候, 命令还没把完整的backup文件写完, 磁盘就被内核摘掉了.

想办法补全吧, 用etc/lvm/archive里最新的历史记录, 上beyond compare. 期间还发现backup不但不全, 前面还有旧的, 因为现在已经全是linear了, 但是backup的data LV还是RAID1, 而且PV有2个. 这就要仔细计算, 看看哪个是现在这块盘, 把另外那个删掉, 然后把RAID1手动改成linear, 注意PE的地址不要算错, 否则还是找不回来.

改完后就要用pvcreate去尝试恢复了:

#pvcreate /dev/sda3 -u "nhkPNh-l4p8-rNau-ybjk-MyQn-mV8E-DL7um2" --restorefile /opt/etc/lvm/backup/pve

嗯, 来回改了几次, 终于成功了, pvs识别到PV了. 下一步就是恢复VG和LV:

#vgcfgrestore --test --file pve -d pve #先test一把, 直接写入万一失败了呢

提示restore失败, 因为有thin pool类型的LV, 必须加--force直接写, 不让test. 我手软啊, 就这一把了, 成就成了, 不成估计我也没招了, 因为反复核对, backup文件应该没什么错误了. 我仍然坚信只是丢了LVM元数据, 如果LV数据丢失就还得去恢复文件系统, 还是不行就得去开盘了? 我只是听说磁性有残留一说, 但不是很懂.

还是让老婆来吧, 实在没有勇气了. 准备好命令, 速度跑出房间, 让老婆来这个关键的enter. 隔老远我问: 有报错吗? 答曰: 啥都没啊, 松了一口气. 速度跑过来确认了一下, 成功了!

# pvs && vgs && lvs

终于都回来了. 挂载根分区试了下正常, 然后就reboot了.

成功启动, SSH登上去mount看了下, 文件系统都成功挂载了, 至此数据恢复完成.

总结:

1. 早日升级热插拔盘位机箱, 插拔硬盘不再愁;

2. 按流程操作, 不管是在哪里, 数据无价, 时间无价;

3. 后来仔细看fio的man, 其实是有说抹数据的, 但是执行时确实没有二次确认, 试试给作者提个建议.

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表