Пошаговое руководство: Развертывание базового кластера MongoDB с шардированием
MongoDB, популярная документо-ориентированная база данных NoSQL, отлично справляется с большими объемами данных, обеспечивая высокую производительность и гибкость. Однако по мере роста данных один сервер или набор реплик может достичь своих пределов масштабирования. Здесь на помощь приходит шардирование, позволяющее горизонтально масштабировать данные путем их распределения по нескольким серверам, или шардам.
Это подробное руководство проведет вас через полный процесс настройки функционального кластера MongoDB с шардированием. Вы узнаете, как сконфигурировать основные компоненты: серверы конфигурации (config servers), маршрутизаторы mongos и наборы реплик шардов. К концу этого учебного пособия вы получите фундаментальное понимание и практический опыт развертывания кластера с шардированием, предназначенного для высокой горизонтальной масштабируемости и доступности.
Понимание кластеров MongoDB с шардированием
Кластер MongoDB с шардированием состоит из трех основных компонентов, которые работают вместе для распределения и маршрутизации данных:
- Наборы реплик шардов (Shard Replica Sets): Это фактические узлы, содержащие данные. Каждый шард представляет собой набор реплик для обеспечения высокой доступности и избыточности данных. Данные секционируются между этими шардами.
- Серверы конфигурации (Config Servers): Они хранят метаданные кластера, включая отображение фрагментов данных на шарды. Начиная с MongoDB 3.2, серверы конфигурации должны быть развернуты как набор реплик (CSRS - Config Server Replica Set) для высокой доступности и согласованности.
- Маршрутизаторы
mongos: Они действуют как маршрутизаторы запросов, предоставляя интерфейс для клиентских приложений. Экземплярmongosнаправляет операции клиента к соответствующему шарду (шардам) на основе метаданных кластера. Приложения подключаются кmongos, а не напрямую к шардам.

Концептуальная диаграмма кластера MongoDB с шардированием (изображение предоставлено: официальная документация MongoDB)
Предварительные требования
Прежде чем начать, убедитесь, что у вас есть следующее:
- Несколько машин/виртуальных машин: Для по-настоящему распределенного кластера с шардированием вам потребуется как минимум 6-9 машин/виртуальных машин/Docker-контейнеров. Для данного базового руководства мы можем симулировать это на одной машине, используя разные порты, но помните, что производственная установка требует выделенных ресурсов.
- 3 для серверов конфигурации (configSrv01, configSrv02, configSrv03)
- Минимум 2-3 для каждого шарда (например, Shard01-RS01, Shard01-RS02, Shard01-RS03; Shard02-RS01, ...)
- 1+ для маршрутизаторов
mongos
- Установка MongoDB: MongoDB 4.2+ установлен на всех машинах, которые будут размещать экземпляры
mongodилиmongos. Инструкции по установке можно найти в документации MongoDB. - Сеть: Убедитесь, что все машины могут взаимодействовать друг с другом по необходимым портам (по умолчанию
27017,27018,27019,27020для серверов конфигурации, шардов иmongosсоответственно, или пользовательские порты). - Структура каталогов: Создайте выделенные каталоги данных и журналов для каждого экземпляра
mongodиmongos.
Для простоты в этом руководстве мы будем использовать localhost с разными портами и каталогами. В производственной среде вы бы использовали фактические имена хостов или IP-адреса.
Рекомендуемая структура каталогов (пример для настройки localhost)
mkdir -p /data/db/configdb01 /data/db/configdb02 /data/db/configdb03
mkdir -p /data/db/shard01-rs01 /data/db/shard01-rs02 /data/db/shard01-rs03
mkdir -p /data/db/shard02-rs01 /data/db/shard02-rs02 /data/db/shard02-rs03
mkdir -p /data/log/config /data/log/shard01 /data/log/shard02 /data/log/mongos
Шаги развертывания
Шаг 1: Настройка серверов конфигурации (набор реплик конфигурации)
Серверы конфигурации хранят метаданные для кластера с шардированием. Они должны работать как набор реплик.
-
Запустите экземпляры
mongodдля серверов конфигурации: Каждый экземпляр требует опций--configsvrи--replSet.```bash
Сервер конфигурации 1
mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb01 --port 27019 --bind_ip localhost --logpath /data/log/config/configdb01.log --fork
Сервер конфигурации 2
mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb02 --port 27020 --bind_ip localhost --logpath /data/log/config/configdb02.log --fork
Сервер конфигурации 3
mongod --configsvr --replSet cfgReplSet --dbpath /data/db/configdb03 --port 27021 --bind_ip localhost --logpath /data/log/config/configdb03.log --fork
```Совет: Для производственной среды замените
localhostна фактические IP-адреса или имена хостов. -
Инициализируйте набор реплик конфигурации: Подключитесь к одному из экземпляров сервера конфигурации и инициализируйте набор реплик.
bash mongo --port 27019Внутри оболочки mongo:
javascript rs.initiate({ _id: "cfgReplSet", configsvr: true, members: [ { _id : 0, host : "localhost:27019" }, { _id : 1, host : "localhost:27020" }, { _id : 2, host : "localhost:27021" } ] });Проверьте статус:
javascript rs.status();
Шаг 2: Настройка наборов реплик шардов
Каждый шард в кластере является набором реплик. Мы настроим два шарда (shard01 и shard02), каждый с тремя членами.
-
Запустите экземпляры
mongodдля членов шарда 1: Каждый экземпляр требует опций--shardsvrи--replSet.```bash
Член шарда 1, экземпляр 1
mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs01 --port 27030 --bind_ip localhost --logpath /data/log/shard01/shard01-rs01.log --fork
Член шарда 1, экземпляр 2
mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs02 --port 27031 --bind_ip localhost --logpath /data/log/shard01/shard01-rs02.log --fork
Член шарда 1, экземпляр 3
mongod --shardsvr --replSet shard01 --dbpath /data/db/shard01-rs03 --port 27032 --bind_ip localhost --logpath /data/log/shard01/shard01-rs03.log --fork
``` -
Инициализируйте набор реплик шарда 1: Подключитесь к одному из экземпляров шарда 1.
bash mongo --port 27030Внутри оболочки mongo:
javascript rs.initiate({ _id : "shard01", members: [ { _id : 0, host : "localhost:27030" }, { _id : 1, host : "localhost:27031" }, { _id : 2, host : "localhost:27032" } ] }); -
Запустите экземпляры
mongodдля членов шарда 2 (повторите для дополнительных шардов):```bash
Член шарда 2, экземпляр 1
mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs01 --port 27040 --bind_ip localhost --logpath /data/log/shard02/shard02-rs01.log --fork
Член шарда 2, экземпляр 2
mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs02 --port 27041 --bind_ip localhost --logpath /data/log/shard02/shard02-rs02.log --fork
Член шарда 2, экземпляр 3
mongod --shardsvr --replSet shard02 --dbpath /data/db/shard02-rs03 --port 27042 --bind_ip localhost --logpath /data/log/shard02/shard02-rs03.log --fork
``` -
Инициализируйте набор реплик шарда 2: Подключитесь к одному из экземпляров шарда 2.
bash mongo --port 27040Внутри оболочки mongo:
javascript rs.initiate({ _id : "shard02", members: [ { _id : 0, host : "localhost:27040" }, { _id : 1, host : "localhost:27041" }, { _id : 2, host : "localhost:27042" } ] });
Шаг 3: Настройка маршрутизаторов mongos
Экземпляры mongos являются точками входа для клиентских приложений. Им необходимо знать, где находятся серверы конфигурации.
-
Запустите экземпляры
mongos: Укажите опцию--configdb, перечислив членов набора реплик конфигурации.```bash
Маршрутизатор Mongos 1
mongos --configdb cfgReplSet/localhost:27019,localhost:27020,localhost:27021 --port 27017 --bind_ip localhost --logpath /data/log/mongos/mongos01.log --fork
```Примечание: Вы можете запустить несколько экземпляров
mongosдля балансировки нагрузки и высокой доступности. Все они подключаются к одним и тем же серверам конфигурации.
Шаг 4: Подключение к mongos и добавление шардов
Теперь подключитесь к экземпляру mongos и добавьте наборы реплик шардов в кластер.
-
Подключитесь к
mongos: Используйте порт MongoDB по умолчанию27017или пользовательский порт, который вы указали дляmongos.bash mongo --port 27017 -
Добавьте шарды: Используйте команду
sh.addShard(), указав имя набора реплик и одного из его членов.javascript sh.addShard("shard01/localhost:27030"); sh.addShard("shard02/localhost:27040");
Шаг 5: Включение шардирования для базы данных и коллекции
После добавления шардов вам нужно включить шардирование для конкретных баз данных, а затем для конкретных коллекций в этих базах данных. Это требует выбора ключа шарда.
-
Включение шардирования для базы данных: Переключитесь на базу данных, которую вы хотите шардировать, и выполните
sh.enableSharding().javascript use mydatabase; sh.enableSharding("mydatabase"); -
Шардирование коллекции: Выберите
ключ шардаи используйтеsh.shardCollection().Предупреждение: Выбор эффективного ключа шарда имеет решающее значение для производительности и равномерного распределения. Плохой ключ шарда может привести к горячим точкам или неэффективным запросам. Общие стратегии включают хешированные ключи, диапазонные ключи или составные ключи.
В этом примере предположим, что у нас есть коллекция
mycollectionс полем_id.```javascript
sh.shardCollection("mydatabase.mycollection"