Я играл с MongoDb, благодаря курсу M101J, предлагаемому Университетом Mongodb. Эти хранилища данных NoSQL набирают популярность по ряду причин, одной из которых является простота масштабирования, например горизонтальное масштабирование. Это горизонтальное масштабирование в MongoDB может быть достигнуто путем создания сегментированного кластера экземпляров mongodb. Возможно, вы захотите понять концепцию разделения, прежде чем продолжить. Ссылка MongoDB имеет очень четкое объяснение того же здесь .
Для закрытой установки mongodb требуется следующее:
- Сервер конфигурации Mongodb — хранит метаданные кластера
- Экземпляр mongos — это маршрутизатор, который направляет запросы разным шардам на основе ключа шардинга.
- Отдельные экземпляры mongodb — они действуют как осколки.
Ниже приведена схема архитектуры примера установки shonged mongodb (Источник: MongodDB Reference )
Давайте создадим все вышеперечисленные компоненты в одном экземпляре, т.е. на вашем локальном хосте.
Создание Mongodb Config Server
|
1
2
|
$ mkdir \data\configdb$ mongod --configsvr --port 27010 |
- Сначала создается каталог данных для хранения метаданных кластера.
- Второй запускает сервер конфигурации deamon на порт 27010. Порт по умолчанию 27019, но я переопределил с помощью параметра командной строки —port.
Настройка Query Routers (экземпляры mongos)
Это служба маршрутизации для сегментирующего кластера, где он принимает запросы от приложения и получает данные от определенных сегментов. Маршрутизаторы запросов можно настроить с помощью команды mongos как показано ниже:
|
1
|
$ mongos -configdb localhost:27010 --port 27011 |
Это выводит на консоль ряд вещей, начиная со следующей строки:
|
1
|
2015-02-01T18:51:35.606+0300 warning: running with 1 config server should be done only for testing purposes and is not recommended for production |
Рекомендуется запускать с 3-мя серверами configdb для производства, чтобы избежать единой точки отказа. Но для нашего тестирования 1 сервер configdb вполне подойдет.
--configdb командной строки --configdb используется, чтобы сообщить маршрутизатору запросов о серверах конфигурации, которые мы настроили. Он принимает запятую: значения, такие как –configdb host1: port1, host2: port2. В нашем случае у нас всего 1 конфиг-сервер.
Бегущие осколки mongodb
Теперь нам нужно запустить реальные экземпляры mongodb, которые хранят общие данные. Мы создадим 3 закрытых экземпляра mongodb и запустим все это на локальном хосте в разных портах и предоставим каждому экземпляру mongodb свой собственный --dbpath как показано ниже:
Осколок Монгодб — 1
|
1
|
$ mongod --port 27012 --dbpath \data\db |
Осколок Монгодб — 2
|
1
|
$ mongod --port 27013 --dbpath \data\db2 |
Осколок Монгодб — 3
|
1
|
$ mongod --port 27014 --dbpath \data\db3 |
Теперь у нас есть три осколка mongodb, работающих на localhost. Для базы данных я буду использовать базу данных students имеющую оценочные grades . Структура документов по grades приведена ниже:
|
1
2
3
4
5
6
|
{ "_id" : ObjectId("50906d7fa3c412bb040eb577"), "student_id" : 0, "type" : "exam", "score" : 54.6535436362647} |
Вы можете выбрать любую базу данных на ваш выбор.
Регистрация осколков с помощью монго
Теперь, когда мы создали два шарда mongodb, работающих на localhost: 27012 и localhost: 27013 соответственно, мы продолжим и зарегистрируем эти шарды на нашем маршрутизаторе запросов mongos, также определим, какую базу данных нам нужно шардировать, а затем включим шардинг в коллекции, которую мы заинтересованы, предоставив ключ шарда. Все это должно быть выполнено путем подключения к маршрутизатору запросов mongos, как показано в следующих командах:
|
01
02
03
04
05
06
07
08
09
10
|
$ mongo --port 27011 --host localhostmongos> sh.addShard("localhost:27012"){ "shardAdded" : "shard0000", "ok" : 1 }mongos> sh.addShard("localhost:27013"){ "shardAdded" : "shard0001", "ok" : 1 }mongos> sh.enableSharding("students"){ "ok" : 1 }mongos> sh.shardCollection("students.grades", {"student_id" : 1}){ "collectionsharded" : "students.grades", "ok" : 1 }mongos> |
В sh.shardCollection мы указываем коллекцию и поле из коллекции, которая должна использоваться в качестве ключа шарда.
Добавление данных в сегментированный кластер mongodb
Позволяет подключиться к Монго и запустить некоторый код для заполнения данных в коллекцию оценок в базе данных студентов.
|
1
2
3
4
5
6
|
for ( i = 200; i < 10000; i++ ) { db.grades.insert({student_id: i, type: "exam", score : Math.random() * 100 }); db.grades.insert({student_id: i, type: "quiz", score : Math.random() * 100 }); db.grades.insert({student_id: i, type: "homework", score : Math.random() * 100 });}WriteResult({ "nInserted" : 1 }) |
После вставки данных мы заметили некоторую активность в демоне mongos, утверждающую, что он перемещает некоторые чанки для определенного шарда и т. Д., Т.е. балансировщик будет в действии, пытаясь сбалансировать данные между шардами. Вывод будет примерно таким:
|
1
2
3
4
5
6
7
|
2015-02-02T18:26:26.770+0300 [Balancer] moving chunk ns: students.grades moving ( ns: students.grades, shard: shard0000:localhost:27012, lastmod: 1|1||000000000000000000000000, min: { student_id: MinKey }, max: { student_id: 200.0 }) shard0000:localhost:27012 -> shard0001:localhost:27013 2015-02-02T18:31:12.314+0300 [Balancer] moving chunk ns: students.grades moving ( ns: students.grades, shard: shard0000:localhost:27012, lastmod: 2|2||000000000000000000000000, min: { student_id: 200.0 }, max: { student_id: 2096.0 }) shard0000:localhost:27012 -> shard0002:localhost:27014 |
Давайте посмотрим на состояние осколков, подключившись к монго. Это может быть достигнуто с помощью команды sh.status() .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
$ mongo --port 27011 --host localhostmongos> sh.status()--- Sharding Status ---sharding version: { "_id" : 1, "version" : 4, "minCompatibleVersion" : 4, "currentVersion" : 5, "clusterId" : ObjectId("54cf95d9d9309193f5fa0780")}shards: { "_id" : "shard0000", "host" : "localhost:27012" } { "_id" : "shard0001", "host" : "localhost:27013" } { "_id" : "shard0002", "host" : "localhost:27014" }databases: { "_id" : "admin", "partitioned" : false, "primary" : "config" } { "_id" : "blog", "partitioned" : false, "primary" : "shard0000" } { "_id" : "course", "partitioned" : false, "primary" : "shard0000" } { "_id" : "m101", "partitioned" : false, "primary" : "shard0000" } { "_id" : "school", "partitioned" : false, "primary" : "shard0000" } { "_id" : "students", "partitioned" : true, "primary" : "shard0000" } students.grades shard key: { "student_id" : 1 } chunks: shard0001 1 shard0002 1 shard0000 1 { "student_id" : { "$minKey" : 1 } } -->> { "student_id" : 200 } on : shard0001 Timestamp(2, 0) { "student_id" : 200 } -->> { "student_id" : 2096 } on : shard0002 Timestamp(3, 0) { "student_id" : 2096 } -->> { "student_id" : { "$maxKey" : 1 } } on : shard0000 Timestamp(3, 1) { "_id" : "task-db", "partitioned" : false, "primary" : "shard0000" } { "_id" : "test", "partitioned" : false, "primary" : "shard0000" } |
Приведенный выше вывод показывает, что база данных students отбрасывается, а разбитая коллекция является коллекцией grades . Он также показывает различные доступные шарды и диапазон ключей шарда, распределенных по разным шардам. Таким образом, для shard0001 у нас есть student_id от минимума до 200, затем для shard0002 у нас есть student_id от 200 до 2096, а остальные в shard0000.
Мы также можем подключиться к отдельным осколкам и выполнить запрос, чтобы узнать максимальные и минимальные доступные идентификаторы учащихся.
На шард0000
|
1
2
3
4
5
6
7
8
9
|
$ mongo --host localhost --port 27012MongoDB shell version: 2.6.7connecting to: localhost:27012/test> use studentsswitched to db students> db.grades.find().sort({student_id : 1}).limit(1){ "_id" : ObjectId("54cf97295a23cc67efa848c8"), "student_id" : 2096, "type" : "exam", "score" : 6.7372970981523395 }> db.grades.find().sort({student_id : -1}).limit(1){ "_id" : ObjectId("54cf973b5a23cc67efa8a567"), "student_id" : 9999, "type" : "homework", "score" : 60.64519872888923 } |
На шард0001
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
C:\Users\Mohamed>mongo --host localhost --port 27013MongoDB shell version: 2.6.7connecting to: localhost:27013/test> use studentsswitched to db students> db.grades.find().sort({student_id:1}).limit(1).pretty(){ "_id" : ObjectId("54cf97d05a23cc67efa8a568"), "student_id" : 1, "type" : "exam", "score" : 5.511052813380957}> db.grades.find().sort({student_id:-1}).limit(1).pretty(){ "_id" : ObjectId("54cf97d15a23cc67efa8a7bc"), "student_id" : 199, "type" : "homework", "score" : 51.78457708097994} |
На шард0002
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
$ mongo --host localhost --port 27014MongoDB shell version: 2.6.7connecting to: localhost:27014/test> use studentsswitched to db students> db.grades.find().sort({student_id:1}).limit(1).pretty(){ "_id" : ObjectId("54cf971f5a23cc67efa83292"), "student_id" : 200, "type" : "homework", "score" : 79.56434232182801}> db.grades.find().sort({student_id:-1}).limit(1).pretty(){ "_id" : ObjectId("54cf97295a23cc67efa848c7"), "student_id" : 2095, "type" : "homework", "score" : 62.75710032787174} |
Давайте выполним тот же набор запросов на маршрутизаторе запросов mongos и увидим, что на этот раз результаты будут включать данные всех сегментов, а не только отдельные сегменты.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
$ mongo --port 27011 --host localhostMongoDB shell version: 2.6.7connecting to: localhost:27011/testmongos> use studentsswitched to db studentsmongos> db.grades.find().sort({student_id:-1}).limit(1).pretty(){ "_id" : ObjectId("54cf973b5a23cc67efa8a567"), "student_id" : 9999, "type" : "homework", "score" : 60.64519872888923}mongos> db.grades.find().sort({student_id:1}).limit(1).pretty(){ "_id" : ObjectId("54cf97d05a23cc67efa8a568"), "student_id" : 1, "type" : "exam", "score" : 5.511052813380957}mongos> |
Таким образом, это завершает настройку кластера shong mongodb на локальном хосте. Надеюсь, это было информативно и полезно!
| Ссылка: | Настройка sharded кластера mongodb на локальном хосте от нашего партнера по JCG Мохамеда Санауллы в блоге Experiences Unlimited . |
