Skip to content
 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Homework NoSQL

Для успешного выполнения ДЗ вам потребуется использовать базы данных Redis, Scylla, ClickHouse. Крайне рекомендуется использовать Docker для поднятия этих баз данных. Инструкцию по установке сможете найти тут: https://docs.docker.com/get-docker/

Запуск баз данных в Docker

Redis

Команда для старта Redis:

docker run -d --name redis -p 6379:6379 redis

Зайти в консольный клиент Redis:

docker exec -it redis redis-cli

Scylla

Команда для старта Scylla:

docker run --name scylla -p 9042:9042 -d scylladb/scylla

Зайти в консольный клиент:

# или для Scylla:
docker exec -it scylla cqlsh

ClickHouse

Команда для старта ClickHouse:

docker run -d --name clickhouse -p 8123:8123 -p 9000:9000 clickhouse/clickhouse-server

Зайти в консольный клиент ClickHouse:

docker exec -it clickhouse clickhouse-client

Задания:

Делаем себе форк этого репозитория, создаем отдельную ветку в этом форке и пишем решение в этой ветке. Готовый результат скидываем как PR в master своего форка из новой ветки и пишем лектору в Mattermost.

1. Redis (Key-Value хранилище)

Описание: Redis - это in-memory key-value хранилище, часто используемое для кэширования и rate limiting.

Команды: https://redis.io/commands/

Задание:

  1. Понять что такое Rate Limiter: https://t.ly/TSIwJ
  2. Придумать алгоритм его работы на Redis
  3. В папке redis лежит maven проект. В зависимостях подключен Redis. В классе RateLimiter необходимо используя Redis реализовать метод pass(), который будет возвращать true, в случае если лимит запросов не превышен и запрос пропускается, а если же рейт превышен и нужно ограничить запрос, возвращается false.

Параметры конструктора RateLimiter:

  • redis - клиент Jedis для работы с Redis
  • label - название запроса, рейт которого хотим ограничивать
  • maxRequestCount - максимальное количество запросов
  • timeWindowSeconds - временное окно в секундах

Например, для ограничения 60 rps: maxRequestCount=60, timeWindowSeconds=1.

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

  • Запустите main() и нажимайте Enter для тестирования
  • Завершить программу можно написав q
  • Запустите тесты (требуется поднятый Redis)
  • Тест slidingWindowTest - задание со звездочкой (дополнительный балл). Если не получилось пройти - закомментируйте его.

2. Scylla/Cassandra (Wide Column Store)

Описание: Cassandra/Scylla - это wide column store база данных, где важно проектировать таблицы под конкретные запросы.

Задание: В папке scylla лежит файл schema.sql, представляющий собой схему таблиц, как бы они выглядели в SQL. Необходимо написать запросы для создания таблицы (или нескольких таблиц) в Cassandra/Scylla и написать CQL запросы под следующие требования:

  1. Запрос, который бы доставал посты заданного пользователя, упорядоченные по времени создания поста (сначала новые). Должен возвращать: post_id, content, дату создания поста.

  2. Запрос, который бы доставал последний пост заданного пользователя. Должен возвращать: post_id, content, дату создания поста, username.

  3. Запрос, который бы доставал посты заданного пользователя после заданной даты. Должен возвращать: post_id, content, дату создания поста.

  4. Запрос, который бы доставал пользователей, сделавших пост в заданный день по заданной теме, упорядоченные по времени (сначала новые). Должен возвращать: user_id, username, post_id, время создания поста.

Решение (таблицы и запросы) писать в файле scylla/solution.cql.

3. ClickHouse (Columnar OLAP)

Описание: ClickHouse - это колоночная аналитическая СУБД, оптимизированная для OLAP запросов и работы с большими объемами данных.

Документация: https://clickhouse.com/docs

Задание: В папке clickhouse находится файл server_logs.csv с логами веб-сервера.

  1. Создать таблицу для хранения логов:

    • Используйте движок MergeTree
    • Выберите подходящий ORDER BY для оптимизации запросов
    • Определите типы данных для каждого поля
  2. Загрузить данные из CSV файла в таблицу

  3. Написать аналитические запросы:

    • Топ-5 самых медленных endpoint'ов (по среднему времени ответа response_time_ms)
    • Количество запросов по часам за весь период в логах
    • Процент ошибок (status_code >= 400) для каждого endpoint'а

Решение писать в файле clickhouse/solution.sql.

Подсказка: для загрузки CSV можно использовать:

cat server_logs.csv | docker exec -i clickhouse clickhouse-client --query="INSERT INTO server_logs FORMAT CSVWithNames"

About

Домашнее задание к лекции по NoSQL базам данных

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages