Gửi nhật ký Nginx json bằng Vector tới Clickhouse và Elaticsearch

Gửi nhật ký Nginx json bằng Vector tới Clickhouse và Elaticsearch

vector, được thiết kế để thu thập, chuyển đổi và gửi dữ liệu nhật ký, số liệu và sự kiện.

→ Github

Được viết bằng ngôn ngữ Rust, nó được đặc trưng bởi hiệu suất cao và mức tiêu thụ RAM thấp so với các ngôn ngữ tương tự. Ngoài ra, người ta chú ý nhiều đến các chức năng liên quan đến tính chính xác, đặc biệt là khả năng lưu các sự kiện chưa gửi vào bộ đệm trên đĩa và xoay tệp.

Về mặt kiến ​​trúc, Vector là một bộ định tuyến sự kiện nhận tin nhắn từ một hoặc nhiều nguồn, tùy ý áp dụng trên các tin nhắn này phép biến hìnhvà gửi chúng tới một hoặc nhiều cống thoát nước.

Vector là sự thay thế cho filebeat và logstash, nó có thể hoạt động ở cả hai vai trò (nhận và gửi nhật ký), biết thêm chi tiết về chúng website.

Nếu trong Logstash chuỗi được xây dựng dưới dạng đầu vào → bộ lọc → đầu ra thì trong Vector nó là nguồnbiến đổibồn rửa

Ví dụ có thể được tìm thấy trong tài liệu.

Hướng dẫn này là một hướng dẫn sửa đổi từ Vyacheslav Rakhinsky. Các hướng dẫn ban đầu chứa xử lý geoip. Khi kiểm tra geoip từ mạng nội bộ, vector đã báo lỗi.

Aug 05 06:25:31.889 DEBUG transform{name=nginx_parse_rename_fields type=rename_fields}: vector::transforms::rename_fields: Field did not exist field=«geoip.country_name» rate_limit_secs=30

Nếu ai có nhu cầu xử lý geoip thì tham khảo hướng dẫn gốc từ Vyacheslav Rakhinsky.

Chúng tôi sẽ định cấu hình kết hợp Nginx (Nhật ký truy cập) → Vector (Máy khách | Filebeat) → Vector (Máy chủ | Logstash) → riêng biệt trong Clickhouse và riêng biệt trong Elaticsearch. Chúng tôi sẽ cài đặt 4 máy chủ. Mặc dù bạn có thể bỏ qua nó với 3 máy chủ.

Gửi nhật ký Nginx json bằng Vector tới Clickhouse và Elaticsearch

Đề án này là một cái gì đó như thế này.

Vô hiệu hóa Selinux trên tất cả các máy chủ của bạn

sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot

Chúng tôi cài đặt trình giả lập máy chủ HTTP + tiện ích trên tất cả các máy chủ

Là trình mô phỏng máy chủ HTTP, chúng tôi sẽ sử dụng nodejs-stub-server từ Maxim Ignatenko

Nodejs-stub-server không có vòng/phút. Здесь tạo vòng/phút cho nó. vòng/phút sẽ được xây dựng bằng cách sử dụng Fedora Copr

Thêm kho lưu trữ Antonpatsev/nodejs-stub-server

yum -y install yum-plugin-copr epel-release
yes | yum copr enable antonpatsev/nodejs-stub-server

Cài đặt nodejs-stub-server, bộ ghép kênh điểm chuẩn Apache và thiết bị đầu cuối màn hình trên tất cả các máy chủ

yum -y install stub_http_server screen mc httpd-tools screen

Tôi đã sửa thời gian phản hồi stub_http_server trong tệp /var/lib/stub_http_server/stub_http_server.js để có nhiều nhật ký hơn.

var max_sleep = 10;

Hãy khởi chạy stub_http_server.

systemctl start stub_http_server
systemctl enable stub_http_server

Lắp đặt Clickhouse trên máy chủ 3

ClickHouse sử dụng tập lệnh SSE 4.2, do đó, trừ khi có quy định khác, việc hỗ trợ tập lệnh này trong bộ xử lý được sử dụng sẽ trở thành một yêu cầu bổ sung của hệ thống. Đây là lệnh để kiểm tra xem bộ xử lý hiện tại có hỗ trợ SSE 4.2 hay không:

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

Trước tiên, bạn cần kết nối kho lưu trữ chính thức:

sudo yum install -y yum-utils
sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG
sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64

Để cài đặt các gói, bạn cần chạy các lệnh sau:

sudo yum install -y clickhouse-server clickhouse-client

Cho phép clickhouse-server nghe card mạng trong file /etc/clickhouse-server/config.xml

<listen_host>0.0.0.0</listen_host>

Thay đổi cấp độ ghi nhật ký từ theo dõi sang gỡ lỗi

gỡ lỗi

Cài đặt nén tiêu chuẩn:

min_compress_block_size  65536
max_compress_block_size  1048576

Để kích hoạt tính năng nén Zstd, bạn không nên chạm vào cấu hình mà nên sử dụng DDL.

Gửi nhật ký Nginx json bằng Vector tới Clickhouse và Elaticsearch

Tôi không thể tìm thấy cách sử dụng tính năng nén zstd qua DDL trong Google. Vì thế tôi để nó như vậy.

Các đồng nghiệp sử dụng tính năng nén zstd trong Clickhouse xin chia sẻ hướng dẫn nhé.

Để khởi động máy chủ dưới dạng daemon, hãy chạy:

service clickhouse-server start

Bây giờ chúng ta chuyển sang phần setup Clickhouse

Đến Clickhouse

clickhouse-client -h 172.26.10.109 -m

172.26.10.109 — IP của máy chủ nơi Clickhouse được cài đặt.

Hãy tạo một cơ sở dữ liệu vector

CREATE DATABASE vector;

Hãy kiểm tra xem cơ sở dữ liệu có tồn tại không.

show databases;

Tạo bảng vector.logs.

/* Это таблица где хранятся логи как есть */

CREATE TABLE vector.logs
(
    `node_name` String,
    `timestamp` DateTime,
    `server_name` String,
    `user_id` String,
    `request_full` String,
    `request_user_agent` String,
    `request_http_host` String,
    `request_uri` String,
    `request_scheme` String,
    `request_method` String,
    `request_length` UInt64,
    `request_time` Float32,
    `request_referrer` String,
    `response_status` UInt16,
    `response_body_bytes_sent` UInt64,
    `response_content_type` String,
    `remote_addr` IPv4,
    `remote_port` UInt32,
    `remote_user` String,
    `upstream_addr` IPv4,
    `upstream_port` UInt32,
    `upstream_bytes_received` UInt64,
    `upstream_bytes_sent` UInt64,
    `upstream_cache_status` String,
    `upstream_connect_time` Float32,
    `upstream_header_time` Float32,
    `upstream_response_length` UInt64,
    `upstream_response_time` Float32,
    `upstream_status` UInt16,
    `upstream_content_type` String,
    INDEX idx_http_host request_http_host TYPE set(0) GRANULARITY 1
)
ENGINE = MergeTree()
PARTITION BY toYYYYMMDD(timestamp)
ORDER BY timestamp
TTL timestamp + toIntervalMonth(1)
SETTINGS index_granularity = 8192;

Chúng tôi kiểm tra xem các bảng đã được tạo chưa. Hãy khởi động clickhouse-client và đưa ra yêu cầu.

Hãy đi đến cơ sở dữ liệu vector.

use vector;

Ok.

0 rows in set. Elapsed: 0.001 sec.

Chúng ta hãy nhìn vào các bảng.

show tables;

┌─name────────────────┐
│ logs                │
└─────────────────────┘

Cài đặt elasticsearch trên server thứ 4 để gửi cùng dữ liệu lên Elasticsearch để so sánh với Clickhouse

Thêm khóa vòng/phút công khai

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

Hãy tạo 2 repo:

/etc/yum.repos.d/elasticsearch.repo

[elasticsearch]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=0
autorefresh=1
type=rpm-md

/etc/yum.repos.d/kibana.repo

[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

Cài đặt elaticsearch và kibana

yum install -y kibana elasticsearch

Vì nó sẽ ở dạng 1 bản sao nên bạn cần thêm phần sau vào tệp /etc/elasticsearch/elasticsearch.yml:

discovery.type: single-node

Để vectơ đó có thể gửi dữ liệu đến elaticsearch từ một máy chủ khác, hãy thay đổi network.host.

network.host: 0.0.0.0

Để kết nối với kibana, hãy thay đổi tham số server.host trong tệp /etc/kibana/kibana.yml

server.host: "0.0.0.0"

Cũ và bao gồm elaticsearch trong tự động khởi động

systemctl enable elasticsearch
systemctl start elasticsearch

và kibana

systemctl enable kibana
systemctl start kibana

Định cấu hình Elaticsearch cho chế độ nút đơn 1 phân đoạn, 0 bản sao. Rất có thể bạn sẽ có một cụm gồm một số lượng lớn máy chủ và bạn không cần phải làm điều này.

Đối với các chỉ mục trong tương lai, hãy cập nhật mẫu mặc định:

curl -X PUT http://localhost:9200/_template/default -H 'Content-Type: application/json' -d '{"index_patterns": ["*"],"order": -1,"settings": {"number_of_shards": "1","number_of_replicas": "0"}}' 

Cài đặt vector thay thế cho Logstash trên máy chủ 2

yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm mc httpd-tools screen

Hãy thiết lập Vector để thay thế cho Logstash. Chỉnh sửa tệp /etc/vector/vector.toml

# /etc/vector/vector.toml

data_dir = "/var/lib/vector"

[sources.nginx_input_vector]
  # General
  type                          = "vector"
  address                       = "0.0.0.0:9876"
  shutdown_timeout_secs         = 30

[transforms.nginx_parse_json]
  inputs                        = [ "nginx_input_vector" ]
  type                          = "json_parser"

[transforms.nginx_parse_add_defaults]
  inputs                        = [ "nginx_parse_json" ]
  type                          = "lua"
  version                       = "2"

  hooks.process = """
  function (event, emit)

    function split_first(s, delimiter)
      result = {};
      for match in (s..delimiter):gmatch("(.-)"..delimiter) do
          table.insert(result, match);
      end
      return result[1];
    end

    function split_last(s, delimiter)
      result = {};
      for match in (s..delimiter):gmatch("(.-)"..delimiter) do
          table.insert(result, match);
      end
      return result[#result];
    end

    event.log.upstream_addr             = split_first(split_last(event.log.upstream_addr, ', '), ':')
    event.log.upstream_bytes_received   = split_last(event.log.upstream_bytes_received, ', ')
    event.log.upstream_bytes_sent       = split_last(event.log.upstream_bytes_sent, ', ')
    event.log.upstream_connect_time     = split_last(event.log.upstream_connect_time, ', ')
    event.log.upstream_header_time      = split_last(event.log.upstream_header_time, ', ')
    event.log.upstream_response_length  = split_last(event.log.upstream_response_length, ', ')
    event.log.upstream_response_time    = split_last(event.log.upstream_response_time, ', ')
    event.log.upstream_status           = split_last(event.log.upstream_status, ', ')

    if event.log.upstream_addr == "" then
        event.log.upstream_addr = "127.0.0.1"
    end

    if (event.log.upstream_bytes_received == "-" or event.log.upstream_bytes_received == "") then
        event.log.upstream_bytes_received = "0"
    end

    if (event.log.upstream_bytes_sent == "-" or event.log.upstream_bytes_sent == "") then
        event.log.upstream_bytes_sent = "0"
    end

    if event.log.upstream_cache_status == "" then
        event.log.upstream_cache_status = "DISABLED"
    end

    if (event.log.upstream_connect_time == "-" or event.log.upstream_connect_time == "") then
        event.log.upstream_connect_time = "0"
    end

    if (event.log.upstream_header_time == "-" or event.log.upstream_header_time == "") then
        event.log.upstream_header_time = "0"
    end

    if (event.log.upstream_response_length == "-" or event.log.upstream_response_length == "") then
        event.log.upstream_response_length = "0"
    end

    if (event.log.upstream_response_time == "-" or event.log.upstream_response_time == "") then
        event.log.upstream_response_time = "0"
    end

    if (event.log.upstream_status == "-" or event.log.upstream_status == "") then
        event.log.upstream_status = "0"
    end

    emit(event)

  end
  """

[transforms.nginx_parse_remove_fields]
    inputs                              = [ "nginx_parse_add_defaults" ]
    type                                = "remove_fields"
    fields                              = ["data", "file", "host", "source_type"]

[transforms.nginx_parse_coercer]

    type                                = "coercer"
    inputs                              = ["nginx_parse_remove_fields"]

    types.request_length = "int"
    types.request_time = "float"

    types.response_status = "int"
    types.response_body_bytes_sent = "int"

    types.remote_port = "int"

    types.upstream_bytes_received = "int"
    types.upstream_bytes_send = "int"
    types.upstream_connect_time = "float"
    types.upstream_header_time = "float"
    types.upstream_response_length = "int"
    types.upstream_response_time = "float"
    types.upstream_status = "int"

    types.timestamp = "timestamp"

[sinks.nginx_output_clickhouse]
    inputs   = ["nginx_parse_coercer"]
    type     = "clickhouse"

    database = "vector"
    healthcheck = true
    host = "http://172.26.10.109:8123" #  Адрес Clickhouse
    table = "logs"

    encoding.timestamp_format = "unix"

    buffer.type = "disk"
    buffer.max_size = 104900000
    buffer.when_full = "block"

    request.in_flight_limit = 20

[sinks.elasticsearch]
    type = "elasticsearch"
    inputs   = ["nginx_parse_coercer"]
    compression = "none"
    healthcheck = true
    # 172.26.10.116 - сервер где установен elasticsearch
    host = "http://172.26.10.116:9200" 
    index = "vector-%Y-%m-%d"

Bạn có thể điều chỉnh phần Transforms.nginx_parse_add_defaults.

Như Vyacheslav Rakhinsky sử dụng các cấu hình này cho một CDN nhỏ và có thể có một số giá trị trong upstream_*

Ví dụ:

"upstream_addr": "128.66.0.10:443, 128.66.0.11:443, 128.66.0.12:443"
"upstream_bytes_received": "-, -, 123"
"upstream_status": "502, 502, 200"

Nếu đây không phải là trường hợp của bạn thì phần này có thể được đơn giản hóa

Hãy tạo cài đặt dịch vụ cho systemd /etc/systemd/system/vector.service

# /etc/systemd/system/vector.service

[Unit]
Description=Vector
After=network-online.target
Requires=network-online.target

[Service]
User=vector
Group=vector
ExecStart=/usr/bin/vector
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=vector

[Install]
WantedBy=multi-user.target

Sau khi tạo bảng, bạn có thể chạy Vector

systemctl enable vector
systemctl start vector

Nhật ký vector có thể được xem như thế này:

journalctl -f -u vector

Nên có những mục như thế này trong nhật ký

INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.

Trên máy khách (Máy chủ web) - Máy chủ thứ 1

Trên máy chủ có nginx, bạn cần tắt ipv6, vì bảng nhật ký trong clickhouse sử dụng trường upstream_addr IPv4, vì tôi không sử dụng ipv6 trong mạng. Nếu không tắt ipv6 sẽ xuất hiện lỗi:

DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)

Có lẽ độc giả hãy thêm hỗ trợ ipv6.

Tạo tệp /etc/sysctl.d/98-disable-ipv6.conf

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

Áp dụng cài đặt

sysctl --system

Hãy cài đặt nginx.

Đã thêm tệp kho lưu trữ nginx /etc/yum.repos.d/nginx.repo

[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Cài đặt gói nginx

yum install -y nginx

Đầu tiên, chúng ta cần định cấu hình định dạng nhật ký trong Nginx trong tệp /etc/nginx/nginx.conf

user  nginx;
# you must set worker processes based on your CPU cores, nginx does not benefit from setting more than that
worker_processes auto; #some last versions calculate it automatically

# number of file descriptors used for nginx
# the limit for the maximum FDs on the server is usually set by the OS.
# if you don't set FD's then OS settings will be used which is by default 2000
worker_rlimit_nofile 100000;

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

# provides the configuration file context in which the directives that affect connection processing are specified.
events {
    # determines how much clients will be served per worker
    # max clients = worker_connections * worker_processes
    # max clients is also limited by the number of socket connections available on the system (~64k)
    worker_connections 4000;

    # optimized to serve many clients with each thread, essential for linux -- for testing environment
    use epoll;

    # accept as many connections as possible, may flood worker connections if set too low -- for testing environment
    multi_accept on;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

log_format vector escape=json
    '{'
        '"node_name":"nginx-vector",'
        '"timestamp":"$time_iso8601",'
        '"server_name":"$server_name",'
        '"request_full": "$request",'
        '"request_user_agent":"$http_user_agent",'
        '"request_http_host":"$http_host",'
        '"request_uri":"$request_uri",'
        '"request_scheme": "$scheme",'
        '"request_method":"$request_method",'
        '"request_length":"$request_length",'
        '"request_time": "$request_time",'
        '"request_referrer":"$http_referer",'
        '"response_status": "$status",'
        '"response_body_bytes_sent":"$body_bytes_sent",'
        '"response_content_type":"$sent_http_content_type",'
        '"remote_addr": "$remote_addr",'
        '"remote_port": "$remote_port",'
        '"remote_user": "$remote_user",'
        '"upstream_addr": "$upstream_addr",'
        '"upstream_bytes_received": "$upstream_bytes_received",'
        '"upstream_bytes_sent": "$upstream_bytes_sent",'
        '"upstream_cache_status":"$upstream_cache_status",'
        '"upstream_connect_time":"$upstream_connect_time",'
        '"upstream_header_time":"$upstream_header_time",'
        '"upstream_response_length":"$upstream_response_length",'
        '"upstream_response_time":"$upstream_response_time",'
        '"upstream_status": "$upstream_status",'
        '"upstream_content_type":"$upstream_http_content_type"'
    '}';

    access_log  /var/log/nginx/access.log  main;
    access_log  /var/log/nginx/access.json.log vector;      # Новый лог в формате json

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}

Để không làm hỏng cấu hình hiện tại của bạn, Nginx cho phép bạn có một số lệnh access_log

access_log  /var/log/nginx/access.log  main;            # Стандартный лог
access_log  /var/log/nginx/access.json.log vector;      # Новый лог в формате json

Đừng quên thêm quy tắc để logrotate cho nhật ký mới (nếu tệp nhật ký không kết thúc bằng .log)

Xóa default.conf khỏi /etc/nginx/conf.d/

rm -f /etc/nginx/conf.d/default.conf

Thêm máy chủ ảo /etc/nginx/conf.d/vhost1.conf

server {
    listen 80;
    server_name vhost1;
    location / {
        proxy_pass http://172.26.10.106:8080;
    }
}

Thêm máy chủ ảo /etc/nginx/conf.d/vhost2.conf

server {
    listen 80;
    server_name vhost2;
    location / {
        proxy_pass http://172.26.10.108:8080;
    }
}

Thêm máy chủ ảo /etc/nginx/conf.d/vhost3.conf

server {
    listen 80;
    server_name vhost3;
    location / {
        proxy_pass http://172.26.10.109:8080;
    }
}

Thêm máy chủ ảo /etc/nginx/conf.d/vhost4.conf

server {
    listen 80;
    server_name vhost4;
    location / {
        proxy_pass http://172.26.10.116:8080;
    }
}

Thêm máy chủ ảo (172.26.10.106 ip của máy chủ nơi cài đặt nginx) vào tất cả các máy chủ vào tệp /etc/hosts:

172.26.10.106 vhost1
172.26.10.106 vhost2
172.26.10.106 vhost3
172.26.10.106 vhost4

Và nếu mọi thứ đã sẵn sàng thì

nginx -t 
systemctl restart nginx

Bây giờ chúng ta hãy tự cài đặt nó vector

yum install -y https://packages.timber.io/vector/0.9.X/vector-x86_64.rpm

Hãy tạo một tệp cài đặt cho systemd /etc/systemd/system/vector.service

[Unit]
Description=Vector
After=network-online.target
Requires=network-online.target

[Service]
User=vector
Group=vector
ExecStart=/usr/bin/vector
ExecReload=/bin/kill -HUP $MAINPID
Restart=no
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=vector

[Install]
WantedBy=multi-user.target

Và định cấu hình thay thế Filebeat trong cấu hình /etc/vector/vector.toml. Địa chỉ IP 172.26.10.108 là địa chỉ IP của log server (Vector-Server)

data_dir = "/var/lib/vector"

[sources.nginx_file]
  type                          = "file"
  include                       = [ "/var/log/nginx/access.json.log" ]
  start_at_beginning            = false
  fingerprinting.strategy       = "device_and_inode"

[sinks.nginx_output_vector]
  type                          = "vector"
  inputs                        = [ "nginx_file" ]

  address                       = "172.26.10.108:9876"

Đừng quên thêm người dùng vectơ vào nhóm được yêu cầu để anh ta có thể đọc tệp nhật ký. Ví dụ: nginx trong centos tạo nhật ký với quyền nhóm adm.

usermod -a -G adm vector

Hãy bắt đầu dịch vụ vector

systemctl enable vector
systemctl start vector

Nhật ký vector có thể được xem như thế này:

journalctl -f -u vector

Nên có một mục như thế này trong nhật ký

INFO vector::topology::builder: Healthcheck: Passed.

Bài kiểm tra về áp lực

Việc kiểm tra được thực hiện bằng cách sử dụng điểm chuẩn Apache.

Gói httpd-tools đã được cài đặt trên tất cả các máy chủ

Chúng tôi bắt đầu thử nghiệm bằng cách sử dụng điểm chuẩn Apache từ 4 máy chủ khác nhau trên màn hình. Đầu tiên, chúng tôi khởi chạy bộ ghép kênh đầu cuối màn hình, sau đó chúng tôi bắt đầu thử nghiệm bằng cách sử dụng điểm chuẩn Apache. Cách làm việc với màn hình bạn có thể tìm thấy trong Bài viết.

Từ máy chủ thứ nhất

while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done

Từ máy chủ thứ nhất

while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done

Từ máy chủ thứ nhất

while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done

Từ máy chủ thứ nhất

while true; do ab -H "User-Agent: 4server" -c 100 -n 10 -t 10 http://vhost4/; sleep 1; done

Hãy kiểm tra dữ liệu trong Clickhouse

Đến Clickhouse

clickhouse-client -h 172.26.10.109 -m

Thực hiện một truy vấn SQL

SELECT * FROM vector.logs;

┌─node_name────┬───────────timestamp─┬─server_name─┬─user_id─┬─request_full───┬─request_user_agent─┬─request_http_host─┬─request_uri─┬─request_scheme─┬─request_method─┬─request_length─┬─request_time─┬─request_referrer─┬─response_status─┬─response_body_bytes_sent─┬─response_content_type─┬───remote_addr─┬─remote_port─┬─remote_user─┬─upstream_addr─┬─upstream_port─┬─upstream_bytes_received─┬─upstream_bytes_sent─┬─upstream_cache_status─┬─upstream_connect_time─┬─upstream_header_time─┬─upstream_response_length─┬─upstream_response_time─┬─upstream_status─┬─upstream_content_type─┐
│ nginx-vector │ 2020-08-07 04:32:42 │ vhost1      │         │ GET / HTTP/1.0 │ 1server            │ vhost1            │ /           │ http           │ GET            │             66 │        0.028 │                  │             404 │                       27 │                       │ 172.26.10.106 │       45886 │             │ 172.26.10.106 │             0 │                     109 │                  97 │ DISABLED              │                     0 │                0.025 │                       27 │                  0.029 │             404 │                       │
└──────────────┴─────────────────────┴─────────────┴─────────┴────────────────┴────────────────────┴───────────────────┴─────────────┴────────────────┴────────────────┴────────────────┴──────────────┴──────────────────┴─────────────────┴──────────────────────────┴───────────────────────┴───────────────┴─────────────┴─────────────┴───────────────┴───────────────┴─────────────────────────┴─────────────────────┴───────────────────────┴───────────────────────┴──────────────────────┴──────────────────────────┴────────────────────────┴─────────────────┴───────────────────────

Tìm hiểu kích thước bàn trong Clickhouse

select concat(database, '.', table)                         as table,
       formatReadableSize(sum(bytes))                       as size,
       sum(rows)                                            as rows,
       max(modification_time)                               as latest_modification,
       sum(bytes)                                           as bytes_size,
       any(engine)                                          as engine,
       formatReadableSize(sum(primary_key_bytes_in_memory)) as primary_keys_size
from system.parts
where active
group by database, table
order by bytes_size desc;

Hãy cùng tìm hiểu xem Clickhouse đã chiếm bao nhiêu nhật ký.

Gửi nhật ký Nginx json bằng Vector tới Clickhouse và Elaticsearch

Kích thước bảng nhật ký là 857.19 MB.

Gửi nhật ký Nginx json bằng Vector tới Clickhouse và Elaticsearch

Kích thước của cùng một dữ liệu trong chỉ mục trong Elaticsearch là 4,5GB.

Nếu bạn không chỉ định dữ liệu trong vectơ trong các tham số, Clickhouse mất 4500/857.19 = 5.24 lần so với trong Elaticsearch.

Trong vectơ, trường nén được sử dụng theo mặc định.

Trò chuyện Telegram bởi clickhouse
Trò chuyện Telegram bởi Elasticsearch
Trò chuyện Telegram bởi "Thu thập và phân tích hệ thống tin nhắn"

Nguồn: www.habr.com

Thêm một lời nhận xét