Đượ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ồn → biến đổi → bồ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ủ.
Đề á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ủ
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:
Đị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:
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)
Đầ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)
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
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ý.
Kích thước bảng nhật ký là 857.19 MB.
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.