Как стать автором
Обновить

Комментарии 2

ЗакрепленныеЗакреплённые комментарии

Всем привет!

Прошло время, я обновился до InfluxDB v2

Стал использовать станцию
Instance type
m5a.2xlarge -- 32 ГБайт ОЗУ
https://instances.vantage.sh/aws/ec2/m5a.2xlarge

Запускаю сервис вот так:

docker run --shm-size 2g \
  --user=influxdb --restart=on-failure --restart unless-stopped \
  -d -p 8086:8086 \
  --log-driver=syslog \
  --name influx \
  --env-file env.list \
  -v /home/influxdb:/var/lib/influxdb2 \
influxdb:2.7.6-alpine

Где файл env.list это файл, в котором задано использование только 25 ГБайт ОЗУ из 32-х и другие более строгие лимиты по памяти:

GOMEMLIMIT=25GiB
GOGC=10


INFLUXD_REPORTING_DISABLED=true
INFLUXD_STORAGE_CACHE_SNAPSHOT_WRITE_COLD_DURATION=10m
INFLUXD_STORAGE_COMPACT_FULL_WRITE_COLD_DURATION=48h
INFLUXD_STORAGE_COMPACT_THROUGHPUT_BURST=80388608
INFLUXD_STORAGE_MAX_CONCURRENT_COMPACTIONS=1
INFLUXD_STORAGE_SERIES_FILE_MAX_CONCURRENT_SNAPSHOT_COMPACTIONS=1

INFLUXD_QUERY_MEMORY_BYTES=304857600
INFLUXD_QUERY_INITIAL_MEMORY_BYTES=10485760
INFLUXD_QUERY_CONCURRENCY=5
INFLUXD_STORAGE_CACHE_MAX_MEMORY_SIZE=1073741824
INFLUXD_STORAGE_CACHE_SNAPSHOT_MEMORY_SIZE=26214400
INFLUXD_STORAGE_WAL_MAX_WRITE_DELAY=10m
INFLUXD_STORAGE_WRITE_TIMEOUT=10s
INFLUXD_STORAGE_WAL_MAX_CONCURRENT_WRITES=6
INFLUXD_STORAGE_SERIES_ID_SET_CACHE_SIZE=0

INFLUXD_QUERY_QUEUE_SIZE=100
INFLUXD_FLUX_LOG_ENABLED=false

Кроме того в файле /etc/security/limits.conf были увеличены лимиты на файлы

root    soft    nofile  504800
root    hard    nofile  504800
*       soft    nofile  504800
*       hard    nofile  504800

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

echo session required pam_limits.so >> cat /etc/pam.d/common-session-noninteractive
echo session required pam_limits.so >> cat /etc/pam.d/common-session

И увеличены лимиты для системы:

sysctl -w vm.max_map_count=262144
sysctl -p

sysctl -w fs.file-max=800000
sysctl -p

Такая сборка позволяет работать как с InfluxDB v2 так и в режими совместимости с InfluxDB v1. Чтобы создать к backet-ам возможность подключения как к v1 базам данных, нужно выполнить в консоли команды

export INFLUX_HOST=http://influx:8086
export INFLUX_TOKEN=uA3kTOken==
export INFLUX_ORG_ID=d710abc76347d169

brew install influxdb-cli

influx v1 dbrp create \
--bucket-id 5d69c811b871b876 --db ClientMetrics --rp auto

influx v1 auth create \
--read-bucket 5d69c811b871b876 --write-bucket 5d69c811b871b876 \
--username ClientMetrics

Тут INFLUX_HOST, INFLUX_TOKEN, INFLUX_ORG_ID - параметры подключения к серверу

5d69c811b871b876 -- это bucket, а ClientMetrics -- то как будет называться база данных

Таким образом, для ускорения используются:

  • больше памяти для сервера

  • настройки GO для работы с памятью более аккуратно

  • настройки influxdb, чтобы не выделять очень много памяти на запросы

  • настройки сервера, чтобы influxdb мог работать с тысячами файлов без ошибок

И еще есть nginx, который кеширует ответы для метода query и включает поддержку CORS для influxdb, так как в самом InfluxDB v2 нет поддержки CORS вообще.

nginx.conf:

Скрытый текст
worker_processes  4;

error_log  /var/log/nginx/error.log warn;

events {
        worker_connections  1024;
}

http {
    proxy_cache_path /data/nginx/cache keys_zone=mycache:20m max_size=1g inactive=60m;
    limit_conn_zone $server_name zone=perserver:10m;

    upstream backend {
        server host.docker.internal:8086;
        keepalive 5000;
    }
    upstream victoria_metrics_1 {
        server victoria_metrics_1:8428;
        keepalive 5000;
    }

    server {
        listen 8096;
        client_max_body_size 20m;
        location /query {
            proxy_cache mycache;
            proxy_cache_key "$host$request_uri";
            proxy_cache_min_uses 1;
            proxy_cache_methods GET;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404      1m;

            proxy_cache_background_update on;
            proxy_cache_revalidate on;
            proxy_cache_lock on;
            add_header X-Cache-Status $upstream_cache_status;
            proxy_ignore_headers Cache-Control;
            proxy_hide_header 'Access-Control-Allow-Origin';
            if ($http_origin = ''){
                set $http_origin "*";
            }

            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' $http_origin;
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'Pragma,Accept,Authorization,Content-Type,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                add_header 'Access-Control-Allow-Credentials' 'true';
                return 204;
            }
            if ($request_method = 'GET') {
                add_header 'Access-Control-Allow-Origin' $http_origin;
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Headers' 'Pragma,Accept,Authorization,Content-Type,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
                proxy_pass http://backend;
            }
            if ($request_method = 'POST') {
                add_header 'Access-Control-Allow-Origin' $http_origin;
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'Pragma,Accept,Authorization,Content-Type,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
                proxy_pass http://backend;
            }
        }

        location = /write1 {
            internal;
            proxy_pass http://victoria_metrics_1$request_uri;
        }

        location /write {
            #mirror /write1;
            proxy_pass http://backend;
        }

        location / {
            proxy_pass http://backend;
        }
    }
}

Всем привет!

Прошло время, я обновился до InfluxDB v2

Стал использовать станцию
Instance type
m5a.2xlarge -- 32 ГБайт ОЗУ
https://instances.vantage.sh/aws/ec2/m5a.2xlarge

Запускаю сервис вот так:

docker run --shm-size 2g \
  --user=influxdb --restart=on-failure --restart unless-stopped \
  -d -p 8086:8086 \
  --log-driver=syslog \
  --name influx \
  --env-file env.list \
  -v /home/influxdb:/var/lib/influxdb2 \
influxdb:2.7.6-alpine

Где файл env.list это файл, в котором задано использование только 25 ГБайт ОЗУ из 32-х и другие более строгие лимиты по памяти:

GOMEMLIMIT=25GiB
GOGC=10


INFLUXD_REPORTING_DISABLED=true
INFLUXD_STORAGE_CACHE_SNAPSHOT_WRITE_COLD_DURATION=10m
INFLUXD_STORAGE_COMPACT_FULL_WRITE_COLD_DURATION=48h
INFLUXD_STORAGE_COMPACT_THROUGHPUT_BURST=80388608
INFLUXD_STORAGE_MAX_CONCURRENT_COMPACTIONS=1
INFLUXD_STORAGE_SERIES_FILE_MAX_CONCURRENT_SNAPSHOT_COMPACTIONS=1

INFLUXD_QUERY_MEMORY_BYTES=304857600
INFLUXD_QUERY_INITIAL_MEMORY_BYTES=10485760
INFLUXD_QUERY_CONCURRENCY=5
INFLUXD_STORAGE_CACHE_MAX_MEMORY_SIZE=1073741824
INFLUXD_STORAGE_CACHE_SNAPSHOT_MEMORY_SIZE=26214400
INFLUXD_STORAGE_WAL_MAX_WRITE_DELAY=10m
INFLUXD_STORAGE_WRITE_TIMEOUT=10s
INFLUXD_STORAGE_WAL_MAX_CONCURRENT_WRITES=6
INFLUXD_STORAGE_SERIES_ID_SET_CACHE_SIZE=0

INFLUXD_QUERY_QUEUE_SIZE=100
INFLUXD_FLUX_LOG_ENABLED=false

Кроме того в файле /etc/security/limits.conf были увеличены лимиты на файлы

root    soft    nofile  504800
root    hard    nofile  504800
*       soft    nofile  504800
*       hard    nofile  504800

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

echo session required pam_limits.so >> cat /etc/pam.d/common-session-noninteractive
echo session required pam_limits.so >> cat /etc/pam.d/common-session

И увеличены лимиты для системы:

sysctl -w vm.max_map_count=262144
sysctl -p

sysctl -w fs.file-max=800000
sysctl -p

Такая сборка позволяет работать как с InfluxDB v2 так и в режими совместимости с InfluxDB v1. Чтобы создать к backet-ам возможность подключения как к v1 базам данных, нужно выполнить в консоли команды

export INFLUX_HOST=http://influx:8086
export INFLUX_TOKEN=uA3kTOken==
export INFLUX_ORG_ID=d710abc76347d169

brew install influxdb-cli

influx v1 dbrp create \
--bucket-id 5d69c811b871b876 --db ClientMetrics --rp auto

influx v1 auth create \
--read-bucket 5d69c811b871b876 --write-bucket 5d69c811b871b876 \
--username ClientMetrics

Тут INFLUX_HOST, INFLUX_TOKEN, INFLUX_ORG_ID - параметры подключения к серверу

5d69c811b871b876 -- это bucket, а ClientMetrics -- то как будет называться база данных

Таким образом, для ускорения используются:

  • больше памяти для сервера

  • настройки GO для работы с памятью более аккуратно

  • настройки influxdb, чтобы не выделять очень много памяти на запросы

  • настройки сервера, чтобы influxdb мог работать с тысячами файлов без ошибок

И еще есть nginx, который кеширует ответы для метода query и включает поддержку CORS для influxdb, так как в самом InfluxDB v2 нет поддержки CORS вообще.

nginx.conf:

Скрытый текст
worker_processes  4;

error_log  /var/log/nginx/error.log warn;

events {
        worker_connections  1024;
}

http {
    proxy_cache_path /data/nginx/cache keys_zone=mycache:20m max_size=1g inactive=60m;
    limit_conn_zone $server_name zone=perserver:10m;

    upstream backend {
        server host.docker.internal:8086;
        keepalive 5000;
    }
    upstream victoria_metrics_1 {
        server victoria_metrics_1:8428;
        keepalive 5000;
    }

    server {
        listen 8096;
        client_max_body_size 20m;
        location /query {
            proxy_cache mycache;
            proxy_cache_key "$host$request_uri";
            proxy_cache_min_uses 1;
            proxy_cache_methods GET;
            proxy_cache_valid 200 302 10m;
            proxy_cache_valid 404      1m;

            proxy_cache_background_update on;
            proxy_cache_revalidate on;
            proxy_cache_lock on;
            add_header X-Cache-Status $upstream_cache_status;
            proxy_ignore_headers Cache-Control;
            proxy_hide_header 'Access-Control-Allow-Origin';
            if ($http_origin = ''){
                set $http_origin "*";
            }

            if ($request_method = 'OPTIONS') {
                add_header 'Access-Control-Allow-Origin' $http_origin;
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'Pragma,Accept,Authorization,Content-Type,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
                add_header 'Access-Control-Max-Age' 1728000;
                add_header 'Content-Type' 'text/plain charset=UTF-8';
                add_header 'Content-Length' 0;
                add_header 'Access-Control-Allow-Credentials' 'true';
                return 204;
            }
            if ($request_method = 'GET') {
                add_header 'Access-Control-Allow-Origin' $http_origin;
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Headers' 'Pragma,Accept,Authorization,Content-Type,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
                proxy_pass http://backend;
            }
            if ($request_method = 'POST') {
                add_header 'Access-Control-Allow-Origin' $http_origin;
                add_header 'Access-Control-Allow-Credentials' 'true';
                add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
                add_header 'Access-Control-Allow-Headers' 'Pragma,Accept,Authorization,Content-Type,Origin,DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range';
                proxy_pass http://backend;
            }
        }

        location = /write1 {
            internal;
            proxy_pass http://victoria_metrics_1$request_uri;
        }

        location /write {
            #mirror /write1;
            proxy_pass http://backend;
        }

        location / {
            proxy_pass http://backend;
        }
    }
}

Сколько памяти нужно серверу сказать сложно. У меня базы данных, размером около 15 ГБайт:

15973724349     ./engine
15298464381     ./engine/data
54345865        ./engine/wal
4096            ./engine/replicationq

При этом сервису выделено 25 ГБайт HEAP, а на самом сервере 32 ГБайт ОЗУ

Базы данных достаточно нагруженные, потребление ресурсов такое:

  • Res: 9 ГБайт (всего выделено 25 ГБайт Heap, а памяти на сервере 30 ГБайт физически)

  • Virt: 40 ГБайт

  • Shr: 633 МБайт (для контейнера задан --shm-size 2g)

Под нагрузкой все 8 ядер процессора используются. Технически такую базу данных можно перести на сервер, где будет только 16 ГБайт ОЗУ и

GOMEMLIMIT=11GiB

А также можно сократить и настройку shm до 1g -- тоже хватит

Но ядра CPU нужны

Зарегистрируйтесь на Хабре, чтобы оставить комментарий