Шардинг в MongoDB


Шардирование

В MongoDB существует другой тип кластера — технология шардирования, которая может удовлетворить потребности, связанные с огромным ростом объёма данных MongoDB.

Когда MongoDB хранит огромные объёмы данных, одной машины может не хватить для хранения данных, а также может не хватать для обеспечения приемлемой пропускной способности чтения и записи. В этом случае мы можем распределить данные по нескольким машинам, чтобы система базы данных могла хранить и обрабатывать больше данных.


Зачем использовать шардирование

  • Все операции записи копируются на первичный узел
  • Данные, чувствительные к задержке, будут запрашиваться на первичном узле
  • Один набор реплик ограничен 12 узлами
  • При огромном объёме запросов может возникнуть нехватка памяти.
  • Недостаточно локального дискового пространства
  • Вертикальное масштабирование дорого

Шардинг в MongoDB

На следующей диаграмме показано распределение структуры шардированного кластера в MongoDB:

Диаграмма выше в основном включает следующие три основных компонента:

  • Шард:

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

  • Сервер конфигурации:

    Экземпляр mongod, который хранит весь ClusterMetadata, включая информацию о чанках.

  • Маршрутизаторы запросов:

    Фронтенд-маршрутизатор, через который подключаются клиенты, благодаря чему весь кластер выглядит как единая база данных. Фронтенд-приложения могут использовать его прозрачно.


Пример шардинга

Распределение портов в структуре шардинга следующее:

Shard Server 1:27020
Shard Server 2:27021
Shard Server 3:27022
Shard Server 4:27023
Config Server :27100
Route Process:40000

Шаг 1: Запуск сервера шардов

[root@100 /]# mkdir -p /www/mongoDB/shard/s0
[root@100 /]# mkdir -p /www/mongoDB/shard/s1
[root@100 /]# mkdir -p /www/mongoDB/shard/s2
[root@100 /]# mkdir -p /www/mongoDB/shard/s3
[root@100 /]# mkdir -p /www/mongoDB/shard/log
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork
....
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork

Шаг 2: Запуск сервера конфигурации

[root@100 /]# mkdir -p /www/mongoDB/shard/config
[root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork

Примечание:Здесь мы можем запустить его так же, как запускаем обычную службу mongodb, без добавления параметров --shardsvr и --configsvr. Поскольку функция этих двух параметров — изменять порт запуска, мы можем просто указать порт самостоятельно.

Шаг 3: Запуск процесса маршрутизации

/usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500

Среди параметров запуска mongos элемент chunkSize используется для указания размера чанков в MB, размер по умолчанию — 200MB.

Шаг 4: Настройка шардинга

Далее мы используем MongoDB Shell, чтобы войти в mongos и добавить узлы шардов.

[root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000
MongoDB shell version: 2.0.7
connecting to: 127.0.0.1:40000/admin
mongos> db.runCommand({ addshard:"localhost:27020" })
{ "shardAdded" : "shard0000", "ok" : 1 }
......
mongos> db.runCommand({ addshard:"localhost:27029" })
{ "shardAdded" : "shard0009", "ok" : 1 }
mongos> db.runCommand({ enablesharding:"test" }) #设置分片存储的数据库
{ "ok" : 1 }
mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}})
{ "collectionsharded" : "test.log", "ok" : 1 }

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

Другие расширения