Шардинг в 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.
Другие расширения