á ááᲠááááᣠᨠMKB á¨áá¨á á´áááááá˝ áłááŹááśáŹáľ á¨áááľ á áááááľ áťááá˝ á¨áĽááľ ááĽá¨á ááá
á¨á¤áᏠááá (ElasticSearch, Logstash, Kibana) áĽáá° á ááŤá ᨠClickHouse áłáłá¤á á¨áááἠááľáłááťáá˝á áĽáá° á¨ááἠáá¨ááť áľááá áá áááá áĽáŤá°á¨áá ááá˘
á áá á˝áá ááľáĽ áľá ClickHouse áłáłá¤á áľááá áá áŤááá áááľ áĽá á¨á áĽáŤáŞ áĽáŤ á¨ááááŞáŤ áá¤áśá˝á ááááá áĽááááááᢠáá¤áśáš á áľá°áá áĽáá°áá አáá˛áŤáá áἠááŁá áááŁá.
á ááá á, á¨áĽá áľáááľ áĽáá´áľ áĽáá°áááá, áĽá áá á áááľ á áŤááľá áĽáá°ááŤáŤáľáľ á á áá áááá áĽáááááá. á áá áá áľááá
á¨ááἠááł á á á ááá áľáá˝ áááŤáľ áĽááááá, áĽá ááá áľáŠá¨áľ ááľá áľ áĽááłáá áľ. ᨠClickHouse áłáłá¤á ᨠYandex á¨áá°á á ááťá¸á áŤáá á¨áľááłá áááľ áłáłá¤á ááᢠá Yandex á áááááśá˝ ááľáĽ áĽá
á áá áááá, ááááŞáŤ áá á Yandex.Metrica ááá á¨ááἠáá¨ááť áá. áááľ ááá áľááᾠᣠááᢠá¨ááᢠáĽááł á ááťáᣠáĽáá´áľ áĽáá°á°áá áŠáľ áááá á áľáĽ áá áᣠááááŤáąá á ááŤáľá°áá
áááł áľáá
áá¨á á áᢠáĽá á¨ááľáŞááľ á¨á°á áá á áááá˝ áŤáą á áŁá á°áááá áĽá ááŁá ááᢠá¨áá
á¨áá¨á ááľ áá áááááŞáŤ áá á˛áŤáá ᣠáááá¤á âá°á
á ᣠá áá¨á¨áť! áá
áἠá¨á°á°áŤ! á¨ááŤá áá°áą ááᎠáĽá á ááá áĽáŤááá˝á áŤá áá.
áá á¨ááἠááł á áŁá áá á°á á¨ááá˘áŤ áá°áĽ á ááᢠá ááŤá á˝ááł áŤáá ááᢠáĽááłá áá á áłáłá¤á á áĽááľ á°áááá˝ ááľáĽ áá áá áá áááá áá˝ááᢠááá ááá á ááá˝ áá°áŤá. áááááľ á á˛áľ á¨áá á°áá˝ áĽááłá ááŤáá á ááĽááľ ááľá°áááľ áĽá ááá áľáŤáá˝á áá¨ááá áá˝ááᢠáá°á á˛á ᣠá˘á áłáł ᣠááąá ᣠááá á˘á á´áĽá ᣠá¤á˝á˛á¤áá¤áľ á áááľ áááľ á ááľ á°áŤ ááᢠáľá á ááłááľ á´áŤáŁáᾠᣠááłáŁáᾠᣠá ááłááľ á¨á°á á áá á¨áá á°áá˝ ááĽááá áľáááśá˝ á áá áśá˝ áĽá áááľ ááľáĽ ááłá°áá á¨áá ááłáĽ áá á¨á ᣠá¨á፠ᨠClickHouse áááŁáľ ááᢠá¨ááἠááłáŁ á¨áá áá°á áá°á¨áľ á¨ááá˝ááá á¨á°ááŁá áĽááľ áááłáľ á¨áá˝áá áľ ááá áĽá ááá¨áłáľ á¨ááťá ááłáŞáŤ á ááá°ááᢠáááŤá á ááľ áľáááá á ááŤá áá˝á áĽá á ááľáľ á°áá áĽáť áá á¨áááľá°áᢠáŤá áááľ áĽáá° MySql áŤá á¨ááἠááł á ááá°áá ááá áá á á˘ááŽáá˝ á¨ááá አááááŚá˝á ááá¨áá¸áľ áĽáť áá! á¨SQL ááá áá á¨á°áá°á ááá-áááἠá¤áľá˘ á°áá˝ á¨áŁááľ áŚá ááłáŞáŤ áĽáá°á°á°áŁá¸á ááá˘
áľá áĽá á¨áááἠááľáłááť áľáááľ
áá¨áá ááá°áĽá°áĽ ᨠIIS áá áááá˝ áá°á á á áá¸áľ á¨áľá áá°áá áŞáŤáá˝ áĽá á áá áááá (á á áá áá á¨áá°áá áŞáŤ áááἠááľáłááťáá˝á áĽá¨á°ááá¨áľá áá ááá áá á áá¨áŤ á°á¨á áá áŤáá ááá áἠᨠIIS áááἠááľáłááťáá˝á áá°áĽá°áĽ áá)á˘
á á°ááŤáŠ ááááŤáśá˝ ᨠELK ááá áá á áá áá°á á ááťáááᣠáĽá áĽáŤáłá¸áá á ááᣠáŤá¨ááᥠáĽá á áľááá á¨áá°áŠáľá LogStash áĽá Filebeat áááá˝á áá ááá˝áá ááĽáááá˘
á á ááá á¨áááᣠáĽá áľ á¨áá á áłá˝ áŁáá áľáĽá ááľáĽ ááłáŤáá˘
áá° ClickHouse áłáłá¤á ááἠá¨ááá áŁá
᪠áĽá áá (á á´áŽááľ á ááľ áá) ááááŚá˝á á áľááá
áľáĽáľáŚá˝ ááľáĽ ááľááŁáľ ááᢠáá
á¨ááá áááľ áłáłá¤á áá áááááŞáŤ áá á˛á°áŠ á¨ááŤááĽááľ á áŁá âá˝áá áŤáá áľâ ááá ááᥠáĽá
áą áľáá˝ á¨á°ááłá°á ááááá˘
ᨠLogStash áááá ᣠáá¨áá á ááĽáł áá° ClickHouse á¨ááŤáľáᣠᣠáĽáá
áĽá á¨áľáˇáᢠáá
á áŤá áĽáá° áłáłá¤á áŤáą á á°ááłáłá á áááá áá á°ááááˇáᢠáľááá
, á á á ááá á áááá, á á°ááłáłá á áááá áá á áá°áŤáá áľ áá á¨á°ááŤáŠ á ááááŽá˝á áĽááłáŤáááą, á¨á°ááŁáŤá áĽááł á ááťá áá áĽáá˛áŤá°áááľ á ááá¨áá. á¨áá¨á ááą áá ááá á áááľ ááľááśá˝ ááá á¨ááĽá¨áľ áááśá˝ á áá¨ááᢠá á°á¨ááŞá, áááá áľá
á°áśá˝ áŤá áĽáá°áá á¨ááá¨á áá´ áĽááłáá áἠááŁá áááŁá. áĽá áľá
á°áśá˝ áŤá, áááá ááᣠá¨ááá˝á á¨ááἠáľáĽáľáĽ áá° á˛áľá áá˝áá (á¨ááá á
áá¸áą ááš áá: á¨á ááľááľ á áá á¨á°áľá°áŤá¨ááá ááá á¤áľ-á°áá áá á áá áá á ááá ááľááŁáľ áá˝áá).
á áĽá áą ááľáĽ áĽá á áá á¨áá á¨áśááľáá áá áááá á á áá á¨áĽ ááľáĽ ááá§á-
áŤáááá áśááľááŽá˝ áááá
áááľ
ááááŤ
á¨áľáááľ á ááá
NGINX
á áá°áŚá˝ ááłá¨áťá áááá°áĽ áĽá áááľá ááá°áŤááľ á áááŁá á°áŞ
á á áá áá á áĽá áą ááľáĽ áĽá á áá á áááá
FileBeat
á¨ááá ááááŚá˝á ááľá°ááá.
logstash
á¨áááἠááľáłááť á°áĽáłá˘.
áááἠááľáłááťáá˝á á¨áááá˘áľ ááá°áĽá°áĽáŁ áĽáá˛áá ᨠRabbitMQ áá¨á (á á˛á¤ááá¤áľ ááľáĽ áá á ááááŽá˝) áááἠááľáłááťáá˝á ááá°áĽá°áĽ áá á ááá˘
Logstash-áá¤áľ-ááá áááľ
Loagstash plugin áááἠááľáłááťáá˝á áá° ClickHouse áłáłá¤á á áĄáľá ááááá
/usr/share/logstash/bin/logstash-plugin logstash-output-clickhouse áŤá
/usr/share/logstash/bin/logstash-plugin áŤá logstash-filter-prune
/usr/share/logstash/bin/logstash-plugin logstash-filter-multiline áŤá
á á áł á¤áľ
á¨áááἠááľáłááť áá¨ááť
ááľáłááť. á¨áŚááľáľ 2018 ááᎠá RHEL "áá°á á" rpm ááááŁá á Yandex áá¨ááť ááľáĽ áłá¨, áľááá áĽááąá ááá áá ááá¨á áá˝áá. á ááŤá áá á á áá˛áᲠá¨á°ááᥠáĽá áá˝á áĽáá áá áá á.
ááŤáá
á¨áááἠááľáłááť áĽááł. áłá˝áŚááśá˝á á áááááľ áá
Redhat & Centos(64 á˘áľ) - á¨á áἠáá áľáŞáľ
ClickHouse á¨ááἠááá á Grafana 4.6+
á Grafana á°á°áŞ á ClickHouse á¨ááἠááá
logstash
áŤáá°áá á¨áááá˘áľ áá° RabbitMQ áá¨á áŤáľááĄá˘
ááľáłááť. áĽáá° á áááłá°á áá, FileBeat á ááĽáł áá° RabbitMQ áá ááľ á¨ááá, áľááá á Logstash ááá ááŤá¨áá á ááá áŤáľáááá.
RabbitMQ
á¨áááááľ áá¨á. áá á DMZ ááľáĽ áŤáá á¨áááἠááľáłááť ááľ ááá˘
Erlang Runtime (á RabbitMQ áŤáľáááá)
á¨á¤áááá áŠáŤ ááᢠRabbitMQ áĽáá˛á°áŤ áŤáľáááá
ᨠClickHouse áłáłá¤á áá áŤáá á¨á áááá áá á á áá¨á°áá á áá á¨áĽ ááá§áá˘
áááľ
áá
á ááá¨á°
áá á
HDD: 40GB
áŤá: 8 ááŁ
ááŽá°á°á: áŽá 2 2Ghz
ᨠClickHouse áłáłá¤á (ááááááľ) á¨áá¨á ááąá áááľáŹáľ áááŽá˝á áľáŠá¨áľ ááľá áľ áŤáľáááá á˘
á á ááá á¨áľáááľ áśááľáá
áľááá° áááᥠRed Hat Enterprise Linux Server (Maipo)
áá áá á (á፠8)
áĽáá°áááá¨áąáľ, áá á°áŤ á¨áľáŤ áŚáł áá.
á¨áááἠááľáłááťáá˝á ááá¨áá¸áľ á¨á°áá á¨áĄ ááá á áĽáá°áá¨á°áá áá.
log_web.sql
CREATE TABLE log_web (
logdate Date,
logdatetime DateTime CODEC(Delta, LZ4HC),
fld_log_file_name LowCardinality( String ),
fld_server_name LowCardinality( String ),
fld_app_name LowCardinality( String ),
fld_app_module LowCardinality( String ),
fld_website_name LowCardinality( String ),
serverIP LowCardinality( String ),
method LowCardinality( String ),
uriStem String,
uriQuery String,
port UInt32,
username LowCardinality( String ),
clientIP String,
clientRealIP String,
userAgent String,
referer String,
response String,
subresponse String,
win32response String,
timetaken UInt64
, uriQuery__utm_medium String
, uriQuery__utm_source String
, uriQuery__utm_campaign String
, uriQuery__utm_term String
, uriQuery__utm_content String
, uriQuery__yclid String
, uriQuery__region String
) Engine = MergeTree()
PARTITION BY toYYYYMM(logdate)
ORDER BY (fld_app_name, fld_app_module, logdatetime)
SETTINGS index_granularity = 8192;
ááŁáŞ ááááá (á áá) áĽá á¨áá¨á á ááá áĽáá áááá ᢠááá ááľáŽá˝ ᨠhttp áĽáŤááá˝á áááááἠᨠIIS áááἠááľáłááťáá˝ áá ááááłáᢠá á°áá á, utm-tags ááá¨áá¸áľ á¨á°áአááľáŽá˝ áĽááłá áĽááľá°áááá (á¨áĽáŤáá ááĽá¨ááá ááľá áá° á á¨á´áá ááľáĽ á ááŤáľááĄá áľ á°á¨á áá ááá áá).
áĽáá˛áá áľá áľáááśá˝, á áŤááľ, á ááááŽá˝ áá¨áá ááá¨áá¸áľ áĽá á¨áľáááľ ááľáŽá˝ áá° á á¨á´áá á°á¨áá¨áá. á¨áĽááá á ááľáŽá˝ ááá፠áááááľ á¨áá á áłá˝ áŤááá á°áá á¨áĽ áááá¨áąá˘ á á ááľ á áá á¨áĽ ááľáĽ ááĽá áľáááśá˝ áááἠááľáłááťáá˝á áĽáá¨ááťáá.
áááľ
ááááŤ
áááłá:
fld_app_áľá
á¨áá°áá áŞáŤ / á¨áľáááľ áľá
áľáááá áĽá´áśá˝áĄ-
- site1.domain.com ááŤá áŁá˘áŤ 1
- site2.domain.com ááŤá áŁá˘áŤ 2
- internal-site1.domain.local Internal site 1
site1.domain.com
fld_app_module
á¨áľáááľ ááá
áľáááá áĽá´áśá˝áĄ-
- áľá - áľá áŁá˘áŤ
- svc - á¨áľá áŁá˘áŤ á áááááľ
- intgr - á¨áá á°áľ áľá á áááááľ
- ጠ- á áľá°áłáłáŞ (BackOffice)
á¨áľá
fld_áľá¨-áá˝_áľá
á IIS ááľáĽ á¨áŁá˘áŤ áľá
áĽá áľáááśá˝ á á ááľ á áááá áá áá°áአáá˝ááᣠááá á á ááľ á¨áľáááľ ááá ááľáĽ áĽá á ááŁááá˝
á¨áľá áá
fld_á áááá_áľá
á¨á áááá áľá
web1.domain.com
fld_log_ááá_áľá
á á áááአáá áá° á¨áááἠááľáłááť ááá á¨áááľá°á ááááľ
áᥠinetpublogsLogFiles
W3SVC1u_ex190711.áá
áá á ááŤáá ááľáĽ ááŤáá˝á á áĽááľ áĽáá˛ááᥠáŤáľá˝áááłáᢠáááłáᣠá¨á ááľ á¨á°áá°á áľáááľ ááľ áááľ á¨ááᥠáĽáŤááá˝á áááá¨áąá˘ áá á Yandex.Metrica ááľáĽ áŤáá á¨áŁá˘áŤ ááŁáŞ áá á°ááłáłá ááá˘
ááááľ ááŤáľ áŤá á á¨ááἠááł á á áááá á á°ááá¨á° á ááłááľ áľáłá˛áľá˛ááľ áĽááá˘
á áľáááśá˝ áĽá ááááťá¸á á¨á°á¨ááá ááááŚá˝ áĽááľ
SELECT
fld_app_name,
fld_app_module,
count(fld_app_name) AS rows_count
FROM log_web
GROUP BY
fld_app_name,
fld_app_module
WITH TOTALS
ORDER BY
fld_app_name ASC,
rows_count DESC
ââfld_app_nameââââââŹâfld_app_moduleââŹârows_countââ
â site1.domain.ru â web â 131441 â
â site2.domain.ru â web â 1751081 â
â site3.domain.ru â web â 106887543 â
â site3.domain.ru â svc â 44908603 â
â site3.domain.ru â intgr â 9813911 â
â site4.domain.ru â web â 772095 â
â site5.domain.ru â web â 17037221 â
â site5.domain.ru â intgr â 838559 â
â site5.domain.ru â bo â 7404 â
â site6.domain.ru â web â 595877 â
â site7.domain.ru â web â 27778858 â
ââââââââââââââââââââ´âââââââââââââââââ´âââââââââââââ
Totals:
ââfld_app_nameââŹâfld_app_moduleââŹârows_countââ
â â â 210522593 â
ââââââââââââââââ´âââââââââââââââââ´âââââââââââââ
11 rows in set. Elapsed: 4.874 sec. Processed 210.52 million rows, 421.67 MB (43.19 million rows/s., 86.51 MB/s.)
á á˛áľá áá áŤáá á¨ááἠáá á
SELECT
formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed,
formatReadableSize(sum(data_compressed_bytes)) AS compressed,
sum(rows) AS total_rows
FROM system.parts
WHERE table = 'log_web'
ââuncompressedââŹâcompressedââŹâtotal_rowsââ
â 54.50 GiB â 4.86 GiB â 211427094 â
ââââââââââââââââ´âââââââââââââ´âââââââââââââ
1 rows in set. Elapsed: 0.035 sec.
á á ááśá˝ ááľáĽ á¨ááἠáá¨ááŞáŤ á°á¨á
SELECT
name,
formatReadableSize(data_uncompressed_bytes) AS uncompressed,
formatReadableSize(data_compressed_bytes) AS compressed,
data_uncompressed_bytes / data_compressed_bytes AS compress_ratio
FROM system.columns
WHERE table = 'log_web'
âânameââââââââââââââââââââŹâuncompressedââŹâcompressedââŹâââââcompress_ratioââ
â logdate â 401.53 MiB â 1.80 MiB â 223.16665968777315 â
â logdatetime â 803.06 MiB â 35.91 MiB â 22.363966401202305 â
â fld_log_file_name â 220.66 MiB â 2.60 MiB â 84.99905736932571 â
â fld_server_name â 201.54 MiB â 50.63 MiB â 3.980924816977078 â
â fld_app_name â 201.17 MiB â 969.17 KiB â 212.55518183686877 â
â fld_app_module â 201.17 MiB â 968.60 KiB â 212.67805817411906 â
â fld_website_name â 201.54 MiB â 1.24 MiB â 162.7204926761546 â
â serverIP â 201.54 MiB â 50.25 MiB â 4.010824061219731 â
â method â 201.53 MiB â 43.64 MiB â 4.617721053304486 â
â uriStem â 5.13 GiB â 832.51 MiB â 6.311522291936919 â
â uriQuery â 2.58 GiB â 501.06 MiB â 5.269731450124478 â
â port â 803.06 MiB â 3.98 MiB â 201.91673864241824 â
â username â 318.08 MiB â 26.93 MiB â 11.812513794583598 â
â clientIP â 2.35 GiB â 82.59 MiB â 29.132328640073343 â
â clientRealIP â 2.49 GiB â 465.05 MiB â 5.478382297052563 â
â userAgent â 18.34 GiB â 764.08 MiB â 24.57905114484208 â
â referer â 14.71 GiB â 1.37 GiB â 10.736792723669906 â
â response â 803.06 MiB â 83.81 MiB â 9.582334090987247 â
â subresponse â 399.87 MiB â 1.83 MiB â 218.4831068635027 â
â win32response â 407.86 MiB â 7.41 MiB â 55.050315514606815 â
â timetaken â 1.57 GiB â 402.06 MiB â 3.9947395692010637 â
â uriQuery__utm_medium â 208.17 MiB â 12.29 MiB â 16.936148912472955 â
â uriQuery__utm_source â 215.18 MiB â 13.00 MiB â 16.548367623199912 â
â uriQuery__utm_campaign â 381.46 MiB â 37.94 MiB â 10.055156353418509 â
â uriQuery__utm_term â 231.82 MiB â 10.78 MiB â 21.502540454070672 â
â uriQuery__utm_content â 441.34 MiB â 87.60 MiB â 5.038260760449327 â
â uriQuery__yclid â 216.88 MiB â 16.58 MiB â 13.07721335008116 â
â uriQuery__region â 204.35 MiB â 9.49 MiB â 21.52661903446796 â
ââââââââââââââââââââââââââ´âââââââââââââââ´âââââââââââââ´âââââââââââââââââââââ
28 rows in set. Elapsed: 0.005 sec.
áĽá á áá á¨áá á áŤááľ ááááŤ
FileBeat á¨ááá ááááŚá˝á á ááľá°ááá áá
áá á áŤá á á˛áľá áá áááá˝á áááááἠáááŚá˝á áá¨áłá°áá áĽá áá¨ááá áá° LogStash áŤáľá°ááááᢠá¨áááἠááľáłááť áááá˝ á á°áťááŁá¸á ááá á ááááŽá˝ áá á°ááá (áĽááá áá IIS)ᢠá á áŤáľ áááł áá°áŤá (áááľá á¨á°á¨ááŠáľá ááááŚá˝ áá° ááá áĽáť áŤáľá°áááá). ááá áá á á°ááĽá áááá áááá˝ áááľá°ááá áááá áá˝áá. áŤáááľ ááŤáľ ááἠááá¨áľ á˛ááá áá á áá ááᢠá¨áá áááá áá° áá á°á ááľááŁáľ áĽáť áá áĽá áá á áá áŤáá ááá˘
á áááááą á˛áá ááᥠá¨á áá á áá áá° áá¨ááťá á áá°ááááá˘
á¨ááłá áá á áá á áááľááá˘
filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- C:/inetpub/logs/LogFiles/W3SVC1/*.log
exclude_files: ['.gz$','.zip$']
tail_files: true
ignore_older: 24h
fields:
fld_server_name: "site1.domain.ru"
fld_app_name: "site1.domain.ru"
fld_app_module: "web"
fld_website_name: "web-main"
- type: log
enabled: true
paths:
- C:/inetpub/logs/LogFiles/__Import/access_log-*
exclude_files: ['.gz$','.zip$']
tail_files: false
fields:
fld_server_name: "site2.domain.ru"
fld_app_name: "site2.domain.ru"
fld_app_module: "web"
fld_website_name: "web-main"
fld_logformat: "logformat__apache"
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
reload.period: 2s
output.logstash:
hosts: ["log.domain.com:5044"]
ssl.enabled: true
ssl.certificate_authorities: ["C:/filebeat/certs/ca.pem", "C:/filebeat/certs/ca-issuing.pem"]
ssl.certificate: "C:/filebeat/certs/site1.domain.ru.cer"
ssl.key: "C:/filebeat/certs/site1.domain.ru.key"
#================================ Processors =====================================
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
logstash. á¨áááἠááľáłááť á°áĽáłá˘
áá á áŤá á¨á°áá°áá á¨áááá˘áľ (ááá á RabbitMQ áá¨á) á¨áááἠááľáłááťáá˝á áááá á ááᣠá ClickHouse á¨ááἠááł ááľáĽ áĽá áá˝á áá°áá°á áĽá ááľááŁáľá˘
áá° ClickHouse áááľááŁáľ ᨠLogstash-output-clickhouse á°á°áŞ áĽá á áá ááááᢠᨠLogstash áááá á¨áĽáŤá áá´ á áá ᣠáá á áá°á áááľ áááᾠᣠá áááááąá á áŤáą ááá á¨á°áťá ááᢠá˛áá áááĽááśá˝ á RabbitMQ áá¨á ááľáĽ áá¨ááťá, áľááá ááááŤá áá¨á á áá á¨áá, á á ááááŽáš áá Filebeats á ááá á¨á°áťá áá. RabbitMQ áĽá á áá á ááááá áľ áĽá áľ (á á áŤáŁá˘á á ááłá¨áá¨áĽ áá, Filebeat á ááĽáł áá° Logstash áááἠááľáłááťáá˝á áááŤá), Filebeats á áŁá á°ááŁáááľ áŤáá áĽá á°á áááą á á°á á á áááł áá°áŤá, áľááá ááĽááą á¨áá¤áľ á áááááľ áŤáááá ááá áŤááá.
á¨ááłá áá á áá á áááľááá˘
log_web__filebeat_clickhouse.conf
input {
beats {
port => 5044
type => 'iis'
ssl => true
ssl_certificate_authorities => ["/etc/logstash/certs/ca.cer", "/etc/logstash/certs/ca-issuing.cer"]
ssl_certificate => "/etc/logstash/certs/server.cer"
ssl_key => "/etc/logstash/certs/server-pkcs8.key"
ssl_verify_mode => "peer"
add_field => {
"fld_server_name" => "%{[fields][fld_server_name]}"
"fld_app_name" => "%{[fields][fld_app_name]}"
"fld_app_module" => "%{[fields][fld_app_module]}"
"fld_website_name" => "%{[fields][fld_website_name]}"
"fld_log_file_name" => "%{source}"
"fld_logformat" => "%{[fields][fld_logformat]}"
}
}
rabbitmq {
host => "queue.domain.com"
port => 5671
user => "q-reader"
password => "password"
queue => "web_log"
heartbeat => 30
durable => true
ssl => true
#ssl_certificate_path => "/etc/logstash/certs/server.p12"
#ssl_certificate_password => "password"
add_field => {
"fld_server_name" => "%{[fields][fld_server_name]}"
"fld_app_name" => "%{[fields][fld_app_name]}"
"fld_app_module" => "%{[fields][fld_app_module]}"
"fld_website_name" => "%{[fields][fld_website_name]}"
"fld_log_file_name" => "%{source}"
"fld_logformat" => "%{[fields][fld_logformat]}"
}
}
}
filter {
if [message] =~ "^#" {
drop {}
}
if [fld_logformat] == "logformat__iis_with_xrealip" {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken} %{NOTSPACE:xrealIP} %{NOTSPACE:xforwarderfor}"]
}
} else {
grok {
match => ["message", "%{TIMESTAMP_ISO8601:log_timestamp} %{IP:serverIP} %{WORD:method} %{NOTSPACE:uriStem} %{NOTSPACE:uriQuery} %{NUMBER:port} %{NOTSPACE:username} %{IPORHOST:clientIP} %{NOTSPACE:userAgent} %{NOTSPACE:referer} %{NUMBER:response} %{NUMBER:subresponse} %{NUMBER:win32response} %{NUMBER:timetaken}"]
}
}
date {
match => [ "log_timestamp", "YYYY-MM-dd HH:mm:ss" ]
timezone => "Etc/UTC"
remove_field => [ "log_timestamp", "@timestamp" ]
target => [ "log_timestamp2" ]
}
ruby {
code => "tstamp = event.get('log_timestamp2').to_i
event.set('logdatetime', Time.at(tstamp).strftime('%Y-%m-%d %H:%M:%S'))
event.set('logdate', Time.at(tstamp).strftime('%Y-%m-%d'))"
}
if [bytesSent] {
ruby {
code => "event['kilobytesSent'] = event['bytesSent'].to_i / 1024.0"
}
}
if [bytesReceived] {
ruby {
code => "event['kilobytesReceived'] = event['bytesReceived'].to_i / 1024.0"
}
}
ruby {
code => "event.set('clientRealIP', event.get('clientIP'))"
}
if [xrealIP] {
ruby {
code => "event.set('clientRealIP', event.get('xrealIP'))"
}
}
if [xforwarderfor] {
ruby {
code => "event.set('clientRealIP', event.get('xforwarderfor'))"
}
}
mutate {
convert => ["bytesSent", "integer"]
convert => ["bytesReceived", "integer"]
convert => ["timetaken", "integer"]
convert => ["port", "integer"]
add_field => {
"clientHostname" => "%{clientIP}"
}
}
useragent {
source=> "useragent"
prefix=> "browser"
}
kv {
source => "uriQuery"
prefix => "uriQuery__"
allow_duplicate_values => false
field_split => "&"
include_keys => [ "utm_medium", "utm_source", "utm_campaign", "utm_term", "utm_content", "yclid", "region" ]
}
mutate {
join => { "uriQuery__utm_source" => "," }
join => { "uriQuery__utm_medium" => "," }
join => { "uriQuery__utm_campaign" => "," }
join => { "uriQuery__utm_term" => "," }
join => { "uriQuery__utm_content" => "," }
join => { "uriQuery__yclid" => "," }
join => { "uriQuery__region" => "," }
}
}
output {
#stdout {codec => rubydebug}
clickhouse {
headers => ["Authorization", "Basic abcdsfks..."]
http_hosts => ["http://127.0.0.1:8123"]
save_dir => "/etc/logstash/tmp"
table => "log_web"
request_tolerance => 1
flush_size => 10000
idle_flush_time => 1
mutations => {
"fld_log_file_name" => "fld_log_file_name"
"fld_server_name" => "fld_server_name"
"fld_app_name" => "fld_app_name"
"fld_app_module" => "fld_app_module"
"fld_website_name" => "fld_website_name"
"logdatetime" => "logdatetime"
"logdate" => "logdate"
"serverIP" => "serverIP"
"method" => "method"
"uriStem" => "uriStem"
"uriQuery" => "uriQuery"
"port" => "port"
"username" => "username"
"clientIP" => "clientIP"
"clientRealIP" => "clientRealIP"
"userAgent" => "userAgent"
"referer" => "referer"
"response" => "response"
"subresponse" => "subresponse"
"win32response" => "win32response"
"timetaken" => "timetaken"
"uriQuery__utm_medium" => "uriQuery__utm_medium"
"uriQuery__utm_source" => "uriQuery__utm_source"
"uriQuery__utm_campaign" => "uriQuery__utm_campaign"
"uriQuery__utm_term" => "uriQuery__utm_term"
"uriQuery__utm_content" => "uriQuery__utm_content"
"uriQuery__yclid" => "uriQuery__yclid"
"uriQuery__region" => "uriQuery__region"
}
}
}
pipelines.yml
# This file is where you define your pipelines. You can define multiple.
# For more information on multiple pipelines, see the documentation:
# https://www.elastic.co/guide/en/logstash/current/multiple-pipelines.html
- pipeline.id: log_web__filebeat_clickhouse
path.config: "/etc/logstash/log_web__filebeat_clickhouse.conf"
á á áł á¤áľ. á¨áááἠááľáłááť áá¨ááť
á¨ááá áľáááśá˝ áááἠááľáłááťáá˝ á á ááľ á áá á¨áĽ ááľáĽ ááááŁá (á á˝áá ááááŞáŤ áá áááá¨áą). áľá áĽáŤááá˝ áá¨áá ááá¨áá¸áľ á¨áłá°á áá-ááá áááŞáŤáá˝ áá°ááŤáŠ á áá¸áśá˝ á°ááłáłá áá¸á, áĽáá° IIS áááá˝, apache áĽá nginx logs. ááá°áá áŞáŤ áááἠááľáłááťáá˝, áááłá, áľá á°áśá˝, á¨áá¨á áááááśá˝, ááľá ááááŤáá˝ á¨á°ááááĄá áľ, á¨á°áᨠá áá á¨áĽ á á°áá˘á ááá á (á á áá áá á ááľá á°á¨á) ááááŁá.
á á¨á´áá á˛ááľá áááá ááá ááá°á á áŁá á áľááá áá (á áá¨ááťá áá
áľ áá¨áá á¨ááá¨á) ᢠá¨ááἠáá¨áá፠áĽá á¨áá áá
ááĽááľ áá á á áá
áá á¨á°áá°á¨á° áá. á áĽá ááłá, ááá ááá áá
áľáĽáá á (fld_app_nameᣠfld_app_moduleᣠlogdatetime)
áá
á áááľ á áľáááą áľá, á¨áľáááą á áŤá áľá áĽá á¨ááá
áą áá. ááááŞáŤ áá á¨ááľá°áą áá ááááŞáŤ ááŁ. áá° áá¨á¨áťá áŚáł á¨á°ááᨠá ááᣠáá ááá˝ á áĽáĽá ááĽááľ ááľáŤáľ áááŠá˘ áááá ááá ááá¨á á°áá á¨áĄá áĽáá°áá ááá á áĽá áááĄá áĽáá°áá ááŤá áŤáľááááá ClickHouse á á˛áľá áá áŤááá áá¨á áĽáá°áá ááá°áá°á. áá
á¨áŁáľ ááá áááŁáľááá
á áá°áá°á ááá ááľáĽ áá ááŤá°áľ áĽááłáá áľ áĽá áá°áĽ áĽáŠ ááłáĽ ááá˘
á á°á¨ááŞá á¨áááŤáá˛ááᲠá¨ááἠá áááľ á á ááťáŤáááľ á á áἠáá áľáŞáśá˝ ááľáĽ áĽáá°áłá¨ áἠááŁá áááŁá. á áá ááá áľ áá áá á°á áŤáá˛áᲠ(áĽááľ á ááŤáŽá˝) ááá¸á ááľáŽá˝ á¨áłáá áá¨á áá á á áĽá á ááááłá.
áľáŞáľ 19.6 á á áá áá áĽá á áá á¨áá á˛áá áá° á á˛áą áľáŞáľ ááááá á á á°ááᢠáĽáá° Adaptive GranularityᣠSkipping Indices áĽá DoubleDelta Codecᣠáááłá áľáá áŁá áŞáŤáľ á áá¸áá˘
á ááŁáŞ, á ááŤá áá, á¨ááá˘áŤ á°á¨á ááá¨áłá°á á°áááĽáŻá. ááááŚáš áá˝á¨á¨á¨áŤá áĽá ááááŁá, áá á á°ááłáłá áá áĽáľá¨ áááŁááľ áľá¨áľ áá°áá. ááá ááááľ á¨áá, á¨ááľá ááá፠á°á¨ááá áááááľ áá˝áá, á¨á፠á¨áááἠááľáłááťá áá á á á¨áá°á áááł ááááłá. á¨áááἠááľáłááťá á config.xml ááá ááľáĽ á°ááá áˇááĄ
<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>
á ááłááľ á áá áľáááá˝
ĐĐžŃкОНŃĐşŃ ĐžŃигинаНŃĐ˝ŃĐľ пакоŃŃ ŃŃŃанОвки ŃОйиŃĐ°ŃŃŃŃ ĐżĐž Debian, ŃĐž Đ´ĐťŃ Đ´ŃŃгиŃ
воŃŃиК Linux ноОйŃ
ОдиПО иŃпОНŃСОваŃŃ ĐżĐ°ĐşĐľŃŃ ŃОйŃаннŃĐľ кОПпаниоК Altinity.
ĐĐžŃ ĐżĐž ŃŃОК ŃŃŃНко ĐľŃŃŃ Đ¸Đ˝ŃŃŃŃĐşŃии Ń ŃŃŃНкаПи на иŃ
ŃопОСиŃĐžŃиК: https://www.altinity.com/blog/2017/12/18/logstash-with-clickhouse
sudo yum search clickhouse-server
sudo yum install clickhouse-server.noarch
1. ĐżŃОвоŃка ŃŃĐ°ŃŃŃĐ°
sudo systemctl status clickhouse-server
2. ĐžŃŃанОвка ŃĐľŃвоŃĐ°
sudo systemctl stop clickhouse-server
3. СапŃŃĐş ŃĐľŃвоŃĐ°
sudo systemctl start clickhouse-server
ĐĐ°ĐżŃŃĐş Đ´ĐťŃ Đ˛ŃĐżĐžĐťĐ˝ĐľĐ˝Đ¸Ń ĐˇĐ°ĐżŃĐžŃОв в ПнОгОŃŃŃĐžŃнОП ŃоМиПо (вŃпОНнонио пОŃНо Снака ";")
clickhouse-client --multiline
clickhouse-client --multiline --host 127.0.0.1 --password pa55w0rd
clickhouse-client --multiline --host 127.0.0.1 --port 9440 --secure --user default --password pa55w0rd
ĐНагин кНикНаŃСа Đ´ĐťŃ ĐťĐžĐłŃŃĐľŃ Đ˛ ŃĐťŃŃĐ°Đľ ĐžŃийки в ОднОК ŃŃŃОко ŃĐžŃ
ŃĐ°Đ˝ŃĐľŃ Đ˛ŃŃ ĐżĐ°ŃĐşŃ Đ˛ ŃаКН /tmp/log_web_failed.json
ĐОМнО вŃŃŃĐ˝ŃŃ Đ¸ŃĐżŃавиŃŃ ŃŃĐžŃ ŃаКН и пОпŃОйОваŃŃ ĐˇĐ°ĐťĐ¸ŃŃ ĐľĐłĐž в ĐРвŃŃŃĐ˝ŃŃ:
clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed.json /etc/logstash/tmp/log_web_failed__fixed.json
sudo chown user_dev /etc/logstash/tmp/log_web_failed__fixed.json
sudo clickhouse-client --host 127.0.0.1 --password password --query="INSERT INTO log_web FORMAT JSONEachRow" < /etc/logstash/tmp/log_web_failed__fixed.json
sudo mv /etc/logstash/tmp/log_web_failed__fixed.json /etc/logstash/tmp/log_web_failed__fixed_.json
вŃŃ
Од иС кОПанднОК ŃŃŃОки
quit;
## ĐĐ°ŃŃŃОКка TLS
https://www.altinity.com/blog/2019/3/5/clickhouse-networking-part-2
openssl s_client -connect log.domain.com:9440 < /dev/null
logstash. áŤáá°áá á¨áááá˘áľ áá° RabbitMQ áá¨á áŤáľááĄ
áá á áŤá á¨áááá˘áľ á¨áááĄáľá áááἠááľáłááťáá˝ áá° RabbitMQ áá¨á ááááŤáľ áá á ááᢠáĽáá áááľ ááĽáŚá˝ á á.
- áĽáá° á áááłá°á áá FileBeat á ááĽáł áá° RabbitMQ á¨áá˝á á¨áá¤áľ á°á°áŞ á¨áááᢠáĽá áĽáá°áá á áááľ á°ááŁáŤáááľ, á github áá áŁáá ááłá áá á áááá, ááľáá ፠á¨áłáá° á áá°áá. ááŤá፠áááá á áᣠáá á áá ááááŤáľ á á¤áľ ááľáĽ ááá ááá áľ á áá˝ááá˘
- á DMZ ááľáĽ áááἠááľáłááťáá˝á ááá°áĽá°áĽ ááľáááśá˝ á á. á áĽááą áá á áááľá¨áľ, áááἠááľáłááťááš ááááŞáŤ áá° áá¨áá áá¨áá á ááŁá¸á á¨ááŤá LogStash ááááŚášá á¨áá¨áá á¨áá áŤááŁá.
áľááá , á ááľ á°á áľáá˝ á¨á°ááłá°á áĽá áľ áá áá áŤáá áľ á á˛á¤áá¤áľ ááľáĽ á ááááŽá˝ á áááá áľ áá áá. á¨ááłá áá á áá á áááľááá˘
iis_w3c_logs__filebeat_rabbitmq.conf
input {
beats {
port => 5044
type => 'iis'
ssl => true
ssl_certificate_authorities => ["/etc/pki/tls/certs/app/ca.pem", "/etc/pki/tls/certs/app/ca-issuing.pem"]
ssl_certificate => "/etc/pki/tls/certs/app/queue.domain.com.cer"
ssl_key => "/etc/pki/tls/certs/app/queue.domain.com-pkcs8.key"
ssl_verify_mode => "peer"
}
}
output {
#stdout {codec => rubydebug}
rabbitmq {
host => "127.0.0.1"
port => 5672
exchange => "monitor.direct"
exchange_type => "direct"
key => "%{[fields][fld_app_name]}"
user => "q-writer"
password => "password"
ssl => false
}
}
RabbitMQ á¨áááááľ áá¨á
áá á áŤá á DMZ ááľáĽ á¨áááἠááľáłááťáá˝á áááľááἠáá á ááᢠáá¨áť á¨áá¨áááá á áááá˘áľ â LogStash áľáĽáľáĽ ááᢠááá ἠá¨ááŤáá°á á¨DMZ á᪠á LogStash á áŠá ááᢠá RabboitMQ á áŠá á˛á°áŤ á á°á¨ááľ áá° 4 áşá á¨áá á áááĽááśá˝ ááľá°áááłáá˘
á¨áááĽááľ ááááá á áľáááľ áľá á¨á°ááᨠááᣠáááľá á áááá˘áľ áá á ááἠáá á áááľá¨áľá˘ ááá áááááśá˝ áá° á ááľ áá¨á áááłáᢠá áá ááááŤáľ á¨áá¨á á áááááľ á¨áá áá áá° áááĽááśá˝ ááĽááľ á áááŤá: FileBeats á¨áááááľ áľá á°áśá˝á ááá áá áĽá áááá áááá áŤááá. áĽá LogStash á¨áá¨áá áá á¨ááŤáἠá¨á ááłá¨ áá¨áĽ áľá á°áśá˝á ááá áá áĽá áááááą áá°áá á¨á áľ áĽáľáŞáááľ áľá¨áľ áá áĽááᢠá áá áááł, áááĄ, á áĽáááĽ, á¨á áá á áá áá° á¨ááἠááł á ááťáá.
á¨áá¨á°ááľ áááŞáŤáá˝ áá¨ááá˝á áááá á áĽá ááááá áĽá á áá ááááá˘
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare exchange --vhost=/ name=monitor.direct type=direct sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin declare queue --vhost=/ name=web_log durable=true
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site1.domain.ru"
sudo /usr/local/bin/rabbitmqadmin/rabbitmqadmin --vhost="/" declare binding source="monitor.direct" destination_type="queue" destination="web_log" routing_key="site2.domain.ru"
ááŤáá áłá˝áŚááśá˝
áá á áŤá á¨ááľáľá áááĽá á ááľá áááłá¨áľ áŤáááááᢠá áá á ááŁá áááŤáá 4.6+ áááá ᨠClickHouse áłáł áááá ááŤá á ááŚáľá˘ á áłá˝áŚááą áá á¨SQL ááŁáŞáŤáá˝á á¨ááľáŹáľ á ááĽááá áááťáťá áľáá˝ ááľá°áŤá¨á áá á¨áĽáá˘
áááłá, á°ááááŽá˝á áĽáá áááá, áĽá á ááŁáŞáŤá ááľá ááľáĽ áŤáá°áááŠ, á á áš WHERE ( uriStem = Âť AND uriStem ! = Âť) ááľáĽ áááłá áĽááłáŤáᣠáĽáááááá. á áá á ááŁá ClickHouse ᨠuriStem á ááľ áŤááŁáᢠá á á áááᣠá¨á°ááŤáŠ á ááŤáŽá˝á ááá¨á á áá¨á¨áť á°á°áŞáá á áľá°áŤáááá (á¨$valueIfEmpty áááŽ) áŁáś áĽá´áľ á¨áá áá á ááąá áłáá á áľ 1 ááááłáá˘
áĽá á áá áá áá áá áá áááŤá áá áá áá˝ááá˘
$columns(response, count(*) c) from $table where $adhoc
and $valueIfEmpty($fld_app_name, 1, fld_app_name = '$fld_app_name')
and $valueIfEmpty($fld_app_module, 1, fld_app_module = '$fld_app_module') and $valueIfEmpty($fld_server_name, 1, fld_server_name = '$fld_server_name') and $valueIfEmpty($uriStem, 1, uriStem like '%$uriStem%')
and $valueIfEmpty($clientRealIP, 1, clientRealIP = '$clientRealIP')
áá° SQL áĽáá°áá áá°á¨ááá (áŁáś ᨠuriStem ááľáŽá˝ áá° 1 áĽáť áĽáá°á°áá¨áŠ áἠáá á)
SELECT
t,
groupArray((response, c)) AS groupArr
FROM (
SELECT
(intDiv(toUInt32(logdatetime), 60) * 60) * 1000 AS t, response,
count(*) AS c FROM default.log_web
WHERE (logdate >= toDate(1565061982)) AND (logdatetime >= toDateTime(1565061982)) AND 1 AND (fld_app_name = 'site1.domain.ru') AND (fld_app_module = 'web') AND 1 AND 1 AND 1
GROUP BY
t, response
ORDER BY
t ASC,
response ASC
)
GROUP BY t ORDER BY t ASC
áá°áá°ááŤ
ᨠClickHouse áłáłá¤á áá˝áł á áá áŤá ááľáĽ áľáá áŚáł á¨áá°á á ááľá°áľ áááᢠáá á áá á¨áá፠áá á áá á á˝á áľ á¨áľáá áá¨á áá áááľáŤáľ áááá áĽá á°ááŁáŤá ááłáŞáŤ áĽáá°áŤáá ááááľ á¨áŁáľ áá áᢠáĽááἠááᣠááááśá˝ áĽá¨á¨áአá˛ááą (áááłáᣠáááŤáľ áĽá áá° áĽá á ááááŽá˝ ááŁááľ) áĽá áą áá áἠá¨á°ááłá°á ááááᢠáá á ááááŞáŤ áááá¤áὠᣠá¨áá á¨ááἠááł áá á áĽáŽ ááĽáŤáľ á áŁá á áľá°áłá˝ ááᢠáááą "áá°áá˝" á¨á°á°áŤ áááá áá¨áľ ááťáá.
ᨠElasticSearch áá á˛áááá á¨áá¨ááť áĽá á¨ááááŁá áŞáŤ áá á¨á ááľáľ áĽáľá¨ á áľá áĽáĽá áĽáá°ááááľ ááááłáᢠá áá á áááá á áá ááá á¨áá¨á áá á á¨á ááŤáł áá˝áá˝ áááľá°á áááááľ áŤááĽá ClickHouse áľáá áá á ááľ á ááľá°á ááá áŤáá áá˝á áá áááᢠá áᣠá áĽáááĽáŁ ElasticSearch á á˛áľá áá á¨áá¨á áá¨ááŞáŤ áá´áá˝ áĽá ááá˝ á¨ááĽáľ áááłá á áĽá á á¨ááááą áŁá áŞáŤáľ á ááľáŁ ááá áá ᨠClickHouse áá á˛ááłá°á áá á¨á áá ááľ ááááá˘
á áĽá á áŠá ááá áአáááťá¸áľ á¨áá á ááŁáŞ á áá áśá˝ áá, áááĽá ááŤá áĽá á¨áá¨á ááľ ááľáĽ ááá¨áĽ á ááŤáľá°áá ááĽááľ áá°áŤá. áĽáľáŤáá áĽá áá¨á á¨ááá (áá° 200 áááŽá ááááŚá˝) ᣠáá á áááአáŤáą á°áŤá ááᢠáá áá ááłáŞáŤ ááá°ááą áááἠááľáłááťáá˝á á¨áá áŤáá áá áá°áŤáŤá ááá˝ ááááá˝ ááá ááá áľ áĽáá˝ááá. áááłá, á¨áŤá áĽáľá¨ áŤá áľááłá, á á°á áááľ ááľá, á¨áá˝á áľáá ááľ.
á áá¨á¨áť ᣠáľá áĽá ááš áĽá ááłáśá˝ áľáá˝á˘
ĐинŃŃŃ
- á áľááá áľáĽáľáŚá˝ ááááŚá˝á á ááŤá áá. á á ááľ á áŠá, áá áŁá ᪠áá, ááá áá á ááá á°á¨á᪠áááá˝á á ááááŚá˝ áá፠áá áá á ááĽááľ. áá á°ááŁá áááá ááá á áá°áá, áá á ááá áááł á¨áá˝á áá. áĽá áĽá áąá ááá ááľá¨á áĽááááá.
- á ááłááľ áŤáá°áááą á°ááŁáŤáľ ááá á á˛áľ áŁá áŞáŤáľ áĽááá áá á á á˛áľ áľáŞáśá˝ ááľáĽ áá°á áŤá. áá ááááľá áŤáľá¨áľáá, áá° á á˛áľ áľáŞáľ á¨ááťáťá ááááľ ááááłá. áááłá, á¨áŤá፠á¨á á¨á´á áá°á á¸áážá˝á áłáá°áá አá¨áŤá፠ááľá°áśá˝á á ááĽáł áĽáá˛áŤáᥠá¨ááŤáľá˝áá á áŁá á áá áŁá ᪠áá. ááá áá á github áá áŁá ááłáŽá˝ áĽááľ á áááá áá áá áá°á á áááľ ááľáĽ áĽááłáá áá á ááá áĽáá áááááᢠááá áľááá°á ááááśá˝á áá° áá áŤáá°á¨á áĽá áááá á°ááŁá áŤáá°á áá á¨á፠á á°á¨áá áááł áá°áŤáá˘
á°áá
- á áááááá˘
- áá á°á á¨ááá˘áŤ áá°áĽá˘
- áááľ ááá.
- ááá.
- áááá˝ á á°áἠ(á¨áłáĽá ááľáĽ áá¨ááá/ááŁááľ)
- á áŽáááŹá˝á áááľá´á á¨á°á ááá á¨áŠáľáŤ áśááľáá áááἠááľáĽ á°áŤáľáˇá.
- ᨠYandex áŚáá´áá áľáá ááááľ.
ááá: hab.com