Комментарии 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 нужны
Как ускорить запросы к InfluxDB разными способами