αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αžŸαž½αžŸαŸ’αžαžΈβ€‹αž’αŸ’αž“αž€β€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αŸ’αž“αžΆ! αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž˜αž½αž™αž“αŸƒαž€αžΆαžšαž„αžΆαžšαžœαž‚αŸ’αž‚αžŸαž·αž€αŸ’αžŸαžΆαžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ† αžαŸ’αž‰αž»αŸ†αž€αŸ†αž–αž»αž„αžŸαŸ’αžšαžΆαžœαž‡αŸ’αžšαžΆαžœαž–αžΈαž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαžœαŸαž‘αž·αž€αžΆαž–αž–αž€αž€αŸ’αž“αž»αž„αžŸαŸ’αžšαž»αž€αžŠαžΌαž…αž‡αžΆ Yandex.Cloud. αžœαŸαž‘αž·αž€αžΆαž•αŸ’αžαž›αŸ‹αž‡αžΌαž“αž“αžΌαžœαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž•αŸ’αžŸαŸαž„αŸ—αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž–αŸαž›αžαŸ’αž›αŸ‡αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž–αž–αž€αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΌαž›αŸ†αž‘αžΌαž›αžΆαž™αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αž”αž‘αž–αž·αžŸαŸ„αž’αž“αŸαž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ‚αž”αž“αŸαŸ‡αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αžαžΎαž’αŸ’αž“αž€αž…αž„αŸ‹αž‘αž‘αž½αž›αž”αžΆαž“αž’αŸ’αžœαžΈ?

αž αŸ’αž‚αŸ’αžšαŸαžŽαžΆαžŽαžΆ - αž§αž”αž€αžšαžŽαŸαžŠαŸαž˜αžΆαž“αž’αžΆαž“αž»αž—αžΆαž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž”αž‰αŸ’αž αžΆαžœαž·αž—αžΆαž‚ αž¬αžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αž”αž‰αŸ’αž αžΆαž“αŸƒαž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŽαžΆαž˜αž½αž™αŸ” αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αžšαž”αžŸαŸ‹αžœαžΆ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš Grafana αž€αŸαžŠαžΌαž…αž‡αžΆαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ (ClickHouse, InfluxDB αŸ”αž›αŸ”) αž‡αžΆαž˜αž½αž™αž“αžΉαž„αžŸαŸ†αžŽαž»αŸ†αž‘αž·αž“αŸ’αž“αž“αŸαž™αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž€αžΆαžšαžœαž·αž—αžΆαž‚αŸ”

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš αž’αŸ’αž“αž€αž’αžΆαž…αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹αžœαžΆ αž αžΎαž™αž‘αž‘αž½αž›αž”αžΆαž“ UI αžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαž αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‡αžΆαž”αŸ’αžšαž—αž–αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž„αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜ αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž“αž·αž„αž€αŸ’αžšαžΆαž αŸ’αžœαŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž€αŸ†αžŽαŸ‚αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž˜αžΆαž“αž‚αž»αžŽαžœαž·αž”αžαŸ’αžαž·αžŸαŸ†αžαžΆαž“αŸ‹αž˜αž½αž™ - αžœαžΆαž˜αž·αž“αž˜αžΆαž“αž—αžΆαž–αž’αžαŸ‹αž’αŸ’αž˜αžαŸ‹αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡αŸ” αž“αŸ„αŸ‡β€‹αž‚αžΊβ€‹αž€αžΆαžšβ€‹αž’αž“αž»αžœαžαŸ’αžβ€‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈβ€‹αž‘αžΆαŸ†αž„αž˜αžΌαž›β€‹αž’αžΆαžŸαŸ’αžšαŸαž™β€‹αž›αžΎβ€‹αž›αž‘αŸ’αž’αž—αžΆαž–β€‹αž‡αŸ„αž‚αž‡αŸαž™β€‹αž“αŸƒβ€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž“αž·αž˜αŸ’αž˜αž·αžβ€‹αž˜αž½αž™αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž“αžΆαž„αž”αžŠαž·αžŸαŸαž’ αž¬αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αž“αž»αžŸαŸ’αžŸ 10 αž“αžΆαž€αŸ‹αž”αžΎαž€ UI αž€αŸ’αž“αž»αž„αž–αŸαž›αžαŸ‚αž˜αž½αž™αž“αŸ„αŸ‡αž”αž‰αŸ’αž αžΆαž“αžΉαž„αž€αžΎαžαž‘αžΎαž„αŸ”

αž–αž½αž€αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αž™αŸ‰αžΆαž„αžŸαžΆαž˜αž‰αŸ’αž‰αŸ– αž’αŸ’αž“αž€αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αž‡αžΆαž…αŸ’αžšαžΎαž“αž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš αž αžΎαž™αžŠαžΆαž€αŸ‹αžœαžΆαž“αŸ…αž€αŸ’αžšαŸ„αž˜αžαž»αž›αŸ’αž™αž—αžΆαž– L3 αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αž·αž“αž˜αŸ‚αž“αž’αŸ’αžœαžΈαŸ—αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‚αžΊαž…αŸ’αž”αžΆαžŸαŸ‹αžŽαžΆαžŸαŸ‹αž“αŸ…αž‘αžΈαž“αŸαŸ‡αŸ” Grafana αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ (αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ αž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„ αž€αŸ’αžšαžΆαž αŸ’αžœαž·αž€αŸ”αž›αŸ”) αžŠαŸ„αž™αž•αŸ’αž‘αžΆαž›αŸ‹αž“αŸ…αž›αžΎαžαžΆαžŸαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžšαž”αžŸαŸ‹αžœαžΆαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž˜αž½αž™αž…αŸ†αž“αž½αž“αž“αŸ…αž€αŸ’αž“αž»αž„ UI αž“αŸ„αŸ‡αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ‚αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž’αŸ’αž“αž€αžαž»αž›αŸ’αž™αž—αžΆαž–αž”αžΆαž“αž•αŸ’αž‰αžΎαž˜αž€αž™αžΎαž„αŸ” αžœαžΆαž“αžΉαž„αž“αžΆαŸ†αž±αŸ’αž™αž˜αžΆαž“αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž˜αž·αž“αžŸαŸŠαžΈαžŸαž„αŸ’αžœαžΆαž€αŸ‹αž‚αŸ’αž“αžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ αž”αž‰αŸ’αž αžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž“αž·αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αž½αž™αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž“αžΉαž„αž˜αž€αž‡αž½αž™αžŸαž„αŸ’αž‚αŸ’αžšαŸ„αŸ‡ αž§αž‘αžΆαž αžšαžŽαŸ MySQL αž¬αžŸαž˜αž˜αžΌαž›αžšαž”αžŸαŸ‹αžœαžΆαŸ” αž™αžΎαž„αž”αŸ’αžšαžΆαž”αŸ‹ Grafana αžαžΆαž“αžΆαž„αž‚αž½αžšαžαŸ‚αžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™ "αž‘αŸ†αž“αŸαžš" αž“αŸαŸ‡αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αžœαžΆαž“αžΉαž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸαŸ‡αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αžΈαž˜αž½αž™αŸ—αž˜αŸ’αžαž„ αž αžΎαž™αž€αŸ‚αžŸαž˜αŸ’αžšαž½αž›αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŽαžΆαž˜αž½αž™ αž–αž½αž€αž‚αŸαž“αžΉαž„αžšαžΈαž€αž…αž˜αŸ’αžšαžΎαž“αž“αŸ…αž›αžΎαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž“αŸ…αžŸαž›αŸ‹αŸ”

αž“αŸαŸ‡αž‚αžΊαž‡αžΆαžŠαŸ’αž™αžΆαž€αŸ’αžšαžΆαž˜αž“αŸƒαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž…αž»αž„αž€αŸ’αžšαŸ„αž™αŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αžšαŸ€αž“αž›αžΎαž€αžŠαŸƒαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€

MySQL αž“αž·αž„ ClickHouse

αž˜αž»αž“αž–αŸαž›αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž”αŸ‚αž”αž“αŸαŸ‡αžŠαŸ„αž™αž…αž»αž…αž”αŸŠαžΌαžαž»αž„αž˜αž½αž™ αžœαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžαŸ’αžšαžΌαžœαžšαŸ€αž“αž–αžΈαžšαž”αŸ€αž”αž›αžΎαž€αžŸαž˜αžΆαžŸαž’αžΆαžαž»αž“αžΈαž˜αž½αž™αŸ—αžšαž”αžŸαŸ‹αžœαžΆαžŠαŸ„αž™αž”αŸ’αžšαžΎαž…αŸ†αžŽαž»αž…αž‘αžΆαž‰ αž αžΎαž™αž”αž‰αŸ’αž…αžΌαž›αž–αž½αž€αžœαžΆαž‡αžΆαž˜αž½αž™αž‚αŸ’αž“αžΆαŸ”

Yandex.Cloud αž“αžΉαž„αž‡αž½αž™αž™αžΎαž„αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹ L3 balancers, ClickHouse αž“αž·αž„ MySQL αž‡αžΆαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αŸ” αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžš αž αžΎαž™αžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαžŠαž›αŸ‹αžœαŸαž‘αž·αž€αžΆαž“αžΆαŸ†αž’αŸ’αžœαžΈαŸ—αž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αž»αŸ‡αžˆαŸ’αž˜αŸ„αŸ‡ αž”αž„αŸ’αž€αžΎαžαž–αž–αž€ αž“αž·αž„αž‚αžŽαž“αžΈαžœαž·αž€αŸ’αž€αž™αž”αžαŸ’αžšαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžαŸ’αž›αž½αž“αžαŸ’αž‰αž»αŸ†αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž–αž–αž€ αž αžΎαž™αž”αžΆαž“αž›αžΎαž€αž‘αžΎαž„αž“αžΌαžœ MySQL αž“αž·αž„ ClickHouse clusters αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαž·αž…αžαž½αž…αž”αŸ†αž•αž»αžαŸ” αžšαž„αŸ‹αž…αžΆαŸ†αžšαž αžΌαžαžŠαž›αŸ‹αž–αž½αž€αž‚αŸαžŸαž€αž˜αŸ’αž˜αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸαž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž’αŸ’αž“αž€αž€αŸαžαŸ’αžšαžΌαžœαž…αž„αž…αžΆαŸ†αž•αž„αžŠαŸ‚αžš αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž…αž„αŸ’αž€αŸ„αž˜αž“αžΈαž˜αž½αž™αŸ— αž αžΎαž™αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎαžœαžΆαžŠαŸ„αž™αž€αžΆαžšαž…αžΌαž› αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αŸ” αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž˜αž·αž“αž…αžΌαž›αž‘αŸ…αž€αŸ’αž“αž»αž„αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž‘αŸ - αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‚αžΊαž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αŸ”

αž–αŸαžαŸŒαž˜αžΆαž“αž›αž˜αŸ’αž’αž·αžαž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹αž‚αžΊαžαžΆ αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž“αŸαŸ‡αž˜αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‡αžΆαž…αŸ’αžšαžΎαž“αžŠαŸ‚αž›αž•αŸ’αžαž›αŸ‹αž“αžΌαžœαž€αžΆαžšαž’αžαŸ‹αž±αž“αž…αŸ†αž–αŸ„αŸ‡αž€αŸ†αž αž»αžŸαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαŸ” αž‘αŸ„αŸ‡αž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ Grafana αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αž½αž™αž™αŸ‰αžΆαž„αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αžΈαž˜αž½αž™αŸ—αžŠαŸ‚αž›αžœαžΆαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αŸ” αž€αžΆαžšαž’αžΆαž“αž™αžΌαžš αž―αž€αžŸαžΆαžš αž–αž–αž€αž“αžΆαŸ†αžαŸ’αž‰αž»αŸ†αž‘αŸ…αžšαž€αž€αžΆαžšαžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαŸ” αžœαžΆαž”αŸ’αžšαŸ‚αžαžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αŸƒαž‘αž˜αŸ’αžšαž„αŸ‹αž˜αž½αž™αŸ” c-<cluster_id>.rw.mdb.yandexcloud.net αž•αŸ‚αž“αž‘αžΈαž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž…αž„αŸ’αž€αŸ„αž˜αžŸαž€αž˜αŸ’αž˜αž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™ Grafana αŸ”

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαž’αžΆαžŸαŸ’αžšαŸαž™αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ” αž…αžΌαžšαž›αžΎαž€αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž’αž˜αŸ’αž˜αžαžΆαž‡αžΆαž˜αž½αž™αž›αžΈαž“αž»αž… αž αžΎαž™αžŠαŸ†αž‘αžΎαž„ Grafana αž“αŸ…αž›αžΎαžœαžΆαžŠαŸ„αž™αžŠαŸƒαžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž…αžΌαžšαž—αŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžšαž™αŸˆ ssh αž αžΎαž™αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹αž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

sudo apt-get install -y apt-transport-https software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡ αž™αžΎαž„αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ Grafana αž“αŸ…αž€αŸ’αžšαŸ„αž˜ systemctl αž αžΎαž™αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™ ClickHouse (αž”αžΆαž‘ αžœαžΆαž˜αž·αž“αžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αž‚αžαŸ‹αž•αŸ’αž‚αž„αŸ‹αž€αŸ’αž“αž»αž„αž€αž‰αŸ’αž…αž”αŸ‹αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αŸ)αŸ”

sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαžŸαžΆαž˜αž‰αŸ’αž‰

sudo service grafana-server start

αž™αžΎαž„αž“αžΉαž„αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαŸ” αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαž“αžΉαž„αž’αžΆαž…αž”αžΎαž€αž”αžšαž€αŸ’αž“αž»αž„αž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžαžΆαž„αž€αŸ’αžšαŸ…αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž“αŸ…αž€αŸ’αž“αž»αž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€ αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž…αŸ’αžšαž€ 3000 αž“αž·αž„αž˜αžΎαž› UI grafana αžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαŸ”
αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž€αž»αŸ†αž”αŸ’αžšαž‰αžΆαž”αŸ‹αž”αŸ’αžšαž‰αžΆαž›αŸ‹αž˜αž»αž“αž–αŸαž›αžŠαŸ†αž‘αžΎαž„ Grafana αž’αŸ’αž“αž€αž˜αž·αž“αžαŸ’αžšαžΌαžœαž—αŸ’αž›αŸαž…αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹ MySQL αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαžšαž€αŸ’αžŸαžΆαž‘αž»αž€αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ”

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš Grafana αž‚αžΊαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš /etc/grafana/grafana.ini. αž”αž“αŸ’αž‘αžΆαžαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αžΎαž›αž‘αŸ…αžŠαžΌαž…αž“αŸαŸ‡αŸ–

;url =

αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αŸ…αž€αŸ’αžšαž»αž˜ MySQL αŸ” αž―αž€αžŸαžΆαžšαžŠαžΌαž…αž‚αŸ’αž“αžΆαž“αŸαŸ‡αž˜αžΆαž“αž€αžΆαžšαž…αžΌαž› αž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΌαž›αž”αŸ’αžšαžΎ Grafana αž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž–αžαžΆαž„αž›αžΎ αžŠαŸ‚αž›αž‘αžΆαŸ†αž„αž–αžΈαžšαžŸαŸ’αž˜αžΎαž‚αŸ’αž“αžΆαžαžΆαž˜αž›αŸ†αž“αžΆαŸ†αžŠαžΎαž˜ admin.

αž’αŸ’αž“αž€αž’αžΆαž…αž”αŸ’αžšαžΎαž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆ sed:

sudo sed -i "s#.*;url =.*#url = mysql://${MYSQL_USERNAME}:${MYSQL_PASSWORD}@${MYSQL_CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${GRAFANA_USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${GRAFANA_PASSWORD}#" /etc/grafana/grafana.ini

αžŠαž›αŸ‹αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαž‘αžΎαž„αžœαž·αž‰αž αžΎαž™!

sudo service grafana-server restart

αž₯αž‘αžΌαžœαž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„ Grafana UI αž™αžΎαž„αž“αžΉαž„αž”αž‰αŸ’αž‡αžΆαž€αŸ‹ ClickHouse αž‡αžΆ DataSource αŸ”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαžΎαž˜αŸ’αž”αžΈαžŸαž˜αŸ’αžšαŸαž…αž”αžΆαž“αž“αžΌαžœαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž•αŸ’αžαž›αŸ‹αž±αŸ’αž™αž‡αžΆ URL https://c-<cluster_id>.rw.mdb.yandexcloud.net:8443

αž‘αžΆαŸ†αž„αž’αžŸαŸ‹! αž™αžΎαž„β€‹αž˜αžΆαž“β€‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“β€‹αž“αž·αž˜αŸ’αž˜αž·αžβ€‹αž˜αž½αž™β€‹αžŠαŸ‚αž›β€‹αž’αŸ’αžœαžΎβ€‹αž€αžΆαžšβ€‹αž‡αžΆαž˜αž½αž™β€‹αž“αžΉαž„ web server αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αžαž—αŸ’αž‡αžΆαž”αŸ‹β€‹αž‘αŸ… CH αž“αž·αž„ MySQL αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž αŸ„αŸ‡αžŸαŸ†αžŽαž»αŸ†αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ… ClickHouse αž“αž·αž„αž”αž„αŸ’αž€αžΎαžαž•αŸ’αž‘αžΆαŸ†αž„αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžšαž½αž…αž αžΎαž™αŸ” αž‘αŸ„αŸ‡αž‡αžΆαž™αŸ‰αžΆαž„αžŽαžΆαž€αŸαžŠαŸ„αž™ αž™αžΎαž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž”αžΆαž“αž‘αŸ…αžŠαž›αŸ‹αž‚αŸ„αž›αžŠαŸ…αžšαž”αžŸαŸ‹αž™αžΎαž„ αž“αž·αž„αž˜αž·αž“αž‘αžΆαž“αŸ‹αž”αžΆαž“αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž–αŸαž‰αž›αŸαž‰αž“αŸ…αž‘αžΎαž™αŸ”

αž•αžΆαž€αž€αžΊ

Yandex.Cloud αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹ αž αžΎαž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαžΆ αž’αŸ’αž“αž€αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαžΌαž…αž‚αŸ’αž“αžΆαž”αŸαŸ‡αž”αž·αž‘αž”αžΆαž“αž…αŸ’αžšαžΎαž“αžαžΆαž˜αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αžΌαž›αž…αž·αžαŸ’αžαŸ” αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‚αž»αŸ†αžšαžΌαž”αž—αžΆαž–αž”αžΆαž“αž™αŸ‰αžΆαž„αž„αžΆαž™αžŸαŸ’αžšαž½αž› αžŸαžΌαž˜αž™αž€αž§αž”αž€αžšαžŽαŸ αž•αžΆαž€αž€αžΊ αž–αžΈ HashiCorp αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž€αžΆαžšαž–αŸαž›αž”αž‰αŸ’αž…αžΌαž›αž―αž€αžŸαžΆαžš json αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αŸ”

αž―αž€αžŸαžΆαžš json αžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αž˜αžΆαž“αž”αŸ’αž›αž»αž€αž–αžΈαžšαŸ– αž’αŸ’αž“αž€αžŸαžΆαž„αžŸαž„αŸ‹αž“αž·αž„αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αŸ” αž”αŸ’αž›αž»αž€αž‘αžΈαž˜αž½αž™αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž“αŸƒαžšαžΌαž”αž—αžΆαž–αžαŸ’αž›αž½αž“αžœαžΆαžαžΆαž‡αžΆαž’αž„αŸ’αž‚αž—αžΆαž–αž˜αž½αž™ αž αžΎαž™αž”αŸ’αž›αž»αž€αž‘αžΈαž–αžΈαžšαž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž€αžΆαžšαžŽαŸ‚αž“αžΆαŸ†αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž”αŸ†αž–αŸαž‰αžœαžΆαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž˜αžΆαžαž·αž€αžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

αž€αŸ’αžšαž»αž˜αž αŸŠαž»αž“αžŸαžΆαž„αžŸαž„αŸ‹

{
"builders": [
    {
      "type": "yandex",
      "endpoint": "{{user `endpoint`}}",
      "folder_id": "<folder_id>",
      "subnet_id": "{{user `subnet_id`}}",
      "zone": "{{user `zone`}}",
      "labels": {},
      "use_ipv4_nat": true,
      "use_internal_ip": false,
      "service_account_key_file": "<service_account_key_file>",
      "image_name": "grafana-{{timestamp}}",
      "image_family": "grafana",
      "image_labels": {},
      "image_description": "GRAFANA",
      "source_image_family": "ubuntu-1804-lts",
      "disk_size_gb": 3,
      "disk_type": "network-hdd",
      "ssh_username": "ubuntu"
    }
  ],
...
}

αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ†αžšαžΌαž“αŸαŸ‡ αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž“αŸƒαž•αŸ’αž“αŸ‚αž€αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž–αž€αžŠαŸ‚αž›αž’αŸ’αž“αž€αž…αž„αŸ‹αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž– αž€αŸαžŠαžΌαž…αž‡αžΆαž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„αž–αžΈαž‚αžŽαž“αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž–αžΈαž˜αž»αž“αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž“αŸαŸ‡αŸ” αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž‚αžŽαž“αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ αž“αž·αž„αž€αžΌαž“αžŸαŸ„αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž―αž€αžŸαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ” αž―αž€αžŸαžΆαžš.

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αŸαŸ‡αž“αž·αž™αžΆαž™αžαžΆαžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαŸαž‘αž·αž€αžΆ ubuntu-1804-ltsαž”αžΆαž“αžŠαžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αžŸαž˜αžšαž˜αŸ’αž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‚αŸ’αžšαž½αžŸαžΆαžšαžšαžΌαž”αž—αžΆαž– GRAFANA αž“αŸ…αž€αŸ’αžšαŸ„αž˜αžˆαŸ’αž˜αŸ„αŸ‡ grafana-{{timestamp}}.

αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆ

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž•αŸ’αž“αŸ‚αž€αž‚αž½αžšαž±αŸ’αž™αž…αžΆαž”αŸ‹αž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž”αž“αŸ’αžαŸ‚αž˜αž‘αŸ€αžαž“αŸƒαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αŸ” αžœαžΆαž“αžΉαž„αž–αž·αž–αžŽαŸŒαž“αžΆαž’αŸ†αž–αžΈαž›αŸ†αžŠαžΆαž”αŸ‹αž“αŸƒαžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž’αž“αž»αžœαžαŸ’αžαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž˜αž»αž“αž–αŸαž›αž”αž„αŸ’αž€αž€αžŸαŸ’αžαžΆαž“αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆαž‘αŸ…αž‡αžΆαžšαžΌαž”αž—αžΆαž–αžŒαžΈαžŸαŸ”

{
...,
"provisioners": [
    {
            "type": "shell",
            "pause_before": "5s",
            "scripts": [
                "prepare-ctg.sh"
            ]
        },
    {
            "type": "file",
            "source": "setup.sh",
            "destination": "/opt/grafana/setup.sh"
        },
        {
            "type": "shell",
        "execute_command": "sudo {{ .Vars }} bash '{{ .Path }}'",
            "pause_before": "5s",
            "scripts": [
                "install-packages.sh",
                "grafana-setup.sh",
                "run-setup-at-reboot.sh"
        ]
        }
  ]
}

αž“αŸ…αž‘αžΈαž“αŸαŸ‡αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ‚αž„αž…αŸ‚αž€αž‡αžΆ 3 αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αŸ” αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αžŠαŸ†αž”αžΌαž„ αžŸαŸ’αž‚αŸ’αžšαžΈαž”αžŸαžΆαž˜αž‰αŸ’αž‰αž˜αž½αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αžŠαŸ‚αž›αž”αž„αŸ’αž€αžΎαžαž”αž‰αŸ’αž‡αžΈαž‡αŸ†αž“αž½αž™αŸ”

αžšαŸ€αž”αž…αŸ†-ctg.shαŸ–

#!/bin/bash
sudo mkdir -p /opt/grafana
sudo chown -R ubuntu:ubuntu /opt/grafana

αž“αŸ…αžŠαŸ†αžŽαžΆαž€αŸ‹αž€αžΆαž›αž”αž“αŸ’αž‘αžΆαž”αŸ‹ αž™αžΎαž„αžŠαžΆαž€αŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸ…αž€αŸ’αž“αž»αž„αžαžαž“αŸαŸ‡ αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαŸ” αžŸαŸ’αž‚αŸ’αžšαžΈαž”αž“αŸαŸ‡αž“αžΉαž„αžŠαžΆαž€αŸ‹αž’αžαŸαžšαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž”αžŸαŸ‹ Grafana αž αžΎαž™αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžšαž‘αžΎαž„αžœαž·αž‰αŸ”

setup.shαŸ–

#!/bin/bash
CLUSTER_ID="<cluster_id>"
USERNAME="<username>"
PASSWORD="<password>"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@c-${CLUSTER_ID}.rw.mdb.yandexcloud.net#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

αž”αž“αŸ’αž‘αžΆαž”αŸ‹β€‹αž˜αž€β€‹αž˜αžΆαž“β€‹αž€αž·αž…αŸ’αž…αž€αžΆαžšβ€‹αŸ£β€‹αžŠαŸ‚αž›β€‹αžαŸ’αžšαžΌαžœβ€‹αž’αŸ’αžœαžΎαŸ–
1) αžŠαŸ†αž‘αžΎαž„αž€αž‰αŸ’αž…αž”αŸ‹
2) αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ Grafana αž“αŸ…αž€αŸ’αžšαŸ„αž˜ systemctl αž αžΎαž™αžŠαŸ†αž‘αžΎαž„αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‡αŸ†αž“αž½αž™ ClickHouse
3) αžŠαžΆαž€αŸ‹αžŸαŸ’αž‚αŸ’αžšαžΈαž” setup.sh αž€αŸ’αž“αž»αž„αž‡αž½αžšαžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž—αŸ’αž›αžΆαž˜αŸ—αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž”αžΎαž€αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαŸ”

install-packages.shαŸ–

#!/bin/bash
sudo systemd-run --property='After=apt-daily.service apt-daily-upgrade.service' --wait /bin/true
sudo apt-get install -y apt-transport-https
sudo apt-get install -y software-properties-common wget
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -
sudo add-apt-repository "deb https://packages.grafana.com/enterprise/deb stable main"
sudo apt-get update
sudo apt-get install -y grafana-enterprise 

grafana-setup.shαŸ–

#!/bin/bash
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
sudo grafana-cli plugins install vertamedia-clickhouse-datasource

run-setup-at-reboot.shαŸ–

#!/bin/bash
chmod +x /opt/grafana/setup.sh
cat > /etc/cron.d/first-boot <<EOF
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
@reboot root /bin/bash /opt/grafana/setup.sh > /var/log/yc-setup.log 2>&1
EOF
chmod +x /etc/cron.d/first-boot;

αž₯αž‘αžΌαžœαž“αŸαŸ‡αžœαžΆαž“αŸ…αžŸαž›αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαŸ†αžŽαžΎαžšαž€αžΆαžš Packer αž“αž·αž„αž‘αž‘αž½αž›αž”αžΆαž“αžšαžΌαž”αž—αžΆαž–αž›αž‘αŸ’αž’αž•αž›αžŠαŸ‚αž›αžŠαžΆαž€αŸ‹αž€αŸ’αž“αž»αž„αž—αžΆαž‚αžαžΆαžŸαžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αŸ” αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž’αŸ’αž“αž€αž’αžΆαž…αž‡αŸ’αžšαžΎαžŸαžšαžΎαžŸαžœαžΆαž‡αžΆαžαžΆαžŸαž…αžΆαž”αŸ‹αž•αŸ’αžŠαžΎαž˜ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž‘αž‘αž½αž›αž”αžΆαž“αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš Grafana αžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ
αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž€αŸ’αžšαž»αž˜αž§αž‘αžΆαž αžšαžŽαŸ αž“αž·αž„αžŸαž˜αžαž»αž›αŸ’αž™

αž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αžΆαž“αžšαžΌαž”αž—αžΆαž–αžŒαžΈαžŸαžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž„αŸ’αž€αžΎαžαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ Grafana αžŠαžΌαž…αž‚αŸ’αž“αžΆαž‡αžΆαž…αŸ’αžšαžΎαž“ αž™αžΎαž„αž’αžΆαž…αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜ instance αž˜αž½αž™αŸ” αž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆ Yandex.Cloud αž–αžΆαž€αŸ’αž™αž“αŸαŸ‡αžŸαŸ†αžŠαŸ…αž‘αŸ…αž›αžΎαž€αžΆαžšαžšαž½αž”αžšαž½αž˜αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžŠαŸ‚αž›αž˜αžΆαž“αž›αž€αŸ’αžαžŽαŸˆαžŠαžΌαž…αž‚αŸ’αž“αžΆαŸ” αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜ instance αž‚αŸ†αžšαžΌαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αžαŸ’αžšαžΌαžœαž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αž›αž€αŸ’αžαžŽαŸˆαž“αŸƒαž€αŸ’αžšαž»αž˜αžαŸ’αž›αž½αž“αžœαžΆ (αž§αž‘αžΆαž αžšαžŽαŸ αž…αŸ†αž“αž½αž“αž’αž”αŸ’αž”αž”αžšαž˜αžΆ αž“αž·αž„αž’αžαž·αž”αžšαž˜αžΆαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŸαž€αž˜αŸ’αž˜)αŸ” αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž›αŸαžαž”αž…αŸ’αž…αž»αž”αŸ’αž”αž“αŸ’αž“αž˜αž·αž“αž”αŸ†αž–αŸαž‰αžαžΆαž˜αž›αž€αŸ’αžαžŽαŸˆαžœαž·αž“αž·αž…αŸ’αž†αŸαž™αž“αŸαŸ‡αž‘αŸ αž“αŸ„αŸ‡αž€αŸ’αžšαž»αž˜αž§αž‘αžΆαž αžšαžŽαŸαžαŸ’αž›αž½αž“αž―αž„αž“αžΉαž„αžŠαž€αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž›αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αŸαž‰ αž¬αž”αž„αŸ’αž€αžΎαžαžαŸ’αž˜αžΈαž€αŸ’αž“αž»αž„αžšαžΌαž”αž—αžΆαž– αž“αž·αž„αžšαžΌαž”αžšαžΆαž„αŸ”

αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž€αž·αž…αŸ’αž…αž€αžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„ αž™αžΎαž„αž“αžΉαž„αž”αž„αŸ’αž€αžΎαžαž€αŸ’αžšαž»αž˜ instance αž“αŸƒ web servers αžŠαŸ‚αž›αž“αžΉαž„αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž…αŸαž‰αž–αžΈαžšαžΌαž”αž—αžΆαž–αžŒαžΈαžŸαžŠαŸ‚αž›αž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž–αžΈαž˜αž»αž“αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž€αŸ’αžšαž»αž˜αž§αž‘αžΆαž αžšαžŽαŸαž…αž»αž„αž€αŸ’αžšαŸ„αž™αž‚αžΊαž–αž·αžαž‡αžΆαž‚αž½αžšαž±αŸ’αž™αž€αžαŸ‹αžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αŸ” αž€αŸ’αžšαž»αž˜αž‚αŸ„αž›αžŠαŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™ Load Balancer αž“αžΉαž„αž‡αž½αž™αž’αŸ’αž“αž€αžšαŸ€αž”αž…αŸ† L3 Balancer αž“αŸ…αž•αŸ’αž“αŸ‚αž€αžαžΆαž„αž›αžΎαž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž“αŸƒαž€αŸ’αžšαž»αž˜αž“αŸαŸ‡αžŠαŸ„αž™αž…αž»αž…αž”αŸŠαžΌαžαž»αž„αž–αžΈαžšαž”αžΈαŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž“αŸ…αž–αŸαž›αžŠαŸ†αž‘αžΎαž„αž§αž”αž€αžšαžŽαŸαžαž»αž›αŸ’αž™αž—αžΆαž– αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαž…αŸ†αžŽαž»αž…αžŸαŸ†αžαžΆαž“αŸ‹αž–αžΈαžšαŸ–

  1. αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž’αŸ’αžœαžΎαžœαžΆαžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αžŸαž˜αžαž»αž›αŸ’αž™αž‘αž‘αž½αž›αž™αž€αž…αžšαžΆαž…αžšαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 80 αž αžΎαž™αž”αžΆαž“αž”αŸ’αžαžΌαžšαž‘αž·αžŸαžœαžΆαž‘αŸ…αž…αŸ’αžšαž€ 3000 αž“αŸƒαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αž‡αžΆαž€αž“αŸ’αž›αŸ‚αž„αžŠαŸ‚αž› Grafana αžšαžŸαŸ‹αž“αŸ…αŸ”
  2. αžŠαŸ†αž‘αžΎαž„αž€αžΆαžšαžαŸ’αžšαž½αžαž–αž·αž“αž·αžαŸ’αž™αžŸαž»αžαž—αžΆαž–αžšαž”αžŸαŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ„αž™ ping αž–αž½αž€αžœαžΆαž“αŸ…αž›αžΎαž…αŸ’αžšαž€ 3000αŸ”

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αžŸαžšαž»αž”αžαžΌαž…

αž‘αžΈαž”αŸ†αž•αž»αž αž™αžΎαž„αž’αžΆαž…αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“αžŠαŸ„αž™αžŠαŸƒ αž αžΎαž™αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αžΆαž“αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜ Grafana αžŠαŸ‚αž›αž’αžΆαž…αž’αž“αŸ‹αž‘αŸ’αžšαžΆαŸ†αž”αžΆαž“αžαŸ’αž–αžŸαŸ‹αŸ” αžœαžΆαž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž€αžΆαžšαž…αžΆαŸ†αž”αžΆαž…αŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαžŠαžΉαž„αž–αžΈαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ IP αžšαž”αžŸαŸ‹ Balancer αžŠαŸ‚αž›αž‡αžΆαž…αŸ†αžŽαž»αž…αž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžšαž”αžŸαŸ‹ ClickHouse cluster αžŠαžΎαž˜αŸ’αž”αžΈαž•αŸ’αž‘αž»αž€αžŸαŸ†αžŽαž»αŸ†αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αŸ…αž€αŸ’αž“αž»αž„αžœαžΆαŸ”

αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž‡αŸαž™αž‡αŸ†αž“αŸ‡? αž”αžΆαž‘ αž‡αŸαž™αž‡αŸ†αž“αŸ‡αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž˜αžΆαž“αž’αŸ’αžœαžΈαž˜αž½αž™αž“αŸ…αžαŸ‚αžšαŸ†αžαžΆαž“αžαŸ’αž‰αž»αŸ†αŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αžαžΆαž„αž›αžΎαžαž˜αŸ’αžšαžΌαžœαž±αŸ’αž™αž˜αžΆαž“αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αžŠαŸ„αž™αžŠαŸƒαž…αŸ’αžšαžΎαž“ αž αžΎαž™αž˜αž·αž“αž’αŸ’αžœαžΎαž˜αžΆαžαŸ’αžšαžŠαŸ’αž‹αžΆαž“αž‘αžΆαž›αŸ‹αžαŸ‚αžŸαŸ„αŸ‡ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž’αŸ’αžœαžΎαž±αŸ’αž™αžœαžΆαžŠαŸ„αž™αžŸαŸ’αžœαŸαž™αž”αŸ’αžšαžœαžαŸ’αžαž·αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αžΆαž…αž’αŸ’αžœαžΎαž‘αŸ…αž”αžΆαž“αŸ” αž“αŸαŸ‡αž“αžΉαž„αž‡αžΆαž€αžΆαžšαž•αŸ’αžαŸ„αžαž’αžΆαžšαž˜αŸ’αž˜αžŽαŸαž“αŸƒαž•αŸ’αž“αŸ‚αž€αž”αž“αŸ’αž‘αžΆαž”αŸ‹αŸ”

αž€αžΆαžšαžšαž½αž˜αž”αž‰αŸ’αž…αžΌαž›αž‡αžΆαž˜αž½αž™ Terraform

αž™αžΎαž„αž“αžΉαž„αž”αŸ’αžšαžΎαž§αž”αž€αžšαžŽαŸαž–αžΈ HashiCorp αž˜αŸ’αžαž„αž‘αŸ€αž Terraform. αžœαžΆαž“αžΉαž„αž‡αž½αž™αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸ…αž–αŸαž›αž…αž»αž…αž”αŸŠαžΌαžαž»αž„ αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαž’αžαŸαžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αžŠαŸ‚αž›αž†αŸ’αž›αž„αž€αžΆαžαŸ‹αžŠαŸ„αž™αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ” αž…αžΌαžšαž™αžΎαž„αžŸαžšαžŸαŸαžšαžšαžΌαž”αž˜αž“αŸ’αžαžŠαŸ‚αž›αž’αžΆαž…αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž”αžΆαž“αž…αŸ’αžšαžΎαž“αžŠαž„αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαž“αŸƒαž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆαŸ”

αž€αžΆαžšαž„αžΆαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αž‡αžΆαž˜αž½αž™ Terraform αž˜αž€αž›αžΎαž€αžΆαžšαžŸαžšαžŸαŸαžšαž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ (*.tf) αž“αž·αž„αž€αžΆαžšαž”αž„αŸ’αž€αžΎαžαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ„αž™αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαžΆαŸ”

ធថេរ

αž“αŸ…αžŠαžΎαž˜αžŠαŸ†αž”αžΌαž„αž“αŸƒαž―αž€αžŸαžΆαžš αž™αžΎαž„αž“αžΉαž„αžŠαž€αž’αžαŸαžšαžŠαŸ‚αž›αž€αŸ†αžŽαžαŸ‹αž‘αžΈαž€αž“αŸ’αž›αŸ‚αž„ αž“αž·αž„αžšαž”αŸ€αž”αžŠαŸ‚αž›αž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž“αžΆαž–αŸαž›αž’αž“αžΆαž‚αžαž“αžΉαž„αžαŸ’αžšαžΌαžœαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αŸ”

variable "oauth_token" {
    type = string
    default = "<oauth-token>"
}
variable "cloud_id" {
    type = string
    default = "<cloud-id>"
}
variable "folder_id" {
    type = string
    default = "<folder_id>"
}
variable "service_account_id" {
    type = string
    default = "<service_account_id>"
}
variable "image_id" {
    type = string
    default = "<image_id>"
}
variable "username" {
    type = string
    default = "<username>"
}
variable "password" {
    type = string
    default = "<password>"
}
variable "dbname" {
    type = string
    default = "<dbname>"
}
variable "public_key_path" {
    type = string
    default = "<path to ssh public key>"
}

αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αž“αŸƒαž€αžΆαžšαžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαž“αžΉαž„αž…αž»αŸ‡αž˜αž€αžŠαžΎαž˜αŸ’αž”αžΈαž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αžαžΆαžŸ αž“αž·αž„αž€αŸ†αžŽαžαŸ‹αž’αžαŸαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αžŸαžΌαž˜αž–αž“αŸ’αž™αž›αŸ‹αž–αžΈαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž–αž½αž€αž‚αŸαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœαŸ–

outh_token - αžŸαž‰αŸ’αž‰αžΆαžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž–αž–αž€αŸ” αž’αžΆαž…αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ„αž™ αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹.
cloud_id - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž“αŸƒαž–αž–αž€αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ
folder_id - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž“αŸƒαž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αž™αžΎαž„αž“αžΉαž„αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ
service_account_id - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž‚αžŽαž“αžΈαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αž•αŸ’αž“αŸ‚αž€αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαž“αŸƒαž–αž–αž€αŸ”
image_id - αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž“αŸƒαžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαžŠαŸ‚αž›αž‘αž‘αž½αž›αž”αžΆαž“αžŠαŸ„αž™αž”αŸ’αžšαžΎ Packer
username ΠΈ αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹ - αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž“αž·αž„αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž”αŸ’αžšαžΎαž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž‘αžΆαŸ†αž„αž–αžΈαžšαž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž”αžŽαŸ’αžαžΆαž‰ Grafana
dbname - αžˆαŸ’αž˜αŸ„αŸ‡αž˜αžΌαž›αžŠαŸ’αž‹αžΆαž“αž‘αž·αž“αŸ’αž“αž“αŸαž™αž“αŸ…αžαžΆαž„αž€αŸ’αž“αž»αž„ CH αž“αž·αž„ MySQL clusters
public_key_path - αž•αŸ’αž›αžΌαžœαž‘αŸ…αž€αžΆαž“αŸ‹αž―αž€αžŸαžΆαžšαžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸ„αžŸαžΆαž’αžΆαžšαžŽαŸˆ ssh αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž“αŸ…αž€αŸ’αžšαŸ„αž˜αžˆαŸ’αž˜αŸ„αŸ‡ ubuntu αž‘αŸ…αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαž‡αžΆαž˜αž½αž™αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš

αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆ

αž₯αž‘αžΌαžœαž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆ Terraform - αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαžšαž”αžŸαŸ‹αž™αžΎαž„ YandexαŸ–

provider "yandex" {
  token     = var.oauth_token
  cloud_id  = var.cloud_id
  folder_id = var.folder_id
  zone      = "ru-central1-a"
}

αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžαžΆαž“αŸ…αž‘αžΈαž“αŸαŸ‡αž™αžΎαž„αž€αŸ†αž–αž»αž„αž”αŸ’αžšαžΎαž’αžαŸαžšαžŠαŸ‚αž›αž”αžΆαž“αž€αŸ†αžŽαžαŸ‹αžαžΆαž„αž›αžΎαŸ”

αž”αžŽαŸ’αžαžΆαž‰ αž“αž·αž„αž…αž„αŸ’αž€αŸ„αž˜

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αž…αžΌαžšαž™αžΎαž„αž”αž„αŸ’αž€αžΎαžαž”αžŽαŸ’αžαžΆαž‰αž˜αž½αž™αžŠαŸ‚αž›αž’αžΆαžαž»αž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž™αžΎαž„αž“αžΉαž„αž‘αžΆαž€αŸ‹αž‘αž„αž‚αŸ’αž“αžΆ αž”αžŽαŸ’αžαžΆαž‰αžšαž„αž…αŸ†αž“αž½αž“αž”αžΈ (αž˜αž½αž™αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αž“αžΈαž˜αž½αž™αŸ—) αž“αž·αž„αž”αž„αŸ’αž€αžΎαž“αž…αž„αŸ’αž€αŸ„αž˜ CH αž“αž·αž„ MySQL αŸ”


resource "yandex_vpc_network" "grafana_network" {}

resource "yandex_vpc_subnet" "subnet_a" {
  zone           = "ru-central1-a"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.1.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_b" {
  zone           = "ru-central1-b"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.2.0.0/24"]
}

resource "yandex_vpc_subnet" "subnet_c" {
  zone           = "ru-central1-c"
  network_id     = yandex_vpc_network.grafana_network.id
  v4_cidr_blocks = ["10.3.0.0/24"]
}

resource "yandex_mdb_clickhouse_cluster" "ch_cluster" {
  name        = "grafana-clickhouse"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id

  clickhouse {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 16
    }
  }

  zookeeper {
    resources {
      resource_preset_id = "s2.micro"
      disk_type_id       = "network-ssd"
      disk_size          = 10
    }
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
    }
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "CLICKHOUSE"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }

  host {
    type      = "ZOOKEEPER"
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

resource "yandex_mdb_mysql_cluster" "mysql_cluster" {
  name        = "grafana_mysql"
  environment = "PRODUCTION"
  network_id  = yandex_vpc_network.grafana_network.id
  version     = "8.0"

  resources {
    resource_preset_id = "s2.micro"
    disk_type_id       = "network-ssd"
    disk_size          = 16
  }

  database {
    name = var.dbname
  }

  user {
    name     = var.username
    password = var.password
    permission {
      database_name = var.dbname
      roles         = ["ALL"]
    }
  }

  host {
    zone      = "ru-central1-a"
    subnet_id = yandex_vpc_subnet.subnet_a.id
  }
  host {
    zone      = "ru-central1-b"
    subnet_id = yandex_vpc_subnet.subnet_b.id
  }
  host {
    zone      = "ru-central1-c"
    subnet_id = yandex_vpc_subnet.subnet_c.id
  }
}

αžŠαžΌαž…αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžƒαžΎαž‰ αž…αž„αŸ’αž€αŸ„αž˜αž“αžΈαž˜αž½αž™αŸ—αž“αŸƒαž€αŸ’αžšαž»αž˜αž‘αžΆαŸ†αž„αž–αžΈαžšαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž„αŸ’αž€αžΎαžαž‘αžΎαž„αžŠαžΎαž˜αŸ’αž”αžΈαž±αŸ’αž™αž˜αžΆαž“αž—αžΆαž–αž’αžαŸ‹αž’αŸ’αž˜αžαŸ‹αžŠαŸ„αž™αž™αž»αžαŸ’αžαž·αž’αž˜αŸŒ αžŠαŸ„αž™αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ†αž”αž“αŸ‹αžŠαŸ‚αž›αž˜αžΆαž“αž…αŸ†αž“αž½αž“αž”αžΈαŸ”

αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸαž‚αŸαž αž‘αŸ†αž–αŸαžš

αžœαžΆαž αžΆαž€αŸ‹αžŠαžΌαž…αž‡αžΆαž’αŸ’αž“αž€αž’αžΆαž…αž”αž“αŸ’αžαž€αŸ’αž“αž»αž„αžŸαŸ’αž˜αžΆαžšαžαžΈαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž‡αž½αž”αž€αžΆαžšαž›αŸ†αž”αžΆαž€αŸ” αž˜αž»αž“αž“αŸ„αŸ‡ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž›αžΎαž€αž…αž„αŸ’αž€αŸ„αž˜ MySQL αž‡αžΆαž˜αž»αž“αžŸαž·αž“ αž αžΎαž™αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž“αŸ„αŸ‡αžŠαŸ„αž™αžŠαžΉαž„αž–αžΈαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžšαž”αžŸαŸ‹αžœαžΆ αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž”αŸ’αžšαž˜αžΌαž›αžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžŠαŸ‚αž›αž…αž„αŸ‹αž”αžΆαž“ αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž‘αŸ…αž…αž„αŸ’αž€αŸ„αž˜αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αž₯αž‘αžΌαžœαž“αŸαŸ‡αž™αžΎαž„αž˜αž·αž“αžŠαžΉαž„αž’αŸ†αž–αžΈαž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αž…αž„αŸ’αž€αŸ„αž˜αž˜αž»αž“αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αž“αŸƒ Terraform αžšαž½αž˜αž‘αžΆαŸ†αž„αž“αŸ…αž–αŸαž›αž”αž„αŸ’αž€αžΎαžαžšαžΌαž”αž—αžΆαž–αž•αž„αžŠαŸ‚αžšαŸ” αžŠαžΌαž…αŸ’αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αžαŸ’αžšαžΌαžœαž„αžΆαž€αž‘αŸ…αžšαž€αž…αŸ†αžŽαž»αž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜ αž›αŸ’αž”αž·αž….

αžŠαŸ„αž™αž”αŸ’αžšαžΎαžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆαž–αžΈ Amazon αž™αžΎαž„αž“αžΉαž„αž”αž‰αŸ’αž‡αžΌαž“αž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαž˜αž½αž™αž…αŸ†αž“αž½αž“αž‘αŸ…αž€αžΆαž“αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αž αžŠαŸ‚αž›αžœαžΆαž“αžΉαž„αž‘αž‘αž½αž›αž™αž€ αž“αž·αž„αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαŸ” αž™αžΎαž„αžαŸ’αžšαžΌαžœαž€αžΆαžšαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαžΎαž˜αŸ’αž”αžΈαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“ MySQL αž“αŸƒαž…αž„αŸ’αž€αŸ„αž˜ αž“αž·αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžˆαŸ’αž˜αŸ„αŸ‡αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹-αž–αžΆαž€αŸ’αž™αžŸαž˜αŸ’αž„αžΆαžαŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αž”αžΆαž“αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžš Terraform αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜αŸ” αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž˜αžΆαžαž·αž€αžΆαž“αŸƒαž―αž€αžŸαžΆαžšαž”αž“αŸ’αžαž·αž… setup.shαžŠαŸ‚αž›αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž“αŸ…αž–αŸαž›αžŠαŸ‚αž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αžΎαž€αŸ”

setup.shαŸ–

#!/bin/bash
CLUSTER_URI="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/mysql_cluster_uri)"
USERNAME="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/username)"
PASSWORD="$(curl -H 'Metadata-Flavor:Google' http://169.254.169.254/computeMetadata/v1/instance/attributes/password)"
sudo sed -i "s#.*;url =.*#url = mysql://${USERNAME}:${PASSWORD}@${CLUSTER_URI}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_user =.*#admin_user = ${USERNAME}#" /etc/grafana/grafana.ini
sudo sed -i "s#.*;admin_password =.*#admin_password = ${PASSWORD}#" /etc/grafana/grafana.ini
sudo service grafana-server restart

αž€αŸ’αžšαž»αž˜ Instance αž“αž·αž„ Balancer

αžŠαŸ„αž™αž”αžΆαž“αž€αžŸαžΆαž„αžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαžαŸ’αž˜αžΈαž‘αžΎαž„αžœαž·αž‰ αž‘αžΈαž”αŸ†αž•αž»αžαž™αžΎαž„αž’αžΆαž…αž”αž“αŸ’αžαŸ‚αž˜αž―αž€αžŸαžΆαžšαžšαž”αžŸαŸ‹αž™αžΎαž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Terraform αŸ”

αž™αžΎαž„αž”αž„αŸ’αž αžΆαž‰αžαžΆαž™αžΎαž„αž…αž„αŸ‹αž”αŸ’αžšαžΎαžšαžΌαž”αž—αžΆαž–αžαžΆαžŸαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžšαžΆαž”αŸ‹αŸ–

data "yandex_compute_image" "grafana_image" {
  image_id = var.image_id
}

αž₯αž‘αžΌαžœβ€‹αž™αžΎαž„β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž€αŸ’αžšαž»αž˜β€‹αž§αž‘αžΆαž αžšαžŽαŸαŸ–

resource "yandex_compute_instance_group" "grafana_group" {
  name               = "grafana-group"
  folder_id          = var.folder_id
  service_account_id = var.service_account_id
  instance_template {
    platform_id = "standard-v1"
    resources {
      memory = 1
      cores  = 1
    }
    boot_disk {
      mode = "READ_WRITE"
      initialize_params {
        image_id = data.yandex_compute_image.grafana_image.id
        size     = 4
      }
    }
    network_interface {
      network_id = yandex_vpc_network.grafana_network.id
      subnet_ids = [yandex_vpc_subnet.subnet_a.id, yandex_vpc_subnet.subnet_b.id, yandex_vpc_subnet.subnet_c.id]
      nat = "true"
    }
    metadata = {
      mysql_cluster_uri = "c-${yandex_mdb_mysql_cluster.mysql_cluster.id}.rw.mdb.yandexcloud.net:3306/${var.dbname}"
      username = var.username
      password = var.password
      ssh-keys = "ubuntu:${file("${var.public_key_path}")}"
    }
    network_settings {
      type = "STANDARD"
    }
  }

  scale_policy {
    fixed_scale {
      size = 6
    }
  }

  allocation_policy {
    zones = ["ru-central1-a", "ru-central1-b", "ru-central1-c"]
  }

  deploy_policy {
    max_unavailable = 2
    max_creating    = 2
    max_expansion   = 2
    max_deleting    = 2
  }

  load_balancer {
    target_group_name = "grafana-target-group"
  }
}

αžœαžΆαž‚αž½αžšαž’αŸ„αž™αž™αž€αž…αž·αžαŸ’αžαž‘αž»αž€αžŠαžΆαž€αŸ‹αž…αŸ†αž–αŸ„αŸ‡αžšαž”αŸ€αž”αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž†αŸ’αž›αž„αž‘αŸ…αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆ cluster_uri, username ΠΈ password. αžœαžΆαž‚αžΊαž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž“αž·αž˜αŸ’αž˜αž·αžαžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸ αžŠαŸ‚αž›αž“αžΉαž„αž‘αž‘αž½αž›αž”αžΆαž“αžœαžΆαž“αŸ…αž–αŸαž›αž…αžΆαž”αŸ‹αž•αŸ’αžαžΎαž˜ αž αžΎαž™αžŠαžΆαž€αŸ‹αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ Grafana αŸ”

αžœαžΆαž“αž·αž™αžΆαž™αž’αŸ†αž–αžΈαž’αŸ’αž“αž€αžαž»αž›αŸ’αž™αž—αžΆαž–αŸ”

resource "yandex_lb_network_load_balancer" "grafana_balancer" {
  name = "grafana-balancer"

  listener {
    name = "grafana-listener"
    port = 80
    target_port = 3000
    external_address_spec {
      ip_version = "ipv4"
    }
  }

  attached_target_group {
    target_group_id = yandex_compute_instance_group.grafana_group.load_balancer.0.target_group_id

    healthcheck {
      name = "healthcheck"
      tcp_options {
        port = 3000
      }
    }
  }
}

αžŸαŸ’αž€αžšαž”αž“αŸ’αžαž·αž…

αž“αŸ…αžŸαž›αŸ‹αžαž·αž…αžαž½αž…αžŽαžΆαžŸαŸ‹αŸ” αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž–αžΈαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžαŸ’αžšαžΌαžœαž”αžΆαž“αžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ αž’αŸ’αž“αž€αž“αžΉαž„αžαŸ’αžšαžΌαžœαž…αžΌαž›αž‘αŸ…αž€αžΆαž“αŸ‹ Grafana UI αž αžΎαž™αž”αž“αŸ’αžαŸ‚αž˜αž…αž„αŸ’αž€αŸ„αž˜ CH αžŠαŸ„αž™αžŠαŸƒ (αž›αŸαžαžŸαž˜αŸ’αž‚αžΆαž›αŸ‹αžŠαŸ‚αž›αž’αŸ’αž“αž€αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž€αžΆαžšαžŠαžΎαž˜αŸ’αž”αžΈαž‘αž‘αž½αž›αž”αžΆαž“) αž‡αžΆαž”αŸ’αžšαž—αž–αž‘αž·αž“αŸ’αž“αž“αŸαž™αŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚ Terraform αžŸαŸ’αž‚αžΆαž›αŸ‹αž’αžαŸ’αžαžŸαž‰αŸ’αž‰αžΆαžŽαž…αž„αŸ’αž€αŸ„αž˜αŸ” αžŸαžΌαž˜β€‹αž²αŸ’αž™β€‹αž‚αžΆαžαŸ‹β€‹αž”αž‰αŸ’αž…αž”αŸ‹β€‹αž€αžΆαžšαž„αžΆαžšαŸ”

αžαŸ„αŸ‡αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαžαŸ’αž˜αžΈ - Grafana αž αžΎαž™αžšαž’αž·αž› IP αžšαž”αžŸαŸ‹ Balancer αž‡αžΆαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αŸ” αž€αžΆαžšαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αžŠαŸ‚αž› Terraform αž’αŸ’αžœαžΎαž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αžŠαŸ‚αž›αžαž»αž›αŸ’αž™αž—αžΆαž–αžšαž”αžŸαŸ‹αžœαžΆαž€αŸ†αžŽαžαŸ‹αž“αžΉαž„αž€αžΎαž“αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„ MySQL αž αžΎαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž›αžΎαž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αžΆαŸ†αž„αž’αžŸαŸ‹αŸ”

provider "grafana" {
  url  = "http://${[for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0}"
  auth = "${var.username}:${var.password}"
}

resource "grafana_data_source" "ch_data_source" {
  type          = "vertamedia-clickhouse-datasource"
  name          = "grafana"
  url           = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
  basic_auth_enabled = "true"
  basic_auth_username = var.username
  basic_auth_password = var.password
  is_default = "true"
  access_mode = "proxy"
}

αžαŸ„αŸ‡αžŸαž·αžαžŸαž€αŸ‹

αž”αž„αŸ’αž αžΆαž‰ IP αžŠαŸ‚αž›αž˜αžΆαž“αžαž»αž›αŸ’αž™αž—αžΆαž– αž“αž·αž„αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž…αž„αŸ’αž€αŸ„αž˜ ClickHouse

output "grafana_balancer_ip_address" {
  value = [for s in yandex_lb_network_load_balancer.grafana_balancer.listener: s.external_address_spec.0.address].0
}

output "clickhouse_cluster_host" {
  value = "https://c-${yandex_mdb_clickhouse_cluster.ch_cluster.id}.rw.mdb.yandexcloud.net:8443"
}

αž’αžΆαž…αžšαžαŸ‹αž”αžΆαž“αŸ”

αž‘αžΆαŸ†αž„αž’αžŸαŸ‹! αž―αž€αžŸαžΆαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžšαž”αžŸαŸ‹αž™αžΎαž„αžšαž½αž…αžšαžΆαž›αŸ‹αž αžΎαž™ αž αžΎαž™αž™αžΎαž„αž’αžΆαž…αžŠαŸ„αž™αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž’αžαŸαžš αž”αŸ’αžšαžΆαž”αŸ‹ Terraform αž±αŸ’αž™αž›αžΎαž€αž‘αžΎαž„αž“αžΌαžœαž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αžŠαŸ‚αž›αž™αžΎαž„αž”αžΆαž“αž–αž·αž–αžŽαŸŒαž“αžΆαžαžΆαž„αž›αžΎαŸ” αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αžΆαŸ†αž„αž˜αžΌαž›αž”αžΆαž“αž…αŸ†αžŽαžΆαž™αž–αŸαž›αž”αŸ’αžšαž αŸ‚αž› 15 αž“αžΆαž‘αžΈαŸ”
αž“αŸ…αž…αž»αž„αž”αž‰αŸ’αž…αž”αŸ‹αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžŸαžΆαžšαžŠαŸαžŸαŸ’αžšαžŸαŸ‹αžŸαŸ’αž’αžΆαžαž˜αž½αž™:

Apply complete! Resources: 9 added, 0 changed, 0 destroyed.
Outputs:

clickhouse_cluster_host = https://c-c9q14ipa2ngadqsbp2iq.rw.mdb.yandexcloud.net:8443
grafana_balancer_ip_address = 130.193.50.25

αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž–αž–αž€ αž’αžΆαžαž»αž“αŸƒαž αŸαžŠαŸ’αž‹αžΆαžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’αžŠαŸ‚αž›αž”αžΆαž“αž›αžΎαž€αž‘αžΎαž„αž“αžΉαž„αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αŸ–

αž€αžΆαžšαžŠαžΆαž€αŸ‹αž±αŸ’αž™αž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹αžŸαŸαžœαžΆαž€αž˜αŸ’αž˜αž…αŸ‚αž€αž…αžΆαž™αž“αŸ…αž€αŸ’αž“αž»αž„ Yandex.Cloud αžŠαŸ„αž™αž”αŸ’αžšαžΎ Grafana αž‡αžΆαž§αž‘αžΆαž αžšαžŽαŸ

αž…αžΌαžšαžŸαž“αŸ’αž˜αžαž›αž‘αŸ’αž’αž•αž›

αž₯αž‘αžΌαžœαž“αŸαŸ‡ αžŠαŸ„αž™αž”αŸ’αžšαžΎαž§αž‘αžΆαž αžšαžŽαŸαž“αŸƒ Grafana αž’αŸ’αž“αž€αž˜αŸ’αž“αžΆαž€αŸ‹αŸ—αž’αžΆαž…αžŠαžΆαž€αŸ‹αž–αž„αŸ’αžšαžΆαž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžŠαŸ‚αž›αž˜αžΆαž“αžŸαŸ’αžαžΆαž”αžαŸ’αž™αž€αž˜αŸ’αž˜αž–αž–αž€αž’αŸ†αž‘αžΌαž›αžΆαž™αž“αŸ…αž›αžΎαžœαŸαž‘αž·αž€αžΆ Yandex.Cloud αŸ” αž§αž”αž€αžšαžŽαŸαž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž–αžΈ HashiCorp αžŠαžΌαž…αž‡αžΆ Packer αž“αž·αž„ Terraform αž’αžΆαž…αž‡αž½αž™αž’αŸ’αž“αž€αž€αŸ’αž“αž»αž„αžšαžΏαž„αž“αŸαŸ‡αŸ” αžαŸ’αž‰αž»αŸ†αžŸαž„αŸ’αžƒαžΉαž˜αžαžΆαž“αžšαžŽαžΆαž˜αŸ’αž“αžΆαž€αŸ‹αžšαž€αžƒαžΎαž‰αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸπŸ™‚

PS αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αž“αŸαŸ‡αžαŸ’αž‰αž»αŸ†αž“αžΉαž„αž—αŸ’αž‡αžΆαž”αŸ‹αžαŸ†αžŽαž—αŸ’αž‡αžΆαž”αŸ‹αž‘αŸ…αž€αžΆαž“αŸ‹αžƒαŸ’αž›αžΆαŸ†αž„ αžŠαŸ‚αž›αž’αŸ’αž“αž€αž’αžΆαž…αžŸαŸ’αžœαŸ‚αž„αžšαž€αžšαžΌαž”αž˜αž“αŸ’αžαžŠαŸ‚αž›αžαŸ’αžšαŸ€αž˜αžšαž½αž…αž‡αžΆαžŸαŸ’αžšαŸαž…αžŸαž˜αŸ’αžšαžΆαž”αŸ‹ Packer αž“αž·αž„ Terraform αžŠαŸ‚αž›αž‡αžΆαž”αŸ†αžŽαŸ‚αž€αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αž›αžΎαž€αž‘αžΎαž„αž“αŸ…αž€αŸ’αž“αž»αž„αž’αžαŸ’αžαž”αž‘αž“αŸαŸ‡αŸ”

αžƒαŸ’αž›αžΆαŸ†αž„

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹