Пошаговое руководство: Развертывание базового шардированного кластера MongoDB

Откройте для себя горизонтальную масштабируемость с помощью этого пошагового руководства по развертыванию базового шардированного кластера MongoDB. Научитесь настраивать config-серверы, реплика-сеты шардов и развертывать маршрутизаторы `mongos`. Это руководство охватывает все: от начальной настройки и инициализации компонентов до включения шардирования для ваших баз данных и коллекций. Идеально подходит для разработчиков и администраторов, оно предоставляет практические команды, лучшие практики и шаги проверки для обеспечения надежной и масштабируемой среды MongoDB.

35 просмотров

Пошаговое руководство: Развертывание базового кластера 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 с шардированием (изображение предоставлено: официальная документация MongoDB)

Предварительные требования

Прежде чем начать, убедитесь, что у вас есть следующее:

  1. Несколько машин/виртуальных машин: Для по-настоящему распределенного кластера с шардированием вам потребуется как минимум 6-9 машин/виртуальных машин/Docker-контейнеров. Для данного базового руководства мы можем симулировать это на одной машине, используя разные порты, но помните, что производственная установка требует выделенных ресурсов.
    • 3 для серверов конфигурации (configSrv01, configSrv02, configSrv03)
    • Минимум 2-3 для каждого шарда (например, Shard01-RS01, Shard01-RS02, Shard01-RS03; Shard02-RS01, ...)
    • 1+ для маршрутизаторов mongos
  2. Установка MongoDB: MongoDB 4.2+ установлен на всех машинах, которые будут размещать экземпляры mongod или mongos. Инструкции по установке можно найти в документации MongoDB.
  3. Сеть: Убедитесь, что все машины могут взаимодействовать друг с другом по необходимым портам (по умолчанию 27017, 27018, 27019, 27020 для серверов конфигурации, шардов и mongos соответственно, или пользовательские порты).
  4. Структура каталогов: Создайте выделенные каталоги данных и журналов для каждого экземпляра 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: Настройка серверов конфигурации (набор реплик конфигурации)

Серверы конфигурации хранят метаданные для кластера с шардированием. Они должны работать как набор реплик.

  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-адреса или имена хостов.

  2. Инициализируйте набор реплик конфигурации: Подключитесь к одному из экземпляров сервера конфигурации и инициализируйте набор реплик.

    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), каждый с тремя членами.

  1. Запустите экземпляры 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
    ```

  2. Инициализируйте набор реплик шарда 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" } ] });

  3. Запустите экземпляры 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
    ```

  4. Инициализируйте набор реплик шарда 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 являются точками входа для клиентских приложений. Им необходимо знать, где находятся серверы конфигурации.

  1. Запустите экземпляры 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 и добавьте наборы реплик шардов в кластер.

  1. Подключитесь к mongos: Используйте порт MongoDB по умолчанию 27017 или пользовательский порт, который вы указали для mongos.

    bash mongo --port 27017

  2. Добавьте шарды: Используйте команду sh.addShard(), указав имя набора реплик и одного из его членов.

    javascript sh.addShard("shard01/localhost:27030"); sh.addShard("shard02/localhost:27040");

Шаг 5: Включение шардирования для базы данных и коллекции

После добавления шардов вам нужно включить шардирование для конкретных баз данных, а затем для конкретных коллекций в этих базах данных. Это требует выбора ключа шарда.

  1. Включение шардирования для базы данных: Переключитесь на базу данных, которую вы хотите шардировать, и выполните sh.enableSharding().

    javascript use mydatabase; sh.enableSharding("mydatabase");

  2. Шардирование коллекции: Выберите ключ шарда и используйте sh.shardCollection().

    Предупреждение: Выбор эффективного ключа шарда имеет решающее значение для производительности и равномерного распределения. Плохой ключ шарда может привести к горячим точкам или неэффективным запросам. Общие стратегии включают хешированные ключи, диапазонные ключи или составные ключи.

    В этом примере предположим, что у нас есть коллекция mycollection с полем _id.

    ```javascript
    sh.shardCollection("mydatabase.mycollection"