Установка и использование TimescaleDB в CentOS 7

Многие приложения должны накапливать данные для дальнейшего анализа (например, так работают системы мониторинга и сбора данных). Как правило, дальнейшая их обработка призвана показать, как со временем изменяется часть показателей или система. В этих случаях данные представляются в виде временного ряда, причем каждая точка данных сопровождается меткой времени:

2019-11-01 09:00:00    server.cpu.1    0.9
2019-11-01 09:00:00    server.cpu.15   0.8
2019-11-01 09:01:00    server.cpu.1    0.9
2019-11-01 09:01:00    server.cpu.15   0.8
...

С появлением Интернета вещей (IoT) и промышленного интернета вещей управление временными рядами стало важным. Все больше и больше устройств собирают различную информацию о временных рядах: фитнес-трекеры, умные часы, домашние метеостанции и различные датчики. Эти устройства собирают много информации, и все эти данные должны где-то храниться.

Для хранения данных обычно используются классические реляционные базы, но они не всегда подходят, когда речь идет об огромных объемах временных рядов. Чтобы эффективно обработать такой объем, реляционные базы слишком медленные. Поэтому появились оптимизированные базы данных, называемые NoSQL – они позволяют избежать проблем РСУБД.

Читайте также: Модели и системы управления базами данных NoSQL

TimescaleDB – это база данных с открытым исходным кодом, оптимизированная для хранения временных рядов. Она реализована как расширение PostgreSQL, благодаря чему сочетает в себе простоту использования реляционных баз данных и скорость работы баз NoSQL. В итоге вы можете использовать PostgreSQL как для хранения бизнес-данных, так и для данных временных рядов.

В данном мануале вы научитесь устанавливать и настраивать TimescaleDB в CentOS 7. Вы узнаете, как создавать базы данных временных рядов, отправлять простые запросы и избавиться от ненужных данных.

Требования

  • Сервер CentOS 7, настроенный по этому мануалу. Дополнительные рекомендации по настройке сервера вы найдете здесь.
  • Установка PostgreSQL (следуйте мануалу Установка и использование PostgreSQL в CentOS 7).

1: Установка TimescaleDB

Пакетов TimescaleDB нет в стандартных репозиториях CentOS. Поэтому для установки мы будем использовать PPA (Personal Packages Archive).

Сначала создайте новый файл репозитория:

sudo vi /etc/yum.repos.d/timescaledb.repo

Перейдите в режим вставки, нажав i, и вставьте в файл следующие параметры:

[timescale_timescaledb]
name=timescale_timescaledb
baseurl=https://packagecloud.io/timescale/timescaledb/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/timescale/timescaledb/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300

Нажмите Esc, чтобы выйти из режима вставки, а затем :wq и Enter, чтобы сохранить и закрыть файл.

Читайте также: Установка и использование текстового редактора Vim

Теперь вы можете продолжить установку. В этом мануале используется версия PostgreSQL 11; если вы используете другую версию PostgreSQL (например, 9.6), замените номер версии в следующей команде и запустите ее:

sudo yum install -y timescaledb-postgresql-11

Теперь база данных TimescaleDB установлена и готова к использованию. Давайте включим и настроим некоторые связанные с ней параметры в конфигурационном файле PostgreSQL.

2: Настройка TimescaleDB

Модуль TimescaleDB хорошо работает со стандартными настройками конфигурации PostgreSQL, но для повышения производительности и оптимизации использования ресурсов процессора, памяти и диска разработчики TimescaleDB предлагают изменить некоторые параметры. Это можно сделать автоматически (с помощью инструмента timescaledb-tune) или вручную (отредактировав файл postgresql.conf).

В этом мануале мы используем инструмент timescaledb-tune, который прочитает файл postgresql.conf и предложит вам внести изменения в интерактивном режиме.

Введите следующую команду, чтобы запустить мастер настройки:

sudo timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config

Сначала мастер предложит подтвердить путь к конфигурационному файлу PostgreSQL:

Using postgresql.conf at this path:
/var/lib/pgsql/11/data/postgresql.conf
Is this correct? [(y)es/(n)o]:

Утилита обнаруживает путь к нужному конфигурационному файлу автоматически. Просто введите у, чтобы подтвердить его.

...
Is this correct? [(y)es/(n)o]: y
Writing backup to:
/tmp/timescaledb_tune.backup201912191633

Чтобы включить модуль TimescaleDB, введите y в командную строку и нажмите Enter:

shared_preload_libraries needs to be updated
Current:
#shared_preload_libraries = ''
Recommended:
shared_preload_libraries = 'timescaledb'
Is this okay? [(y)es/(n)o]:  y
success: shared_preload_libraries will be updated

В зависимости от характеристик сервера и версии PostgreSQL скрипт может предложить тонкую настройку параметров. Нажмите у, чтобы запустить этот процесс:

Tune memory/parallelism/WAL and other settings? [(y)es/(n)o]:  y
Recommendations based on 7.64 GB of available memory and 4 CPUs for PostgreSQL 11
Memory settings recommendations
Current:
shared_buffers = 128MB
#effective_cache_size = 4GB
#maintenance_work_mem = 64MB
#work_mem = 4MB
Recommended:
shared_buffers = 1955MB
effective_cache_size = 5865MB
maintenance_work_mem = 1001121kB
work_mem = 5005kB
Is this okay? [(y)es/(s)kip/(q)uit]:

Мастер timescaledb-tune автоматически обнаружит доступную память сервера и рассчитает рекомендуемые значения для параметров shared_buffers, effective_cache_size, maintenance_work_mem и work_mem. Чтобы узнать больше о настройке параметров памяти PostgreSQL, читайте эту статью.

Введите y, чтобы принять значения:

...
Is this okay? [(y)es/(s)kip/(q)uit]:  y
success: memory settings will be updated

Если у вас один CPU, timescaledb-tune сразу перейдет к настройкам WAL. Если ваш сервер имеет несколько процессоров, вы получите рекомендации по настройке параллелизма. В этом случае вы увидите:

Parallelism settings recommendations
Current:
missing: timescaledb.max_background_workers
#max_worker_processes = 8
#max_parallel_workers_per_gather = 2
#max_parallel_workers = 8
Recommended:
timescaledb.max_background_workers = 8
max_worker_processes = 15
max_parallel_workers_per_gather = 2
max_parallel_workers = 4
Is this okay? [(y)es/(s)kip/(q)uit]:

Эти параметры определяют количество рабочих процессов, которые обслуживают запросы и фоновые задачи. Вы можете узнать больше об этих настройках в документации TimescaleDB и PostgreSQL .

Введите y, затем нажмите Enter, чтобы принять эти настройки:

...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: parallelism settings will be updated

После этого на экране появятся рекомендации для Write Ahead Log (WAL):

WAL settings recommendations
Current:
#wal_buffers = -1
#min_wal_size = 80MB
#max_wal_size = 1GB
Recommended:
wal_buffers = 16MB
min_wal_size = 4GB
max_wal_size = 8GB
Is this okay? [(y)es/(s)kip/(q)uit]:

WAL отвечает за целостность данных, однако настройки по умолчанию могут снизить эффективность операций ввода/вывода, что в свою очередь снижает и производительность записи. Чтобы это исправить, введите y:

...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: WAL settings will be updated

Далее появится ряд разных рекомендаций:

Miscellaneous settings recommendations
Current:
#default_statistics_target = 100
#random_page_cost = 4.0
#checkpoint_completion_target = 0.5
#max_locks_per_transaction = 64
#autovacuum_max_workers = 3
#autovacuum_naptime = 1min
#effective_io_concurrency = 1
Recommended:
default_statistics_target = 500
random_page_cost = 1.1
checkpoint_completion_target = 0.9
max_locks_per_transaction = 64
autovacuum_max_workers = 10
autovacuum_naptime = 10
effective_io_concurrency = 200
Is this okay? [(y)es/(s)kip/(q)uit]:

Все эти настройки отвечают за повышение производительности. Например, твердотельные накопители могут обрабатывать много одновременных запросов, поэтому хорошее значение для effective_io_concurrency может быть в несколько сотен. Больше информации об этих опциях вы найдете в документации PostgreSQL.

Нажмите y, затем Enter, чтобы продолжить.

...
Is this okay? [(y)es/(s)kip/(q)uit]: y
success: miscellaneous settings will be updated
Saving changes to: /var/lib/pgsql/11/data/postgresql.conf

В результате вы получите готовый конфигурационный файл в /var/lib/pgsql/11/data/postgresql.conf.

Примечание: Если вы автоматизируете установку, вы также можете запустить стартовую команду с флагами —quiet и —yes, которая автоматически применит все рекомендации и внесет изменения в конфигурации postgresql.conf:

sudo timescaledb-tune --pg-config=/usr/pgsql-11/bin/pg_config --quiet --yes

Чтобы изменения конфигурации вступили в силу, необходимо перезапустить PostgreSQL:

sudo systemctl restart postgresql-11.service

База данных с оптимизированными настройками готова к обработке временных рядов. Теперь давайте поработаем с этими данными: вы научитесь создавать новые базы данных, гипертаблицы и выполнять операции.

3: Создание новой базы данных и гипертаблицы

TimescaleDB существует как расширение PostgreSQL, поэтому операции с данными временных рядов мало чем отличаются от операций с реляционными данными. К тому же, БД позволяет свободно комбинировать данные из временных рядов и реляционных таблиц.

Давайте попробуем создать новую БД и включить для этого расширение TimescaleDB. Войдите в PostgreSQL:

sudo -u postgres psql

Создайте новую базу данных и подключитесь к ней. Здесь мы назовем БД timeseries:

CREATE DATABASE timeseries;
\c timeseries

Читайте также: Управление таблицами PostgreSQL на облачном сервере

Теперь включите расширение TimescaleDB:

CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

Вы увидите:

WARNING:
WELCOME TO
._____ _                               _     ____________
|_   _(_)                             | |    |  _  \ ___ \
. | |  _ _ __ ___   ___  ___  ___ __ _| | ___| | | | |_/ /
. | | | |  _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \
. | | | | | | | | |  __/\__ \ (_| (_| | |  __/ |/ /| |_/ /
. |_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/
Running version 1.5.1
For more information on TimescaleDB, please visit the following links:
Getting started: https://docs.timescale.com/getting-started
API reference documentation: https://docs.timescale.com/api
How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture
Note: TimescaleDB collects anonymous reports to better understand and assist our users.
For more information and how to disable, please see our docs https://docs.timescaledb.com/using-timescaledb/telemetry.
CREATE EXTENSION

Как уже упоминалось ранее, основными точками взаимодействия с временными рядами являются гипертаблицы, они состоят из множества таблиц с данными, которые называются блоками.

Чтобы создать гипертаблицу, сначала нужно создать обычную таблицу SQL, а затем преобразовать ее в гипертаблицу с помощью функций create_hypertable.

Создайте таблицу conditions, в которой будут храниться данные для отслеживания температуры и влажности, собранные несколькими устройствами:

CREATE TABLE conditions (
time        TIMESTAMP WITH TIME ZONE NOT NULL,
device_id   TEXT,
temperature  NUMERIC,
humidity     NUMERIC
);

Эта команда создает таблицу conditions с четырьмя столбцами. В первом столбце будет храниться временная метка. Далее мы используем столбец времени, чтобы преобразовать таблицу в гипертаблицу:

SELECT create_hypertable('conditions', 'time');

Эта команда выполняет функцию create_hypertable(), которая создаст гипертаблицу TimescaleDB из таблицы PostgreSQL, заменяя последнюю. Вы получите следующий вывод:

create_hypertable
-------------------------
(1,public,conditions,t)
(1 row)

Вы успешно создали новую гипертаблицу для хранения временных рядов. Теперь можно заполнить ее данными или удалить.

4: Запись и удаление гипертаблицы

Теперь давайте вставим данные в таблицу с помощью стандартных команд SQL и импортируем большие наборы из внешних источников. Это продемонстрирует вам, какие аспекты реляционной базы данных присутствуют в TimescaleDB.

Попробуйте запустить базовые команды. Вы можете вставить данные в гипертаблицу, используя стандартную SQL команду INSERT. Вставьте данные о температуре и влажности для устройства weather-pro-000000, используя следующую команду:

INSERT INTO conditions(time, device_id, temperature, humidity)
VALUES (NOW(), 'weather-pro-000000', 84.1, 84.1);

Вы увидите следующий вывод:

INSERT 0 1

Вы также можете вставить несколько строк одновременно. Введите следующую команду:

INSERT INTO conditions
VALUES
(NOW(), 'weather-pro-000002', 71.0, 51.0),
(NOW(), 'weather-pro-000003', 70.5, 50.5),
(NOW(), 'weather-pro-000004', 70.0, 50.2);

Вы получите вывод:

INSERT 0 3

Команда INSERT также может вернуть отдельные или все вставленные данные, используя опцию RETURNING:

INSERT INTO conditions
VALUES (NOW(), 'weather-pro-000002', 70.1, 50.1) RETURNING *;
time                |     device_id      | temperature | humidity
-------------------------------+--------------------+-------------+----------
2019-09-15 14:14:01.576651+00 | weather-pro-000002 |        70.1 |     50.1
(1 row)

Если вы хотите удалить данные из гипертаблицы, используйте стандартную SQL-команду DELETE. Введите следующую команду, чтобы удалить все данные, где значение temperature выше 80 или humidity выше 50:

DELETE FROM conditions WHERE temperature > 80;
DELETE FROM conditions WHERE humidity > 50;

После операции удаления используйте команду VACUUM, чтобы восстановить пространство, все еще занимаемое удаленными данными.

VACUUM conditions;

Больше информации о команде VACUUM вы найдете в документации PostgreSQL.

Эти команды подходят для ввода небольших блоков данных, но поскольку временные ряды часто генерируют огромные наборы данных из нескольких устройств одновременно, важно также знать, как вставлять сотни или тысячи строк за раз. Если вы подготовили данные из внешних источников в структурированной форме, например в формате csv, эту задачу можно быстро выполнить.

Давайте потренируемся на тестовом наборе, который представляет данные о температуре и влажности из разных мест. Это официальный набор данных TimescaleDB, созданный специально для тестирования базы данных. Узнать больше об образцах данных можно в документации TimescaleDB.

Давайте импортируем данные из тестового набора weather_small в вашу БД. Выйдите из Postgresql:

\q

Загрузите набор данных на свою машину и распакуйте его:

cd /tmp

curl https://timescaledata.blob.core.windows.net/datasets/weather_small.tar.gz -o weather_small.tar.gz

tar -xvzf weather_small.tar.gz

Затем импортируйте данные о температуре и влажности в БД:

sudo -u postgres psql -d timeseries -c "\COPY conditions FROM weather_small_conditions.csv CSV"

Команда подключится к базе данных timeseries и выполнит команду \COPY, которая копирует данные из выбранного файла в гипертаблицу conditions. Задача будет обрабатываться в течение нескольких секунд.

Когда данные будут введены в вашу таблицу, вы получите вывод:

COPY 1000000

Вы успешно добавили вручную данные из набора в гипертаблицу. Можно приступать к выполнению запросов.

5: Запрос данных

Теперь таблица содержит данные, и вы можете выполнять различные запросы для их анализа.

Чтобы начать работу, войдите в базу данных:

sudo -u postgres psql -d timeseries

Как вы уже знаете, для работы с гипертаблицами вы можете использовать стандартные команды SQL. Например, чтобы вывести последние 10 записей из conditions, можно ввести следующую команду:

SELECT * FROM conditions LIMIT 10;

Вы получите такой результат:

time           |     device_id      |    temperature     | humidity
-----------------------+--------------------+--------------------+----------
2016-11-15 12:00:00+00 | weather-pro-000000 |               39.9 |     49.9
2016-11-15 12:00:00+00 | weather-pro-000001 |               32.4 |     49.8
2016-11-15 12:00:00+00 | weather-pro-000002 | 39.800000000000004 |     50.2
2016-11-15 12:00:00+00 | weather-pro-000003 | 36.800000000000004 |     49.8
2016-11-15 12:00:00+00 | weather-pro-000004 |               71.8 |     50.1
2016-11-15 12:00:00+00 | weather-pro-000005 |               71.8 |     49.9
2016-11-15 12:00:00+00 | weather-pro-000006 |                 37 |     49.8
2016-11-15 12:00:00+00 | weather-pro-000007 |                 72 |       50
2016-11-15 12:00:00+00 | weather-pro-000008 |               31.3 |       50
2016-11-15 12:00:00+00 | weather-pro-000009 |               84.4 |     87.8
(10 rows)

Эта команда позволяет увидеть, какие данные находятся в базе. Поскольку база содержит миллион записей, мы использовали LIMIT 10, чтобы ограничить вывод 10 записями.

Чтобы просмотреть самые последние записи, отсортируйте массив данных по времени в порядке убывания:

SELECT * FROM conditions ORDER BY time DESC LIMIT 20;

Это выведет на экран 20 самых последних записей.

Вы также можете включить фильтр. Например, чтобы просмотреть записи с устройства weather-pro-000000, выполните:

SELECT * FROM conditions WHERE device_id = 'weather-pro-000000' ORDER BY time DESC LIMIT 10;

В этом случае вы увидите 10 самых последних данных о температуре и влажности, зарегистрированных устройством weather-pro-000000.

В дополнение к стандартным SQL командам TimescaleDB также предоставляет ряд специальных функций, которые нужны для анализа данных временных рядов. Например, чтобы найти медиану значений температуры, вы можете использовать следующий запрос с функцией percentile_cont:

SELECT percentile_cont(0.5)
WITHIN GROUP (ORDER BY temperature)
FROM conditions
WHERE device_id = 'weather-pro-000000';

Вы увидите следующий вывод:

percentile_cont
-----------------
40.5
(1 row)

Так вы узнаете среднюю температуру за весь период наблюдения устройства weather-pro-00000.

Чтобы показать последние значения для каждого из датчиков, вы можете использовать функцию last:

select device_id, last(temperature, time)
FROM conditions
GROUP BY device_id;

В выводе вы увидите список всех датчиков и последние зарегистрированные ими значения.

Чтобы получить первые значения, используйте функцию first.

Следующий пример более сложный. Он покажет среднечасовую, минимальную и максимальную температуры для выбранного датчика за последние 24 часа:

SELECT time_bucket('1 hour', time) "hour",
trunc(avg(temperature), 2) avg_temp,
trunc(min(temperature), 2) min_temp,
trunc(max(temperature), 2) max_temp
FROM conditions
WHERE device_id = 'weather-pro-000000'
GROUP BY "hour" ORDER BY "hour" DESC LIMIT 24;

Здесь мы использовали функцию time_bucket, более мощную версию функции date_trunc в PostgreSQL. В результате мы видим, в какие периоды дня температура повышается или понижается:

hour           | avg_temp | min_temp | max_temp
-----------------------+----------+----------+----------
2016-11-16 21:00:00+00 |    42.00 |    42.00 |    42.00
2016-11-16 20:00:00+00 |    41.92 |    41.69 |    42.00
2016-11-16 19:00:00+00 |    41.07 |    40.59 |    41.59
2016-11-16 18:00:00+00 |    40.11 |    39.79 |    40.59
2016-11-16 17:00:00+00 |    39.46 |    38.99 |    39.79
2016-11-16 16:00:00+00 |    38.54 |    38.19 |    38.99
2016-11-16 15:00:00+00 |    37.56 |    37.09 |    38.09
2016-11-16 14:00:00+00 |    36.62 |    36.39 |    37.09
2016-11-16 13:00:00+00 |    35.59 |    34.79 |    36.29
2016-11-16 12:00:00+00 |    34.59 |    34.19 |    34.79
2016-11-16 11:00:00+00 |    33.94 |    33.49 |    34.19
2016-11-16 10:00:00+00 |    33.27 |    32.79 |    33.39
2016-11-16 09:00:00+00 |    33.37 |    32.69 |    34.09
2016-11-16 08:00:00+00 |    34.94 |    34.19 |    35.49
2016-11-16 07:00:00+00 |    36.12 |    35.49 |    36.69
2016-11-16 06:00:00+00 |    37.02 |    36.69 |    37.49
2016-11-16 05:00:00+00 |    38.05 |    37.49 |    38.39
2016-11-16 04:00:00+00 |    38.71 |    38.39 |    39.19
2016-11-16 03:00:00+00 |    39.72 |    39.19 |    40.19
2016-11-16 02:00:00+00 |    40.67 |    40.29 |    40.99
2016-11-16 01:00:00+00 |    41.63 |    40.99 |    42.00
2016-11-16 00:00:00+00 |    42.00 |    42.00 |    42.00
2016-11-15 23:00:00+00 |    42.00 |    42.00 |    42.00
2016-11-15 22:00:00+00 |    42.00 |    42.00 |    42.00
(24 rows)

Больше полезных функций вы найдете в документации TimescaleDB.

Теперь вы знаете, как обрабатывать данные. Далее вы узнаете, как удалять и сжимать данные.

6: Настройка сжатия и удаления данных

По мере своего накопления данные будут занимать все больше места на диске. Для экономии дискового пространства в последней версии TimescaleDB предусмотрена функция сжатия данных. Эта функция не требует настройки файловой системы и может быстро повысить эффективность вашей базы данных. Больше информации о том, как работает это сжатие, вы найдете в этой статье о сжатии от TimescaleDB.

Включите сжатие гипертаблицы:

ALTER TABLE conditions SET (
timescaledb.compress,
timescaledb.compress_segmentby = 'device_id'
);

Вы получите следующие данные:

NOTICE:  adding index _compressed_hypertable_2_device_id__ts_meta_sequence_num_idx ON _timescaledb_internal._compressed_hypertable_2 USING BTREE(device_id, _ts_meta_sequence_num)
ALTER TABLE

Примечание: Вы также можете настроить TimescaleDB для сжатия данных за определенный период времени. Например:

SELECT add_compress_chunks_policy('conditions', INTERVAL '7 days');

В этом примере данные будут автоматически сжаты через неделю.

Вы можете запросить статистику по сжатым данным:

SELECT *
FROM timescaledb_information.compressed_chunk_stats;

Затем вы увидите список блоков с их статусами: статус сжатия и количество места, занимаемое несжатыми и сжатыми данными в байтах.

Если у вас нет необходимости хранить данные в течение длительного периода времени, вы можете удалить устаревшие данные, чтобы освободить больше места. Для этого существует специальная функция drop_chunks. Она позволяет удалять блоки с данными старше заданного времени:

SELECT drop_chunks(interval '24 hours', 'conditions');

Этот запрос удалит из гипертаблицы conditions все блоки, данные которых созданы раньше, чем день назад.

Вы получите следующий вывод:

drop_chunks
----------------------------------------
_timescaledb_internal._hyper_1_2_chunk
(1 row)

Для автоматического удаления старых данных вы можете настроить задачу cron.

Читайте также: Автоматизация задач с помощью Cron

Закройте базу данных:

\q

Затем отредактируйте crontab с помощью следующей команды, которую нужно запустить из оболочки:

crontab -e

Добавьте в конец файла следующую строку:

...
0 1 * * * /usr/bin/psql -h localhost -p 5432 -U postgres -d postgres -c "SELECT drop_chunks(interval '24 hours', 'conditions');" >/dev/null 2>&1

Эта задача удаляет устаревшие данные (в данном случае все данные старше одного дня) каждый день в 1:00 утра.

Заключение

Вы настроили TimescaleDB на сервере CentOS. Вы также научились создавать гипертаблицы, вставлять в них данные, запрашивать их, сжимать и удалять ненужные записи. На этих примерах вы научились пользоваться основными преимуществами TimescaleDB и увидели, чем эта БД отличается от традиционных реляционных систем управления базами данных. Среди преимуществ TimescaleDB:

  • Более высокая скорость приема данных
  • Высокая производительность запросов
  • Функции на основе времени
Tags: , , , , ,

Добавить комментарий