РЕЗЕРВНОЕ КОПИРОВАНИЕ И ВОССТАНОВЛЕНИЕ MONGODB

Thank you for reading this post, don't forget to subscribe!

MongoDB – одна из самых попу­ляр­ных систем управ­ле­ния баз дан­ных NoSQL. MongoDB извест­на сво­ей мас­шта­би­ру­е­мо­стью, ошиб­ко­устой­чи­во­стью, надеж­но­стью и про­сто­той исполь­зо­ва­ния. В этом мануа­ле вы узна­е­те, как создать резерв­ную копию БД, вос­ста­но­вить и пере­ме­стить обра­зец дан­ных MongoDB.

Импорт и экс­порт БД под­ра­зу­ме­ва­ет рабо­ту с дан­ны­ми в удо­бо­чи­та­е­мом фор­ма­те, сов­ме­сти­мом с дру­ги­ми про­грам­ма­ми. Опе­ра­ции резерв­но­го копи­ро­ва­ния и вос­ста­нов­ле­ния, напро­тив, созда­ют или исполь­зу­ют дво­ич­ные дан­ные, спе­ци­фич­ные для MongoDB – это поз­во­ля­ет сохра­нить не толь­ко согла­со­ван­ность и целост­ность дан­ных, но и их атри­бу­ты. Таким обра­зом, для пере­ме­ще­ния дан­ных обыч­но реко­мен­ду­ет­ся исполь­зо­вать резерв­ное копи­ро­ва­ние и вос­ста­нов­ле­ние (если исход­ная и целе­вая систе­мы совместимы).

1: Использование JSON и BSON

Преж­де чем про­дол­жить рабо­ту с этим ману­а­лом, необ­хо­ди­мо разо­брать­ся с базо­вы­ми поня­ти­я­ми. Если у вас есть опыт рабо­ты с дру­ги­ми систе­ма­ми баз дан­ных NoSQL, таки­ми как Redis, вы заме­ти­те неко­то­рое сход­ство меж­ду ними и MongoDB.

Во-пер­вых, раз­бе­рем­ся с фор­ма­та­ми. Для хра­не­ния сво­ей инфор­ма­ции MongoDB исполь­зу­ет фор­ма­ты JSON и BSON (дво­ич­ный JSON). JSON – это удо­бо­чи­та­е­мый фор­мат, кото­рый иде­аль­но под­хо­дит для экс­пор­та и импор­та ваших дан­ных. Вы може­те управ­лять экс­пор­ти­ро­ван­ны­ми дан­ны­ми с помо­щью любо­го инстру­мен­та, под­дер­жи­ва­ю­ще­го JSON, вклю­чая про­стой тек­сто­вый редактор.

Доку­мент json выгля­дит так:

С JSON удоб­но рабо­тать, но он под­дер­жи­ва­ет не все типы дан­ных, доступ­ные в BSON. Это озна­ча­ет, что при исполь­зо­ва­нии JSON дан­ные могут стать недо­сто­вер­ны­ми. Пото­му для резерв­но­го копи­ро­ва­ния и вос­ста­нов­ле­ния луч­ше исполь­зо­вать фор­мат BSON.

Во-вто­рых, вам не нуж­но явно созда­вать базу дан­ных MongoDB. Если для импор­та вы ука­за­ли несу­ще­ству­ю­щую БД, она будет созда­на авто­ма­ти­че­ски. Еще луч­ше обсто­ит дело со струк­ту­рой кол­лек­ций (таб­лиц базы дан­ных). В отли­чие от дру­гих движ­ков, MongoDB авто­ма­ти­че­ски вос­со­зда­ет струк­ту­ру при встав­ке пер­во­го доку­мен­та (стро­ки данных).

В-тре­тьих, в MongoDB чте­ние или встав­ка боль­ших объ­е­мов дан­ных, таких как зада­чи в этой ста­тье, может потре­бо­вать зна­чи­тель­ных ресур­сов и занять боль­шую часть ваше­го про­цес­со­ра, памя­ти и дис­ко­во­го про­стран­ства. Это очень важ­но, учи­ты­вая, что MongoDB часто исполь­зу­ет­ся имен­но для боль­ших баз дан­ных. Самое про­стое реше­ние этой про­бле­мы – запус­кать экс­порт и резерв­ное копи­ро­ва­ние в ноч­ное вре­мя или в непи­ко­вые часы.

В-чет­вер­тых, согла­со­ван­ность инфор­ма­ции может быть про­бле­мой, если ваш сер­вер MongoDB пере­гру­жен, а инфор­ма­ция на нем изме­ня­ет­ся во вре­мя экс­пор­та или резерв­но­го копи­ро­ва­ния БД. Одним из воз­мож­ных реше­ний этой про­бле­мы явля­ет­ся репли­ка­ция.

Функ­ции импор­та и экс­пор­та мож­но исполь­зо­вать для резерв­но­го копи­ро­ва­ния и вос­ста­нов­ле­ния дан­ных, одна­ко есть более эффек­тив­ные спо­со­бы обес­пе­чить пол­ную целост­ность ваших БД MongoDB. Для резерв­но­го копи­ро­ва­ния сле­ду­ет исполь­зо­вать коман­ду mongodump. Для вос­ста­нов­ле­ния – коман­ду mongorestore. Давай­те посмот­рим, как они работают.

2: Резервное копирование MongoDB с помощью mongodump

Сна­ча­ла мы рас­смот­рим резерв­ное копи­ро­ва­ние базы дан­ных MongoDB.

Важ­ным аргу­мен­том коман­ды mongodump явля­ет­ся –db, он ука­зы­ва­ет имя БД, резерв­ную копию кото­рой вы хоти­те создать. Если вы не ука­же­те имя базы дан­ных, mongodump создаст резерв­ную копию всех ваших баз данных.

Вто­рой важ­ный аргу­мент – это –out, он опре­де­ля­ет ката­лог, в кото­рый будут выгру­же­ны дан­ные. Для при­ме­ра давай­те созда­дим резерв­ную копию БД newdb и сохра­ним ее в ката­ло­ге /var/backups/mongobackups. В иде­а­ле каж­дая из наших резерв­ных копий появит­ся в ката­ло­ге с теку­щей датой (в фор­ма­те /var/backups/mongobackups/10-29-20).

Сна­ча­ла создай­те необ­хо­ди­мый ката­лог /var/backups/mongobackups:

sudo mkdir /var/backups/mongobackups

А теперь запу­сти­те коман­ду mongodump:

sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`

Вы уви­ди­те такой вывод:

 

Обра­ти­те вни­ма­ние, что в ука­зан­ном выше пути к ката­ло­гу мы исполь­зо­ва­ли date +”%m-%d-%y”, что авто­ма­ти­че­ски уста­но­вит теку­щую дату. Это поз­во­лит нам созда­вать резерв­ные копии внут­ри ката­ло­га, напри­мер, /var/backups/10-29-20/.   Это осо­бен­но удоб­но, когда мы авто­ма­ти­зи­ру­ем резерв­ное копирование.

На этом эта­пе у вас есть пол­ная резерв­ная копия базы дан­ных newdb в ката­ло­ге /var/backups/mongobackups/10-29-20/newdb/. В этой резерв­ной копии есть все, что­бы пра­виль­но вос­ста­но­вить newdb и сохра­нить точ­ность и целост­ность данных.

Как пра­ви­ло, резерв­ные копии долж­ны созда­вать­ся регу­ляр­но, жела­тель­но тогда, когда сер­вер наи­ме­нее загру­жен. Что­бы сде­лать это, мож­но уста­но­вить коман­ду mongodump как зада­ние cron, что­бы она выпол­ня­лась в опре­де­лен­ное вре­мя, напри­мер, каж­дый день в 03:03.

Для это­го открой­те crontab, редак­тор cron:

sudo crontab -e

Обра­ти­те вни­ма­ние, что при запус­ке sudo crontab вы буде­те редак­ти­ро­вать зада­ния cron для поль­зо­ва­те­ля root. Реко­мен­ду­ет­ся делать имен­но так, пото­му что если вы уста­но­ви­те crons для дру­го­го поль­зо­ва­те­ля, зада­чи могут рабо­тать некор­рект­но (осо­бен­но если ваш про­филь sudo тре­бу­ет про­вер­ки пароля).

В команд­ную стро­ку crontab вве­ди­те сле­ду­ю­щую коман­ду mongodump:

3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

В при­ве­ден­ной выше коман­де мы наме­рен­но опус­ка­ем аргу­мент –db, пото­му что резерв­ное копи­ро­ва­ние обыч­но тре­бу­ет­ся всем базам данных.

В зави­си­мо­сти от раз­ме­ров вашей БД MongoDB, рано или позд­но у вас закон­чит­ся дис­ко­вое про­стран­ство – нако­пит­ся мно­го резерв­ных копий. Вот пото­му так­же реко­мен­ду­ет­ся регу­ляр­но уда­лять или сжи­мать ста­рые копии.

Напри­мер, что­бы уда­лить все резерв­ные копии стар­ше семи дней, вы може­те исполь­зо­вать сле­ду­ю­щую коман­ду bash:

find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

Как и преды­ду­щую коман­ду mongodump, вы може­те доба­вить ее как зада­чу cron. Она долж­на запус­кать­ся непо­сред­ствен­но перед нача­лом сле­ду­ю­ще­го резерв­но­го копи­ро­ва­ния, напри­мер, в 03:01. Сно­ва открой­те crontab:

sudo crontab -e

После это­го вставь­те сле­ду­ю­щую строку:

1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

Сохра­ни­те и закрой­те файл.

Все эти зада­чи обес­пе­чат пра­виль­ное выпол­не­ние резерв­но­го копи­ро­ва­ния ваших баз дан­ных MongoDB.

3: Восстановление и миграция MongoDB с помощью mongorestore

После вос­ста­нов­ле­ния БД MongoDB из резерв­ной копии у вас будет точ­ная копия дан­ных MongoDB, создан­ная в опре­де­лен­ное вре­мя (вклю­чая все индек­сы и типы). Это осо­бен­но полез­но, если вы хоти­те пере­не­сти свои базы дан­ных MongoDB на дру­гую маши­ну. Для вос­ста­нов­ле­ния MongoDB мы будем исполь­зо­вать коман­ду mongorestore, кото­рая рабо­та­ет с дво­ич­ны­ми резерв­ны­ми копи­я­ми, создан­ны­ми коман­дой mongodump.

Давай­те про­дол­жим рабо­ту с нашей тесто­вой БД newdb и посмот­рим, как вос­ста­но­вить ее из ранее создан­ной резерв­ной копии. Сна­ча­ла ука­жем имя базы дан­ных с помо­щью аргу­мен­та –nsInclude (в нашем слу­чае это newdb). Сим­вол * нужен в коман­де для вос­ста­нов­ле­ния всех кол­лек­ций. Что­бы вос­ста­но­вить одну кол­лек­цию, напри­мер restaurants, исполь­зуй­те вме­сто звез­доч­ки newdb.restaurants.

Затем, исполь­зуя аргу­мент –drop, мы сбро­сим целе­вую БД, что­бы резерв­ная копия была вос­ста­нов­ле­на ​​в чистой базе дан­ных. В каче­стве послед­не­го аргу­мен­та мы ука­жем ката­лог послед­ней резерв­ной копии, кото­рый будет выгля­деть при­мер­но так: /var/backups/mongobackups/10-29-20/newdb/.

Если у вас есть резерв­ная копия с мет­кой вре­ме­ни, вы може­те вос­ста­но­вить ее с помо­щью этой команды:

sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

Вы полу­чи­те при­мер­но такой вывод:

В при­ве­ден­ном выше при­ме­ре мы вос­ста­нав­ли­ва­ем дан­ные на том же сер­ве­ре, на кото­ром мы созда­ли резерв­ную копию. Если вы хоти­те пере­не­сти дан­ные на дру­гой сер­вер и исполь­зо­вать тот же метод, вам сле­ду­ет ско­пи­ро­вать на новую маши­ну ваш ката­лог резерв­ных копий (в нашем мануа­ле это /var/backups/mongobackups/10-29-20/newdb/).