/architecture-sprint-2

Scaling MongoDB with sharding, replication and caching.

Primary LanguagePython

Запустить контейнеры MongoDB с двумя шардами и репликацией и кешем, используя файл docker-compose:

# перейдите в директорию /architecture-sprint-2/sharding-repl-cache

# поднимите контейнеры из описанных образов в файле compose.yaml:
docker compose up

Инициализируем конфиг сервер для кластера MongoDB:

# подключитесь к контейнеру конфиг сервера MongoDB
docker exec -it configsvr mongosh --eval --port=27019

# инициализируйте в кластере MongoDB конфиг сервер MongoDB
> rs.initiate({_id: 'configReplSet', configsvr: true, members: [{ _id: 0, host: 'configsvr:27019' }]})

Инициализируем первый шард кластера MongoDB на порту 27018:

# подключитесь к контейнеру мастера первого шарда кластера MongoDB
docker exec -it shard1_primary mongosh --port 27018

# инициализируйте первый шард с репликасетом 1 мастер 2 реплики
> rs.initiate({
  _id: "shard1ReplSet",
  members: [
    { _id: 0, host: "shard1_primary:27018" },
    { _id: 1, host: "shard1_secondary1:27018" },
    { _id: 2, host: "shard1_secondary2:27018" }
  ]
})

Инициализируем второй шард кластера MongoDB на порту 27020:

# подключитесь к контейнеру мастера второго шарда кластера MongoDB
docker exec -it shard2_primary mongosh --port 27020

# инициализируйте второй шард с репликасетом 1 мастер 2 реплики
> rs.initiate({
  _id: "shard2ReplSet",
  members: [
    { _id: 0, host: "shard2_primary:27020" },
    { _id: 1, host: "shard2_secondary1:27020" },
    { _id: 2, host: "shard2_secondary2:27020" }
  ]
})

Инициализируем роутер mongos на порту 27017:

# подключитесь к роутеру узлов инстансов MondoDB
docker exec -it mongos mongosh --port 27017

# добавьте первый и второй шард роутеру кластера MongoDB
> sh.addShard("shard1ReplSet/shard1_primary:27018")
> sh.addShard("shard2ReplSet/shard2_primary:27020")

# включите шардирование у базы данных somedb
> sh.enableSharding("somedb");

# создайте новую шардированую коллекцию helloDoc
> sh.shardCollection("somedb.helloDoc", { "name" : "hashed" } )

# вы можете проверить статус шардирования с помощью команды:
> sh.status()

# наполните базу данных "somedb" тестовыми данными

# подключитесь к только что созданной коллекции somedb
> use somedb

# выполните скрипт для записи тестовых данных
> for(var i = 0; i < 1000; i++) db.helloDoc.insert({age:i, name:"ly"+i})

# проверьте наполнение коллекции "somedb" тестовыми данными, должно быть 1000 записей
> db.helloDoc.countDocuments() 

# конфигурируем кластер Redis для кеширования

# подключитесь внутрь контенейнера любого хоста Redis, например redis_1:
> docker exec -it redis_1 bash

# выполните команду для инициализиации кластера Redis, для автоответа о согласии на создании используйте команду echo
> echo "yes" | redis-cli --cluster create redis_1:6379 redis_2:6379 redis_3:6379 redis_4:6379 redis_5:6379 redis_6:6379 --cluster-replicas 1

# для того, чтобы убедиться, что Redis кластер корректно сконфигурировался, выполните команды:

# подключитесь внутрь контенейнера любого хоста Redis, например redis_1:
> docker exec -it redis_1 bash

# выведите описание кластера
> redis-cli -c -h redis_1 -p 6379 cluster nodes

# также выведите подробное описание Redis кластера
> redis-cli -c -h redis_1 -p 6379 cluster info

# если cluster_state:ok, cluster_slots_assigned:16384, cluster_slots_ok:16384, то всё прошло успешно

Проверить можно, получив ответ от эндпоинта http://127.0.0.1:8080/:

{
  "mongo_topology_type": "Sharded",
  "mongo_replicaset_name": null,
  "mongo_db": "somedb",
  "read_preference": "Primary()",
  "mongo_nodes": [
    [
      "mongos",
      27017
    ]
  ],
  "mongo_primary_host": null,
  "mongo_secondary_hosts": [],
  "mongo_address": [
    "mongos",
    27017
  ],
  "mongo_is_primary": true,
  "mongo_is_mongos": true,
  "collections": {
    "helloDoc": {
      "documents_count": 1000
    }
  },
  "shards": {
    "shard1ReplSet": "shard1ReplSet/shard1_primary:27018,shard1_secondary1:27018,shard1_secondary2:27018", // 1-ый шард
    "shard2ReplSet": "shard2ReplSet/shard2_primary:27020,shard2_secondary1:27020,shard2_secondary2:27020" // 2-ой шард
  },
  "cache_enabled": true,  // кеш работает
  "status": "OK"
}

Итоговая диаграмма веб-приложения:

cdn