Кратко:
- ClickHouse - популярная столбцовая БД с открытым исходным кодом, созданная Яндексом для обработки аналитических онлайн-запросов к Яндекс Метрике.
- ClickHouse работает на Linux, FreeBSD и macOS, а также доступен в Yandex Cloud.
- ClickHouse позволяет создавать БД, загружать данные и выполнять запросы.
- Высокая скорость работы достигается благодаря шардированию, автоматическому распараллеливанию запросов и возможностям приближенных вычислений.
- ClickHouse предназначен для аналитических запросов, но не подходит для транзакционной целостности и построчной выборки данных по ключу.
- ClickHouse используется для анализа логов, метрик поведения пользователей и как аналитический инструмент.
Описание ClickHouse
В этой теме вы узнаете о сервисе управляемых баз данных ClickHouse. Эта БД предназначена для задач, связанных с аналитической обработкой данных, и не подходит там, где основная часть операций — обработка транзакций. Чтобы разобраться в том, почему это так, давайте сначала разберёмся с различными сценариями работы с данными.
Базы данных помогают решать различные задачи. То, какие при этом делаются запросы, насколько их много и как соотносятся операции чтения и записи, называют сценарием работы с данными. Универсальной БД, которая подходит для любого сценария, не существует.
Сценарии можно разделить на две группы:
-
Обработка транзакций, т. е. связанных между собой операций с данными. Классический пример — банковский перевод, при котором в БД одновременно изменяются записи о количестве денег на двух счетах.
-
Обработка аналитических запросов (online analytical processing, OLAP). В этом случае требуется быстро извлечь из БД сведения.
Например, если у вас есть мобильное приложение, то вас интересуют его продуктовые метрики: количество уникальных пользователей, среднее время нахождения на экране, среднее время, необходимое, чтобы выполнить последовательность действий... Вы отслеживаете, как меняются метрики, и решаете, как развивать приложение. Если метрики хранятся в большой БД, а запросы к ней выполняются медленно, то анализ метрик тоже станет весьма небыстрым.
Как правило, при OLAP-сценариях:
- данные в базе не изменяются или изменяются редко (нет команд модификации существующих данных типа
UPDATEилиREPLACE); - данные добавляются в базу крупными порциями (командой
INSERT); - большинство запросов — это операции чтения;
- данные читаются из большого количества строк и небольшого количества столбцов;
- на выходе данные фильтруют или агрегируют, поэтому результат выполнения запроса содержит гораздо меньше исходных данных;
- нет транзакций;
- нет строгих требований к консистентности данных.
Классические реляционные БД не всегда удобно использовать для задач, в которых идут частые и сложные запросы к большому массиву данных. Для решения таких задач разработаны столбцовые (колоночные) БД. О них мы кратко говорили раньше.
Строковые и столбцовые БД обрабатывают аналитические запросы по-разному. Предположим, для выполнения запроса нужны данные из трёх столбцов БД. В строковой придётся полностью прочитать несколько десятков или сотен тысяч строк со всеми столбцами, а в столбцовой — только данные из этих трёх столбцов.
Более того, в столбцовой БД эти данные физически хранятся вместе, что ещё больше ускоряет ответ.
ClickHouse
ClickHouse — одна из популярных столбцовых БД с открытым исходным кодом. Яндекс создал ClickHouse, когда понадобилось быстро обрабатывать аналитические онлайн-запросы к Яндекс Метрике.
Метрика — это одна из крупнейших систем веб-аналитики. Она установлена более чем на миллионе сайтов и каждый день собирает больше 20 миллиардов событий (посещений сайтов, кликов, переходов со страницы на страницу и т. д.). Объём данных превышает 3,5 петабайта (13 триллионов записей) и постоянно увеличивается, к этим данным обращаются сотни тысяч раз в день. Чтобы такая система работала стабильно, в Яндексе создали ClickHouse — распределённую столбцовую СУБД, оптимизированную для быстрого выполнения большого числа аналитических запросов к огромному объёму данных.
ClickHouse работает на любой операционной системе Linux, FreeBSD или macOS, а также доступна в виде сервиса управляемой БД в Yandex Cloud.
ClickHouse позволяет создавать БД и таблицы, загружать в них данные из разных источников и выполнять к данным запросы. Эту СУБД можно интегрировать с Apache Kafka, а также с внешними источниками данных, включая БД MySQL и PostgreSQL.
Высокая скорость работы ClickHouse достигается за счёт:
- Шардирования. Вы можете разделить данные на шарды (т. е. части) и хранить их на одном или нескольких хостах-репликах. Кроме того, шардирование повышает доступность БД.
- Автоматического распараллеливания запросов на несколько процессорных ядер одного сервера и распределённых вычислений на шардированном кластере.
- Возможности приближенных вычислений. Система способна выполнять запросы на основе части данных (выборки). Можно агрегировать данные не по всем ключам, а по некоторым. Иногда это помогает получить довольно точный результат, задействовав меньше ресурсов.
- Других архитектурных особенностей: индекса (первичного ключа), физической сортировки данных по первичному ключу с помощью merge дерева, хранения данных в сжатом виде и т. д.
ClickHouse предназначен прежде всего для работы с аналитическими запросами. Если вам нужны транзакционная целостность и построчная выборка данных по ключу — применяйте другие БД, например MySQL или PostgreSQL.
Эту СУБД используют:
- чтобы анализировать логи (и мгновенно получать полную информацию об инцидентах в системе);
- чтобы отслеживать метрики поведения пользователей на сайтах (например, переходы на страницы, клики) или в онлайн-играх;
- как аналитический инструмент, когда данные в БД ClickHouse копируются из основной БД (например, PostgreSQL или Oracle), которая медленно обрабатывает аналитические запросы.
Если вам интересны подробности о том, как устроен ClickHouse и что у неё под капотом, посмотрите доклады разработчиков:
- Категория: Cloud Services Engineer
- Просмотров: 655
Кратко:
- MongoDB - сервис управляемых баз данных с различными особенностями.
- Сервис выполняет задачи администрирования инфраструктуры, такие как создание кластеров, обновление ПО, создание резервных копий и обеспечение отказоустойчивости.
- Yandex Managed Service for MongoDB предоставляет интерактивный интерфейс и драйверы для Python и Java.
- Обновление базы данных происходит вручную, но кластеры обновляются автоматически при выходе новых версий.
- Резервное копирование выполняется автоматически и вручную, с возможностью восстановления из резервной копии.
- Сервис поддерживает мониторинг и логи, а также репликацию и отказоустойчивость.
- Лимиты и тарификация сервиса определены, с максимальным числом шардов и одновременных подключений.
Особенности сервиса управляемых баз данных MongoDB
Ответственность сервиса
Как вы могли увидеть, в работе с различными сервисами управляемых БД в облаке есть много общего. При этом, каждый из сервисов имеет свои особенности, обусловленные как самой СУБД, так и спецификой её реализации в облаке.
Как и в случае реляционных БД, сервис управляемых баз данных MongoDB выполняет задачи, связанные с администрированием инфраструктуры:
- при создании кластера выделяет ресурсы, устанавливает СУБД и создает БД;
- обновляет программное обеспечение;
- автоматически создает резервные копии БД;
- предоставляет инструменты мониторинга хостов и БД;
- обеспечивает репликацию данных между хостами;
- при аварии автоматически переключает нагрузку на резервную реплику.
Вы можете выбирать любые клиенты для MongoDB. Yandex Managed Service for MongoDB гарантирует работу интерактивного интерфейса the mongo Shell, а также драйверов для Python и Java.
Обновление базы данных
Сервис поддерживает мажорные версии MongoDB 5.0 и 6.0. Переходить на новую мажорную версию следует вручную. При выходе новых минорных версий MongoDB кластеры обновляется автоматически. Владельцы кластеров получают оповещение о сроках работ и доступности БД.
Когда разработчики перестают поддерживать версию MongoDB, создание хостов с ней становится невозможным, а кластеры автоматически обновляются до ближайшей поддерживаемой версии. Это происходит через семь дней после оповещения для минорных версий и через месяц для мажорных.
Резервное копирование
Сервис создает резервные копии БД автоматически, а также позволяет делать это вручную. Резервные копии сохраняются в специальном хранилище в сжатом виде. Вы не платите за их хранение, пока размер БД и всех резервных копий не превышает размера хранилища, который вы выбрали при создании кластера.
По умолчанию автоматическое резервное копирование выполняется раз в день с 01:00 по 05:00 по московскому времени, а резервные копии хранятся неделю. Время начала резервного копирования и срок хранения резервных копий (от 7 до 35 дней) можно установить при создании или изменении кластера.

Автоматически созданные копии удаляются, когда истекает срок хранения. Копии, созданные вручную, хранятся бессрочно.
Из резервной копии можно восстановить как существующий, так и удаленный кластер. Средняя скорость восстановления — 10 МБ/с.
Для версий MongoDB 4.2 и выше сервис поддерживает технологию point-in-time recovery (восстановление состояния кластера на заданный момент). Вы можете восстановить кластер в состояние на любой момент времени после создания самой старой полной резервной копии. Это достигается за счет дополнения данных выбранной резервной копии записями из архивируемого журнала операций.
Point-in-time recovery работает только для кластеров с выключенным шардированием.
Мониторинг и логи
Сервис отслеживает и выводит на дашборд следующие метрики: общий объём данных, размер журнала операций, место на диске, число подключений к базе, сессий и операций, лаг репликации и пр.

Кроме того, сервис ведет запись логов событий.

Репликация и отказоустойчивость
Сервис управляемых БД MongoDB по умолчанию реплицирует данные, т. е. копирует их на несколько хостов. Если в кластере больше одного активного хоста, из них автоматически выбирается главный — первичная реплика. Этот хост обрабатывает все запросы на запись.

Первичная реплика выбирается автоматически, если в кластере работоспособно больше половины хостов. По этой причине кластер из двух хостов не обеспечивает отказоустойчивости. Если первый хост отказал, второй не сможет назначить сам себя первичной репликой и будет обрабатывать только операции чтения.
Кластер из трёх хостов продолжит обрабатывать операции записи при потере одного хоста. Кластер из четырёх хостов также может потерять только один хост: при потере второго оставшихся хостов не хватит, чтобы автоматически выбрать первичную реплику. Поэтому в MongoDB лучше разворачивать кластеры с нечетным числом хостов.

Лимиты и тарификация
В кластере БД MongoDB можно создать не более 10 шардов. Шард состоит не более чем из семи хостов. Таким образом, максимальное число хостов в одном кластере не может превышать 70.
Максимальное число одновременных подключений к одному хосту зависит от объёма его оперативной памяти: не более 2048 подключений на каждые 2 ГБ.
Максимальный объём данных на хосте — 605 ГБ при использовании сетевого хранилища или 600 ГБ при использовании локального хранилища.
MongoDB тарифицируется по тем же принципам, что и управляемые реляционные БД.
Поздравляем, вы завершили тему «MongoDB»
В этой теме вы узнали о различиях классических реляционных и NoSQL баз данных, научились создавать кластер баз данных MongoDB, познакомились с концепцией шардирования БД, выяснили некоторые особенности сервиса управляемых баз данных MongoDB в Yandex Cloud.
- Категория: Cloud Services Engineer
- Просмотров: 801
Кратко:
- Шардирование - горизонтальное масштабирование данных, разбиение на шарды и размещение на разных хостах.
- Плюсы: обходит технические ограничения, ускоряет доступ к данным для пользователей из конкретного региона, выполняет юридические требования.
- Недостатки: неправильно шардировать данные, могут возникнуть горячие точки, шардирование в MongoDB доступно только для кластеров с версией не ниже 4.0.
- В MongoDB шардирование поддерживается по умолчанию, части коллекций размещаются на разных хостах.
- Данные на шардах должны быть не связаны между собой, выбор ключа шардирования влияет на удобство работы с коллекцией и производительность.
- Шардирование имеет смысл, если данных много или они неоднородны и делятся на категории.
- Сервис поддерживает две основные стратегии: по хешу и по диапазону значений.
- Отменить шардирование невозможно, для восстановления до шардирования нужно сделать резервную копию и создать новый кластер.
Шардирование
Шардирование — это горизонтальное масштабирование данных, при котором данные разбиваются на шарды (т. е. части) и размещаются на разных хостах кластера. Нагрузка на БД при этом распределяется по хостам, что позволяет добиться большей производительности системы, чем если бы она была расположена на одном мощном сервере. Это особенно важно, если данных или запросов к ним очень много.
Плюсы шардирования в том, что оно позволяет:
- Обойти технические ограничения. Если БД работает на пределе производительности — можно разбить её на части и распределить запросы на чтение между ними.
- Ускорить доступ к данным для пользователей из конкретного региона. Например, международные соцсети могут хранить контент на русском языке на серверах ближе к России.
- Выполнить юридические требования. Например, хранить конфиденциальные данные на шарде, публичный доступ к которому отключен.
-
Повысить доступность. Если БД находится на одном нешардированном хосте, то его выход из строя приведет к потере всех данных. Если же БД шардирована, то при отказе одного шарда все данные на других остаются доступными.Для шардов можно дополнительно настроить репликацию. Так вы обойдетесь без потерь, если сервер выйдет из строя. А размещение реплик шарда в разных зонах доступности даст вам отказоустойчивую систему.
-
Ускорить запросы. Они могут выполняться медленнее из-за того, что конкурируют за ресурсы сервера. Шардирование устраняет конкуренцию, исполняя запросы параллельно на разных серверах.
Каким бы замечательным ни было шардирование, у него есть и недостатки:
- Правильно шардировать данные, т. е. разбить их на части — непростая задача. Если вы сделаете это неверно, то мощности серверов будут использоваться нерационально. Например, потребуется много межсерверных запросов.
- Из-за несбалансированного распределения данных между шардами появляются горячие точки — разделы БД, к которым идет намного больше обращений по сравнению с остальными. Запросы к горячим точкам обрабатываются заметно медленнее.
Шардирование в MongoDB
В MongoDB шардирование коллекций поддерживается по умолчанию — части коллекций MongoDB размещаются на разных хостах кластера. На какой шард попадет фрагмент данных, определяет ключ шардирования.
От выбора ключа зависит удобство работы с коллекцией и производительность. Следует логично распределить данные коллекции по шардам. Данные на шардах не должны быть связаны между собой.
Шардировать данные имеет смысл, если:
- Данных много (коллекция больше 200 ГБ).
- Данные неоднородны и четко делятся на примерно одинаковые по объему данных категории.
- Требования к скорости чтения и записи данных высоки. Шардирование распределит нагрузку по хостам, чтобы обойти технические ограничения.
Шардирование доступно для кластеров MongoDB с версией не ниже 4.0. Оно происходит с автоматическим созданием служебных хостов mongos (для маршрутизации запросов пользователей) и mongocfg (для хранения конфигурации шардов), которые тарифицируются отдельно от основных хостов БД.
Сервис поддерживает две основные стратегии шардирования данных: - по хешу (ключ шардирования на базе хеша); - по диапазону значений (ranged sharding).
Отменить шардирование кластера невозможно. Чтобы воссоздать кластер до шардирования, придется сделать его резервную копию, а затем из копии создать новый кластер.
Чтобы повысить доступность, составляйте каждый шард из трёх или более хостов БД.
- Категория: Cloud Services Engineer
- Просмотров: 640
Кратко:
- Создание кластера MongoDB в Yandex Cloud
- Установка основных настроек кластера: тип хоста, класс, стандартное сетевое хранилище
- Подключение к базе данных через интернет или с виртуальных машин
- Установка утилиты MongoDB Shell
- Создание коллекции "users" в базе данных
- Загрузка тестовых данных с помощью методов db.insertOne() и db.insertMany()
- Работа с данными, содержащими разный набор данных
- Проверка наличия пользователей старше 37 лет с помощью метода db.users.find()
Практическая работа. Создание кластера MongoDB
На этом уроке вы создадите кластер MongoDB, подключитесь к нему и загрузите в него данные. Раньше вы работали только с реляционными БД, но использование кластера MongoDB принципиально не отличается от работы с кластером MySQL или PostgreSQL, так что многое будет вам знакомо.
Создание кластера базы данных
Выберите в консоли управления Yandex Cloud каталог для кластера БД. На дашборде каталога откройте раздел Managed Service for MongoDB. В открывшемся окне нажмите кнопку Создать кластер.
Установите основные настройки кластера. Для этого урока создайте кластер с минимальной конфигурацией: тип хоста
burstable, класс b2.nano, стандартное сетевое хранилище размером 10 ГБ. Откройте публичный доступ к хосту и задайте пароль пользователя БД. Остальные значения оставьте по умолчанию.
Подключение к базе данных
В сервисе управляемых БД MongoDB к хостам можно подключаться через интернет или с виртуальных машин в той же сети. Порт для подключения —
27018.Для подключения через интернет хосты кластера должны находиться в публичном доступе. Подключаться можно только через зашифрованное соединение.
Обратите внимание: если публичный доступ настроен только для некоторых хостов в кластере, то при автоматической смене основной реплики она может оказаться недоступной из интернета.
Если к хосту нет публичного доступа и вы подключаетесь к нему с виртуальных машин Yandex Cloud, то зашифрованное соединение необязательно.
Подключитесь к созданной БД из интернета. Используйте SSL-сертификат, который вы подготовили на одной из предыдущих практических работ, или команду (для Ubuntu):
sudo mkdir -p /usr/local/share/ca-certificates/Yandex && \
sudo wget "https://storage.yandexcloud.net/cloud-certs/CA.pem" -O /usr/local/share/ca-certificates/Yandex/YandexInternalRootCA.crt
Если всё пройдет успешно — вы получите сообщение операционной системы о том, что сертификат сохранён.

Установите утилиту MongoDB Shell:
- Обновление индекса пакетов. Для этого нужно запустить команду
.sudo apt update - Установка curl. Теперь можно установить пакет curl с помощью команды
sudo apt install curl - Проверка установки. После установки можно проверить версию curl, чтобы убедиться, что она установлена правильно. Для этого нужно выполнить команду
curl --version
Чтобы установить актуальный пакет MongoDB, необходимо добавить его в список репозиториев. Но предварительно следует импортировать открытый ключ для MongoDB в вашу систему. Для этого используйте следующую команду:
curl -fsSL https://pgp.mongodb.com/server-7.0.asc | sudo gpg -o /usr/share/keyrings/mongodb-server-7.0.gpg --dearmor
Теперь добавьте репозиторий MongoDB 7.0 в директорию
/etc/apt/sources.list.d:echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-7.0.gpg ] https://repo.mongodb.org/apt/ubuntu jammy/mongodb-org/7.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-7.0.list
В результате вы создадите файл с именем
mongodb-org-7.0.list. Для просмотра его содержимого можно использовать команду cat находясь в директории /etc/apt/sources.list.d/:cd /etc/apt/sources.list.d/
cat mongodb-org-7.0.list

Затем обновите локальный список пакетов, в результате чего репозиторий MongoDB 7.0 будет добавлен в систему:
sudo apt update
Далее уже можно будет запустить установку непосредственно пакета MongoDB:
sudo apt install mongodb-org

Сервис сформирует пример строки подключения для кластера. Там же вы можете посмотреть примеры кода на Python, PHP, Java, Node.js, Go для подключения из приложений.
Подключитесь к кластеру из командной строки.
mongosh --norc \
--tls \
--tlsCAFile /home/<домашняя директория>/.mongodb/root.crt \
--host '<FQDN хоста MongoDB>:27018' \
--username <имя пользователя БД> \
--password <пароль пользователя БД> \
<имя БД>
При успешном подключении вы получите сообщение:

Создадим в БД коллекцию
users. Предположим, в ней содержится информация о пользователях вашего приложения.db.createCollection("users")
Загрузим в коллекцию тестовые данные с помощью методов добавления одного документа
db.insertOne(...) и сразу нескольких db.insertMany(...).Сначала добавим один документ (данные одного пользователя).
db.users.insertOne({firstName: "Adam", lastName: "Smith", age: 37, email: "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. "});
Ответ должен выглядеть примерно так:

Дополним коллекцию данными еще двух пользователей.
db.users.insertMany( [
{firstName: "Viktoria", lastName: "Holmes", age: 73, email: "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. ", phone: "737772727"},
{firstName: "Tina", lastName: "Anders", age: 29, email: "Адрес электронной почты защищен от спам-ботов. Для просмотра адреса в браузере должен быть включен Javascript. ", children: [{firstName: "Sam", lastName: "Anders"},{firstName: "Anna", lastName: "Anders"}]}
] );
Обратите внимание, что документы в коллекции
users содержат разный набор данных. С помощью MongoDB мы можем работать с данными, структура которых частично не совпадает.Теперь посмотрим на содержимое коллекции с помощью команды
db.users.find(). Результат показывает, что все данные успешно добавлены:
Проверим, есть ли среди пользователей те, кому больше 37 лет. Сделаем запрос к БД с помощью метода
find.db.users.find({age: {$gt: 37}});
Подробности о методах работы с данными в MongoDB вы найдете в документации.
- Категория: Cloud Services Engineer
- Просмотров: 805
Кратко:
- Реляционные БД подходят не для всех задач, поэтому были созданы нереляционные модели данных, такие как NoSQL.
- Нереляционные модели данных хранят данные в разных формах, таких как документы, графы, пары "ключ-значение" и т.д.
- В MongoDB данные хранятся в документах, которые могут иметь сложную структуру и могут отличаться размером и полями.
- Однотипные документы объединяются в коллекции, аналог таблиц в реляционных БД.
- MongoDB подходит для управления большим объемом данных с неизвестной структурой и горизонтального масштабирования.
- Пример использования MongoDB: интернет-магазин с множеством товаров с разными характеристиками и национальной БД медицинских карт.
Введение. Несколько слов о NoSQL
Вы уже знаете, что реляционные БД — это набор таблиц и связей между ними. Такие БД подходят не для всех задач. Например, данные без структуры невозможно уложить в таблицу. В итоге разработчики создали для нереляционных моделей данных NoSQL (not only SQL) БД.
Различия реляционных и нереляционных БД
На этом и следующих уроках вы познакомитесь с документо-ориентированной БД MongoDB и тем, как с ней работать в Yandex Cloud.
MongoDB — это популярная NoSQL БД, в которой данные хранятся не в строках таблиц, а в документах. Один объект — один документ. Структура каждого документа подобна структуре JSON (JavaScript Object Notation).
Так может выглядеть документ из базы данных поликлиники с медицинскими картами пациентов:
{
"Имя":"Сергей",
"Фамилия":"Шишкин",
"Дата рождения":"02.12.1961",
"Номер медицинской карты":23264,
"Посещения врача":[
{
"Дата":"24.02.2021",
"Врач":"Сидорова О.С.",
"Анамнез":"...",
"Назначенные обследования":"Общий анализ крови",
"Диагноз":"ОРВИ",
"Лечение":"Теплый чай с медом перорально до 12 раз в сутки"
},
{
"Дата":"05.03.2021",
"Врач":"Сидорова О.С.",
"Анамнез":"...",
"Назначенные обследования":"",
"Диагноз":"Здоров"
}
]
}
В отличие от строк в реляционных БД, документы:
- позволяют сохранять объекты со сложной структурой, которая может изменяться;
- могут отличаться друг от друга размером и полями.
Высокоуровнево документы состоят из пар «ключ - значение». В примере с медицинской картой
имя — это ключ, а Сергей — его значение. Значениями могут быть числа, строки, аудиофайлы, изображения, массивы или другие объекты, даже сложные.Однотипные документы объединяются в коллекции — аналог таблиц в реляционных БД. Например, в БД поликлиники могут входить коллекции «Медицинские карты пациентов», «Результаты лабораторной диагностики» и «Листы нетрудоспособности».
MongoDB подойдет, если необходимо:
-
Управлять большим объемом данных с заранее неизвестной структурой (каталоги товаров, пользовательские профили, системы управления контентом).Пример: интернет-магазин, где продается множество товаров с разными характеристиками. Чтобы выставить товар на сайт, контент-менеджер выбирает характеристики и их значения из набора. Менеджер также может добавить или удалить любое поле и установленные для него значения.
-
Горизонтально масштабироваться.Пример: создание национальной БД медицинских карт. Реляционная БД здесь — не лучшее решение: ее горизонтальное масштабирование сопряжено с трудностями и плохо автоматизируется.
- Категория: Cloud Services Engineer
- Просмотров: 527




