ΠΠ»Π΅ΠΊΡΠ΅ΠΉ ΠΠΈΠ·ΡΠ½ΠΎΠ², ΡΡΠΊΠΎΠ²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΡΠ΅Π½ΡΡΠ° ΠΊΠΎΠΌΠΏΠ΅ΡΠ΅Π½ΡΠΈΠΉ Π΄ΠΈΡΡΠ°Π½ΡΠΈΠΎΠ½Π½ΡΡ ΠΊΠ°Π½Π°Π»ΠΎΠ² ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΡ Π΄ΠΈΡΠ΅ΠΊΡΠΈΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ ΠΠΠ
Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Ρ ΡΡΠ΅ΠΊΡ ELK (ElasticSearch, Logstash, Kibana) ΠΌΡ ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ ClickHouse Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Π»ΠΎΠ³ΠΎΠ².
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ Π±Ρ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎ Π½Π°ΡΠ΅ΠΌ ΠΎΠΏΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ ClickHouse ΠΈ ΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°Ρ ΠΏΠΎ ΠΈΡΠΎΠ³Π°ΠΌ ΠΏΠΈΠ»ΠΎΡΠ½ΠΎΠΉ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ. Π‘ΡΠΎΠΈΡ ΠΎΡΠΌΠ΅ΡΠΈΡΡ ΡΡΠ°Π·Ρ, ΡΡΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈΡΡ Π²ΠΏΠ΅ΡΠ°ΡΠ»ΡΡΡΠΈΠ΅.
ΠΠ°Π»Π΅Π΅ ΠΌΡ ΠΎΠΏΠΈΡΠ΅ΠΌ ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π΅Π΅, ΠΊΠ°ΠΊ Ρ Π½Π°Ρ Π½Π°ΡΡΡΠΎΠ΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΠΈ ΠΈΠ· ΠΊΠ°ΠΊΠΈΡ
ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² ΠΎΠ½Π° ΡΠΎΡΡΠΎΠΈΡ. ΠΠΎ ΡΠ΅ΠΉΡΠ°Ρ Ρ
ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ°ΡΡΠΊΠ°Π·Π°ΡΡ ΠΎΠ± ΡΡΠΎΠΉ ΠΠ Π² ΡΠ΅Π»ΠΎΠΌ, ΠΈ ΠΏΠΎΡΠ΅ΠΌΡ Π½Π° Π½Π΅Π΅ ΡΡΠΎΠΈΡ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠΠ ClickHouse β ΡΡΠΎ Π²ΡΡΠΎΠΊΠΎΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π°Π½Π°Π»ΠΈΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΡΠΎΠ»Π±ΡΠΎΠ²Π°Ρ ΠΠ ΠΎΡ Π―Π½Π΄Π΅ΠΊΡΠ°. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠ΅ΡΠ²ΠΈΡΠ°Ρ
Π―Π½Π΄Π΅ΠΊΡΠ°, ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΡΡΠΎ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ Ρ
ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π΄Π°Π½Π½ΡΡ
Π΄Π»Ρ Π―Π½Π΄Π΅ΠΊΡ.ΠΠ΅ΡΡΠΈΠΊΠΈ. Π‘ΠΈΡΡΠ΅ΠΌΠ° open-source, Π±Π΅ΡΠΏΠ»Π°ΡΠ½Π°Ρ. Π‘ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°, ΠΌΠ½Π΅ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ»ΠΎ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΊΠ°ΠΊ ΠΆΠ΅ Ρ Π½ΠΈΡ
ΡΡΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ, Π²Π΅Π΄Ρ ΡΠ°ΠΌ ΡΠ°Π½ΡΠ°ΡΡΠΈΡΠ΅ΡΠΊΠΈ Π±ΠΎΠ»ΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅. Π ΡΠ°ΠΌ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΠ΅ΡΡΠΈΠΊΠΈ ΠΎΡΠ΅Π½Ρ Π³ΠΈΠ±ΠΎΠΊ ΠΈ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π±ΡΡΡΡΠΎ. ΠΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ Π·Π½Π°ΠΊΠΎΠΌΡΡΠ²Π΅ Ρ ΡΡΠΎΠΉ ΠΠ Π²ΠΏΠ΅ΡΠ°ΡΠ»Π΅Π½ΠΈΠ΅: Β«ΠΡ, Π½Π°ΠΊΠΎΠ½Π΅Ρ-ΡΠΎ! Π‘Π΄Π΅Π»Π°Π½ΠΎ Β«Π΄Π»Ρ Π»ΡΠ΄Π΅ΠΉΒ»! ΠΠ°ΡΠΈΠ½Π°Ρ ΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡΠ° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΈ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΎΠΉ Π·Π°ΠΏΡΠΎΡΠΎΠ²Β».
Π£ ΡΡΠΎΠΉ ΠΠ ΠΎΡΠ΅Π½Ρ Π½ΠΈΠ·ΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠ³ Π²Ρ ΠΎΠ΄Π°. ΠΠ°ΠΆΠ΅ ΡΡΠ΅Π΄Π½Π΅ΠΉ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ Π·Π° Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠΈΠ½ΡΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΡΡ ΠΠ ΠΈ Π½Π°ΡΠ°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ. ΠΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠΊΠΎ. ΠΠ°ΠΆΠ΅ Π»ΡΠ΄ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΏΠ»ΠΎΡ ΠΎ Π·Π½Π°ΠΊΠΎΠΌΡ Ρ Linux, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΡΡΡΠΎ ΠΌΠΎΠ³ΡΡ ΡΠΏΡΠ°Π²ΠΈΡΡΡΡ Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ ΠΈ Π΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΡΠ»ΠΈ ΡΠ°Π½ΡΡΠ΅, ΠΏΡΠΈ ΡΠ»ΠΎΠ²Π΅ Big Data, Hadoop, Google BigTable, HDFS, Ρ ΠΎΠ±ΡΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π»ΠΈ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΡΡΠΎ ΡΠ°ΠΌ ΡΠ΅ΡΡ ΠΎ ΠΊΠ°ΠΊΠΈΡ -ΡΠΎ ΡΠ΅ΡΠ°Π±Π°ΠΉΡΠ°Ρ , ΠΏΠ΅ΡΠ°Π±Π°ΠΉΡΠ°Ρ , ΡΡΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΠΌΠΈ ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ Π΄Π»Ρ ΡΡΠΈΡ ΡΠΈΡΡΠ΅ΠΌ Π·Π°Π½ΠΈΠΌΠ°ΡΡΡΡ Π½Π΅ΠΊΠΈΠ΅ ΡΠ²Π΅ΡΡ Π»ΡΠ΄ΠΈ, ΡΠΎ Ρ ΠΏΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΠ ClickHouse ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎΠΉ, ΠΏΠΎΠ½ΡΡΠ½ΡΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ, ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ΅ΡΠ°ΡΡ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ Π½Π΅Π΄ΠΎΡΡΠΈΠΆΠΈΠΌΡΠΉ ΠΊΡΡΠ³ Π·Π°Π΄Π°Ρ. ΠΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π»ΠΈΡΡ ΠΎΠ΄Π½Π° Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΡΡΠ΅Π΄Π½ΡΡ ΠΌΠ°ΡΠΈΠ½Π° ΠΈ ΠΏΡΡΡ ΠΌΠΈΠ½ΡΡ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ. Π’ΠΎ Π΅ΡΡΡ ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΡΠ°ΠΊΡΡ ΠΠ ΠΊΠ°ΠΊ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, MySql, Π½ΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΌΠΈΠ»Π»ΠΈΠ°ΡΠ΄ΠΎΠ² Π·Π°ΠΏΠΈΡΠ΅ΠΉ! ΠΠ΅ΠΊΠΈΠΉ ΡΡΠΏΠ΅ΡΠ°ΡΡ ΠΈΠ²Π°ΡΠΎΡ Ρ ΡΠ·ΡΠΊΠΎΠΌ SQL. ΠΡΠΎ ΠΊΠ°ΠΊ Π±ΡΠ΄ΡΠΎ Π»ΡΠ΄ΡΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π»ΠΈ ΠΎΡΡΠΆΠΈΠ΅ ΠΈΠ½ΠΎΠΏΠ»Π°Π½Π΅ΡΡΠ½.
Π Π½Π°ΡΠ΅ΠΉ ΡΠΈΡΡΠ΅ΠΌΠ΅ ΡΠ±ΠΎΡΠ° Π»ΠΎΠ³ΠΎΠ²
ΠΠ»Ρ ΡΠ±ΠΎΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°ΠΉΠ»Ρ Π»ΠΎΠ³ΠΎΠ² IIS Π²Π΅Π±-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ ΡΠΎΡΠΌΠ°ΡΠ° (ΡΠ°ΠΊΠΆΠ΅ ΡΠ΅ΠΉΡΠ°Ρ ΠΌΡ Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΡΡ ΠΈ ΠΏΠ°ΡΡΠΈΠ½Π³ΠΎΠΌ Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π½ΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°Ρ ΡΠ΅Π»Ρ Π½Π° ΡΡΠ°ΠΏΠ΅ ΠΏΠΈΠ»ΠΎΡΠ½ΠΎΠΉ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ Ρ Π½Π°Ρ β ΡΡΠΎ ΡΠ±ΠΎΡ Π»ΠΎΠ³ΠΎΠ² IIS).
ΠΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡ ΡΡΠ΅ΠΊΠ° ELK Π½Π°ΠΌ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ, ΠΈ ΠΌΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ LogStash ΠΈ Filebeat, ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π»ΠΈ ΡΠ΅Π±Ρ Ρ ΠΎΡΠΎΡΠΎ ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΠΎ ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ΅ΠΌΠΎ.
ΠΠ±ΡΠ°Ρ ΡΡ Π΅ΠΌΠ° Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π½Π° ΡΠΈΡΡΠ½ΠΊΠ΅ Π½ΠΈΠΆΠ΅:
ΠΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ
Π² ΠΠ ClickHouse ΡΠ²Π»ΡΠ΅ΡΡΡ Π½Π΅ΡΠ°ΡΡΠ°Ρ (ΡΠ°Π· Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ) Π²ΡΡΠ°Π²ΠΊΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΠΊΠ°ΠΌΠΈ. ΠΡΠΎ, ΡΡΠ΄Ρ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ, ΡΠ°ΠΌΠ°Ρ Β«ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½Π°ΡΒ» ΡΠ°ΡΡΡ, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΡΠ°Π»ΠΊΠΈΠ²Π°Π΅ΡΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΎΠΏΡΡΠ΅ ΡΠ°Π±ΠΎΡΡ Ρ ΠΠ ClickHouse: ΡΡ
Π΅ΠΌΠ° Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠΆΠ½ΡΠ΅ΡΡΡ.
ΠΠ΄Π΅ΡΡ ΡΠΈΠ»ΡΠ½ΠΎ ΠΏΠΎΠΌΠΎΠ³ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ LogStash, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π°ΠΏΡΡΠΌΡΡ Π²ΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ClickHouse. ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ΅, ΡΡΠΎ ΠΈ ΡΠ°ΠΌΠ° ΠΠ. Π’Π°ΠΊ, Π²ΠΎΠΎΠ±ΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, Π½Π΅ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ Π΄Π΅Π»Π°ΡΡ, Π½ΠΎ Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ, ΡΡΠΎΠ±Ρ Π½Π΅ ΠΏΠ»ΠΎΠ΄ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ°, ΠΏΠΎΠΊΠ° ΠΎΠ½ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡ Π½Π° ΡΠΎΠΌ ΠΆΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ΅. ΠΠΈ ΡΠ±ΠΎΠ΅Π², Π½ΠΈ ΠΊΠΎΠ½ΡΠ»ΠΈΠΊΡΠΎΠ² ΡΠ΅ΡΡΡΡΠΎΠ² Ρ ΠΠ ΠΌΡ Π½Π΅ Π½Π°Π±Π»ΡΠ΄Π°Π»ΠΈ. Π ΡΠΎΠΌΡ ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ Ρ ΠΏΠ»Π°Π³ΠΈΠ½Π° ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½ ΠΌΠ΅Ρ
Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΡΡΠ°Ρ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΎΠΊ. Π Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΈΡΠ΅Ρ Π½Π° Π΄ΠΈΡΠΊ ΠΏΠ°ΡΠΊΡ Π΄Π°Π½Π½ΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΠ΄Π°Π»ΠΎΡΡ Π²ΡΡΠ°Π²ΠΈΡΡ (ΡΠΎΡΠΌΠ°Ρ ΡΠ°ΠΉΠ»Π° ΡΠ΄ΠΎΠ±Π½ΡΠΉ: ΠΏΠΎΡΠ»Π΅ ΠΏΡΠ°Π²ΠΊΠΈ, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ Π·Π°ΠΈΠ½ΡΠ΅ΡΡΠΈΡΡ ΠΈΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΡ ΠΏΠ°ΡΠΊΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ clickhouse-client).
ΠΠΎΠ»Π½ΡΠΉ ΡΠΏΠΈΡΠΎΠΊ ΠΠ, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΡ Π΅ΠΌΠ΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½ Π² ΡΠ°Π±Π»ΠΈΡΠ΅:
CΠΏΠΈΡΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΠ
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π΄ΠΈΡΡΡΠΈΠ±ΡΡΠΈΠ²
NGINX
Reverse-proxy Π΄Π»Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎ ΠΏΠΎΡΡΠ°ΠΌ ΠΈ ΠΎΡΠ³Π°Π½ΠΈΠ·Π°ΡΠΈΠΈ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΡ Π΅ΠΌΠ΅
FileBeat
ΠΠ΅ΡΠ΅Π΄Π°ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²ΡΡ Π»ΠΎΠ³ΠΎΠ².
LogStash
Π‘Π±ΠΎΡΡΠΈΠΊ Π»ΠΎΠ³ΠΎΠ².
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ±ΠΎΡΠ° Π»ΠΎΠ³ΠΎΠ² ΠΎΡ FileBeat, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΠ±ΠΎΡΠ° Π»ΠΎΠ³ΠΎΠ² ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ RabbitMQ (Π΄Π»Ρ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² DMZ.)
Logstash- output- clickhouse
ΠΠ»Π°Π³ΠΈΠ½ Loagstash Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π»ΠΎΠ³ΠΎΠ² Π² ΠΠ ClickHouse ΠΏΠ°ΡΠΊΠ°ΠΌΠΈ
/usr/share/logstash/bin/logstash-plugin install logstash-output-clickhouse
/usr/share/logstash/bin/logstash-plugin install logstash-filter-prune
/usr/share/logstash/bin/logstash-plugin install logstash-filter-multiline
ClickHouse
Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π»ΠΎΠ³ΠΎΠ²
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Π°Π²Π³ΡΡΡΠ° 2018 Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ Π―Π½Π΄Π΅ΠΊΡΠ° ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ «Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΡΠ΅» ΡΠ±ΠΎΡΠΊΠΈ rpm Π΄Π»Ρ RHEL, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡ . ΠΠ° ΠΌΠΎΠΌΠ΅Π½Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΏΠ°ΠΊΠ΅ΡΡ, ΡΠΎΠ±ΡΠ°Π½Π½ΡΠ΅ Altinity.
Grafana
ΠΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π»ΠΎΠ³ΠΎΠ². ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π΄Π°ΡΠ±ΠΎΡΠ΄ΠΎΠ²
Redhat & Centos(64 Bit) β ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ
ClickHouse datasource for Grafana 4.6+
ΠΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ Grafana Ρ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠΎΠΌ Π΄Π°Π½Π½ΡΡ ClickHouse
LogStash
ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ Π»ΠΎΠ³ΠΎΠ² ΠΎΡ FileBeat Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ RabbitMQ.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ Ρ FileBeat Π½Π΅Ρ output Π½Π°ΠΏΡΡΠΌΡΡ Π² RabbitMQ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ Π·Π²Π΅Π½ΠΎ Π² Π²ΠΈΠ΄Π΅ Logstash
RabbitMQ
ΠΡΠ΅ΡΠ΅Π΄Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ. ΠΡΠΎ Π±ΡΡΠ΅Ρ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π»ΠΎΠ³ΠΎΠ² Π² DMZ
Erlang Runtime (ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ Π΄Π»Ρ RabbitMQ)
Π‘ΡΠ΅Π΄Π° Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ Erlang. Π’ΡΠ΅Π±ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ RabbitMQ
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠ° Ρ ΠΠ ClickHouse ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π° Π² ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅:
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅
ΠΠ½Π°ΡΠ΅Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ
HDD: 40GB
RAM: 8GB
Processor: Core 2 2Ghz
ΠΠ΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡΠ°ΡΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎΠ²Π΅ΡΡ ΠΏΠΎ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ ΠΠ ClickHouse (
ΠΠ±ΡΠ΅ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ΅ ΠΠ
ΠΠ‘: Red Hat Enterprise Linux Server (Maipo)
JRE (Java 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;
ΠΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ ΠΏΠ°ΡΡΠΈΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ (ΠΏΠΎ ΠΌΠ΅ΡΡΡΠ°ΠΌ) ΠΈ Π³ΡΠ°Π½ΡΠ»ΡΡΠ½ΠΎΡΡΡ ΠΈΠ½Π΄Π΅ΠΊΡΠ°. ΠΡΠ΅ ΠΏΠΎΠ»Ρ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π·Π°ΠΏΠΈΡΡΠΌ Π»ΠΎΠ³Π° IIS Π΄Π»Ρ ΡΠ΅Π³ΠΈΡΡΡΠ°ΡΠΈΠΈ http-Π·Π°ΠΏΡΠΎΡΠΎΠ². ΠΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΎΡΠΌΠ΅ΡΠΈΠΌ, ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΏΠΎΠ»Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ utm-ΠΌΠ΅ΡΠΎΠΊ (ΠΎΠ½ΠΈ ΠΏΠ°ΡΡΡΡΡΡ Π½Π° ΡΡΠ°ΠΏΠ΅ Π²ΡΡΠ°Π²ΠΊΠΈ Π² ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ· ΠΏΠΎΠ»Ρ ΡΡΡΠΎΠΊΠΈ Π·Π°ΠΏΡΠΎΡΠ°).
Π’Π°ΠΊΠΆΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌΠ½ΡΡ ΠΏΠΎΠ»Π΅ΠΉ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ , ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ , ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ . ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΡΡΠΈΡ ΠΏΠΎΠ»Π΅ΠΉ ΡΠΌ. Π½ΠΈΠΆΠ΅ Π² ΡΠ°Π±Π»ΠΈΡΠ΅. Π ΠΎΠ΄Π½ΠΎΠΉ ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΌΡ Ρ ΡΠ°Π½ΠΈΠΌ Π»ΠΎΠ³ΠΈ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌ.
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅
ΠΡΠΈΠΌΠ΅Ρ
fld_app_name
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ/ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
- site1.domain.com ΠΠ½Π΅ΡΠ½ΠΈΠΉ ΡΠ°ΠΉΡ 1
- site2.domain.com ΠΠ½Π΅ΡΠ½ΠΈΠΉ ΡΠ°ΠΉΡ 2
- internal-site1.domain.local ΠΠ½ΡΡΡΠ΅Π½Π½ΠΈΠΉ ΡΠ°ΠΉΡ 1
site1.domain.com
fld_app_module
ΠΠΎΠ΄ΡΠ»Ρ ΡΠΈΡΡΠ΅ΠΌΡ
ΠΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ:
- web β ΠΠ΅Π±-ΡΠ°ΠΉΡ
- svc β ΠΠ΅Π±-ΡΠ΅ΡΠ²ΠΈΡ ΡΠ°ΠΉΡΠ°
- intgr β ΠΠ΅Π±-ΡΠ΅ΡΠ²ΠΈΡ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ
- bo β ΠΠ΄ΠΌΠΈΠ½ΠΊΠ° (BackOffice)
web
fld_website_name
ΠΠ°Π·Π²Π°Π½ΠΈΠ΅ ΡΠ°ΠΉΡΠ° Π² IIS
ΠΠ° ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΈΡΡΠ΅ΠΌ, ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠΎΠ² ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΡΠ»Ρ ΡΠΈΡΡΠ΅ΠΌΡ
web-main
fld_server_name
ΠΠΌΡ ΡΠ΅ΡΠ²Π΅ΡΠ°
web1.domain.com
fld_log_file_name
ΠΡΡΡ ΠΊ ΡΠ°ΠΉΠ»Ρ Π»ΠΎΠ³Π° Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ΅
Π‘:inetpublogsLogFiles
W3SVC1u_ex190711.log
ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΡΡΡΠΎΠΈΡΡ Π³ΡΠ°ΡΠΈΠΊΠΈ Π² Grafana. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Ρ ΡΡΠΎΠ½ΡΠ΅Π½Π΄Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ. ΠΡΠΎ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΡΠ΅ΡΡΠΈΠΊ ΡΠ°ΠΉΡΠ° Π² Π―Π½Π΄Π΅ΠΊΡ.ΠΠ΅ΡΡΠΈΠΊΠ΅.
ΠΠΎΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΡΡΠ°ΡΠΈΡΡΠΈΠΊΠ° ΠΏΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΠ Π·Π° Π΄Π²Π° ΠΌΠ΅ΡΡΡΠ°.
ΠΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Ρ ΡΠ°Π·Π±ΠΈΠ²ΠΊΠΎΠΉ ΠΏΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌ ΠΈ ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ
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). Π Π°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ tail (Ρ. Π΅. ΠΏΠ΅ΡΠ΅Π΄Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ Π·Π°ΠΏΠΈΡΠΈ Π² ΡΠ°ΠΉΠ»). ΠΠΎ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ Π½Π° ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² ΡΠ΅Π»ΠΈΠΊΠΎΠΌ. ΠΡΠΎ ΡΠ΄ΠΎΠ±Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Π½ΡΠΆΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ Π΄Π°Π½Π½ΡΠ΅ Π·Π° ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΠ΅ ΠΌΠ΅ΡΡΡΡ. ΠΡΠΎΡΡΠΎ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ ΡΠ°ΠΉΠ» Ρ Π»ΠΎΠ³ΠΎΠΌ Π² ΠΏΠ°ΠΏΠΊΡ ΠΈ ΠΎΠ½ ΡΠ°ΠΌ Π΅Π³ΠΎ ΠΏΡΠΎΡΠΈΡΠ°Π΅Ρ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ.
ΠΡΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ ΡΠ΅ΡΠ²ΠΈΡΠ°, Π΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡΡΡ Π΄Π°Π»ΡΡΠ΅ Π² Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
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. Π‘Π±ΠΎΡΡΠΈΠΊ Π»ΠΎΠ³ΠΎΠ²
ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π»ΠΎΠ³ΠΎΠ² ΠΎΡ FileBeat (Π»ΠΈΠ±ΠΎ ΡΠ΅ΡΠ΅Π· ΠΎΡΠ΅ΡΠ΅Π΄Ρ RabbitMQ), ΠΏΠ°ΡΡΠΈΠ½Π³Π° ΠΈ Π²ΡΡΠ°Π²ΠΊΠΈ ΠΏΠ°ΡΠΊΠ°ΠΌΠΈ Π² ΠΠ ClickHouse.
ΠΠ»Ρ Π²ΡΡΠ°Π²ΠΊΠΈ Π² ClickHouse ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ Logstash-output-clickhouse. Π£ ΠΏΠ»Π°Π³ΠΈΠ½Π° Logstash Π΅ΡΡΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΡΠ΅ΡΡΠ°Ρ Π·Π°ΠΏΡΠΎΡΠΎΠ², Π½ΠΎ ΠΏΡΠΈ ΡΡΠ°ΡΠ½ΠΎΠΌ ΠΎΡΡΠ°Π½ΠΎΠ²Π΅, Π»ΡΡΡΠ΅ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ°ΠΌ ΡΠ΅ΡΠ²ΠΈΡ. ΠΡΠΈ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π±ΡΠ΄ΡΡ ΠΊΠΎΠΏΠΈΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ RabbitMQ, ΠΏΠΎΡΡΠΎΠΌΡ Π΅ΡΠ»ΠΈ ΠΎΡΡΠ°Π½ΠΎΠ² Π½Π° ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΡΠΎ ΡΠΎΠ³Π΄Π° Π»ΡΡΡΠ΅ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Filebeat’Ρ Π½Π° ΡΠ΅ΡΠ²Π΅ΡΠ°Ρ . Π ΡΡ Π΅ΠΌΠ΅, Π³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ RabbitMQ (Π² Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ΅ΡΠΈ Filebeat Π½Π°ΠΏΡΡΠΌΡΡ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π»ΠΎΠ³ΠΈ Π² Logstash), Filebeat’Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎ, ΠΏΠΎΡΡΠΎΠΌΡ Π΄Π»Ρ Π½ΠΈΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ output ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΡ Π±Π΅Π· ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠΉ.
ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
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. Π₯ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π»ΠΎΠ³ΠΎΠ²
ΠΠΎΠ³ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π² ΠΎΠ΄Π½Ρ ΡΠ°Π±Π»ΠΈΡΡ (ΡΠΌ. Π² Π½Π°ΡΠ°Π»Π΅ ΡΡΠ°ΡΡΠΈ). ΠΠ½Π° ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π·Π°ΠΏΡΠΎΡΠ°Ρ : Π²ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΏΠΎΡ ΠΎΠΆΠΈ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠΎΡΠΌΠ°ΡΠΎΠ², Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π»ΠΎΠ³ΠΈ IIS, Π»ΠΎΠ³ΠΈ apache ΠΈ nginx. ΠΠ»Ρ Π»ΠΎΠ³ΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π² ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡΡΡ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ, Π²Π°ΡΠ½ΠΈΠ½Π³ΠΈ, Π±ΡΠ΄Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠΌΠΎΡΡΠ΅Π½Π° ΠΎΡΠ΄Π΅Π»ΡΠ½Π°Ρ ΡΠ°Π±Π»ΠΈΡΠ°, Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΡΡΡΠΊΡΡΡΠΎΠΉ (ΡΠ΅ΠΉΡΠ°Ρ Π½Π° ΡΡΠ°Π΄ΠΈΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ).
ΠΡΠΈ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡΡΡ Ρ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΡΠΌ ΠΊΠ»ΡΡΠΎΠΌ (ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ΄ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Π΄Π°Π½Π½ΡΠ΅ ΠΏΡΠΈ Ρ
ΡΠ°Π½Π΅Π½ΠΈΠΈ). ΠΡ ΡΡΠΎΠ³ΠΎ Π·Π°Π²ΠΈΡΠΈΡ ΡΡΠ΅ΠΏΠ΅Π½Ρ ΡΠΆΠ°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΈ ΡΠΊΠΎΡΠΎΡΡΡ Π·Π°ΠΏΡΠΎΡΠΎΠ². Π Π½Π°ΡΠ΅ΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠ»ΡΡΠΎΠΌ ΡΠ²Π»ΡΠ΅ΡΡΡ
ORDER BY (fld_app_name, fld_app_module, logdatetime)
Π’. Π΅. ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ, Π½Π°Π·Π²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΡΠΈΡΡΠ΅ΠΌΡ ΠΈ Π΄Π°ΡΠ΅ ΡΠΎΠ±ΡΡΠΈΡ. ΠΠ΅ΡΠ²ΠΎΠ½Π°ΡΠ°Π»ΡΠ½ΠΎ Π΄Π°ΡΠ° ΡΠΎΠ±ΡΡΠΈΡ Π±ΡΠ»Π° Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅. ΠΠΎΡΠ»Π΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΡ Π΅Π΅ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΌΠ΅ΡΡΠΎ Π·Π°ΠΏΡΠΎΡΡ ΡΡΠ°Π»ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² Π΄Π²Π° ΡΠ°Π·Π° Π±ΡΡΡΡΠ΅Π΅. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ²ΠΈΡΠ½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ° ΠΏΠΎΡΡΠ΅Π±ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°Π»ΠΈΠ²ΠΊΠΈ Π΄Π°Π½Π½ΡΡ
, ΡΡΠΎΠ±Ρ ClickHouse ΠΏΠ΅ΡΠ΅ΡΠΎΡΡΠΈΡΠΎΠ²Π°Π» Π΄Π°Π½Π½ΡΠ΅ Π½Π° Π΄ΠΈΡΠΊΠ΅. ΠΡΠΎ ΡΡΠΆΠ΅Π»Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΆΠ΅Π»Π°ΡΠ΅Π»ΡΠ½ΠΎ ΡΠΈΠ»ΡΠ½ΠΎ Π·Π°ΡΠ°Π½Π΅Π΅ ΠΏΡΠΎΠ΄ΡΠΌΠ°ΡΡ, ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π²Ρ
ΠΎΠ΄ΠΈΡΡ Π² ΠΊΠ»ΡΡ ΡΠΎΡΡΠΈΡΠΎΠ²ΠΊΠΈ.
Π’Π°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΠΌΠ΅ΡΠΈΡΡ, ΡΡΠΎ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΡ Π²Π΅ΡΡΠΈΡΡ ΠΏΠΎΡΠ²ΠΈΠ»ΡΡ ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ LowCardinality. ΠΡΠΈ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠ΅Π·ΠΊΠΎ ΡΠΎΠΊΡΠ°ΡΠ°Π΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠΆΠ°ΡΡΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΠ΅Ρ ΠΏΠΎΠ»Π΅ΠΉ, Ρ ΠΊΠΎΡΠΎΡΡΡ Π½ΠΈΠ·ΠΊΠ°Ρ ΠΊΠ°ΡΠ΄ΠΈΠ½Π°Π»ΡΠ½ΠΎΡΡΡ (ΠΌΠ°Π»ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠΎΠ²).
Π‘Π΅ΠΉΡΠ°Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π²Π΅ΡΡΠΈΡ 19.6, ΠΈ ΠΌΡ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΠΌ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡ Π²Π΅ΡΡΠΈΡ Π΄ΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ. Π Π½ΠΈΡ ΠΏΠΎΡΠ²ΠΈΠ»ΠΈΡΡ ΡΠ°ΠΊΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠΈΡΠΈ ΠΊΠ°ΠΊ Adaptive Granularity, Skipping indices ΠΈ ΠΊΠΎΠ΄Π΅ΠΊ DoubleDelta, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ.
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΡΠΎΠ²Π΅Π½Ρ Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ trace. ΠΠΎΠ³ΠΈ ΡΠΎΡΠΈΡΡΡΡΡΡ ΠΈ Π°ΡΡ ΠΈΠ²ΠΈΡΡΡΡΡΡ, Π½ΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ ΡΠ°ΡΡΠΈΡΡΡΡΡΡ Π΄ΠΎ Π³ΠΈΠ³Π°Π±Π°ΠΉΡΠ°. ΠΡΠ»ΠΈ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ, ΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΡΡΠΎΠ²Π΅Π½Ρ warning, ΡΠΎΠ³Π΄Π° ΡΠ°Π·ΠΌΠ΅Ρ Π»ΠΎΠ³Π° ΡΠ΅Π·ΠΊΠΎ ΡΠΌΠ΅Π½ΡΡΠ°Π΅ΡΡΡ. ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π»ΠΎΠ³ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π·Π°Π΄Π°Π΅ΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ 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. ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ Π»ΠΎΠ³ΠΎΠ² ΠΎΡ FileBeat Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ RabbitMQ
ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ Π»ΠΎΠ³ΠΎΠ², ΠΏΠΎΡΡΡΠΏΠ°ΡΡΠΈΡ ΠΎΡ FileBeat Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ RabbitMQ. ΠΠ΄Π΅ΡΡ Π΄Π²Π° ΠΌΠΎΠΌΠ΅Π½ΡΠ°:
- Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, FileBeat Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ output ΠΏΠ»Π°Π³ΠΈΠ½Π° Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ Π½Π°ΠΏΡΡΠΌΡΡ Π² RabbitMQ. Π ΡΠ°ΠΊΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», ΡΡΠ΄Ρ ΠΏΠΎ ΠΈΡΡΡ Π½Π° ΠΈΡ Π³ΠΈΡΡ Π°Π±Π΅, Π½Π΅ ΠΏΠ»Π°Π½ΠΈΡΡΠ΅ΡΡΡ ΠΊ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ. ΠΡΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ Π΄Π»Ρ ΠΠ°ΡΠΊΠΈ, Π½ΠΎ ΠΏΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ ΠΌΡ Π½Π΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Ρ ΡΠ΅Π±Ρ.
- ΠΡΡΡ ΡΡΠ΅Π±ΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎ ΡΠ±ΠΎΡΡ Π»ΠΎΠ³ΠΎΠ² Π² DMZ. ΠΡΡ ΠΎΠ΄Ρ ΠΈΠ· Π½ΠΈΡ , Π»ΠΎΠ³ΠΈ ΡΠ½Π°ΡΠ°Π»Π° Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡΡΡ Π² ΠΎΡΠ΅ΡΠ΅Π΄Ρ ΠΈ ΠΏΠΎΡΠΎΠΌ LogStash ΠΈΠ·Π²Π½Π΅ ΡΠΈΡΠ°Π΅Ρ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ Π·Π°ΠΏΠΈΡΠΈ.
ΠΠΎΡΡΠΎΠΌΡ ΠΈΠΌΠ΅Π½Π½ΠΎ Π΄Π»Ρ ΡΠ»ΡΡΠ°Ρ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π² DMZ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΠΊΡΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΠ»ΠΎΠΆΠ½Π΅Π½Π½ΡΡ ΡΡ Π΅ΠΌΡ. ΠΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
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. ΠΠ°ΠΏΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ²ΡΠ·ΠΊΡ Filebeat β LogStash. Π§ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ·Π²Π½Π΅ DMZ ΡΠ΅ΡΠ΅Π· LogStash. ΠΡΠΈ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ ΡΠ΅ΡΠ΅Π· RabboitMQ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΡΡΡ ΠΎΠΊΠΎΠ»ΠΎ 4 ΡΡΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π² ΡΠ΅ΠΊΡΠ½Π΄Ρ.
Π Π°ΡΡΠΈΠ½Π³ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ Π½Π°ΡΡΡΠΎΠ΅Π½ ΠΏΠΎ Π½Π°Π·Π²Π°Π½ΠΈΡ ΡΠΈΡΡΠ΅ΠΌΡ, Ρ. Π΅. Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ FileBeat. ΠΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΏΠΎΠΏΠ°Π΄Π°ΡΡ Π² ΠΎΠ΄Π½Ρ ΠΎΡΠ΅ΡΠ΅Π΄Ρ. ΠΡΠ»ΠΈ ΠΏΠΎ ΠΊΠ°ΠΊΠΈΠΌ Π»ΠΈΠ±ΠΎ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ ΡΠ΅ΡΠ²ΠΈΡ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ, ΡΠΎ ΡΡΠΎ Π½Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Ρ ΠΊ ΠΏΠΎΡΠ΅ΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ: FileBeat’Ρ Π±ΡΠ΄ΡΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠΈΠΎΡΡΠ°Π½ΠΎΠ²ΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΎΡΠΏΡΠ°Π²ΠΊΡ. Π LogStash, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΈΡΠ°Π΅Ρ ΠΈΠ· ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ, ΡΠ°ΠΊΠΆΠ΅ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠ»ΡΡΠ°ΡΡ ΡΠ΅ΡΠ΅Π²ΡΠ΅ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΆΠ΄Π°ΡΡ, ΠΊΠΎΠ³Π΄Π° Π²ΠΎcΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅. ΠΠ°Π½Π½ΡΠ΅ ΠΏΡΠΈ ΡΡΠΎΠΌ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΡΡ ΠΏΠΈΡΠ°ΡΡΡΡ Π² ΠΠ.
Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΎΡΠ΅ΡΠ΅Π΄Π΅ΠΉ:
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. ΠΠ°ΡΠ±ΠΎΡΠ΄Ρ
ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π°Π½Π½ΡΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³Π°. ΠΡΠΈ ΡΡΠΎΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΏΠ»Π°Π³ΠΈΠ½ ClickHouse datasource for Grafana 4.6+. ΠΠ°ΠΌ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π΅Π³ΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΏΡΠ°Π²ΠΈΡΡ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ 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 ΠΌΠ»Π½ Π·Π°ΠΏΠΈΡΠ΅ΠΉ), Π½ΠΎ ΡΠ°ΠΌ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ»Π°Π±ΡΠΉ. ΠΡΠΎΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ ΠΌΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π΄Π»Ρ Π΄ΡΡΠ³ΠΈΡ ΡΠ΅Π»Π΅ΠΉ, Π½Π΅ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΠ΅ΠΌ Π»ΠΎΠ³ΠΎΠ². ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π»Ρ ΡΠΊΠ²ΠΎΠ·Π½ΠΎΠΉ Π°Π½Π°Π»ΠΈΡΠΈΠΊΠΈ, Π² ΠΎΠ±Π»Π°ΡΡΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ, ΠΌΠ°ΡΠΈΠ½Π½ΠΎΠΌ ΠΎΠ±ΡΡΠ΅Π½ΠΈΠΈ.
Π ΠΊΠΎΠ½ΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎ ΠΌΠΈΠ½ΡΡΠ°Ρ ΠΈ ΠΏΠ»ΡΡΠ°Ρ .
ΠΠΈΠ½ΡΡΡ
- ΠΠ°Π³ΡΡΠ·ΠΊΠ° Π·Π°ΠΏΠΈΡΠ΅ΠΉ Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΏΠ°ΡΠΊΠ°ΠΌΠΈ. ΠΡΠΎ, Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, ΡΠΈΡΠ°, Π½ΠΎ Π²ΡΠ΅-ΡΠ°ΠΊΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ Π΄Π»Ρ Π±ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. ΠΡΠ° Π·Π°Π΄Π°ΡΠ° Π½Π΅ Π²ΡΠ΅Π³Π΄Π° ΠΏΡΠΎΡΡΠ°Ρ, Π½ΠΎ Π²ΡΠ΅ ΠΆΠ΅ ΡΠ΅ΡΠ°Π΅ΠΌΠ°Ρ. Π Ρ ΠΎΡΠ΅Π»ΠΎΡΡ Π±Ρ ΡΠΏΡΠΎΡΠ°ΡΡ ΡΡ Π΅ΠΌΡ.
- ΠΠ΅ΠΊΠΎΡΠΎΡΡΠΉ ΡΠΊΠ·ΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π» ΠΈΠ»ΠΈ Π½ΠΎΠ²ΡΠ΅ ΡΠΈΡΠΈ ΡΠ°ΡΡΠΎ Π² Π½ΠΎΠ²ΡΡ Π²Π΅ΡΡΠΈΡΡ Π»ΠΎΠΌΠ°ΡΡΡΡ. ΠΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΠΎΠΏΠ°ΡΠ΅Π½ΠΈΡ, ΡΠΌΠ΅Π½ΡΡΠ°Ρ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ ΠΎΠ±Π½ΠΎΠ²ΠΈΡΡΡΡ Π΄ΠΎ Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π²ΠΈΠΆΠΎΠΊ ΡΠ°Π±Π»ΠΈΡ Kafka β ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½Π°Ρ ΡΠΈΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΏΡΡΠΌΡΡ ΡΠΈΡΠ°ΡΡ ΡΠΎΠ±ΡΡΠΈΡ ΠΈΠ· ΠΊΠ°ΡΠΊΠΈ, Π±Π΅Π· ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΡΡΠΌΠ΅ΡΠΎΠ². ΠΠΎ ΡΡΠ΄Ρ ΠΏΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Ρ Issue Π½Π° Π³ΠΈΡΡ Π°Π±Π΅, ΠΌΡ ΠΏΠΎΠΊΠ° ΠΎΡΡΠ΅ΡΠ΅Π³Π°Π΅ΠΌΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠΎΡ Π΄Π²ΠΈΠΆΠΎΠΊ Π² ΠΏΡΠΎΠ΄Π°ΠΊΡΠ΅Π½Π΅. ΠΠΏΡΠΎΡΠ΅ΠΌ, Π΅ΡΠ»ΠΈ Π½Π΅ Π΄Π΅Π»Π°ΡΡ ΡΠ΅Π·ΠΊΠΈΡ ΡΠ΅Π»ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠΉ Π² ΡΡΠΎΡΠΎΠ½Ρ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π», ΡΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΡΠ°Π±ΠΈΠ»ΡΠ½ΠΎ.
ΠΠ»ΡΡΡ
- ΠΠ΅ ΡΠΎΡΠΌΠΎΠ·ΠΈΡ.
- ΠΠΈΠ·ΠΊΠΈΠΉ ΠΏΠΎΡΠΎΠ³ Π²Ρ ΠΎΠ΄Π°.
- Open-source.
- ΠΠ΅ΡΠΏΠ»Π°ΡΠ½Π°.
- Π₯ΠΎΡΠΎΡΠΎ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΡΡΡ (ΡΠ°ΡΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅/ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Β«ΠΈΠ· ΠΊΠΎΡΠΎΠ±ΠΊΠΈΒ»)
- ΠΡ ΠΎΠ΄ΠΈΡ Π² ΡΠ΅Π΅ΡΡΡ ΡΠΎΡΡΠΈΠΉΡΠΊΠΎΠ³ΠΎ ΠΠ, ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΠΈΠ½ΠΠΎΠΌΠ‘Π²ΡΠ·ΠΈ.
- ΠΠ°Π»ΠΈΡΠΈΠ΅ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΎΡ Π―Π½Π΄Π΅ΠΊΡ.
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com