Bofya Hifadhidata ya Wanadamu, au Teknolojia za Alien

Aleksey Lizunov, Mkuu wa Kituo cha Umahiri cha Njia za Huduma za Mbali cha Kurugenzi ya Teknolojia ya Habari ya MKB.

Bofya Hifadhidata ya Wanadamu, au Teknolojia za Alien

Kama mbadala wa mrundikano wa ELK (ElasticSearch, Logstash, Kibana), tunafanya utafiti kuhusu kutumia hifadhidata ya ClickHouse kama hifadhi ya data ya kumbukumbu.

Katika makala hii, tungependa kuzungumza juu ya uzoefu wetu wa kutumia database ya ClickHouse na matokeo ya awali ya uendeshaji wa majaribio. Ikumbukwe mara moja kwamba matokeo yalikuwa ya kuvutia.


Bofya Hifadhidata ya Wanadamu, au Teknolojia za Alien

Ifuatayo, tutaelezea kwa undani zaidi jinsi mfumo wetu umeundwa, na inajumuisha vipengele gani. Lakini sasa ningependa kuzungumza kidogo juu ya hifadhidata hii kwa ujumla, na kwa nini inafaa kulipa kipaumbele. Hifadhidata ya ClickHouse ni hifadhidata ya safu ya uchambuzi wa utendaji wa juu kutoka kwa Yandex. Inatumika katika huduma za Yandex, awali ni hifadhi kuu ya data kwa Yandex.Metrica. Mfumo wa chanzo-wazi, bure. Kwa mtazamo wa msanidi programu, nimekuwa nikijiuliza jinsi walivyoitekeleza, kwa sababu kuna data kubwa sana. Na kiolesura cha mtumiaji wa Metrica yenyewe ni rahisi sana na haraka. Katika kufahamiana kwa kwanza na hifadhidata hii, maoni ni: "Kweli, mwishowe! Imeundwa kwa ajili ya watu! Kuanzia mchakato wa usakinishaji na kuishia na kutuma maombi.

Hifadhidata hii ina kizingiti cha chini sana cha kuingia. Hata msanidi programu mwenye ujuzi wa wastani anaweza kusakinisha hifadhidata hii kwa dakika chache na kuanza kuitumia. Kila kitu hufanya kazi wazi. Hata watu ambao ni wapya kwa Linux wanaweza kushughulikia usakinishaji haraka na kufanya shughuli rahisi zaidi. Ikiwa hapo awali, kwa maneno Big Data, Hadoop, Google BigTable, HDFS, msanidi programu wa kawaida alikuwa na maoni kwamba ilikuwa juu ya baadhi ya terabytes, petabytes, kwamba baadhi ya watu wa juu wanahusika katika mipangilio na maendeleo ya mifumo hii, basi kwa ujio wa ClickHouse. hifadhidata, tulipata zana rahisi, inayoeleweka ambayo unaweza kutatua kazi nyingi ambazo hazikuweza kufikiwa hapo awali. Inachukua tu mashine moja ya wastani na dakika tano kusakinisha. Hiyo ni, tulipata hifadhidata kama, kwa mfano, MySql, lakini tu kwa kuhifadhi mabilioni ya rekodi! Jalada fulani bora lenye lugha ya SQL. Ni kama watu walikabidhiwa silaha za wageni.

Kuhusu mfumo wetu wa ukataji miti

Ili kukusanya taarifa, faili za kumbukumbu za IIS za utumizi wa kawaida wa wavuti hutumiwa (pia kwa sasa tunachanganua kumbukumbu za programu, lakini lengo kuu katika hatua ya majaribio ni kukusanya kumbukumbu za IIS).

Kwa sababu mbalimbali, hatukuweza kuacha kabisa stack ya ELK, na tunaendelea kutumia vipengele vya LogStash na Filebeat, ambavyo vimejidhihirisha vizuri na kufanya kazi kwa uaminifu na kutabirika kabisa.

Mpango wa jumla wa ukataji miti unaonyeshwa kwenye takwimu hapa chini:

Bofya Hifadhidata ya Wanadamu, au Teknolojia za Alien

Kipengele cha kuandika data kwenye hifadhidata ya ClickHouse si mara kwa mara (mara moja kwa sekunde) kuingizwa kwa rekodi katika makundi makubwa. Hii, inaonekana, ndiyo sehemu ya "tatizo" zaidi ambayo hukutana nayo unapopata uzoefu wa kwanza wa kufanya kazi na hifadhidata ya ClickHouse: mpango unakuwa ngumu zaidi.
Programu-jalizi ya LogStash, ambayo huingiza data moja kwa moja kwenye ClickHouse, ilisaidia sana hapa. Sehemu hii imetumwa kwenye seva sawa na hifadhidata yenyewe. Kwa hiyo, kwa ujumla, haipendekezi kuifanya, lakini kutoka kwa mtazamo wa vitendo, ili si kuzalisha seva tofauti wakati inatumiwa kwenye seva moja. Hatukuona mapungufu yoyote au migongano ya rasilimali na hifadhidata. Kwa kuongeza, ni lazima ieleweke kwamba Plugin ina utaratibu wa kujaribu tena katika kesi ya makosa. Na katika kesi ya makosa, programu-jalizi huandika kwa diski kundi la data ambalo halikuweza kuingizwa (fomati ya faili ni rahisi: baada ya kuhariri, unaweza kuingiza kwa urahisi kundi lililosahihishwa kwa kutumia clickhouse-mteja).

Orodha kamili ya programu inayotumiwa katika mpango imewasilishwa kwenye jedwali:

Orodha ya programu zinazotumiwa

Jina

Description

Kiungo cha usambazaji

NGINX

Wakala wa kinyume kwa kuzuia ufikiaji kwa mlango na uidhinishaji wa kuandaa

Hivi sasa haitumiki katika mpango

https://nginx.org/ru/download.html

https://nginx.org/download/nginx-1.16.0.tar.gz

FileBeat

Uhamisho wa kumbukumbu za faili.

https://www.elastic.co/downloads/beats/filebeat (kit cha usambazaji kwa Windows 64bit).

https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.3.0-windows-x86_64.zip

logstash

Mkusanyaji wa logi.

Inatumika kukusanya kumbukumbu kutoka kwa FileBeat, na pia kukusanya kumbukumbu kutoka kwa foleni ya RabbitMQ (kwa seva zilizo katika DMZ.)

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

Logstash-output-clickhouse

Programu-jalizi ya Loagstash ya kuhamisha kumbukumbu kwa hifadhidata ya ClickHouse katika vikundi

https://github.com/mikechris/logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin sakinisha logstash-output-clickhouse

/usr/share/logstash/bin/logstash-plugin sakinisha logstash-filter-prune

/usr/share/logstash/bin/logstash-plugin sakinisha logstash-filter-multiline

Bonyeza Nyumba

Hifadhi ya kumbukumbu https://clickhouse.yandex/docs/ru/

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-server-19.5.3.8-1.el7.x86_64.rpm

https://packagecloud.io/Altinity/clickhouse/packages/el/7/clickhouse-client-19.5.3.8-1.el7.x86_64.rpm

Kumbuka. Kuanzia Agosti 2018, rpm "ya kawaida" hujenga kwa RHEL ilionekana kwenye hifadhi ya Yandex, ili uweze kujaribu kuzitumia. Wakati wa ufungaji, tulikuwa tukitumia vifurushi vilivyojengwa na Altinity.

grafana

Taswira ya kumbukumbu. Kuweka dashibodi

https://grafana.com/

https://grafana.com/grafana/download

Redhat & Centos(64 Bit) - toleo la hivi karibuni

Bofya chanzo cha data cha Grafana 4.6+

Programu-jalizi ya Grafana iliyo na chanzo cha data cha ClickHouse

https://grafana.com/plugins/vertamedia-clickhouse-datasource

https://grafana.com/api/plugins/vertamedia-clickhouse-datasource/versions/1.8.1/download

logstash

Kipanga njia kutoka kwa FileBeat hadi kwenye foleni ya RabbitMQ.

Kumbuka. Kwa bahati mbaya, FileBeat haina pato moja kwa moja kwa RabbitMQ, kwa hivyo kiungo cha kati katika mfumo wa Logstash kinahitajika.

https://www.elastic.co/products/logstash

https://artifacts.elastic.co/downloads/logstash/logstash-7.0.1.rpm

SunguraMQ

foleni ya ujumbe. Hii ni bafa ya kumbukumbu katika DMZ

https://www.rabbitmq.com/download.html

https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm

Erlang Runtime (Inahitajika kwa RabbitMQ)

Wakati wa kukimbia wa Erlang. Inahitajika kwa RabbitMQ kufanya kazi

http://www.erlang.org/download.html

https://www.rabbitmq.com/install-rpm.html#install-erlang http://www.erlang.org/downloads/21.3

Usanidi wa seva na hifadhidata ya ClickHouse umewasilishwa kwenye jedwali lifuatalo:

Jina

Thamani

Kumbuka

Usanidi

HDD: 40GB
RAM: 8GB
Kichakataji: Core 2 2Ghz

Inahitajika kuzingatia vidokezo vya kuendesha hifadhidata ya ClickHouse (https://clickhouse.yandex/docs/ru/operations/tips/)

Programu ya mfumo mzima

Mfumo wa Uendeshaji: Red Hat Enterprise Linux Server (Maipo)

JRE (Java 8)

 

Kama unaweza kuona, hii ni kazi ya kawaida.

Muundo wa jedwali la kuhifadhi magogo ni kama ifuatavyo.

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;

Tunatumia ugawaji chaguo-msingi (kwa mwezi) na uzito wa faharasa. Sehemu zote zinahusiana na maingizo ya logi ya IIS kwa maombi ya http ya ukataji miti. Kando, tunaona kuwa kuna sehemu tofauti za kuhifadhi vitambulisho vya utm (zimechanganuliwa katika hatua ya kuingiza kwenye jedwali kutoka kwa safu ya kamba ya hoja).

Pia, mashamba kadhaa ya mfumo yameongezwa kwenye meza ili kuhifadhi habari kuhusu mifumo, vipengele, seva. Tazama jedwali hapa chini kwa maelezo ya nyanja hizi. Katika meza moja, tunahifadhi magogo kwa mifumo kadhaa.

Jina

Description

Mfano

fld_app_name

Jina la programu/mfumo
Thamani halali:

  • site1.domain.com Tovuti ya nje 1
  • site2.domain.com Tovuti ya nje 2
  • Tovuti ya ndani-site1.domain.local Tovuti ya Ndani 1

tovuti1.domain.com

fld_programu_moduli

Moduli ya mfumo
Thamani halali:

  • wavuti - Tovuti
  • svc - Huduma ya tovuti
  • intgr - Huduma ya Wavuti ya Ujumuishaji
  • bo - Msimamizi (Ofisi ya Nyuma)

mtandao

fld_tovuti_jina

Jina la tovuti katika IIS

Mifumo kadhaa inaweza kupelekwa kwenye seva moja, au hata matukio kadhaa ya moduli moja ya mfumo

mtandao mkuu

fld_server_name

Jina la seva

web1.domain.com

fld_log_file_name

Njia ya faili ya logi kwenye seva

Kutoka:inetpublogsLogFiles
W3SVC1u_ex190711.log

Hii hukuruhusu kuunda grafu kwa ufanisi huko Grafana. Kwa mfano, tazama maombi kutoka upande wa mbele wa mfumo fulani. Hii ni sawa na counter counter katika Yandex.Metrica.

Hapa kuna takwimu za matumizi ya hifadhidata kwa miezi miwili.

Idadi ya rekodi zilizovunjwa na mifumo na vipengele vyake

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.)

Kiasi cha data kwenye diski

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.

Kiwango cha mbano wa data katika safu wima

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.

Maelezo ya vipengele vilivyotumika

FileBeat. Kuhamisha kumbukumbu za faili

Sehemu hii inafuatilia mabadiliko ya kuweka faili kwenye diski na kupitisha habari kwa LogStash. Imewekwa kwenye seva zote ambapo faili za logi zimeandikwa (kawaida IIS). Inafanya kazi katika hali ya mkia (yaani, huhamisha rekodi zilizoongezwa tu kwenye faili). Lakini tofauti inaweza kusanidiwa kuhamisha faili nzima. Hii ni muhimu unapohitaji kupakua data kutoka miezi iliyopita. Weka tu faili ya kumbukumbu kwenye folda na itaisoma kwa ukamilifu.

Huduma inapoacha, data huacha kuhamishwa zaidi kwenye hifadhi.

Mfano wa usanidi unaonekana kama hii:

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. Mkusanyaji wa logi

Kipengele hiki kimeundwa kupokea maingizo ya kumbukumbu kutoka kwa FileBeat (au kupitia foleni ya RabbitMQ), kuchanganua na kuingiza mafungu kwenye hifadhidata ya ClickHouse.

Kwa kuingizwa kwenye ClickHouse, programu-jalizi ya Logstash-output-clickhouse inatumika. Programu-jalizi ya Logstash ina utaratibu wa kurudisha maombi, lakini wakati wa kuzima mara kwa mara, ni bora kusimamisha huduma yenyewe. Inaposimamishwa, ujumbe utajilimbikiza kwenye foleni ya RabbitMQ, hivyo ikiwa kuacha ni kwa muda mrefu, basi ni bora kuacha Filebeats kwenye seva. Katika mpango ambapo RabbitMQ haitumiki (kwenye mtandao wa ndani Filebeat hutuma moja kwa moja kumbukumbu kwa Logstash), Filebeats hufanya kazi kukubalika kabisa na salama, kwa hiyo kwao kutopatikana kwa pato hakuna matokeo.

Mfano wa usanidi unaonekana kama hii:

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"

ClickHouse. Hifadhi ya kumbukumbu

Kumbukumbu za mifumo yote zimehifadhiwa kwenye meza moja (tazama mwanzoni mwa makala). Imekusudiwa kuhifadhi habari kuhusu maombi: vigezo vyote vinafanana kwa miundo tofauti, kama vile kumbukumbu za IIS, kumbukumbu za apache na nginx. Kwa kumbukumbu za maombi, ambayo, kwa mfano, makosa, ujumbe wa habari, maonyo yameandikwa, meza tofauti itatolewa na muundo unaofaa (sasa katika hatua ya kubuni).

Wakati wa kuunda meza, ni muhimu sana kuamua juu ya ufunguo wa msingi (ambayo data itapangwa wakati wa kuhifadhi). Kiwango cha mfinyazo wa data na kasi ya hoja hutegemea hii. Katika mfano wetu, ufunguo ni
AGIZA KWA (fld_app_name, fld_app_module, logdatetime)
Hiyo ni, kwa jina la mfumo, jina la sehemu ya mfumo na tarehe ya tukio. Hapo awali, tarehe ya tukio ilikuja kwanza. Baada ya kuihamisha hadi mahali pa mwisho, maswali yalianza kufanya kazi karibu mara mbili haraka. Kubadilisha ufunguo msingi kutahitaji kuunda upya jedwali na kupakia upya data ili ClickHouse ipange upya data kwenye diski. Huu ni operesheni nzito, kwa hivyo ni wazo nzuri kufikiria mengi juu ya kile kinachopaswa kujumuishwa kwenye kitufe cha kupanga.

Inapaswa pia kuzingatiwa kuwa aina ya data ya LowCardinality imeonekana kiasi katika matoleo ya hivi karibuni. Wakati wa kuitumia, saizi ya data iliyoshinikwa hupunguzwa sana kwa sehemu hizo ambazo zina kadinali ya chini (chaguo chache).

Toleo la 19.6 linatumika kwa sasa na tunapanga kujaribu kusasisha hadi toleo jipya zaidi. Zina sifa nzuri kama vile Granularity Adaptive, Fahirisi za Kuruka na kodeki ya DoubleDelta, kwa mfano.

Kwa chaguo-msingi, wakati wa ufungaji, ngazi ya magogo imewekwa ili kufuatilia. Magogo yanazungushwa na kuhifadhiwa kwenye kumbukumbu, lakini wakati huo huo hupanua hadi gigabyte. Ikiwa hakuna haja, basi unaweza kuweka kiwango cha onyo, basi ukubwa wa logi umepunguzwa kwa kiasi kikubwa. Mpangilio wa ukataji miti umewekwa katika faili ya config.xml:

<!-- Possible levels: https://github.com/pocoproject/poco/blob/develop/Foundation/include/Poco/Logger. h#L105 -->
<level>warning</level>

Baadhi ya amri muhimu

Поскольку оригинальные пакеты установки собираются по 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. Kipanga njia kutoka kwa FileBeat hadi kwenye foleni ya RabbitMQ

Kipengele hiki kinatumika kuelekeza kumbukumbu kutoka kwa FileBeat hadi kwenye foleni ya RabbitMQ. Kuna pointi mbili hapa:

  1. Kwa bahati mbaya, FileBeat haina programu jalizi ya kuandika moja kwa moja kwa RabbitMQ. Na utendaji kama huo, kwa kuzingatia suala kwenye github yao, haujapangwa kwa utekelezaji. Kuna programu-jalizi ya Kafka, lakini kwa sababu fulani hatuwezi kuitumia nyumbani.
  2. Kuna mahitaji ya kukusanya kumbukumbu katika DMZ. Kulingana nao, kumbukumbu lazima kwanza ziongezwe kwenye foleni na kisha LogStash inasoma maingizo kutoka kwenye foleni kutoka nje.

Kwa hiyo, ni kwa kesi ambapo seva ziko katika DMZ kwamba mtu anapaswa kutumia mpango huo ngumu kidogo. Mfano wa usanidi unaonekana kama hii:

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. foleni ya ujumbe

Kipengele hiki kinatumika kuakibisha maingizo ya kumbukumbu katika DMZ. Kurekodi hufanywa kupitia kundi la Filebeat → LogStash. Usomaji unafanywa kutoka nje ya DMZ kupitia LogStash. Wakati wa kufanya kazi kupitia RabboitMQ, karibu ujumbe elfu 4 kwa sekunde huchakatwa.

Uelekezaji wa ujumbe husanidiwa na jina la mfumo, yaani, kulingana na data ya usanidi wa FileBeat. Ujumbe wote huenda kwenye foleni moja. Ikiwa kwa sababu fulani huduma ya foleni imesimamishwa, hii haitasababisha kupoteza ujumbe: FileBeats itapokea hitilafu za uunganisho na itaacha kutuma kwa muda. Na LogStash, ambayo inasoma kutoka kwenye foleni, pia itapokea makosa ya mtandao na kusubiri uunganisho urejeshwe. Katika kesi hii, data, bila shaka, haitaandikwa tena kwenye hifadhidata.

Maagizo yafuatayo hutumiwa kuunda na kusanidi foleni:

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"

Grafana. Dashibodi

Kipengele hiki kinatumika kuibua data ya ufuatiliaji. Katika kesi hii, unahitaji kusakinisha chanzo cha data cha ClickHouse kwa programu-jalizi ya Grafana 4.6+. Ilitubidi kuirekebisha kidogo ili kuboresha ufanisi wa kuchakata vichujio vya SQL kwenye dashibodi.

Kwa mfano, tunatumia vigeu, na ikiwa havijabainishwa katika uga wa chujio, basi tungependa isitoe hali katika WAPI ya fomu ( uriStem = "NA uriStem != "). Katika kesi hii, ClickHouse itasoma safu wima ya uriStem. Kwa hivyo, tulijaribu chaguo tofauti na hatimaye tukasasisha programu-jalizi ($valueIfEmpty macro) ili kurudisha 1 ikiwa thamani tupu, bila kutaja safu yenyewe.

Na sasa unaweza kutumia swali hili kwa grafu

$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')

ambayo hutafsiri kwa SQL hii (kumbuka kuwa sehemu tupu za uriStem zimebadilishwa kuwa 1 tu)

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

Hitimisho

Kuonekana kwa hifadhidata ya ClickHouse imekuwa tukio la kihistoria kwenye soko. Ilikuwa ngumu kufikiria kuwa mara moja, bila malipo kabisa, tulikuwa na zana yenye nguvu na ya vitendo ya kufanya kazi na data kubwa. Kwa kweli, mahitaji yanapoongezeka (kwa mfano, kugawa na kurudia kwa seva nyingi), mpango utakuwa ngumu zaidi. Lakini kulingana na maoni ya kwanza, kufanya kazi na hifadhidata hii ni ya kupendeza sana. Ni wazi kwamba bidhaa hiyo inafanywa "kwa ajili ya watu".

Ikilinganishwa na ElasticSearch, gharama ya kuhifadhi na usindikaji wa kumbukumbu, kulingana na makadirio ya awali, imepunguzwa mara tano hadi kumi. Kwa maneno mengine, ikiwa kwa kiasi cha sasa cha data tutalazimika kuanzisha nguzo ya mashine kadhaa, basi tunapotumia ClickHouse tunahitaji mashine moja ya chini ya nguvu. Ndiyo, bila shaka, ElasticSearch pia ina taratibu za ukandamizaji wa data kwenye diski na vipengele vingine vinavyoweza kupunguza kwa kiasi kikubwa matumizi ya rasilimali, lakini ikilinganishwa na ClickHouse hii itahitaji gharama kubwa zaidi.

Bila uboreshaji wowote maalum kwa upande wetu, kwa mipangilio chaguo-msingi, kupakia data na kuchagua kutoka kwa hifadhidata hufanya kazi kwa kasi ya ajabu. Bado hatuna data nyingi (kama rekodi milioni 200), lakini seva yenyewe ni dhaifu. Tunaweza kutumia zana hii katika siku zijazo kwa madhumuni mengine ambayo hayahusiani na kuhifadhi kumbukumbu. Kwa mfano, kwa uchanganuzi wa mwisho hadi mwisho, katika uwanja wa usalama, kujifunza kwa mashine.

Mwishoni, kidogo juu ya faida na hasara.

Africa

  1. Inapakia rekodi katika makundi makubwa. Kwa upande mmoja, hii ni kipengele, lakini bado unapaswa kutumia vipengele vya ziada ili kuhifadhi kumbukumbu. Kazi hii sio rahisi kila wakati, lakini bado inaweza kutatuliwa. Na ningependa kurahisisha mpango.
  2. Baadhi ya utendakazi wa kigeni au vipengele vipya mara nyingi huvunjwa katika matoleo mapya. Hii husababisha wasiwasi, kupunguza hamu ya kuboresha toleo jipya. Kwa mfano, injini ya meza ya Kafka ni kipengele muhimu sana ambacho kinakuwezesha kusoma moja kwa moja matukio kutoka kwa Kafka, bila kutekeleza watumiaji. Lakini kwa kuzingatia idadi ya Masuala kwenye github, bado tuko makini kutotumia injini hii katika uzalishaji. Walakini, ikiwa hutafanya ishara za ghafla kwa upande na kutumia utendaji kuu, basi inafanya kazi kwa utulivu.

Faida

  1. Haipunguzi.
  2. Kiwango cha chini cha kuingia.
  3. Chanzo-wazi.
  4. Bure.
  5. Mizani vizuri (kugawa/kunakili nje ya boksi)
  6. Imejumuishwa katika rejista ya programu ya Kirusi iliyopendekezwa na Wizara ya Mawasiliano.
  7. Uwepo wa msaada rasmi kutoka kwa Yandex.

Chanzo: mapenzi.com

Kuongeza maoni