Ответ на Q1
с устаревшим содержимым конфигурации сервера, IIRC, может быть незамеченной гигантская потеря данных. Вот почему:
Sharding in MongoDB основан на ключевых диапазонах. То есть каждому осколку присваивается диапазон ключей, которые он отвечает.
Для иллюстрации предположим, что у вас есть ключ осколка целых чисел, начиная с 1 до бесконечности. Таким образом, основные диапазоны могут выглядеть следующим образом (эксклюзивные границы)
shard0001: -infinity to 100
shard0002: 101 - 200
shard0003: 201 - 300
shard0004: 301 - 400
shard0005: 401 - 500
shard0006: 501 - 600
Так как же вы Монго знает об этом распределении? Он хранится на серверах конфигурации. Теперь предположим, что ваши метаданные были изменены, и ваш shard0002 фактически хранит данные от 100-500. Предположим, вы хотите получить документ с помощью ключа осколка 450. Согласно старым метаданным, этот документ должен быть на shard0005, если он существует. Таким образом, запрос направляется в shard0005. Будет выполнен поиск индекса, и осколок выяснит, что у него нет документа. Поэтому, пока документ существует (на shard0002), из-за устаревших метаданных он будет проверяться на shard0005, где его не существует.
Ответ на Q2
Нет, насколько я знаю. Однако вы можете использовать следующую процедуру для MongoDB < 3.0.0.
Отказ
Я не проверял эту процедуру. Перед очисткой каталогов данных убедитесь, что у вас есть резервные копии, и не опускайте флажки --repair
и --objcheck
. Для обеспечения максимальной безопасности создайте моментальные снимки файловой системы перед использованием. Если вы этого не сделаете, пожалуйста, не обвиняйте меня в каких-либо потерях данных.
- Выключите весь кластер изящно
Используйте mongodump против каталога данных
mongodump --repair --dbpath /path/to/your/datafiles -o /path/for/backups/mongo
Сделайте это один раз для каждого осколка.
- Протрите все каталоги данных и восстановить свой sharded кластер
Подключение к mongos
sh.enableSharding({"database":yourDb})
sh.shardCollection("yourdDb.yourShardedCollection",{"yourShardKey":1})
От каждого осколка, используйте mongorestore для записи резервных копий к mongos
mongorestore -h mongosHost:mongosPort --db yourDb --dir /path/for/backups/ \
--objcheck --write-concern "{w:1}"
Обратите внимание, что вы должны NOT выполнять восстановление параллельно, так как это может привести к перегрузке балансировочного устройства.
В основном мы собираем все данные из отдельных осколков, создаем новую очерченную коллекцию в новой базе данных и помещаем собранные данные в эту базу данных, при этом упорядоченная коллекция автоматически балансируется.
Следите за процессом очень осторожно и абсолютно уверены, что вы не перегружаете балансир, иначе вы можете вырваться из дискового пространства на осколке, если у вас нет оптимального ключа осколка.
Конечно, вы можете воссоздать другие защищенные базы данных из резервной копии, используя соответственно mongorestore. Чтобы восстановить незащищенные базы данных, просто подключитесь к репликации, которую вы хотите сохранить, вместо того, чтобы подключаться к монго.
Примечание стороны:
Если вам нужно восстановить сервер конфигурации, просто сбросить один из двух других и восстановить базу данных конфигурации для этого сервера.
Причина этого в том, что метаданные не могут быть обновлены, если все серверы конфигурации не работают, не работают и не синхронизируются.
Для Q1 мы используем привязку к тегам, чтобы значение min/max каждого осколка уже было предварительно выделено. В результате, если значение для запроса или обновления все еще находится в диапазоне min/max каждого осколка, оно должно иметь возможность получать данные в правильном осколке. Однако мы больше беспокоимся о том, что mongodb не работает, если мы восстановим устаревшую резервную копию резервного сервера, особенно некоторые непредвиденные ошибки, которые влияют на нормальные операции кластера mongodb. –
Для Q2 обычно некоторый производственный кластер может иметь несколько терабайт данных, полное восстановление всех данных может занять несколько дней, и поэтому производственная система станет недоступной в течение нескольких дней. Могу ли я узнать, есть ли у нас способ отправить запрос компании mongodb и позволить им рассмотреть вопрос о целесообразности разработки инструмента для синхронизации данных между конфигурационным и сервером данных и восстановления непревзойденных данных. –
Для Q1: с учетом диапазона ключей для каждого осколка не изменились, и ваши теги равны предварительно заданным диапазонам ключей, только фрагменты фрагментов не будут отражаться в метаданных. Хотя это не идеально подходит для последующего масштабирования, это не должно повредить. –