Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π½Π΅Π΄Π°Π²Π½ΠΎ ΠΌΠ½Π΅ попалась интСрСсная Π·Π°Π΄Π°Ρ‡ΠΊΠ° Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для бэкапа большого количСства Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… устройств.

ΠšΠ°ΠΆΠ΄ΡƒΡŽ нСдСлю ΠΌΡ‹ выполняСм Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСх Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин Π² нашСм ΠΎΠ±Π»Π°ΠΊΠ΅, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ тысячи Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΠΉ ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ это максимально быстро ΠΈ эфСктивно.

К соТалСнию стандартныС ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ RAID5, RAID6 Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π°ΠΌ Π½Π΅ подхотят Π² Π²ΠΈΠ΄Ρƒ Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ процСсс восстановлСния Π½Π° Ρ‚Π°ΠΊΠΈΡ… Π±ΠΎΠ»ΡŒΡˆΠΈΡ… дисках ΠΊΠ°ΠΊ наши Π±ΡƒΠ΄Π΅Ρ‚ ΠΌΡƒΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»Π³ΠΈΠΌ ΠΈ скорСС всСго Π½Π΅ закончится Π½ΠΈΠΊΠΎΠ³Π΄Π°.

Рассмотрим ΠΊΠ°ΠΊΠΈΠ΅ Π΅ΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ :

Erasure Coding β€” Аналог RAID5, RAID6, Π½ΠΎ с настраиваСмым ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ чСтности. ΠŸΡ€ΠΈ этом Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ выполняСтся Π½Π΅ ΠΏΠΎΠ±Π»ΠΎΡ‡Π½ΠΎ Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. НаиболСС простой способ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ erasure coding β€” это Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ minio.

DRAID β€” это Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Ρ‰Ρ‘ Π½Π΅ выпущСнная Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ZFS. Π’ ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ RAIDZ DRAID ΠΈΠΌΠ΅Π΅Ρ‚ распрСдСлённый parity block ΠΈ ΠΏΡ€ΠΈ восстановлСнии задСйствуСт сразу всС диски массива, благодаря Ρ‡Π΅ΠΌΡƒ Π»ΡƒΡ‡ΡˆΠ΅ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΠ°Π·Ρ‹ дисков ΠΈ быстрСС восстанавливаСтся послС сбоя.

Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

Π’ распоряТСнии имССтся сСрвСр Fujitsu Primergy RX300 S7 c процСссором Intel Xeon CPU E5-2650L 0 @ 1.80GHz, Π΄Π΅Π²ΡΡ‚ΡŒΡŽ ΠΏΠ»Π°Π½ΠΊΠ°ΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Samsung DDR3-1333 8Gb PC3L-10600R ECC Registered (M393B1K70DH0-YH9), дисковая ΠΏΠΎΠ»ΠΊΠ° Supermicro SuperChassis 847E26-RJBOD1, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Ρ‘Π½Π½Π°Ρ Ρ‡Π΅Ρ€Π΅Π· Dual LSI SAS2X36 Expander ΠΈ 45 дисков Seagage ST6000NM0115-1YZ110 ΠΏΠΎ 6TB ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π°ΠΌ сначала Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ всё ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

Для этого я подготовился ΠΈ ΠΏΡ€ΠΎΠ²Ρ‘Π» тСстированиС Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΉ. Для этого я использовал minio, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выступал Π² качСствС S3-бэкСнда ΠΈ запускал Π΅Π³ΠΎ Π² Ρ€Π°Π·Π½Ρ‹Ρ… Ρ€Π΅ΠΆΠΈΠΌΠ°Ρ… с Ρ€Π°Π·Π½Ρ‹ΠΌ количСством Ρ‚Π°Ρ€Π³Π΅Ρ‚ΠΎΠ².

Π’ основном тСстировался кСйс minio Π² erasure coding vs software raid с Ρ‚Π΅ΠΌ ΠΆΠ΅ количСством дисков ΠΈ parity дисков, Π° это: RAID6, RAIDZ2 ΠΈ DRAID2.

Для справки: ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ запускаСтС minio с ΠΎΠ΄Π½ΠΈΠΌ-лишь Ρ‚Π°Ρ€Π³Π΅Ρ‚ΠΎΠΌ, Ρ‚ΠΎ minio Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ S3-гСйтвСя отдавая Π²Π°ΡˆΡƒ Π»ΠΎΠΊΠ°Π»ΡŒΠ½ΡƒΡŽ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму Π² Π²ΠΈΠ΄Π΅ S3-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°. Π’ случаС ΠΆΠ΅ Ссли Π²Ρ‹ запуститС minio с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ‚Π°Ρ€Π³Π΅Ρ‚ΠΎΠ², Ρ‚ΠΎ автоматичСски Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ Ρ€Π΅ΠΆΠΈΠΌ Erasure Coding, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠ΅ΠΆΠ΄Ρƒ вашими Ρ‚Π°Ρ€Π³Π΅Ρ‚Π°ΠΌΠΈ с прСдоставлСниСм отказоустойчивости.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ minio Π΄Π΅Π»ΠΈΡ‚ Ρ‚Π°Ρ€Π³Π΅Ρ‚Ρ‹ Π½Π° Π³Ρ€ΡƒΠΏΠΏΡ‹ ΠΏΠΎ 16 дисков, Π³Π΄Π΅ Π½Π° ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π³Ρ€ΡƒΠΏΠΏΡƒ приходится ΠΏΠΎ 2 parity. Π’.Π΅. ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΈΠ· строя ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹ΠΉΡ‚ΠΈ Π΄Π²Π° диска Π±Π΅Π· ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π΄Π°Π½Π½Ρ‹Ρ….

Для тСстирования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ я использовал 16 дисков ΠΏΠΎ 6TB ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈ писал Π½Π° Π½ΠΈΡ… нСбольшиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠΌ Π² 1MB, это максимально Ρ‚ΠΎΡ‡Π½ΠΎ описывало Π½Π°ΡˆΡƒ Π±ΡƒΠ΄ΡƒΡ‰ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всС соврСмСнныС инструмСнты для бэкапа дСлят Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° Π±Π»ΠΎΠΊΠΈ Π² нСсколько ΠΌΠ΅Π³Π°Π±Π°ΠΉΡ‚ ΠΈ ΠΏΠΈΡˆΡƒΡ‚ ΠΈΡ… Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ.

Для провСдСния бэнчмарка использовалась ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° s3bench запускаСмая Π½Π° ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠΌ сСрвСрС ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ Π² minio дСсятки тысяч Ρ‚Π°ΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π² ΡΠΎΡ‚Π½ΡŽ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². ПослС Ρ‡Π΅Π³ΠΎ Ρ‚Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ‹Ρ‚Π°Π»Π°ΡΡŒ Π·Π°ΠΏΡ€ΠΎΡΠΈΡ‚ΡŒ ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ бэнчмарка ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Π΅:

Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

Как ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ, minio Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ собствСнного erasure coding Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…ΡƒΠΆΠ΅ Π½Π° запись, Ρ‡Π΅ΠΌ minio Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ²Π΅Ρ€Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ RAID6, RAIDZ2 ΠΈ DRAID2 Π² Ρ‚ΠΎΠΉΠΆΠ΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ.

ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ мСня попросили ΠΏΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ minio Π½Π° ext4 vs XFS. Π£Π΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π½ΠΎ для ΠΌΠΎΠ΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ XFS оказалась Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ Ρ‡Π΅ΠΌ ext4.

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΡ€Ρ†ΠΈΡŽ тСстов Mdadm ΠΏΠΎΠΊΠ°Π·Π°Π» прСвосходство Π½Π°Π΄ ZFS, Π½ΠΎ ΠΏΠΎΠ·ΠΆΠ΅ gmelikov подсказал, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ZFS установив ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ:

xattr=sa atime=off recordsize=1M

ΠΈ послС этого тСсты с ZFS стали Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅.

Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ DRAID Π½Π΅ Π΄Π°Ρ‘Ρ‚ особого Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠ΅Ρ€Π΅Π΄ RAIDZ, Π½ΠΎ Π² Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ бСзопаснСС.

Π’ послСдних Π΄Π²ΡƒΡ… тСстах я Ρ‚Π°ΠΊΠΆΠ΅ попытался вынСсти ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ (special) ΠΈ ZIL (log) Π½Π° Π·Π΅Ρ€ΠΊΠ°Π»ΠΎ ΠΈΠ· SSD. Но вынСсСниС ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ… Π½Π΅ Π΄Π°Π»ΠΎ особого Π²Ρ‹ΠΈΠ³Ρ€Ρ‹ΡˆΠ° Π² скорости записи, Π° ΠΏΡ€ΠΈ выносС ZIL ΠΌΠΎΠΈ SSDSC2KI128G8 ΡƒΠΏΡ‘Ρ€Π»ΠΈΡΡŒ Π² ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ со 100% ΡƒΡ‚ΠΈΠ»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ Π΄Π°Π½Π½Ρ‹ΠΉ тСст ΠΏΡ€ΠΎΠ²Π°Π»Π΅Π½Ρ‹ΠΌ. Π― Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽ, Ρ‡Ρ‚ΠΎ Ссли Π±Ρ‹ Ρƒ мСня Π±Ρ‹Π»ΠΈ Π±ΠΎΠ»Π΅Π΅ быстрыС SSD-диски, Ρ‚ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ это ΠΌΠΎΠ³Π»ΠΎ Π±Ρ‹ сильно ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΌΠΎΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹, Π½ΠΎ, ΠΊ соТалСнию, Ρƒ мСня ΠΈΡ… Π½Π΅ оказалось.

Π’ ΠΈΡ‚ΠΎΠ³Π΅ я Ρ€Π΅ΡˆΠΈΠ» ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° использовании DRAID ΠΈ Π½Π΅ смотря Π½Π° свой Π±Π΅Ρ‚Π° статус, ΠΎΠ½ являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ быстрым ΠΈ эфСктивным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для хранСния Π² нашСм случаС.

Π― создал простой DRAID2 Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ c трСмя Π³Ρ€ΡƒΠΏΠΏΠ°ΠΌΠΈ ΠΈ двумя distributed spares:

# zpool status data
  pool: data
 state: ONLINE
  scan: none requested
config:

    NAME                 STATE     READ WRITE CKSUM
    data                 ONLINE       0     0     0
      draid2:3g:2s-0     ONLINE       0     0     0
        sdy              ONLINE       0     0     0
        sdam             ONLINE       0     0     0
        sdf              ONLINE       0     0     0
        sdau             ONLINE       0     0     0
        sdab             ONLINE       0     0     0
        sdo              ONLINE       0     0     0
        sdw              ONLINE       0     0     0
        sdak             ONLINE       0     0     0
        sdd              ONLINE       0     0     0
        sdas             ONLINE       0     0     0
        sdm              ONLINE       0     0     0
        sdu              ONLINE       0     0     0
        sdai             ONLINE       0     0     0
        sdaq             ONLINE       0     0     0
        sdk              ONLINE       0     0     0
        sds              ONLINE       0     0     0
        sdag             ONLINE       0     0     0
        sdi              ONLINE       0     0     0
        sdq              ONLINE       0     0     0
        sdae             ONLINE       0     0     0
        sdz              ONLINE       0     0     0
        sdan             ONLINE       0     0     0
        sdg              ONLINE       0     0     0
        sdac             ONLINE       0     0     0
        sdx              ONLINE       0     0     0
        sdal             ONLINE       0     0     0
        sde              ONLINE       0     0     0
        sdat             ONLINE       0     0     0
        sdaa             ONLINE       0     0     0
        sdn              ONLINE       0     0     0
        sdv              ONLINE       0     0     0
        sdaj             ONLINE       0     0     0
        sdc              ONLINE       0     0     0
        sdar             ONLINE       0     0     0
        sdl              ONLINE       0     0     0
        sdt              ONLINE       0     0     0
        sdah             ONLINE       0     0     0
        sdap             ONLINE       0     0     0
        sdj              ONLINE       0     0     0
        sdr              ONLINE       0     0     0
        sdaf             ONLINE       0     0     0
        sdao             ONLINE       0     0     0
        sdh              ONLINE       0     0     0
        sdp              ONLINE       0     0     0
        sdad             ONLINE       0     0     0
    spares
      s0-draid2:3g:2s-0  AVAIL   
      s1-draid2:3g:2s-0  AVAIL   

errors: No known data errors

Π₯ΠΎΡ€ΠΎΡˆΠΎ, с Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ Ρ‚ΠΎΠΌ Ρ‡Π΅ΠΌ Π±ΡƒΠ΄Π΅ΠΌ Π±ΡΠΊΠ°ΠΏΠΈΡ‚ΡŒ. Π—Π΄Π΅ΡΡŒ сразу хочСтся Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ‚Ρ€Ρ‘Ρ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΡ… ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ, Π° это:

Benji Backup β€” Ρ„ΠΎΡ€ΠΊ Backy2, спСциализированноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ для бэкапа Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… устройств, ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Π΅ΡΠ½ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡŽ с Ceph. Π£ΠΌΠ΅Π΅Ρ‚ Π·Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ diff’Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡΠ½Π°ΠΏΡˆΠΎΡ‚Π°ΠΌΠΈ ΠΈ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· Π½ΠΈΡ… ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹ΠΉ бэкап. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ большоС количСство бэкСнодов хранСния, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚Π°ΠΊ ΠΈ S3. Π’Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π±Π°Π·Ρ‹ Π΄Π°Π½Π½Ρ‹Ρ… для хранСния Ρ…ΡΡˆ-Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Из минусов: написан Π½Π° python, ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π½Π΅ΠΎΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²Ρ‹ΠΉ cli.

Borg Backup β€” Ρ„ΠΎΡ€ΠΊ Attic, Π΄Π°Π²Π½ΠΎ извСстноС ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ΅ срСдство для Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠ³ΠΎ копирования, ΡƒΠΌΠ΅Π΅Ρ‚ Π±ΡΠΊΠ°ΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ…. Π£ΠΌΠ΅Π΅Ρ‚ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ бэкапы ΠΊΠ°ΠΊ локально Ρ‚Π°ΠΊ ΠΈ Π½Π° ΡƒΠ΄Π°Π»Ρ‘Π½Π½Ρ‹ΠΉ сСрвСр посрСдством scp. Π£ΠΌΠ΅Π΅Ρ‚ Π±ΡΠΊΠ°ΠΏΠΈΡ‚ΡŒ Π±Π»ΠΎΡ‡Π½Ρ‹Π΅ устройства Ссли Π·Π°ΠΏΡƒΡ‰Π΅Π½ с Ρ„Π»Π°Π³ΠΎΠΌ --special, ΠΈΠ· минусов: ΠΏΡ€ΠΈ создании бэкапа Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ блокируСтся, поэтому ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΡƒ рСкомСндуСтся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ это Π½Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°, Π±Π»Π°Π³ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ½ΠΈ ΠΎΡ‡Π΅Π½ΡŒ Π»Π΅Π³ΠΊΠΎ.

Restic β€” Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π·Π²ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, написан Π½Π° go, достаточно быстр ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ большоС количСство бэкСндов для хранСния, срСди ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΊ локальноС Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅, Ρ‚Π°ΠΊ ΠΈ scp, S3 ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ хочСтся Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ созданный rest-server для restic, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ быстро ΡΠΊΡΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для использования ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎ. Из всСх Π²Ρ‹ΡˆΠ΅ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½Π½Ρ‹Ρ… ΠΌΠ½Π΅ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ большС всСго. Π£ΠΌΠ΅Π΅Ρ‚ Π±ΡΠΊΠ°ΠΏΠΈΡ‚ΡŒ ΠΈΠ· stdin. Π—Π°ΠΌΠ΅Ρ‚Π½Ρ‹Ρ… минусов ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚, Π½ΠΎ Π΅ΡΡ‚ΡŒ нСсколько особСнностСй:

  • Π’ΠΎ ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, я ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ ΠΎΠ±Ρ‰Π΅Π³ΠΎ рСпозитория для всСх Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΎΠΊ (ΠΊΠ°ΠΊ Benji) ΠΈ это Π΄Π°ΠΆΠ΅ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π½ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ восстанавлСния Π·Π°Π½ΠΈΠΌΠ°Π»ΠΈ вСсьма ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя, Ρ‚.ΠΊ. ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄ восстановлСниСм restic пытаСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Π΅ всСх бэкапов. Данная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π»Π΅Π³ΠΊΠΎ Ρ€Π΅ΡˆΠΈΠ»Π°ΡΡŒ ΠΊΠ°ΠΊ ΠΈ с borg, созданиСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ рСпозитория ΠΏΠΎΠ΄ ΠΊΠ°ΠΆΠ΄ΡƒΡŽ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΠΊΡƒ. Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ оказался вСсьма эффСктивным Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ для управлСниями Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹ΠΌΠΈ копиями. ΠžΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½Ρ‹Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΠ°Ρ€ΠΎΠ»ΡŒ для доступа ΠΊ Π΄Π°Π½Π½Ρ‹ΠΌ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π½Π΅ Π±ΠΎΡΡ‚ΡŒΡΡ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠ°ΠΊ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ сломаСтся. Π‘ΠΏΠ°Π²Π½ΠΈΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Π΅ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ просто ΠΊΠ°ΠΊ ΠΈ Π² borg backup.

    Π’ любом случаС дСдупликация производится Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ вСрсии бэкапа, ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΉ бэкап опрСдСляСтся ΠΏΠΎ path для ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠ³ΠΎ бэкапа, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ссли Π²Ρ‹ бэкапитС Ρ€Π°Π·Π½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ· stdin Π² ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, Π½Π΅ Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ --stdin-filename, Π»ΠΈΠ±ΠΎ явно ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ --parent.

  • Π’ΠΎ Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, восстановлСниС Π² stdout Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ большС Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ Ρ‡Π΅ΠΌ восстановлСниС Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму Π² Π²ΠΈΠ΄Ρƒ своСй ΠΏΠ°Ρ€Π°Π»Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ планируСтся Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚Π΅ΡΠ½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ бэкапов для Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… устройств.

  • Π’ Ρ‚Ρ€Π΅Ρ‚ΡŒΠΈΡ…, Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈΠ· master, Ρ‚.ΠΊ. вСрсия 0.9.6 ΠΈΠΌΠ΅Π΅Ρ‚ Π±Π°Π³ с Π΄ΠΎΠ»Π³ΠΈΠΌ восстановлСниСм Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ².

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ бэкапа ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ записи / восстановлСния ΠΈΠ· Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ, я создал ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Π» Π·Π°Π±ΡΠΊΠ°ΠΏΠΈΡ‚ΡŒ нСбольшой ΠΎΠ±Ρ€Π°Π· Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ°ΡˆΠΈΠ½Ρ‹ (21 GB). Π‘Ρ‹Π»ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ Π΄Π²Π° бэкапа Π±Π΅Π· измСнСния ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· пСрСчислСнных Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ насколько быстрСС/ΠΌΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π΄Π΅Π΄ΡƒΠΏΠ»ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅.

Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

Как ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Borg Backup ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ коэфициСнт эфСктивности Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π·Π΅Ρ€Π²Π½ΠΎΠΉ ΠΊΠΎΠΏΠΈΠΈ, Π½ΠΎ ΠΏΡ€ΠΎΠΈΠ³Ρ€Ρ‹Π²Π°Π΅Ρ‚ ΠΏΠΎ скорости ΠΊΠ°ΠΊ записи Ρ‚Π°ΠΊ ΠΈ восставлСния.

Restic оказался быстрСС Benji Backup, Π½ΠΎ дольшС восстанавливаСт Π² stdout, Π° ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Π² Π±Π»ΠΎΡ‡Π½ΠΎΠ΅ устройство ΠΎΠ½, ΠΊ соТалСнию, ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚.

ВзвСсив всС Π·Π° ΠΈ всС ΠΏΡ€ΠΎΡ‚ΠΈΠ² я Ρ€Π΅ΡˆΠΈΠ» ΠΎΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π½Π° restic с rest-server ΠΊΠ°ΠΊ Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ ΠΈ пСрспСктивном Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ для бэкапа.

Бэкап-Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ для тысяч Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… машин свободными инструмСнтами

Π’ Π΄Π°Π½Π½ΠΎΠΌ скринкастС Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΊΠ°ΠΊ 10-Π³ΠΈΠ³Π°Π±ΠΈΡ‚Π½Ρ‹ΠΉ ΠΊΠ°Π½Π°Π» ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ утилизируСтся ΠΏΡ€ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ…, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ…, опСрациях бэкапа. Π‘Ρ‚ΠΎΠΈΡ‚ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ утилизация дисков ΠΏΡ€ΠΈ этом Π½Π΅ поднимаСтся Π²Ρ‹ΡˆΠ΅ 30%.

ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ я оказался Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π΄ΠΎΠ²ΠΎΠ»Π΅Π½!

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com