CorBlogкейсы · ops

Статья

MongoDB: перенос dbPath на новый диск

Диск уже размечен — остановить mongod, rsync данных, смонтировать UUID на /var/lib/mongodb, не меняя dbPath в конфиге.

/var/lib забился, mongod ушёл в failed. Новый SSD уже подключил и разметил (подключение SSD) — дальше нужно переложить данные MongoDB так, чтобы dbPath в конфиге остался /var/lib/mongodb. Так проще: не трогаем приложение и часто не лезем в AppArmor/SELinux-пути.

Что произошло

Типичный сетап:

  • Ubuntu 22.04 (или рядом);
  • MongoDB, часто Replica Set;
  • новый диск, например /dev/sdb1 с XFS, пока без постоянного mount на dbPath.

Цель: данные на новом томе, путь для MongoDB тот же.

Как искал

Перед переносом сверил диск и текущий dbPath:

lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,MODEL
grep -n "dbPath" /etc/mongod.conf
systemctl status mongod --no-pager
df -h /var/lib/mongodb

Ожидаю что-то вроде dbPath: /var/lib/mongodb и почти полный раздел под /var/lib.

Решение

Ниже диск уже с ФС (/dev/sdb1).

1. Временный mount

mkdir -p /mnt/mongo-new
mount /dev/sdb1 /mnt/mongo-new
df -h /mnt/mongo-new

2. Стоп и копирование

systemctl stop mongod
rsync -aHAX --numeric-ids /var/lib/mongodb/ /mnt/mongo-new/

Хвостовой / у источника важен: копируем содержимое каталога, не сам каталог вторым уровнем.

3. Подмена пути через fstab

Откат оставляю рядом:

umount /mnt/mongo-new
mv /var/lib/mongodb /var/lib/mongodb.old
mkdir -p /var/lib/mongodb

Постоянный mount по UUID на старый путь. Для ext4 замени тип ФС в строке fstab:

UUID=$(blkid -s UUID -o value /dev/sdb1)
echo "UUID=$UUID /var/lib/mongodb xfs defaults,nofail 0 2" >> /etc/fstab
mount -a
findmnt /var/lib/mongodb
df -h /var/lib/mongodb
chown -R mongodb:mongodb /var/lib/mongodb

4. Старт и проверка

systemctl start mongod
systemctl status mongod --no-pager
journalctl -u mongod -n 100 --no-pager

В RS с primary:

rs.status()

Старое дерево удаляю только после стабильной работы:

rm -rf /var/lib/mongodb.old

Rollback

Если что-то пошло не так:

systemctl stop mongod
umount /var/lib/mongodb
sed -i '\|/var/lib/mongodb xfs defaults,nofail|d' /etc/fstab
rm -rf /var/lib/mongodb
mv /var/lib/mongodb.old /var/lib/mongodb
chown -R mongodb:mongodb /var/lib/mongodb
systemctl start mongod

Итог

Схема, к которой возвращаюсь:

  1. Диск готов (GPT + XFS/ext4)
  2. Временный mount → rsync -aHAX
  3. mongodb → mongodb.old, пустой mount point
  4. UUID в fstab на /var/lib/mongodb
  5. chown, старт, проверка RS
  6. Удаление .old после стабилизации

dbPath в конфиге не меняю — меняю только то, что лежит под этим путём.