रस्ट भाषा में लिखे जाने के कारण, यह अपने एनालॉग्स की तुलना में उच्च प्रदर्शन और कम रैम खपत की विशेषता रखता है। इसके अलावा, शुद्धता से संबंधित कार्यों पर बहुत ध्यान दिया जाता है, विशेष रूप से, डिस्क पर बफर में न भेजी गई घटनाओं को सहेजने और फ़ाइलों को घुमाने की क्षमता।
वास्तुकला की दृष्टि से, वेक्टर एक इवेंट राउटर है जो एक या अधिक से संदेश प्राप्त करता है सूत्रों का कहना है, वैकल्पिक रूप से इन संदेशों पर लागू करना परिवर्तनों, और उन्हें एक या अधिक को भेजना नालियों.
वेक्टर फ़ाइलबीट और लॉगस्टैश का प्रतिस्थापन है, यह दोनों भूमिकाओं में कार्य कर सकता है (लॉग प्राप्त करें और भेजें), उन पर अधिक विवरण ऑनलाइन.
यदि लॉगस्टैश में श्रृंखला इनपुट → फ़िल्टर → आउटपुट के रूप में बनाई गई है तो वेक्टर में यह है स्त्रोत → रूपांतरण → डूब
उदाहरण दस्तावेज़ में पाए जा सकते हैं।
यह निर्देश से संशोधित निर्देश है व्याचेस्लाव राखिंस्की. मूल निर्देशों में जियोआईपी प्रोसेसिंग शामिल है। आंतरिक नेटवर्क से जियोआईपी का परीक्षण करते समय, वेक्टर ने एक त्रुटि दी।
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
यदि किसी को जियोआईपी संसाधित करने की आवश्यकता है, तो मूल निर्देश देखें व्याचेस्लाव राखिंस्की.
हम Nginx (एक्सेस लॉग) → वेक्टर (क्लाइंट | फाइलबीट) → वेक्टर (सर्वर | लॉगस्टैश) → के संयोजन को क्लिकहाउस में अलग से और Elasticsearch में अलग से कॉन्फ़िगर करेंगे। हम 4 सर्वर स्थापित करेंगे. हालाँकि आप इसे 3 सर्वर से बायपास कर सकते हैं।
स्कीम कुछ इस प्रकार है.
अपने सभी सर्वर पर सेलिनक्स अक्षम करें
sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config
reboot
हम सभी सर्वरों पर एक HTTP सर्वर एमुलेटर + उपयोगिताएँ स्थापित करते हैं
ClickHouse SSE 4.2 निर्देश सेट का उपयोग करता है, इसलिए जब तक अन्यथा निर्दिष्ट न हो, उपयोग किए गए प्रोसेसर में इसके लिए समर्थन एक अतिरिक्त सिस्टम आवश्यकता बन जाता है। यहां यह जांचने का आदेश दिया गया है कि वर्तमान प्रोसेसर एसएसई 4.2 का समर्थन करता है या नहीं:
सिंगल-नोड मोड 1 शार्ड, 0 प्रतिकृति के लिए इलास्टिक्स खोज को कॉन्फ़िगर करना। सबसे अधिक संभावना है कि आपके पास बड़ी संख्या में सर्वरों का एक क्लस्टर होगा और आपको ऐसा करने की आवश्यकता नहीं है।
भविष्य के इंडेक्स के लिए, डिफ़ॉल्ट टेम्पलेट अपडेट करें:
INFO vector::topology::builder: Healthcheck: Passed.
INFO vector::topology::builder: Healthcheck: Passed.
क्लाइंट (वेब सर्वर) पर - पहला सर्वर
Nginx वाले सर्वर पर, आपको IPv6 को अक्षम करना होगा, क्योंकि क्लिकहाउस में लॉग तालिका फ़ील्ड का उपयोग करती है upstream_addr आईपीवी4, चूँकि मैं नेटवर्क के अंदर आईपीवी6 का उपयोग नहीं करता। यदि IPv6 बंद नहीं किया गया है, तो त्रुटियाँ होंगी:
DB::Exception: Invalid IPv4 value.: (while read the value of key upstream_addr)
सबसे पहले, हमें फ़ाइल /etc/nginx/nginx.conf में Nginx में लॉग प्रारूप को कॉन्फ़िगर करना होगा
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;
}
आपके वर्तमान कॉन्फ़िगरेशन को न तोड़ने के लिए, Nginx आपको कई एक्सेस_लॉग निर्देश देने की अनुमति देता है
access_log /var/log/nginx/access.log main; # Стандартный лог
access_log /var/log/nginx/access.json.log vector; # Новый лог в формате json
नए लॉग के लिए लॉगरोटेट करने के लिए एक नियम जोड़ना न भूलें (यदि लॉग फ़ाइल .log के साथ समाप्त नहीं होती है)
और फ़ाइलबीट प्रतिस्थापन को /etc/vector/vector.toml कॉन्फ़िगरेशन में कॉन्फ़िगर करें। आईपी पता 172.26.10.108 लॉग सर्वर (वेक्टर-सर्वर) का आईपी पता है
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"
वेक्टर उपयोगकर्ता को आवश्यक समूह में जोड़ना न भूलें ताकि वह लॉग फ़ाइलें पढ़ सके। उदाहरण के लिए, सेंटोज़ में nginx एडम समूह अधिकारों के साथ लॉग बनाता है।
usermod -a -G adm vector
आइए वेक्टर सेवा शुरू करें
systemctl enable vector
systemctl start vector
वेक्टर लॉग को इस तरह देखा जा सकता है:
journalctl -f -u vector
लॉग में इस प्रकार की प्रविष्टि होनी चाहिए
INFO vector::topology::builder: Healthcheck: Passed.
तनाव परीक्षण
अपाचे बेंचमार्क का उपयोग करके परीक्षण किया जाता है।
httpd-tools पैकेज सभी सर्वरों पर स्थापित किया गया था
हम स्क्रीन में 4 अलग-अलग सर्वरों से अपाचे बेंचमार्क का उपयोग करके परीक्षण शुरू करते हैं। सबसे पहले, हम स्क्रीन टर्मिनल मल्टीप्लेक्सर लॉन्च करते हैं, और फिर हम अपाचे बेंचमार्क का उपयोग करके परीक्षण शुरू करते हैं। स्क्रीन के साथ कैसे काम करें आप इसमें पा सकते हैं लेख.
पहले सर्वर से
while true; do ab -H "User-Agent: 1server" -c 100 -n 10 -t 10 http://vhost1/; sleep 1; done
पहले सर्वर से
while true; do ab -H "User-Agent: 2server" -c 100 -n 10 -t 10 http://vhost2/; sleep 1; done
पहले सर्वर से
while true; do ab -H "User-Agent: 3server" -c 100 -n 10 -t 10 http://vhost3/; sleep 1; done
पहले सर्वर से
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;
आइए जानें कि क्लिकहाउस में कितने लॉग लगे।
लॉग तालिका का आकार 857.19 एमबी है।
Elasticsearch में इंडेक्स में समान डेटा का आकार 4,5GB है।
यदि आप पैरामीटर में वेक्टर में डेटा निर्दिष्ट नहीं करते हैं, तो Clickhouse Elasticsearch की तुलना में 4500/857.19 = 5.24 गुना कम लेता है।
वेक्टर में, संपीड़न फ़ील्ड का उपयोग डिफ़ॉल्ट रूप से किया जाता है।