Операційні системи використовують менеджери блокувань для організації та серіалізації доступу до ресурсів. Розподілений менеджер блокувань (англ. Distributed lock manager, DLM) працює на кожній машині в кластері, з ідентичною копією бази даних блокувань кластера. Таким чином, DLM є пакетом програмного забезпечення, який дозволяє комп'ютерам в кластері синхронізувати свої доступи до спільно використовуваних ресурсів .
Різні реалізації DLM були використані як основа для декількох успішних кластерних файлових систем, в яких вузли кластера можна використовувати для зберігання файлів один одного за допомогою єдиної файлової системи, зі значними перевагами у плані підвищення продуктивності і доступності . Основна перевага продуктивності досягається за рахунок вирішення проблеми когерентності дискового кешу між комп'ютерами, що беруть участь в кластері. DLM використовується не тільки для блокування файлів , але і для координації всіх видів дискового доступу. VMScluster , перша система кластеризації одержала широке поширення, покладається на OpenVMS DLM саме таким чином.
Реалізація VMS
DEC VMS була першою широко доступною операційною системою, де було реалізовано DLM. Даний функціонал з'явився у версії 4, хоча інтерфейс користувача був таким же, як і у однопроцесорного менеджера блокування, якого вперше було реалізовано у версії 3.
Ресурси
DLM використовує узагальнене поняття ресурсу, як окремого об'єкта, до якого треба контролювати загальний доступ. Це може бути файл, запис, область загальної пам'яті, або щось ще, що вибрав розробник програми. Розробник сам описує ієрархію ресурсів, отже він сам визначає необхідну кількість рівнів блокування. Наприклад, гіпотетична база даних могла б описувати ієрархію ресурсів таким чином:
- База даних
- Таблиця
- запис
- поле
Таким чином процес в рамках виконання отримує можливість встановлювати необхідні блокування на базу даних в цілому (батьківський ресурс), а потім і на окремі частини бази даних (підпорядковані ресурси).
Режими блокування
Процес, що виконується в межах VMSCluster може отримати блокування ресурсу. DLM реалізує шість режимів блокування, і кожен з них визначає різні рівні ексклюзивності доступу. У процесі використання ресурсу можна перетворити рівень режиму блокування на більш високий або більш низький. Коли усі процеси розблокують ресурс, інформація про ресурсі знищується.
- Null (NL). Вказує інтерес до ресурсу, але не заважає іншим процесам замикаючи його. Цей режим надає зручний механізм створення ресурсу та збереження його значення блоку блокування зберігаються, навіть якщо жоден процес не замикає його.
- Паралельне читання (Concurrent Read, CR). Вказує на намір читати (але не оновлювати) ресурс. Це дозволяє іншим процесам читати або оновлювати ресурс, але не дозволяє іншим отримувати ексклюзивний доступ до нього. Цей режим, як правило, використовується на ресурсах високого рівня ієрархії, враховуючи те, що більш жорсткі блокування можуть бути отримані для підлеглих йому ресурсів.
- Одночасний запис (Concurrent Write, CW). Вказує на намір читати і оновлювати ресурс. Цей режим також дозволяє іншим процесам читати або оновлювати ресурс, але не дозволяє іншим отримувати ексклюзивний доступ до нього. Цей режим, також використовується на ресурсах високого рівня ієрархії, враховуючи те, що більш жорсткі блокування можуть бути отримані для дочірніх ресурсів.
- Захищене читання (Protected Read, PR). Це традиційний режим спільної блокування, який вказує на бажання читати ресурс, але не дозволяє іншим оновлювати його вміст. Інші процеси, однак, також можуть прочитати вміст ресурсу.
- Захищена запис (Write Protected, PW). Це традиційний режим блокування оновлення, який вказує на бажання читати і оновлювати ресурс і не дозволяє іншим користувачам оновлювати його. Інші процеси можуть отримувати режим доступу «Паралельне читання» і можуть прочитати ресурс.
- Exclusive (EX). Це традиційний режим ексклюзивного блокування, якій дозволяє читати та оновлювати доступ до ресурсу, і не дозволяє іншим процесам мати доступ до нього.
Наступна таблиця істинності показує сумісність кожного режиму блокування з іншими:
Mode | NL | CR | CW | PR | PW | EX |
---|---|---|---|---|---|---|
NL | Так | Так | Так | Так | Так | Так |
CR | Так | Так | Так | Так | Так | Ні |
CW | Так | Так | Так | Ні | Ні | Ні |
PR | Так | Так | Ні | Так | Ні | Ні |
PW | Так | Так | Ні | Ні | Ні | Ні |
EX | Так | Ні | Ні | Ні | Ні | Ні |
Отримання блокування
Процес може заблокувати ресурс з допомогою постановки в чергу запиту блокування. Цей механізм схожий на [en] — технологію VMS, яка використовується для виконання операцій введення/виводу. Запит блокування може виконуватися або повністю синхронно, в цьому випадку процес чекає, поки блокування не видається, або асинхронно, і в цьому випадку спрацьовує механізм [en] (англ. AST) , коли буде отримана блокування.
Крім того, можна встановити блокуючий AST, який спрацьовує, коли процес отримав блокування, запобігаючи доступ до ресурсу іншим процесом. Оригінальний процес може потім при необхідності вжити заходів, щоб дозволити іншим доступ (наприклад, знизивши або знявши блокування).
Блок значення блокування
Блок значення блокування пов'язаний з кожним ресурсом. Він може бути прочитаний при отриманні будь-якого виду блокування (крім блокування NULL) і його може бути поновлено за допомогою процесу, який отримав блокування ресурсу рівня PW або EX.
Його може бути використано для зберігання будь-якої інформації про ресурс, який вибирає розробник додатків. Зазвичай він використовується для зберігання номера версії ресурсу. Кожного разу, коли пов'язаний з ним об'єкт (наприклад, запис у базі даних) оновлюється, власник блокування інкрементує значення блоку. Коли інший процес бажає прочитати ресурс, він отримує відповідне значення блокування і порівнює поточне значення блокування з значенням, яке було минулого разу, коли процес звертався до заблокованого ресурсу. Якщо значення таке ж, процес знає, що пов'язаного з ним ресурсу не було оновлено з моменту останнього часу його читання, і, отже, немає необхідності читати його знову. Отже, цей метод може бути використано для реалізації різних типів кеш-пам'яті в базі даних або аналогічних програмах.
Визначення ситуацій взаємного блокування
Взаємне блокування (deadlock) — ситуація, при якій декілька процесів знаходяться в стані нескінченного очікування ресурсів, зайнятих самими цими процесами. Е. Дейкстра спочатку назвав таку ситуацію «смертельними обіймами».
OpenVMS DLM періодично перевіряє процеси на ситуації взаємного блокування. У разі, коли перший процес блокує ресурс 1, очікуючи звільнення ресурсу 2, блокованою другим процесом, який, в свою чергу, очікує звільнення ресурсу 1, то другий процес викликає статус взаємного блокування. У цьому випадку вживаються заходи по виходу із стану взаємної блокування, звільняючи від блокування ресурс, якого було заблоковано першим.
Кластеризація в Linux
У січні 2006 року до ядра Linux версії 2.6.16 було включено код OCFS2 (Oracle Cluster File System), який запропонували програмісти однойменної корпорації; в листопаді 2006 до ядра версії 2.6.19 було додано код підтримки кластерного ПЗ від компанії Red Hat, зокрема підтримку файлової системи {{ safesubst:p{{ safesubst:#ifGFS2:{{{2}}}|1|2}}|{{{3}}}|}}. Обидві системи базуються на успішної моделі VMS DLM. При цьому розподілений менеджер блокувань від Oracle має спрощений API — базова функція dlmlock()
мала всього 8 параметрів. Аналогічне логічне ім'я SYS$ENQ
в VMS, а також функція dlm_lock
в DLM від Red Hat мають по 11 параметрів.
Chubby, сервіс блокування від Google
Корпорація Google розробила свою реалізацію сервісу блокування для слабозв'язанних розподілених систем, яку назвали Chubby. Цей сервіс призначений для забезпечення грубого блокування (Coarse Grained Lock), а також для підтримки функціонально-обмеженої, але надійної розподіленої файлової системи. Основні частини інфраструктури Google, включаючи Google File System, BigTable та MapReduce, використовують Chubby для синхронізації доступу до ресурсів, що розділяються. Хоча сервіс Chubby спочатку було розроблено як службу блокування, зараз Google його широко використовує як сервер імен, витісняючи DNS.
ZooKeeper
Apache Zookeeper, проект Apache Software Foundation — це розподілене ієрархічне сховище ключів і значень, яке використовується для забезпечення розподіленої служби конфігурацій, служби синхронізації та реєстру імен для великих розподілених систем. Також ZooKeeper може використовуватися як розподілений менеджер блокувань. Спочатку Zookeeper було започатковано як суб-проект в рамках Hadoop, але зараз він входить до списку основних проектів ASF.
Архітектура Zookeeper підтримує високу доступність за рахунок надлишковості послуг. Таким чином, клієнти можуть ініціювати вибори іншого лідера Zookeeper, якщо поточний не відповідає на запити. Вузли Zookeeper зберігають свої дані в ієрархічному просторі імен, аналогічному файловій системі або дереву структури даних.
Zookeeper використовується багатьма компаніями, в тому числі Rackspace, Yahoo!, Однокласники, Reddit і eBay , а також платформа повнотекстового пошуку з відкритим кодом Solr.
ETCD
Демон etcd
, що дозволяє оновлювати налаштування вузлів в рамках інфраструктури кластера CoreOS, також надає можливості розподіленого менеджера блокувань.
Алгоритм Redlock в Redis
Нереляційна високопродуктивна СУБД Redis, що представляє собою мережевий журналируемое сховище даних типу «ключ — значення» з відкритим вихідним кодом, може бути використана для реалізації алгоритму розподіленого управління блокуваннями Redlock.
Зноски
- Gehani, Narain. {{{Заголовок}}}. — .
- kernel/git/torvalds/linux.git - Linux kernel source tree. git.kernel.org. Процитовано 14 лютого 2017.
- kernel/git/torvalds/linux.git - Linux kernel source tree. git.kernel.org. Процитовано 14 лютого 2017.
- . lwn.net. Архів оригіналу за 24 жовтня 2016. Процитовано 14 лютого 2017.
- . research.google.com. Архів оригіналу за 20 листопада 2016. Процитовано 14 лютого 2017.
- . cwiki.apache.org. Архів оригіналу за 25 серпня 2018. Процитовано 14 лютого 2017.
- . zookeeper.apache.org. Архів оригіналу за 16 лютого 2017. Процитовано 14 лютого 2017.
- . cwiki.apache.org. Архів оригіналу за 10 квітня 2014. Процитовано 14 лютого 2017.
- . wiki.apache.org. Архів оригіналу за 9 грудня 2013. Процитовано 14 лютого 2017.
- . reddit. Архів оригіналу за 16 лютого 2017. Процитовано 14 лютого 2017.
- . cwiki.apache.org. Архів оригіналу за 13 квітня 2014. Процитовано 14 лютого 2017.
- etcd/demo.md at master · coreos/etcd · GitHub. github.com. Процитовано 14 лютого 2017.
- . redis.io. Архів оригіналу за 16 лютого 2017. Процитовано 14 лютого 2017.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Operacijni sistemi vikoristovuyut menedzheri blokuvan dlya organizaciyi ta serializaciyi dostupu do resursiv Rozpodilenij menedzher blokuvan angl Distributed lock manager DLM pracyuye na kozhnij mashini v klasteri z identichnoyu kopiyeyu bazi danih blokuvan klastera Takim chinom DLM ye paketom programnogo zabezpechennya yakij dozvolyaye komp yuteram v klasteri sinhronizuvati svoyi dostupi do spilno vikoristovuvanih resursiv Rizni realizaciyi DLM buli vikoristani yak osnova dlya dekilkoh uspishnih klasternih fajlovih sistem v yakih vuzli klastera mozhna vikoristovuvati dlya zberigannya fajliv odin odnogo za dopomogoyu yedinoyi fajlovoyi sistemi zi znachnimi perevagami u plani pidvishennya produktivnosti i dostupnosti Osnovna perevaga produktivnosti dosyagayetsya za rahunok virishennya problemi kogerentnosti diskovogo keshu mizh komp yuterami sho berut uchast v klasteri DLM vikoristovuyetsya ne tilki dlya blokuvannya fajliv ale i dlya koordinaciyi vsih vidiv diskovogo dostupu VMScluster persha sistema klasterizaciyi oderzhala shiroke poshirennya pokladayetsya na OpenVMS DLM same takim chinom Realizaciya VMSDEC VMS bula pershoyu shiroko dostupnoyu operacijnoyu sistemoyu de bulo realizovano DLM Danij funkcional z yavivsya u versiyi 4 hocha interfejs koristuvacha buv takim zhe yak i u odnoprocesornogo menedzhera blokuvannya yakogo vpershe bulo realizovano u versiyi 3 Resursi DLM vikoristovuye uzagalnene ponyattya resursu yak okremogo ob yekta do yakogo treba kontrolyuvati zagalnij dostup Ce mozhe buti fajl zapis oblast zagalnoyi pam yati abo shos she sho vibrav rozrobnik programi Rozrobnik sam opisuye iyerarhiyu resursiv otzhe vin sam viznachaye neobhidnu kilkist rivniv blokuvannya Napriklad gipotetichna baza danih mogla b opisuvati iyerarhiyu resursiv takim chinom Baza danih Tablicya zapis pole Takim chinom proces v ramkah vikonannya otrimuye mozhlivist vstanovlyuvati neobhidni blokuvannya na bazu danih v cilomu batkivskij resurs a potim i na okremi chastini bazi danih pidporyadkovani resursi Rezhimi blokuvannya Proces sho vikonuyetsya v mezhah VMSCluster mozhe otrimati blokuvannya resursu DLM realizuye shist rezhimiv blokuvannya i kozhen z nih viznachaye rizni rivni eksklyuzivnosti dostupu U procesi vikoristannya resursu mozhna peretvoriti riven rezhimu blokuvannya na bilsh visokij abo bilsh nizkij Koli usi procesi rozblokuyut resurs informaciya pro resursi znishuyetsya Null NL Vkazuye interes do resursu ale ne zavazhaye inshim procesam zamikayuchi jogo Cej rezhim nadaye zruchnij mehanizm stvorennya resursu ta zberezhennya jogo znachennya bloku blokuvannya zberigayutsya navit yaksho zhoden proces ne zamikaye jogo Paralelne chitannya Concurrent Read CR Vkazuye na namir chitati ale ne onovlyuvati resurs Ce dozvolyaye inshim procesam chitati abo onovlyuvati resurs ale ne dozvolyaye inshim otrimuvati eksklyuzivnij dostup do nogo Cej rezhim yak pravilo vikoristovuyetsya na resursah visokogo rivnya iyerarhiyi vrahovuyuchi te sho bilsh zhorstki blokuvannya mozhut buti otrimani dlya pidleglih jomu resursiv Odnochasnij zapis Concurrent Write CW Vkazuye na namir chitati i onovlyuvati resurs Cej rezhim takozh dozvolyaye inshim procesam chitati abo onovlyuvati resurs ale ne dozvolyaye inshim otrimuvati eksklyuzivnij dostup do nogo Cej rezhim takozh vikoristovuyetsya na resursah visokogo rivnya iyerarhiyi vrahovuyuchi te sho bilsh zhorstki blokuvannya mozhut buti otrimani dlya dochirnih resursiv Zahishene chitannya Protected Read PR Ce tradicijnij rezhim spilnoyi blokuvannya yakij vkazuye na bazhannya chitati resurs ale ne dozvolyaye inshim onovlyuvati jogo vmist Inshi procesi odnak takozh mozhut prochitati vmist resursu Zahishena zapis Write Protected PW Ce tradicijnij rezhim blokuvannya onovlennya yakij vkazuye na bazhannya chitati i onovlyuvati resurs i ne dozvolyaye inshim koristuvacham onovlyuvati jogo Inshi procesi mozhut otrimuvati rezhim dostupu Paralelne chitannya i mozhut prochitati resurs Exclusive EX Ce tradicijnij rezhim eksklyuzivnogo blokuvannya yakij dozvolyaye chitati ta onovlyuvati dostup do resursu i ne dozvolyaye inshim procesam mati dostup do nogo Nastupna tablicya istinnosti pokazuye sumisnist kozhnogo rezhimu blokuvannya z inshimi Mode NL CR CW PR PW EX NL Tak Tak Tak Tak Tak Tak CR Tak Tak Tak Tak Tak Ni CW Tak Tak Tak Ni Ni Ni PR Tak Tak Ni Tak Ni Ni PW Tak Tak Ni Ni Ni Ni EX Tak Ni Ni Ni Ni Ni Otrimannya blokuvannya Proces mozhe zablokuvati resurs z dopomogoyu postanovki v chergu zapitu blokuvannya Cej mehanizm shozhij na en tehnologiyu VMS yaka vikoristovuyetsya dlya vikonannya operacij vvedennya vivodu Zapit blokuvannya mozhe vikonuvatisya abo povnistyu sinhronno v comu vipadku proces chekaye poki blokuvannya ne vidayetsya abo asinhronno i v comu vipadku spracovuye mehanizm en angl AST koli bude otrimana blokuvannya Krim togo mozhna vstanoviti blokuyuchij AST yakij spracovuye koli proces otrimav blokuvannya zapobigayuchi dostup do resursu inshim procesom Originalnij proces mozhe potim pri neobhidnosti vzhiti zahodiv shob dozvoliti inshim dostup napriklad znizivshi abo znyavshi blokuvannya Blok znachennya blokuvannya Blok znachennya blokuvannya pov yazanij z kozhnim resursom Vin mozhe buti prochitanij pri otrimanni bud yakogo vidu blokuvannya krim blokuvannya NULL i jogo mozhe buti ponovleno za dopomogoyu procesu yakij otrimav blokuvannya resursu rivnya PW abo EX Jogo mozhe buti vikoristano dlya zberigannya bud yakoyi informaciyi pro resurs yakij vibiraye rozrobnik dodatkiv Zazvichaj vin vikoristovuyetsya dlya zberigannya nomera versiyi resursu Kozhnogo razu koli pov yazanij z nim ob yekt napriklad zapis u bazi danih onovlyuyetsya vlasnik blokuvannya inkrementuye znachennya bloku Koli inshij proces bazhaye prochitati resurs vin otrimuye vidpovidne znachennya blokuvannya i porivnyuye potochne znachennya blokuvannya z znachennyam yake bulo minulogo razu koli proces zvertavsya do zablokovanogo resursu Yaksho znachennya take zh proces znaye sho pov yazanogo z nim resursu ne bulo onovleno z momentu ostannogo chasu jogo chitannya i otzhe nemaye neobhidnosti chitati jogo znovu Otzhe cej metod mozhe buti vikoristano dlya realizaciyi riznih tipiv kesh pam yati v bazi danih abo analogichnih programah Viznachennya situacij vzayemnogo blokuvannya Vzayemne blokuvannya deadlock situaciya pri yakij dekilka procesiv znahodyatsya v stani neskinchennogo ochikuvannya resursiv zajnyatih samimi cimi procesami E Dejkstra spochatku nazvav taku situaciyu smertelnimi obijmami OpenVMS DLM periodichno pereviryaye procesi na situaciyi vzayemnogo blokuvannya U razi koli pershij proces blokuye resurs 1 ochikuyuchi zvilnennya resursu 2 blokovanoyu drugim procesom yakij v svoyu chergu ochikuye zvilnennya resursu 1 to drugij proces viklikaye status vzayemnogo blokuvannya U comu vipadku vzhivayutsya zahodi po vihodu iz stanu vzayemnoyi blokuvannya zvilnyayuchi vid blokuvannya resurs yakogo bulo zablokovano pershim Klasterizaciya v LinuxU sichni 2006 roku do yadra Linux versiyi 2 6 16 bulo vklyucheno kod OCFS2 Oracle Cluster File System yakij zaproponuvali programisti odnojmennoyi korporaciyi v listopadi 2006 do yadra versiyi 2 6 19 bulo dodano kod pidtrimki klasternogo PZ vid kompaniyi Red Hat zokrema pidtrimku fajlovoyi sistemi safesubst p safesubst ifGFS2 2 1 2 3 Obidvi sistemi bazuyutsya na uspishnoyi modeli VMS DLM Pri comu rozpodilenij menedzher blokuvan vid Oracle maye sproshenij API bazova funkciya dlmlock mala vsogo 8 parametriv Analogichne logichne im ya SYS ENQv VMS a takozh funkciya dlm lock v DLM vid Red Hat mayut po 11 parametriv Chubby servis blokuvannya vid GoogleKorporaciya Google rozrobila svoyu realizaciyu servisu blokuvannya dlya slabozv yazannih rozpodilenih sistem yaku nazvali Chubby Cej servis priznachenij dlya zabezpechennya grubogo blokuvannya Coarse Grained Lock a takozh dlya pidtrimki funkcionalno obmezhenoyi ale nadijnoyi rozpodilenoyi fajlovoyi sistemi Osnovni chastini infrastrukturi Google vklyuchayuchi Google File System BigTable ta MapReduce vikoristovuyut Chubby dlya sinhronizaciyi dostupu do resursiv sho rozdilyayutsya Hocha servis Chubby spochatku bulo rozrobleno yak sluzhbu blokuvannya zaraz Google jogo shiroko vikoristovuye yak server imen vitisnyayuchi DNS ZooKeeperApache Zookeeper proekt Apache Software Foundation ce rozpodilene iyerarhichne shovishe klyuchiv i znachen yake vikoristovuyetsya dlya zabezpechennya rozpodilenoyi sluzhbi konfiguracij sluzhbi sinhronizaciyi ta reyestru imen dlya velikih rozpodilenih sistem Takozh ZooKeeper mozhe vikoristovuvatisya yak rozpodilenij menedzher blokuvan Spochatku Zookeeper bulo zapochatkovano yak sub proekt v ramkah Hadoop ale zaraz vin vhodit do spisku osnovnih proektiv ASF Arhitektura Zookeeper pidtrimuye visoku dostupnist za rahunok nadlishkovosti poslug Takim chinom kliyenti mozhut iniciyuvati vibori inshogo lidera Zookeeper yaksho potochnij ne vidpovidaye na zapiti Vuzli Zookeeper zberigayut svoyi dani v iyerarhichnomu prostori imen analogichnomu fajlovij sistemi abo derevu strukturi danih Zookeeper vikoristovuyetsya bagatma kompaniyami v tomu chisli Rackspace Yahoo Odnoklasniki Reddit i eBay a takozh platforma povnotekstovogo poshuku z vidkritim kodom Solr ETCDDemon etcd sho dozvolyaye onovlyuvati nalashtuvannya vuzliv v ramkah infrastrukturi klastera CoreOS takozh nadaye mozhlivosti rozpodilenogo menedzhera blokuvan Algoritm Redlock v RedisNerelyacijna visokoproduktivna SUBD Redis sho predstavlyaye soboyu merezhevij zhurnaliruemoe shovishe danih tipu klyuch znachennya z vidkritim vihidnim kodom mozhe buti vikoristana dlya realizaciyi algoritmu rozpodilenogo upravlinnya blokuvannyami Redlock ZnoskiGehani Narain Zagolovok ISBN 9780929306087 kernel git torvalds linux git Linux kernel source tree git kernel org Procitovano 14 lyutogo 2017 kernel git torvalds linux git Linux kernel source tree git kernel org Procitovano 14 lyutogo 2017 lwn net Arhiv originalu za 24 zhovtnya 2016 Procitovano 14 lyutogo 2017 research google com Arhiv originalu za 20 listopada 2016 Procitovano 14 lyutogo 2017 cwiki apache org Arhiv originalu za 25 serpnya 2018 Procitovano 14 lyutogo 2017 zookeeper apache org Arhiv originalu za 16 lyutogo 2017 Procitovano 14 lyutogo 2017 cwiki apache org Arhiv originalu za 10 kvitnya 2014 Procitovano 14 lyutogo 2017 wiki apache org Arhiv originalu za 9 grudnya 2013 Procitovano 14 lyutogo 2017 reddit Arhiv originalu za 16 lyutogo 2017 Procitovano 14 lyutogo 2017 cwiki apache org Arhiv originalu za 13 kvitnya 2014 Procitovano 14 lyutogo 2017 etcd demo md at master coreos etcd GitHub github com Procitovano 14 lyutogo 2017 redis io Arhiv originalu za 16 lyutogo 2017 Procitovano 14 lyutogo 2017