Получение данных из RabbitMQ в Yandex Managed Service for ClickHouse®
- Перед началом работы
- Настройте интеграцию RabbitMQ для кластера Managed Service for ClickHouse®
- Создайте в кластере Managed Service for ClickHouse® таблицу на движке RabbitMQ
- Отправьте тестовые данные в очередь RabbitMQ
- Проверьте наличие тестовых данных в таблице кластера Managed Service for ClickHouse®
- Удалите созданные ресурсы
В кластер Managed Service for ClickHouse® можно поставлять данные из RabbitMQ в реальном времени. Managed Service for ClickHouse® будет автоматически вставлять в таблицу на движке RabbitMQ
Чтобы настроить поставку данных из RabbitMQ в Managed Service for ClickHouse®:
- Настройте интеграцию с RabbitMQ для кластера Managed Service for ClickHouse®.
- Создайте в кластере Managed Service for ClickHouse® таблицу на движке RabbitMQ.
- Отправьте тестовые данные в очередь RabbitMQ.
- Проверьте наличие тестовых данных в таблице кластера Managed Service for ClickHouse®.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте инфраструктуру
-
Создайте кластер Managed Service for ClickHouse® любой подходящей вам конфигурации с базой данных
db1
. Для подключения к кластеру с локальной машины пользователя, а не из облачной сети Yandex Cloud, включите публичный доступ к хостам кластера при его создании.Примечание
Интеграцию с RabbitMQ можно настроить уже на этапе создания кластера. В этой статье интеграция будет настроена позже.
-
Создайте виртуальную машину для RabbitMQ. Для подключения к виртуальной машине с локальной машины пользователя, а не из облачной сети Yandex Cloud, включите публичный доступ при ее создании.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации clickhouse-cluster-and-vm-for-rabbitmq.tf
.В этом файле описаны:
- сеть;
- подсеть;
- группа безопасности по умолчанию и правила, необходимые для подключения к кластеру и виртуальной машине из интернета;
- кластер Managed Service for ClickHouse®;
- виртуальная машина.
-
Укажите в файле
clickhouse-cluster-and-vm-for-rabbitmq.tf
:- Имя пользователя и пароль, которые будут использоваться для доступа к кластеру Managed Service for ClickHouse®.
- Идентификатор публичного образа с Ubuntu без GPU для виртуальной машины.
- Логин и путь к файлу открытого ключа, которые будут использоваться для доступа к виртуальной машине. По умолчанию в используемом образе указанный логин игнорируется, вместо него создается пользователь с логином
ubuntu
. Используйте его для подключения к виртуальной машине.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Выполните дополнительные настройки
-
Подключитесь к виртуальной машине по SSH.
-
Установите RabbitMQ:
sudo apt update && sudo apt install rabbitmq-server --yes
-
Создайте пользователя для RabbitMQ:
sudo rabbitmqctl add_user <имя_пользователя> <пароль>
-
Выдайте этому пользователю права на подключение к серверу:
sudo rabbitmqctl set_permissions -p / <имя_пользователя> ".*" ".*" ".*" && \ sudo rabbitmqctl set_topic_permissions -p / <имя_пользователя> amq.topic "cars" "cars"
-
-
Установите утилиты
amqp-publish
иamqp-declare-queue
для работы с RabbitMQ и jq для потоковой обработки JSON-файлов:sudo apt update && sudo apt install amqp-tools --yes && sudo apt-get install jq --yes
-
Убедитесь, что можете создать в RabbitMQ очередь
cars
с помощьюamqp-declare-queue
:amqp-declare-queue \ --url=amqp://<имя_пользователя>:<пароль>@<IP-адрес_или_FQDN_сервера_RabbitMQ>:5672 \ --queue=cars
-
Установите утилиту
clickhouse-client
для подключения к базе данных в кластере Managed Service for ClickHouse®.-
Подключите DEB-репозиторий
ClickHouse®:sudo apt update && sudo apt install --yes apt-transport-https ca-certificates dirmngr && \ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv E0C56BD4 && \ echo "deb https://packages.clickhouse.com/deb stable main" | sudo tee \ /etc/apt/sources.list.d/clickhouse.list
-
Установите зависимости:
sudo apt update && sudo apt install clickhouse-client --yes
-
Загрузите файл конфигурации для
clickhouse-client
:mkdir -p ~/.clickhouse-client && \ wget "https://storage.yandexcloud.net/doc-files/clickhouse-client.conf.example" \ --output-document ~/.clickhouse-client/config.xml
Убедитесь, что можете с помощью
clickhouse-client
подключиться к кластеру Managed Service for ClickHouse® через SSL. -
Настройте интеграцию RabbitMQ для кластера Managed Service for ClickHouse®
Укажите в настройках кластера Managed Service for ClickHouse® имя пользователя и пароль для аутентификации RabbitMQ в секции Настройки СУБД → Rabbitmq.
Добавьте к описанию кластера блок clickhouse.config.rabbitmq
с именем пользователя и паролем для аутентификации RabbitMQ:
resource "yandex_mdb_clickhouse_cluster" "clickhouse-cluster" {
...
clickhouse {
...
config {
rabbitmq {
username = "<имя_пользователя>"
password = "<пароль>"
}
}
...
}
}
Создайте в кластере Managed Service for ClickHouse® таблицу на движке RabbitMQ
Пусть в RabbitMQ в очередь cars
на точке обмена exchange
в RabbitMQ будут помещены данные от сенсоров автомобиля в формате JSON:
-
строковый идентификатор устройства
device_id
; -
дата и время формирования данных
datetime
в форматеYYYY-MM-DD HH:MM:SS
; -
координаты автомобиля:
- широта
latitude
; - долгота
longitude
; - высота над уровнем моря
altitude
;
- широта
-
текущая скорость
speed
; -
напряжение батарей
battery_voltage
(для электромобиля, для автомобиля с ДВС значение этого параметра —null
); -
температура в салоне
cabin_temperature
; -
уровень топлива
fuel_level
(для автомобиля с ДВС, для электромобиля значение этого параметра —null
).
Эти данные будут передаваться в виде сообщений RabbitMQ. Каждое такое сообщение будет содержать JSON-объект как строку следующего вида:
{"device_id":"iv9a94th6rzt********","datetime":"2020-06-05 17:27:00","latitude":"55.70329032","longitude":"37.65472196","altitude":"427.5","speed":"0","battery_voltage":"23.5","cabin_temperature":"17","fuel_level":null}
Кластер Managed Service for ClickHouse® будет использовать при вставке в таблицу формат данных JSONEachRow
Создайте в кластере Managed Service for ClickHouse® таблицу, в которую будут заноситься поступающие от RabbitMQ данные:
-
Подключитесь к базе данных
db1
кластера Managed Service for ClickHouse® с помощьюclickhouse-client
. -
Выполните запрос:
CREATE TABLE IF NOT EXISTS db1.cars ( device_id String, datetime DateTime, latitude Float32, longitude Float32, altitude Float32, speed Float32, battery_voltage Nullable(Float32), cabin_temperature Float32, fuel_level Nullable(Float32) ) ENGINE = RabbitMQ SETTINGS rabbitmq_host_port = '<внутренний_IP-адрес_ВМ_с_RabbitMQ>:5672', rabbitmq_routing_key_list = 'cars', rabbitmq_exchange_name = 'exchange', rabbitmq_format = 'JSONEachRow';
Эта таблица будет автоматически наполняться сообщениями, считываемыми из очереди cars
в точке обмена exchange
RabbitMQ. При чтении данных Managed Service for ClickHouse® использует указанные ранее данные для аутентификации.
Отправьте тестовые данные в очередь RabbitMQ
-
Создайте файл
sample.json
с тестовыми данными:{ "device_id": "iv9a94th6rzt********", "datetime": "2020-06-05 17:27:00", "latitude": 55.70329032, "longitude": 37.65472196, "altitude": 427.5, "speed": 0, "battery_voltage": 23.5, "cabin_temperature": 17, "fuel_level": null } { "device_id": "rhibbh3y08qm********", "datetime": "2020-06-06 09:49:54", "latitude": 55.71294467, "longitude": 37.66542005, "altitude": 429.13, "speed": 55.5, "battery_voltage": null, "cabin_temperature": 18, "fuel_level": 32 } { "device_id": "iv9a94th6rzt********", "datetime": "2020-06-07 15:00:10", "latitude": 55.70985913, "longitude": 37.62141918, "altitude": 417.0, "speed": 15.7, "battery_voltage": 10.3, "cabin_temperature": 17, "fuel_level": null }
-
Отправьте в созданную ранее очередь
cars
в точку обменаexchange
данные из файлаsample.json
с помощьюjq
иamqp-publish
.jq \ --raw-output \ --compact-output . ./sample.json |\ amqp-publish \ --url=amqp://<имя_пользователя_RabbitMQ>:<пароль>@<IP-адрес_или_FQDN_сервера_RabbitMQ>:5672 \ --routing-key=cars \ --exchange=exchange
Проверьте наличие тестовых данных в таблице кластера Managed Service for ClickHouse®
Для доступа к данным используйте материализованное представление (MATERIALIZED VIEW
). Когда к таблице на движке RabbitMQ
присоединяется материализованное представление, оно начинает в фоновом режиме собирать данные. Это позволяет непрерывно получать сообщения от RabbitMQ и преобразовывать их в необходимый формат с помощью SELECT
.
Примечание
Сообщение из очереди может быть прочитано ClickHouse® только один раз, поэтому вместо чтения данных напрямую из таблицы используйте материализованное представление.
Чтобы создать материализованное представление для таблицы db1.cars
:
-
Подключитесь к базе данных
db1
кластера Managed Service for ClickHouse® с помощьюclickhouse-client
. -
Выполните запросы:
CREATE TABLE IF NOT EXISTS db1.cars_data_source ( device_id String, datetime DateTime, latitude Float32, longitude Float32, altitude Float32, speed Float32, battery_voltage Nullable(Float32), cabin_temperature Float32, fuel_level Nullable(Float32) ) ENGINE MergeTree() ORDER BY device_id; CREATE MATERIALIZED VIEW db1.cars_view TO db1.cars_data_source AS SELECT * FROM db1.cars;
Чтобы получить все данные из материализованного представления db1.cars_view
:
-
Подключитесь к базе данных
db1
кластера Managed Service for ClickHouse® с помощьюclickhouse-client
. -
Выполните запрос:
SELECT * FROM db1.cars_view;
Запрос вернет таблицу с данными, отправленными в RabbitMQ.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
- Удалите кластер Yandex Managed Service for ClickHouse®.
- Удалите виртуальную машину.
- Если вы зарезервировали публичные статические IP-адреса, освободите и удалите их.
-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
ClickHouse® является зарегистрированным товарным знаком ClickHouse, Inc