воскресенье, 23 февраля 2020 г.

CentOS7. Использование syslog-ng для отправки данных в базу REDIS

CentOS7. Использование syslog-ng для отправки данных в базу REDIS

Устанавливаем REDIS:
# yum install redis
Запускаем сервис REDIS и включаем его в автозагрузку
# systemctl start redis.service
# systemctl enable redis

Удаляем сервис rsyslog, установленный по умолчанию и устанавливаем syslog-ng на сервер:
# yum -y remove rsyslog
# yum install syslog-ng
# yum install syslog-ng-redis

Редактируем конфигурации 
# nano /etc/syslog-ng/syslog-ng.conf
Добавляем в конфиг перед строчкой
@include "/etc/syslog-ng/conf.d/*.conf" следующие директивы:
################### Настройки ELIS ##########################
source net { udp(ip(0.0.0.0) port(514)); };
destination d_elis {
    redis(
        host(127.0.0.1)
        port(6379)
        command("rpush" "elislogs" "${R_YEAR}-${R_MONTH}-${R_DAY} ${R_HOUR}:${R_MIN}:${R_SEC}|${HOST}|${PRIORITY}|${MSG}")
    );
};
filter f_elis_10 {
    netmask(10.0.0.0/8);
};
filter f_elis_172 {
    netmask(172.16.0.0/12);
};
log { source(net); filter(f_elis_10); destination(d_elis); };
log { source(net); filter(f_elis_172); destination(d_elis); };
##############################################################

Запускаем syslog-ng и добавляем его в автозагрузку
# systemctl start syslog-ng.service
# systemctl enable syslog-ng.service

Все. Сервис syslog-ng работает на 514 порту и все пришедшие данные складываем в очередь ‘elislogs’ базы REDIS

Установка и использование REDIS (REmote DIctinary Service) в Cent OS7

Установка и использование REDIS (REmote DIctinary Service)  в Cent OS7

Установить EPEL репозитарий
# yum install epel-release
Установка базы  REDIS
# yum install redis
Запускаем сервис REDIS и включаем его в автозагрузку
# systemctl start redis.service
# systemctl enable redis

По умолчанию сервис REDIS запускается на порту 6379 и слушает только localhost.
У сервиса есть режим командной строки. Заходим в него для проверки и отправляем проверочную команду PING, на которую последует ответ PONG
# redis-cli
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>
Пример установки пары ключ – значение
127.0.0.1:6379> SET a 12345
OK
Получение значения по ключу:
127.0.0.1:6379> GET a
"12345"
Выход из командной строки - CTRL+D

Конфигурация сервера в файле /etc/redis.conf
По умолчанию сервер прослушивает только localhost. Это отражено в директиве:
bind 127.0.0.1

Логи в директории /var/log/redis/

Передавать команды в REDIS из внешних скриптов можно так:
# redis-cli set test:1:string "my binary safe string"
OK
# redis-cli get test:1:string
"my binary safe string"

Скрипт PHP для передачи параметров в базу:
<?php 
# https://github.com/nrk/predis
date_default_timezone_set('Etc/GMT-3');
require  "vendor/autoload.php"; 
$client = new Predis\Client([
    'scheme' => 'tcp',
    'host'   => '127.0.0.1',
    'port'   => 6379,
]);
$client->set('foo', 'bar');
$value = $client->get('foo');
echo $value."\n";
?>

Скрипт Python для работы с базой:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import redis
r = redis.StrictRedis(host='localhost', port=6379)
# Извлекаем одну строчку из очереди пока есть что извлекать
while(r.llen('logs')!=0):
   # Извлекаем одну строчку
   log_str = r.lpop('logs')

Удалить все записи из REDIS можно командой:
> FLUSHALL
Удалить из текущей базы все элементы:
>FLUSHDB
Узнать содержимое баз данных REDIS:
> info
Вот здесь (в самом конце вывода) информация о количестве ключах баз данных:
db0:keys=8442,expires=0,avg_ttl=0
db1:keys=8441,expires=0,avg_ttl=0
Показ всех элементов в очереди:

>LRANGE logs 0 999

суббота, 8 февраля 2020 г.

Установка и использование clickhouse-bulk


Установка и использование clickhouse-bulk

Сlickhouse-bulk - это модуль для буферизирования запросов в ClikHouse, предназначенный для снижения нагрузки на основную базу ClickHouse
.
Установка модуля выполняется так:
# yum install go
# go env (нужно запустить один раз после установки)
# go version
Версия GO должна быть не ниже 1.13
Далее:
# mkdir /usr/bin/script_elis/clickhouse-bulk
# cd /usr/bin/script_elis/clickhouse-bulk
# git clone https://github.com/nikepan/clickhouse-bulk
# cd clickhouse-bulk
# go build
Готовим файл конфигурации службы clickhouse-bulk
# cp config.sample.json config.json
# nano /usr/bin/script_elis/clickhouse-bulk/clickhouse-bulk/config.json
{
  "listen": ":8124",
  "flush_count": 10000,
  "flush_interval": 1000,
  "dump_check_interval": 300,
  "debug": false,
  "dump_dir": "dumps",
  "clickhouse": {
    "down_timeout": 60,
    "connect_timeout": 10,
    "servers": [
      "http://<IPсервераClickHouse>:8123"
    ]
  }
}
Запуск Сlickhouse-bulk
# nohup /usr/bin/script_elis/clickhouse-bulk/clickhouse-bulk/clickhouse-bulk -config /usr/bin/script_elis/clickhouse-bulk/clickhouse-bulk/config.json
Проверка статуса работы службы:
# curl -s http://127.0.0.1:8124/metrics | grep "^ch_"

Для запуска службы автоматически после загрузки системы, используем файл  rc.local
# chmod +x /etc/rc.d/rc.local
# nano /etc/rc.local
Вписываем туда:
nohup /usr/bin/script_elis/elispoll_cikl.sh >/dev/null &

Отправлять данный теперь можно не в базу ClikHouse напрямую, а в модуль Сlickhouse-bulk на порт 8124, который сам уже накопит и перенаправит данные в основную базу


воскресенье, 2 февраля 2020 г.

Установка ClickHouse на CentOS7

Установка ClickHouse на CentOS7

Проверка возможности использования ClickHouse в системе:
# grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
Команда должна выдать «SSE 4.2 supported»

Подключение официального репозитария ClickHouse от Яндекс
# yum install yum-utils
# rpm --import https://repo.yandex.ru/clickhouse/CLICKHOUSE-KEY.GPG
# yum-config-manager --add-repo https://repo.yandex.ru/clickhouse/rpm/stable/x86_64

Установка серверной и клиентской части ClickHouse:
# yum install clickhouse-server clickhouse-client
Запуск сервера и добавление его в автозагрузку:
# systemctl start clickhouse-server
# systemctl enable clickhouse-server

После запуска сервера, соединяемся с ним так:
# clickhouse-client
или
# clickhouse-client -h IP-адрес
По умолчанию клиент clickhouse-client соединяется с localhost:9000, от имени пользователя default без пароля. Также клиент может быть использован для соединения с удалённым сервером с помощью аргумента --host.
Проверка работы сервера командой SELECT:
:) SELECT 1

SELECT 1

┌─1─┐
│ 1 │
└───┘

1 rows in set. Elapsed: 0.004 sec.

Выход из командной строки - CTRL+D

Конфигурационный файл сервера /etc/clickhouse-server/config.xml
Директивы 
<listen_host>::1</listen_host>
<listen_host>127.0.0.1</listen_host>
Определяют, на каком IP будет работать сервер.

Логи в директории /var/log/clickhouse-server/

Кроме порта 9000, сервер слушает HTTP запросы на порт 8123.
Запрос GET без параметров вернет ОК
# curl 'http://localhost:8123/'
Ok.
Передавать команды в ClickHouse из внешних скриптов можно так:
echo 'SELECT 1' | curl 'http://localhost:8123/?' --data-binary @-

Для просмотра всех таблиц на сервере Clickhouse с их размера в Гб, используйте этот запрос:
SELECT table, round(sum(bytes) / 1024/1024/1024, 2) as size_gb \
FROM system.parts \
WHERE active \
GROUP BY table \
ORDER BY size_gb DESC

Файлы базы данных ClickHouse размещены в каталоге
/var/lib/clickhouse/data
Просмотр размера папок на диске в базе ClickHouse
# du -shc /var/lib/clickhouse/data/*

Создание базы данных
:) CREATE DATABASE IF NOT EXISTS ИмяБазы

Пример создания таблицы elismetrics в базе elisdb:
:) CREATE TABLE IF NOT EXISTS elisdb.elismetrics \
(\
    ne String,\
    ts UInt64,\
    d Date MATERIALIZED toDate(ts),\
    dt DateTime MATERIALIZED toDateTime(ts),\
    metric Array(String),\
    value Array(Float64)\
) ENGINE = MergeTree(d,ne,8192)

Пример создания таблицы elismetrics в базе elisdb с партициями по месяцам:
CREATE TABLE IF NOT EXISTS elisdb.elismetrics \
(\
    ne String,\
    ts UInt64,\
    d Date MATERIALIZED toDate(ts),\
    dt DateTime MATERIALIZED toDateTime(ts),\
    metric Array(String),\
    value Array(Float64)\
) ENGINE = MergeTree()\
PARTITION BY toYYYYMM(d) ORDER BY (d,ne) SETTINGS index_granularity = 8192

Пример удаления таблицы:
DROP TABLE База.Таблица

Выборка из таблицы:
SELECT * FROM База.Таблица

Список активных партиций просмотреть можно так:
SELECT partition, name, table FROM system.parts WHERE active

Удаление партиции:
ALTER TABLE ИмяТаблицы DROP PARTITION ИмяПартиции
Например: ALTER TABLE elisdb.elismetrics DROP PARTITION 20200201