Translate

вівторок, 25 грудня 2018 р.

Graphite. Stack Based On ClickHouse

Graphite - це моніторингова система, що працює за push-моделлю, тобто отримує дані від вузлів, а не опитує їх. Вона чудово підходить для збирання та аналізу метрик і, завдяки вбудованому механізму ущільнення даних (storage aggregation/rollup/retention/downsampling), ці дані можуть зберігатись на протязі дійсно пристойного часу (декілька років).

Graphite був написаний Крісом Дейвісом (Chris Davis), співробітником компанії Orbitz в 2006 році. Мова програмування оригінального проекту - Python, але наразі майже всі компоненти Graphite можна замінити на сторонні, написані на мові Go. Більш того, навіть бібліотеку Whisper для роботи з базою Graphite можна замінити на альтернативні рішення зі збереженням даних в базі Cassandra, ClickHouse і т.п. Якраз про останній і піде мова цього разу.

Детальніше про оригінальний стек Graphite можна почитати в моїй попередній статті. До його недоліків можна віднести досить слабку продуктивність, неефективну роботу з дисковим простором, відсутність можливості масштабування бази даних і ін. Але це зовсім не значить, що він не підійде у випадках не надто високих навантажень.

Спершу пройдемось по кожному із компонентів та опишемо їх призначення.

  • Carbon-clickhouse - демон, що працює у якості заміни оригінального Carbon та може писати отримані метрики від третіх систем в базу даних ClickHouse.
  • ClickHouse - OLAP база даних від компанії Yandex. Пізніше розповім про неї детальніше.
  • Graphite-clickhouse - проміжне програмне забезпечення для роботи між API сервісом та базою ClickHouse.
  • Carbonapi - API-сервер Graphite, написаний на мові Go. Теоретично замість нього може бути використано Graphite-web (оригінальна імплементація API та веб-панель) чи Graphite-api (лише API на Flask фреймворку)
  • Grafana - веб-панель на Go/NodeJS для побудови та відображення метрик. Вміє опитувати Graphite "із коробки", підтримує всі його API-функції. Для Grafana-и увесь описаний вгорі стек буде виглядати як звичайна інсталяція Graphite-у.

елементи наведені пунктиром - опціональні

У свою чергу Carbon-clickhouse та Graphite-clickhouse - по деяких опосередкованих даних розробки компанії Mail.ru, а Carbonapi - Booking.com.


1. CLICKHOUSE


1.1. ClickHouse intro


ClickHouse - база даних Yandex, програмне рішення перевірене в бою, адже компанія використовує її для свого сервісу Yandex.Metrika. Код ClickHouse був відкритий в 2016 році, до цього часу база існувала як закритий продукт всередині компанії.

ClickHouse - це стовпцева (колонкова) аналітична реляційна база. Це значить, що тут дані інакше зберігаються на диску ніж в більш традиційних "строкових" рішеннях на кшталт MySQL чи PostgreSQL. Кожне значення колонки (те що по-вертикалі) таблиці фізично буде зберігатись поряд, тобто послідовно записано в файл на диску. Інакше кажучи, значення з різних стовпців зберігаються окремо, а дані одного стовпця - разом. Ця особливість чудово підійде на запитах типу:

> SELECT time, region, smartphone FROM analitic_db WHERE region = 'Kyiv';

Усі інші стовпці таблиці, окрім наведених у прикладі, навіть не будуть прочитані з диску, що в свою чергу зменшить к-ть io-операцій і, як наслідок, позитивним чином вплине на швидкість роботи запиту.


Також в одному стовпці зберігаються зазвичай дані одного типу (наприклад, чисельні UInt8), що в свою чергу забезпечує кращий коефіцієнт їх стиснення і, як наслідок, економить дисковий простір та зменшує кількість операцій введення-виведення.

А як же аналогічний запит буде виконуватись в реляційних (в т.ч. більш універсальних) базах?


Тобто спочатку база прочитає всі дані у всіх стовпчиках, де region = 'Kyiv', відокремить з них лише ті, які потрібні (time, region та smartphone) і видасть результат. Звісно це займе більше часу.

ClickHouse має SQL-подібний синтаксис, хоч і не підтримує всі його можливості. Наприклад ця база даних не має транзакцій, відсутні точкові UPDATE/DELETE (пакетний UPDATE/DELETE був введений лише в червні 2018 роки) і т.п. Поряд з даними ClickHouse не зберігає метадані, що дозволяє в деякому сенсі прогнозувати розмір даних наперед. Всі ці особливості впливають на високі показники її продуктивності.

Зрозуміло, що ClickHouse не "срібна куля" і підійде далеко не для всіх сценаріїв роботи. Тенденції наразі вказують на те, що для кожної відносно популярної задачі пишуть мало не окрему базу, в чому дійсно є сенс на досить високих навантаженнях. Якщо система підходить під широку множину сценаріїв роботи, то, у разі інтенсивного її використання, система буде справлятися з усіма сценаріями роботи погано, або ж справлятися добре тільки з одним із них.

Не буду переказувати офіційну документацію ClickHouse, адже з нею можна ознайомитись за посиланням https://clickhouse.yandex/docs/ru/.

У чому ж плюси використання ClickHouse як бази для Graphite? Вони наступні:


1.2. ClickHouse Installation


Для установки бази даних існують офіційні репозиторії Yandex (які, між іншим, можуть не коректно працювати в Україні), ними і скористаємось:

# echo 'deb http://repo.yandex.ru/clickhouse/deb/stable/ main/' > /etc/apt/sources.list.d/clickhouse.list
# apt-key adv --keyserver keyserver.ubuntu.com --recv E0C56BD4
# apt update
# apt install clickhouse-client clickhouse-server -y

Важливе зауваження: бінарний пакет серверу працюватиме лише на Intel процесорах із підтримкою SSE 4.2, адже зібраний із цим набором команд. На AMD архітектурі ClickHouse не запускався взагалі, але мабуть його можна перезібрати власноруч.

# grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported"
SSE 4.2 supported

Налаштуємо правила агрегації для майбутніх даних:

# mkdir -p /etc/clickhouse-server/conf.d
# vim /etc/clickhouse-server/conf.d/graphite_rollup.xml

<yandex>
<graphite_rollup>
    <!-- retentions = 30s:6h,1m:7d,5m:90d -->
    <!-- carbon -->
    <pattern>
        <regexp>^carbon\.</regexp>
        <function>avg</function>
        <retention>
                <age>0</age>
                <precision>30</precision>
        </retention>
        <retention>
                <age>21600</age>
                <precision>60</precision>
        </retention>
        <retention>
                <age>604800</age>
                <precision>300</precision>
        </retention>
    </pattern>
    <!-- for all below retentions = 30s:14d,5m:90d,10m:180d,30m:2y -->
    <!-- min -->
    <pattern>
        <regexp>\.min$</regexp>
        <function>min</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </pattern>
    <!-- max -->
    <pattern>
        <regexp>\.max$</regexp>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </pattern>
    <!-- sum -->
    <pattern>
        <regexp>\.count$</regexp>
        <function>sum</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </pattern>
    <!-- default_average -->
    <default>
        <function>avg</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </default>
</graphite_rollup>
</yandex>

age - це мінімальний час з котрого активується наступна точність (precision). Досить специфічна логіка як на мене. Цей yaml-опис відповідає наступним конфігураційним файлам оригінального Graphite:

$ cat /etc/carbon/storage-schemas.conf

[carbon]
pattern = ^carbon\.
retentions = 30s:6h,1m:7d,5m:90d

[default_1min_for_1day]
pattern = .*
retentions = 30s:14d,5m:90d,10m:180d,30m:2y

$ cat /etc/carbon/storage-aggregation.conf

[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min

[max]
pattern = \.max$
xFilesFactor = 0.1
aggregationMethod = max

[sum]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum

[default_average]
pattern = .*
xFilesFactor = 0.5
aggregationMethod = average

Останній взято з /usr/share/doc/graphite-carbon/examples/storage-aggregation.conf.example, детальніше про це я писав у попередній статті. Перетворити схему оригінального Graphite в ClickHouse можна використавши програму за наступним посиланням https://github.com/bzed/carbon-schema-to-clickhouse

Виходячи з назви метрики, котра буде надсилатись, Graphite буде використовувати відповідне правило агрегації.

$ echo "test.count 14 `date +%s`" | nc -q0 127.0.0.1 2003

Ця команда відправить метрику, котра буде агрегована по правилу sum, адже вона містить значення count в кінці. Але дані надсилати поки зарано, адже ще не налаштовано сarbon-clickhouse.

Додаємо в автозавантаження та запускаємо/перезапускаємо clickhouse-server:

# systemctl daemon-reload
# systemctl enable clickhouse-server
# systemctl restart clickhouse-server

Після чого створюємо таблиці для Graphite даних:

# clickhouse-client

:) CREATE DATABASE graphite;

:) CREATE TABLE graphite.graphite ( Path String, Value Float64, Time UInt32, Date Date, Timestamp UInt32 ) ENGINE = GraphiteMergeTree(Date, (Path, Time), 8192, 'graphite_rollup');

:) CREATE TABLE graphite.graphite_tree ( Date Date, Level UInt32, Path String, Deleted UInt8, Version UInt32 ) ENGINE = ReplacingMergeTree(Date, (Level, Path), 8192, Version);

Значення graphite_rollup в ENGINE має відповідати значенню в xml-тегу в graphite_rollup.xml.


2. INSTALLATION AND CONFIGURATION OF CARBON-CLICKHOUSE


Як я вже згадував, Carbon-clickhouse - демон, що приймає дані та записує їх до бази ClickHouse. Автор проекту збирає deb/rpm пакет програми, тому не бачу причини ним не скористатись:

# wget https://github.com/lomik/carbon-clickhouse/releases/download/v0.9.1/carbon-clickhouse_0.9.1_amd64.deb
# dpkg -i carbon-clickhouse_0.9.1_amd64.deb

Пакети зібрані не дуже якісно, тому після їх установки необхідно створити наступні директорії:

# mkdir -p /var/lib/carbon-clickhouse/data
# mkdir -p /var/log/carbon-clickhouse

Відредагуємо основний конфігураційний файл програми:

# vim /etc/carbon-clickhouse/carbon-clickhouse.conf
...
metric-interval = "30s"
...
path = "/var/lib/carbon-clickhouse/data"
...
[upload.graphite]
type = "points"
table = "graphite.graphite"
zero-timestamp = false
...
[upload.graphite_tree]
type = "tree"
table = "graphite.graphite_tree"
zero-timestamp = false
...
[[logging]]
logger = ""
file = "/var/log/carbon-clickhouse/carbon-clickhouse.log"
level = "error"

Опція zero-timestamp = true теоретично може зекономити багато простору на диску, адже Timestamp стовпчик часто не використовується, проте він обов'язковий для роботи GraphiteMergeTree engine.

Цікаво, що Сarbon-clickhouse має вбудований prometheus-інтерфейс, що дозволяє перенаправляти його дані для довготермінового зберігання без додаткових адаптерів:

...
[prometheus]
listen = ":2006"
enabled = false
drop-future = "0s"
drop-past = "0s"
...

Додамо програму в автозавантаження та запустимо:

# systemctl enable carbon-clickhouse
# systemctl start carbon-clickhouse

Для перевірки роботи Carbon-clickhouse та ClickHouse, відправимо тестову метрику:

# echo "test.count 14 `date +%s`" | nc -q0 127.0.0.1 2003

Та перевіримо її присутність в базі:

# clickhouse-client
ClickHouse client version 18.16.0.
Connecting to localhost:9000.
Connected to ClickHouse server version 18.16.0 revision 54412.

ubuntu :) select * from graphite.graphite where Path='test.count';

SELECT *
FROM graphite.graphite 
WHERE Path = 'test.count'

┌─Path───────┬─Value─┬───────Time─┬───────Date─┬──Timestamp─┐
│ test.count │    14 │ 1544979360 │ 2018-12-16 │ 1544979362 │
└────────────┴───────┴────────────┴────────────┴────────────┘

1 rows in set. Elapsed: 0.019 sec. 

ubuntu :) select * from graphite.graphite_tree where Path='test.count';

SELECT *
FROM graphite.graphite_tree 
WHERE Path = 'test.count'

┌───────Date─┬─Level─┬─Path───────┬─Deleted─┬────Version─┐
│ 2016-11-01 │     2 │ test.count │       0 │ 1544979363 │
└────────────┴───────┴────────────┴─────────┴────────────┘

1 rows in set. Elapsed: 0.007 sec. 

Для всіх програм, що раніше надсилали статистику до Graphite ці заміни "під капотом" будуть абсолютно прозорими.


3. INSTALLATION OF GRAPHITE-CLICKHOUSE


Graphite-clickhouse - це драйвер читання даних з бази ClickHouse. Процедура його установки аналогічна:

# wget https://github.com/lomik/graphite-clickhouse/releases/download/v0.8.1/graphite-clickhouse_0.8.1_amd64.deb
# dpkg -i graphite-clickhouse_0.8.1_amd64.deb

Як і випадку із carbon-clickhouse, для роботи потрібно створити директорію для збереження логів:

# mkdir -p /var/log/graphite-clickhouse

Додамо інформацію щодо агрегації даних (ту ж саму, котру додавали до ClickHouse):

# vim /etc/graphite-clickhouse/graphite_rollup.xml

<graphite_rollup>
    <!-- retentions = 30s:6h,1m:7d,5m:90d -->
    <!-- carbon -->
    <pattern>
        <regexp>^carbon\.</regexp>
        <function>avg</function>
        <retention>
                <age>0</age>
                <precision>30</precision>
        </retention>
        <retention>
                <age>21600</age>
                <precision>60</precision>
        </retention>
        <retention>
                <age>604800</age>
                <precision>300</precision>
        </retention>
    </pattern>
    <!-- for all below retentions = 30s:14d,5m:90d,10m:180d,30m:2y -->
    <!-- min -->
    <pattern>
        <regexp>\.min$</regexp>
        <function>min</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </pattern>
    <!-- max -->
    <pattern>
        <regexp>\.max$</regexp>
        <function>max</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </pattern>
    <!-- sum -->
    <pattern>
        <regexp>\.count$</regexp>
        <function>sum</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </pattern>
    <!-- default_average -->
    <default>
        <function>avg</function>
        <retention>
            <age>0</age>
            <precision>30</precision>
        </retention>
        <retention>
            <age>1209600</age>
            <precision>300</precision>
        </retention>
        <retention>
            <age>7776000</age>
            <precision>600</precision>
        </retention>
        <retention>
            <age>15552000</age>
            <precision>1800</precision>
        </retention>
    </default>
</graphite_rollup>

Відредагуємо конфігураційний файл програми, де вкажемо адресу цього файлу, назву бази даних та таблиці, де зберігатимуться метрики:

# vim /etc/graphite-clickhouse/graphite-clickhouse.conf
...
[clickhouse]
url = "http://localhost:8123"
data-table = "graphite.graphite"
tree-table = "graphite.graphite_tree"
date-tree-table = ""
date-tree-table-version = 0
tagged-table = ""
tagged-autocomplete-days = 7
reverse-tree-table = ""
tag-table = ""
rollup-conf = "/etc/graphite-clickhouse/graphite_rollup.xml"
extra-prefix = ""
data-timeout = "1m0s"
tree-timeout = "1m0s"
connect-timeout = "1s"
...
[[logging]]
logger = ""
file = "/var/log/graphite-clickhouse/graphite-clickhouse.log"
level = "error"
encoding = "mixed"
encoding-time = "iso8601"
encoding-duration = "seconds"

Запустимо програму:

# systemctl enable graphite-clickhouse
# systemctl start graphite-clickhouse

# ps aux | grep graphite-clickhouse
root      1800  0.1  0.5  52612  8304 ?        Ssl  18:59   0:00 /usr/bin/graphite-clickhouse -config /etc/graphite-clickhouse/graphite-clickhouse.conf


4. CARBONAPI


Carbonapi - API-сервер Graphite написаний на Go, майже останній елемент ланцюга програм, якщо не брати до уваги Grafana-у. Вміє працювати не лише з Graphite-clickhouse, а і наприклад з go-carbon.

Використовуючи офіційні репозиторії проекту, проінсталюємо програму:

# curl -s https://packagecloud.io/install/repositories/go-graphite/stable/script.deb.sh | bash
# apt install carbonapi -y

Створимо конфігураційний файл Carbonapi:

# mkdir /etc/carbonapi
# vim /etc/carbonapi/carbonapi.yaml

listen: "[::]:9091"
concurency: 20
cache:
   # Type of caching. Valid: "mem", "memcache", "null"
   type: "mem"
   defaultTimeoutSec: 60
upstreams:
    backends:
        - "http://localhost:9090"
graphite:
    # Host:port where to send internal metrics
    # Empty = disabled
    host: "localhost:2003"
    interval: "10s"
    prefix: "carbon.api"
logger:
    - logger: ""
      file: "stderr"
      level: "error"
      encoding: "console"
      encodingTime: "iso8601"
      encodingDuration: "seconds"
    - logger: ""
      file: "carbonapi.log"
      level: "error"
      encoding: "json"

Розширену версію конфігураційного файлу можна знайти за адресою https://github.com/go-graphite/carbonapi/blob/master/cmd/carbonapi/carbonapi.example.yaml.

Додамо програму в автозавантаження:

# systemctl enable carbonapi
# systemctl start carbonapi


5. INSTALLATION OF GRAFANA


Grafana - веб-панель для відображення графічних даних, котра в тому числі може працювати з Graphite API і підтримує його вбудовані функції. Не буду надто зупинятись на її установці:

# echo 'deb https://packagecloud.io/grafana/stable/debian/ stretch main' > /etc/apt/sources.list.d/grafana.list
# curl https://packagecloud.io/gpg.key | apt-key add -
# apt update
# apt install grafana -y

# systemctl daemon-reload
# systemctl enable grafana-server
# systemctl start grafana-server

Після чого переходимо на її сторінку налаштувань, де вказуємо порт Carbonapi як на малюнку.



6. WHAT ELSE TO READ?


GrapHouse


Компанія Yandex розвиває свій власний стек для Graphite і окрім ClickHouse розробляє також GrapHouse. Останній замінює одразу як Carbon-clickhouse, так і Graphite-clickhouse. У якості API може використовувати Graphite-web чи Graphite-api з додатковим плагіном. Інструкцію його налаштування можна знайти за посиланням https://github.com/yandex/graphouse/blob/master/doc/install.md, якщо буде потреба поділитись досвідом його налаштування - запрошую в коментарі. По деяким опосередкованим даним він дещо повільніший за стек на Go, описаний вище.

https://www.altinity.com/blog/2018/5/16/clickhouse-graphouse-introduction
https://github.com/yandex/graphouse/blob/master/doc/install.md
https://www.percona.com/live/17/sites/default/files/slides/clickhouse-as-timeseries-database.pdf

https://github.com/yandex/graphouse/blob/master/doc/install.md#graphite-api
https://graphite-api.readthedocs.io/en/latest/deployment.html#gunicorn-nginx
https://graphite-api.readthedocs.io/en/latest/installation.html#global-installation
https://markinbristol.wordpress.com/2015/09/20/setting-up-graphite-api-grafana-on-a-raspberry-pi/


StatsD Servers


Писати напряму в Carbon може бути не найкращою ідеєю на дуже великих навантаженнях, наприклад, коли програми надсилають тисячі повідомлень в секунду чи потрібно додатково агрегувати дані (вираховувати персентилі, відхилення і т.п.). У такому разі може допомогти StastD, що працюватиме у якості Proxy попереду Carbon. Оригінальна імплементація від Etsy,  написана на JavaScript, не вирізняється високою швидкістю та і проект, здається, вже мертвий. Про неї я писав у попередній статті про Graphite. Щодо актуальних проектів StatsD серверів можна прочитати за посиланням https://medium.com/@_ipeacocks/statsd-which-implementation-is-still-alive-9f4e63001432

Важливо не забути відредагувати правила агрегації ClickHouse перед використанням StatsD в prod-середовищі. Їх вигляд залежить від того, який саме StatsD сервер буде використано, адже вони не дуже стандартизовані. Наприклад, у разі використання Telegraf, rollup для персентилів має бути налаштований так:

<!-- percentile -->
<pattern>
    <regexp>\.(\d+)?_percentile$</regexp>
    <function>max</function>
    <retention>
        <age>0</age>
        <precision>30</precision>
    </retention>
    <retention>
        <age>1209600</age>
        <precision>300</precision>
    </retention>
    <retention>
        <age>7776000</age>
        <precision>600</precision>
    </retention>
    <retention>
        <age>15552000</age>
        <precision>1800</precision>
    </retention>
</pattern>

А для Gostatsd від Atlassian стандартна схема більше ніж підходить https://blog.ipeacocks.info/2016/04/graphite-configuration-sending-metrics.html

Ну і т.п. Загалом не завадить розуміти, що значить кожен тип даних, що надсилає StatsD до Carbon:

https://github.com/etsy/statsd/blob/master/docs/metric_types.md


Moira


Grafana має вбудований інструментарій сповіщення у разі спрацювання тригерів. Вона використовує базу даних Graphite для всіх необхідних виборок, що може бути не дуже ефективно в разі складних запитів. Moira, opensource рішення від компанії Контур, пропонує інакше підійти до рішення цієї проблеми. Задля зменшення навантаження на основну базу Graphite, Moira аналізує копію даних, що зберігатиметься в Redis. Ця репліка створюється одночасною відправкою даних (за допомогою, наприклад, carbon-c-relay) на 2 бекенди: основний Graphite та додатковий Moira/Redis. Сервіс має гарний інтерфейс, активно розробляється, має готові докер контейнери, присутній потужний інструментарій інформування щодо проблем, має хорошу документацію. Тож я не бачу причин не спробувати Moira-у.

https://habr.com/company/skbkontur/blog/276403/
https://github.com/kolobaev/moira-tldr


OLAP Databases


https://habr.com/post/126810/
http://www.olap.ru/basic/alpero2i.asp
https://ruhighload.com/Колоночные+базы+данных


Carbonapi


https://www.usenix.org/conference/srecon17asia/program/presentation/smirnov
https://archive.fosdem.org/2017/schedule/event/graphite_at_scale/


Graphite/ClickHouse


https://github.com/feangulo/graphite-stresser
https://clickhouse.yandex/#independent-benchmarks
https://clickhouse.yandex/benchmark.html
https://hackernoon.com/clickhouse-an-analytics-database-for-the-21st-century-82d3828f79cc
https://rascal.su/blog/2017/09/25/настраиваем-graphite-с-хранилищем-метрик-в-clickhouse/
https://www.altinity.com/blog/2018/5/10/circular-replication-cluster-topology-in-clickhouse
https://www.percona.com/blog/2017/02/13/clickhouse-new-opensource-columnar-database/
https://www.slideshare.net/Altinity/migration-to-clickhouse-practical-guide-by-alexander-zaitsev
https://github.com/bzed/carbon-schema-to-clickhouse
https://habr.com/company/avito/blog/335410/
https://habr.com/company/avito/blog/343928/
https://graphite.readthedocs.io/en/latest/tags.html#carbon
https://github.com/lomik/graphite-clickhouse-tldr
https://github.com/kolobaev/graphite-clickhouse-tldr
https://github.com/lomik/graphite-clickhouse/wiki/RU

Немає коментарів:

Дописати коментар