Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Branch sprint 2 #42

Open
wants to merge 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 70 additions & 31 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,74 @@
# pymongo-api
ИСПРАВЛЕНИЯ ЗАМЕЧАНИЙ ПОСЛЕ REVIEW 1
Диаграмма
Обновил схему, доступна она по той же ссылке.
При работе с mongo , были добалены сервисы route и config
Было исправлено замечание в масштабировании API
Развертывание
Добавлена инициализация реплик

## Как запустить
Схема доступна по ссылке: https://drive.google.com/file/d/1gwMXGBHWtWR1ulzUMwdzqZinfe7136S6/view?usp=sharing

Запускаем mongodb и приложение
## Задание 2. Шардирование
Внутри проекта перейдите в директорию mongo-sharding
Она содержит файл - compose.yaml
Для его запуска введите комманду: docker-compose up -d
После запуска, убедитесь что все сервисы успешно запустились
Затем нужно сделать конфигурацию и заполнить тестовыми данными
Для этого нужно вызвать скрипт (Нам потребуется GitBash)
Открываем нашу директорию в GitBash и вводим комманду: ./scripts/init_sharding.sh
Выполнение займет около 10-15 секунд. В конце должны увидеть результат комманды db.helloDoc.countDocuments()
А именно число 1000;
После этого можем проводить необходимые тесты




## Задание 3. Репликация
Внутри проекта перейдите в директорию mongo-sharding-repl (Дальше все шаги одинаковы с заданием 2)
Она содержит файл - compose.yaml
Для его запуска введите комманду: docker-compose up -d
После запуска, убедитесь что все сервисы успешно запустились
Затем нужно сделать конфигурацию и заполнить тестовыми данными
Для этого нужно вызвать скрипт (Нам потребуется GitBash)
Открываем нашу директорию в GitBash и вводим комманду: ./scripts/init_sharding.sh
Выполнение займет около 10-15 секунд. В конце должны увидеть результат комманды db.helloDoc.countDocuments()
А именно число 1000;
После этого можем проводить необходимые тесты

## Задание 4. Кэширование
Внутри проекта перейдите в директорию sharding-repl-cache (
Она содержит файл - compose.yaml
Также у нас появилась новая папка - redis , которая содержит файл redis.conf для настройки redis в режиме cluster
Для его запуска файла compose.yaml введите комманду: docker-compose up -d
После запуска, убедитесь что все сервисы успешно запустились
Затем нужно сделать конфигурацию и заполнить тестовыми данными
Для этого нужно вызвать скрипт (Нам потребуется GitBash)
Открываем нашу директорию в GitBash и вводим комманду: ./scripts/init_sharding.sh
В данном файле присутсвуют настройки для обьединения redis в cluster
После ~10 секунд , он попросит доступ к конфигурации redis . Для этого нужно будет ввести в окно терминала "yes"
Также были внесены изменения в сам проект, чтобы он поддерживал работу в кластерном режиме:
а) - В папке api_app в файле requirements была добавлена зависимость redis-py-cluster[asyncio]==2.1.3
И для ее совместимости была понижена версия redis , а именно "redis==3.5.3"
б) - Также в самом файле был изменен код проверки присутсвия поля REDIS_URL с

```shell
docker compose up -d
```

Заполняем mongodb данными

```shell
./scripts/mongo-init.sh
```

## Как проверить

### Если вы запускаете проект на локальной машине

Откройте в браузере http://localhost:8080

### Если вы запускаете проект на предоставленной виртуальной машине

Узнать белый ip виртуальной машины

```shell
curl --silent http://ifconfig.me
```

Откройте в браузере http://<ip виртуальной машины>:8080

## Доступные эндпоинты

Список доступных эндпоинтов, swagger http://<ip виртуальной машины>:8080/docs
if REDIS_URL:
cache = cache
else:
cache = nocache

Был заменен на:

if REDIS_URL:
cache = cache
redis_urls_list = REDIS_URLS.split(",")
redis = RedisCluster(startup_nodes=[{"host": url.split(":")[0], "port": int(url.split(":")[1])} for url in redis_urls_list], decode_responses=True)
FastAPICache.init(RedisBackend(redis), prefix="api:cache")
else:
cache = nocache

(К сожалению я не владею python , поэтому этот кусок сгенерировал chatGpt)
После этого можем проводить необходимые тесты
1-й запрос идет около 1с , последующие <100мс


24 changes: 0 additions & 24 deletions compose.yaml

This file was deleted.

Empty file added mongo-sharding-repl/Current
Empty file.
File renamed without changes.
File renamed without changes.
File renamed without changes.
258 changes: 258 additions & 0 deletions mongo-sharding-repl/compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,258 @@
version: '3'
services:
configSrv:
image: mongo:latest
container_name: configSrv
restart: always
ports:
- "27017:27017"
networks:
app-network:
ipv4_address: 173.22.0.10
volumes:
- config-data:/data/db
command:
[
"--configsvr",
"--replSet",
"config_server",
"--bind_ip_all",
"--port",
"27017"
]
healthcheck:
test: ["CMD","mongo","--eval","db.adminCommand('ping')"]
interval: 5s
start_period: 10s

masterA:
container_name: masterA
image: mongo:latest
restart: always
ports:
- "27018:27018"
networks:
app-network:
ipv4_address: 173.22.0.9
volumes:
- masterA-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterA",
"--bind_ip_all",
"--port",
"27018"
]
healthcheck:
test: [ "CMD", "mongo", "--eval", "db.adminCommand('ping')" ]
interval: 5s
start_period: 10s

replicaA1:
image: mongo:latest
container_name: replicaA1
restart: always
networks:
app-network:
ipv4_address: 173.22.0.11
volumes:
- replicaA1-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterA",
"--bind_ip_all",
"--port",
"27018"
]

replicaA2:
image: mongo:latest
container_name: replicaA2
restart: always
networks:
app-network:
ipv4_address: 173.22.0.12
volumes:
- replicaA2-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterA",
"--bind_ip_all",
"--port",
"27018"
]

replicaA3:
image: mongo:latest
container_name: replicaA3
restart: always
networks:
app-network:
ipv4_address: 173.22.0.13
volumes:
- replicaA3-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterA",
"--bind_ip_all",
"--port",
"27018"
]

masterB:
container_name: masterB
image: mongo:latest
restart: always
ports:
- "27019:27019"
networks:
app-network:
ipv4_address: 173.22.0.8
volumes:
- masterB-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterB",
"--bind_ip_all",
"--port",
"27019"
]
healthcheck:
test: ["CMD","mongo","--eval","db.adminCommand('ping')"]
interval: 5s
start_period: 10s

replicaB1:
image: mongo:latest
container_name: replicaB1
restart: always
networks:
app-network:
ipv4_address: 173.22.0.14
volumes:
- replicaB1-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterB",
"--bind_ip_all",
"--port",
"27019"
]

replicaB2:
image: mongo:latest
container_name: replicaB2
restart: always
networks:
app-network:
ipv4_address: 173.22.0.15
volumes:
- replicaB2-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterB",
"--bind_ip_all",
"--port",
"27019"
]

replicaB3:
image: mongo:latest
container_name: replicaB3
restart: always
networks:
app-network:
ipv4_address: 173.22.0.16
volumes:
- replicaB3-data:/data/db
command:
[
"--shardsvr",
"--replSet",
"masterB",
"--bind_ip_all",
"--port",
"27019"
]

mongos_router:
image: mongo:latest
container_name: mongos_router
restart: always
ports:
- "27020:27020"
networks:
app-network:
ipv4_address: 173.22.0.7
command:
[
"mongos",
"--configdb",
"config_server/configSrv:27017",
"--bind_ip_all",
"--port",
"27020"
]
healthcheck:
test: ["CMD","mongo","--eval","db.adminCommand('ping')"]
interval: 5s
start_period: 10s

mongo-sharding-repl:
container_name: mongo-sharding-repl
build:
context: api_app
dockerfile: Dockerfile
image: kazhem/pymongo_api:1.0.0
depends_on:
- mongos_router
ports:
- 8080:8080
environment:
MONGODB_URL: "mongodb://mongos_router:27020"
MONGODB_DATABASE_NAME: "somedb"
healthcheck:
test: ["CMD", "curl", "-f", "http://mongos_router:27020"]
interval: 30s
retries: 5
networks:
app-network:
ipv4_address: 173.22.0.20

networks:
app-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 173.22.0.0/16

volumes:
config-data:

masterA-data:
replicaA1-data:
replicaA2-data:
replicaA3-data:

masterB-data:
replicaB1-data:
replicaB2-data:
replicaB3-data:

mongos_router:
mongo-sharding-repl:
Loading