запропоновано алгоритм взаємного виключення одночасного доступу різних процесів до одного і того ж об'єкту в динамічних п2п системах, орієнтований на зменшення службового трафіку. Основна ідея його передача повідомлень між запитними вузлами і координатором. Інформація n дублікатів об'єкта Rjпублікуется в n вузлах, (в координатора і його кандидатів). Вузли надсилають запит координатору власників дублікатів, щоб отримати доступ до об'єкта. У роботі описується актуальність, істота алгоритму, експериментально, шляхом імітації, оцінюється його масштабованість і ефективність.

Анотація наукової статті з комп'ютерних та інформаційних наук, автор наукової роботи - Губарєв Василь Васильович, Обейдат Aтеф Ахмед


Mutex algorithm of simultaneous access of different processes to the same object in dynamic P2P systems aligned to official traffic decrease has been proposed. The main idea is to transfer messages between requesters and a moderator. Information nof object duplicate Rj is propagated in nnodes, (in moderator and its candidates). Nodes send a demand to a moderator of duplicate proprietaries to get the access to an object. Topicality, algorithm concept are described in the work its scalability and efficiency are experimentally estimated by simulation.


Область наук:
  • Комп'ютер та інформатика
  • Рік видавництва: 2009
    Журнал: Известия Томського політехнічного університету. Інжиніринг ГЕОРЕСУРСИ
    Наукова стаття на тему 'Алгоритм взаємного виключення в пірінгових системах'

    Текст наукової роботи на тему «Алгоритм взаємного виключення в пірінгових системах»

    ?681.3

    АЛГОРИТМ взаємного ВИНЯТКИ У Файлообмінна система

    В.В. Губарєв, A.A. Обейдат

    Новосибірський державний технічний університет E-mail: Ця електронна адреса захищена від спам-ботів. Вам потрібно увімкнути JavaScript, щоб побачити її.

    Запропоновано алгоритм взаємного виключення одночасного доступу різних процесів до одного і того ж об'єкту в динамічних п2п системах, орієнтований на зменшення службового трафіку. Основна ідея його - передача повідомлень між запитними вузлами і координатором. Інформація n дублікатів об'єкта R публікується в n вузлах, (в координатора і його кандидатів). Вузли надсилають запит координатору власників дублікатів, щоб отримати доступ до об'єкта. У роботі описується актуальність, істота алгоритму, експериментально, шляхом імітації, оцінюється його масштабованість і ефективність.

    Ключові слова:

    Розподілені системи, пирингові системи, взаємне виключення, Інтернет-додатки.

    1. Введення і постановка задачі

    Одне з останніх напрямків розподілених інформаційних систем і мереж - пирингові мережі - переживає в даний час активне становлення [1-5]. У зв'язку з молодістю і перспективністю в теорії їх створення і практичного застосування з'являються все нові і нові фундаментальні завдання, що вимагають невідкладного рішення. Однією з таких є завдання взаємного виключення - усунення можливості одночасного доступу різних користувачів до одного і того ж об'єкту мережі в тих критичних ситуаціях, коли одночасне виконання запитів цим об'єктом не допускається. Хоча це завдання вирішується в традиційних засобах паралельних обчислень, специфіка п2п не завжди дозволяє ефективно використовувати відомі рішення. Існуючі для аналогічних п2п рішення задовольняють не всім вимогам п2п-систем.

    У зв'язку з цим мета цієї роботи - розробка алгоритму взаємного виключення в п2п, що відповідає вимогам ефективності, надійності і масштабованості. Для досягнення поставленої мети в роботі вирішуються наступні завдання:

    1. Опис моделі розглянутих систем.

    2. Розгляд операцій процесу тиражування дублікатів об'єкта.

    3. Опис і дослідження нового алгоритму взаємного виключення, що відрізняється відсутністю недоліків, властивих існуючим алгоритмам, і задовольняє вимогам впорядкованості, масштабованості, Децен-тралізованності і відмовостійкості мережі.

    4. Імітаційне порівняння запропонованого алгоритму з існуючими алгоритмами по масштабованості і ефективності.

    2. Модель розглянутих систем

    Розглянуті в даній роботі алгоритми засновані на наступній моделі, яка описує динамічні пірінгових системи.

    1. Система складається з рівноправних вузлів. Позначимо безліч вузлів через {д, / = 0, Ж-1}, де

    N - загальна кількість вузлів в системі, а р -узел з ідентифікатором? Е. Кожен вузол може бути клієнтом (одержувачем) і в той же час сервером (постачальником) об'єктів. Вузол, який виступає як сервер, т. Е. Має дублікат спільно використовуваного об'єкта (даних) і готовий представити його у відповідь на запит, назвемо серверним вузлом (СУ).

    2. Кожному доступному користувачам об'єкту Щ (реальному файлу даних або обчислювальному об'єкту) відповідає певний набір вузлів, що містять дублікати запитуваних користувачами об'єктів. Набір об'єктів позначимо через П = {Щ / = 0, т-1}, де т - кількість об'єктів, а набір дублікатів (реплік) гр відповідають об'єкту Щ, позначимо через Г, = {гр1 = 0, п-1}, де п - кількість дублікатів. Кожен дублікат, об'єкта Щ міститься в певному вузлі. Ми умовно назвемо вузол, який має дублікат I об'єкта, копією (реплікою або дублікатом) I.

    3. Дублікати завжди доступні, але їх внутрішній стан може бути випадково скинуто внаслідок збою. Після виявлення збою дублікат знову відновлюється в мережі з колишнім значенням ідентифікатора вузла? Е.

    4. Кожен об'єкт Щ має унікальний двійковий т-бітний ідентифікатор (ключ) К, який обчислюється як хеш текстового імені об'єкта (наприклад, Х). Ідентифікатор До може бути обчислений з використанням конфліктостійкість (не допускає повторення) хеш-функції (наприклад, SHA-1 [6]), так само, як ідентифікатор вузлів. Вузол V, системи з ідентифікатором, що збігається з ідентифікатором До об'єкта Щ, виступає в якості координатора набору Г, дублікатів об'єкта.

    3. Тиражування дублікатів об'єкта

    Однією з найважливіших завдань п2п є тиражування дублікатів, забезпечення їх автентичності. Існуючі методи тиражування дублікатів на всі вузли є громіздкими. Пое-

    тому пропонується новий метод набірного (поголовно, а затребуваного, поточного) тиражування.

    Основна ідея методу - тиражувати дублікати змінюваних об'єктів не у всіх вузлах мережі, а тільки в активних, тобто в міру необхідності звернення вузлів до дублікатами. Для цього пропонується організація набору зацікавлених вузлів, що об'єднуються координатором. Передбачається, що власники дублікатів деякого об'єкту організовані в набір Г ,. Кожне безліч Г, має унікальний ідентифікатор К]. Ідентифікатор К, набору присвоюється з використанням хешування імені об'єкта. В якості координатора для відповідного набору виступає вузол V, з ідентифікатором, що є чисельно найбільш близьким до ідентифікатора набору До,.

    3.1. операції методу

    З'єднання: щоб отримувати оновлення дубліката, вузол, що містить дублікат, який треба підтримувати в сучасному стані, ініціює операцію «З'єднання» (т. Е. Приєднання до набору).

    Роз'єднання: якщо вузлу не потрібно підтримувати свій дубліката в сучасному стані, він ініціює операцію «роз'єднання» (т. Е. Від'єднання від набору), тим самим залишивши без уваги поточні модифікації дубліката, економлячи ресурси (свої і мережі).

    Відновлення: при відновленні і повернення в систему, вузол ініціює операцію «відновлення», по виконанні якої отримує сучасну версію дубліката об'єкта.

    3.1.1. Операція «^ єднання». На рис. 1, а, наведена схема операції з'єднання для власника дубліката об'єкта.

    Крок 1. Вузол р - власник дубліката об'єкта просить оверлей обчислити хешировать ідентифікатор До його об'єкта Щ.

    Крок 2. р просить оверлей послати повідомлення з'єднання М = ^ е, з'єднання, К) вузла V, з ідентифікатором? Е, найбільш близьким до хешировать ідентифікатором До .

    Крок 3. р отримує відповідь від координатора, що він став членом набору Г,.

    При отриманні координатором повідомлення з'єднання він почне виконувати наступні кроки (див. Рис. 1, б):

    Крок 1. Координатор V, або кандидат отримує повідомлення М (з'єднання).

    Крок 2. Координатор V, перевіряє, чи настав це повідомлення від власника дубліката чи ні. Якщо так, він (на Кроці 3) відправляє власнику відповідь, що містить поточну версію дубліката об'єкта.

    Крок 4. Координатор V, перевіряє, чи існує набір Г з ідентифікатором До чи ні.

    Крок 5. Якщо набір існує, це означає, що вузол V, вже є координатором безлічі Г ,. В цьому випадку V, додає інформацію про власника дубліката в список власників і відправляє повідомлення з'єднання вузла V /, чий ідентифікатор найбільш близький до нього, щоб цей вузол став новим кандидатом координатора V ,,. Число кандидатів разом з координатором дорівнює числу дублікатів.

    З

    початок

    К'-ХЕ ш (Я /)

    2 1 Г

    Послати М до координатора

    3 1 г

    Отримати відповідь

    3 ^ г

    послати відповідь

    ->

    ^ Кінець ^

    а. власник дубліката

    ^ Кінець ^

    б. координатор

    Мал. 1. Схема операції «з'єднання»

    1

    5

    6

    Крок 6. Якщо набір не існує, джерело повідомлення - власник дубліката усвідомлює, що він є координатором v; для нового набору власників дублікатів Г ;, тому повинен створити список Г, - і додати відправника повідомлення до свого списку; в іншому випадку він буде кандидатом vc для координатора.

    3.1.2. Операція «роз'єднання». Коли вузлу pt не потрібно підтримувати свій дубліката в сучасному стані, він ініціює операцію роз'єднання, щоб вийти з набору. Координатор, отримуючи це повідомлення, видаляє інформацію про дублікаті вузла pt зі свого списку і інформує про це своїх кандидатів.

    3.1.3. Операція «возз'єднання». Кроки операції відновлення наступні.

    Крок 1. Коли будь-який вузол pt бажає отримати сучасну версію дубліката об'єкта, він посилає свого vj повідомлення ВІДНОВЛЕННЯ із зазначенням наявної в вузлі версії дубліката.

    Крок 2. При отриманні повідомлення ВІДНОВЛЕННЯ, v; визначає відмінність між останньою версією дубліката, що знаходиться в системі, і версією дубліката вузла р.

    Крок 3. Якщо відмінності в дублікатах немає, v; включає вузол Pi в набір. Якщо дублікати відрізняються, v; відправляє повідомлення ОНОВЛЕННЯ вузлу р, що містить список модифікацій OPS.

    Крок 4. При отриманні повідомлення ОНОВЛЕННЯ вузол Pi виконує модифікації в списку OPS і наводить свій дублікат об'єкта у відповідність з поточною версією об'єкта. Після цього вузол pt включається в набір Г,

    4. Алгоритм взаємного виключення одночасного

    доступу для зміни об'єкта

    Друге важливе завдання - це взаємне виключення доступу до одного і тему ж об'єкту або його дублікатами, коли одночасний доступ неприпустимий, небажаний (один вузол хоче читати вміст об'єкта, інший записувати або змінювати його або обидва вузла хочуть змінити його вміст). Недоліки існуючих методів - в труднощі їх масштабування.

    Запропонований алгоритм заснований на організації набору вузлів і передачі повідомлень тільки між запитними вузлами і координатором. Тому назвемо його умовно алгоритмом вузол-координатор (У2К). Запитні вузли посилають запит координатору, щоб отримати доступ до об'єкта. При отриманні запиту на використання об'єкта R, координатор v; повідомляє про це всіх своїх кандидатів і посилає відповідь запитними вузлу. Відповідь містить інформацію про поточний власника, що працює з об'єктом, і черги чекають вузлів. Після завершення роботи з об'єктом вузол посилає координатору повідомлення освоб. Коли v; отримує повідомлення освоб від поточного власника об'єкта, він повідомляє про це всі запитні вузли набору, включаючи

    і кандидатів координатора, і, якщо тільки що завершив роботу з об'єктом вузол виробляв модифікацію об'єкта, повідомляє їм про нову версію об'єкта, а при необхідності тиражує її.

    Повноваження доступу до об'єкту надається при одночасному дотриманні наступних умов:

    a) Припустимо безліч операцій читання в один і той же час.

    b) Дозволяється тільки одна операція запису в одне й те саме час.

    c) Відсутність (заборона) пари або поле операцій «читання - запис» в один і той же час.

    Кроки алгоритму У2К наступні.

    Входять даними алгоритму є:

    ?е: ідентифікатор вузла?;

    с /. ідентифікатор клієнта, який володіє об'єктом Щ; / Час отримання повноважень (дозволу) на доступ до об'єкта Щ; 4 ": тимчасова відмітка, змінна стану, завжди зберігається в р, спочатку нуль;

    pQ ?. частковий перелік очікують запитів, який містить відомості про запити всіх клієнтів, упорядкованих за часом; 2 повна чергу запитів, спочатку порожня, використовується тільки координатором;

    Т час оренди, повноваження на доступ об'єкта надається на деякий час Т. Координатор відстежує час закінчення блокування і знімає її, коли час Т закінчується;

    Я /, ідентифікатор об'єкта ,;

    М: сполучення між вузлами, які зазвичай містять: ^ - ідентифікатор джерела повідомлення, запитальний вузла р; 1ео - тимчасова відмітка запиту; р2 - часткова чергу запитів; С1 пункт доставки повідомлення; (С, / - поточний власник і тимчасова відмітка; Тип повідомлення: (ЗАПИТ, ЗВІЛЬНЕННЯ (освоб), ВІДПОВІДЬ).

    Крок 1. Коли вузол р1 хоче отримати доступ до певного об'єкту Щ, він посилає координатору повідомлення ЗАПИТ (s = id, 4 ", е = К). В якості координатора розглядається вузол системи з ідентифікатором, найбільш близьким до хешировать ідентифікатором К, асоційованого об'єкта Щ.

    Крок 2. Коли вузол V ,, який виступає в якості координатора для набору дублікатів, отримує запит на доступ до об'єкта Щ від вузла р, він визначає, доступний об'єкт Щ чи ні. Якщо так, то він блокує об'єкт Щ для вузла р1 (т. Е. З = р, tcj = M • tJ, посилає повідомлення ВІДПОВІДЬ «Так» запитними вузлу і інформує про це його кандидатів. В іншому випадку він додає запит в чергу.

    Крок 3. Коли вузол р1 отримує повідомлення ВІДПОВІДЬ «так», він перевіряє, чи є він сам власником об'єкта чи ні. Якщо так, він може увійти в критичну секцію (КС) і почати використовувати

    об'єкт Щ. Коли він закінчує свою роботу в КС, він посилає V, повідомлення освоб. В іншому випадку, якщо він отримує повідомлення ВІДПОВІДЬ «ні», йому потрібно чекати протягом певного часу очікування ^ = 1 ^ до, де I - число вузлів в черзі р2, 4с - час знаходження вузла в КС.

    Крок 4. При отриманні координатором повідомлення освоб від поточного власника КС, він перевіряє, порожня чи чергу запитів. Якщо немає, він виключає з черги нового власниця, посилаючи йому ВІДПОВІДЬ «так», і розсилає повідомлення освоб всім іншим вузлам черзі <2. Якщо координатор не отримає від поточного вузла повідомлення освоб протягом прогнозного часу (Т), він зрозуміє, що власник об'єкта вийшов з ладу. Тоді він дасть повноваження на доступ до об'єкта наступного вузла в черзі. Якщо чергу закінчилася, координатор очікує, нові запити.

    Крок 5. При отриманні від координатора повідомлення освоб, вузол р1 чекає свою чергу. Якщо вузол р1 не отримує повідомлення ВІДПОВІДЬ або освоб протягом прогнозного часу ^, він знову (крок 1) посилає повідомлення ЗАПИТ вузлу в якості координатора.

    Отже, кроки 1-5 повторюються у міру того, як вузли хочуть отримати доступ до спільно використовуваного об'єкту Щ.

    5. Властивості У2К

    Тепер розглянемо, які властивості має У2К

    і, отже, яким вимогам він задовольняє.

    Перше властивість - впорядкованість. Перш за все зазначимо, що У2К відповідає вимозі впорядкованості, т. К. Запити задовольняються в порядку «першим прийшов, першим обслужений (FCFS)». Дійсно, тільки координатор V, містить 2 і приймає рішення щодо доступу до об'єкта у відповідності зі своєю інформацією. Після отримання повідомлення (ЗАПИТ або освоб) координатор перевіряє стан об'єкта. Якщо він вільний, V, посилає повідомлення «ТАК» наступного в черзі вузлу. Це повідомлення містить дозвіл на використання об'єкта, доступ в його КС. За його отриманні запитальний вузол входить в КС. Тільки V, може надати повноваження на доступ до спільного об'єкту. Таким чином У2К має властивість впорядкованості.

    Друга важлива властивість - ступінь завантаження мережі службовим трафіком. Як неважко переконатися, вона буде нижче, ніж в існуючих алгоритмах, оскільки У2К використовує меншу кількість операцій, ніж інші алгоритми. Насправді обмін повідомленнями в алгоритмі здійснюється тільки між запитними вузлами і координатором замість обміну повідомленнями з усіма вузлами як в існуючих алгоритмах. Наприклад, повідомлення ЗАПИТ надсилається тільки координатору, а не всім вузлам, що зберігає п дублікатів, як в інших алгоритмах, заснованих на кворумі [7, 8].

    Властивість децентралізації. У2К досягає кращих показників децентралізації та відмовостійкості, т. К. Qj зберігається в v; і його кандидатах, а часткові черзі - в усіх Запитальний вузлах. Тому всі вузли локально визначають наступного власника об'єкта при отриманні повідомлення освоб або після закінчення терміну оренди об'єкта. Незважаючи на те, що Qj зберігається в координатора і кандидатів, У2К гарантує взаємне виключення, але з іншого боку У2К отказоустойчів: коли координатор і кандидати виходять з ладу одночасно, запитальні вузли можуть і дізнаються про це, не отримуючи повідомлення освоб від поточного власника об'єкта в межах часу оренди. Це означає, що коли координатор виходить з ладу, запитальні вузли знову посилають свої запити з частковими чергами (pQ) новому координатору. Новий координатор об'єднає всі отримані pQj в одну повну чергу Qj.

    Властивість автентичності. Вимога автентичності задовольняється, якщо в будь-який момент часу вміст всіх затребуваних дублікатів об'єкта однаково (т. Е. Задовольняється умова тотожності всіх копій однієї). Ця вимога можна забезпечити різними шляхами. Перший -одночасне заміною всіх старих дублів зміненого об'єкта новою редакцією (тиражуванням нових дублів) відразу ж після закінчення зміни об'єкта до виконання наступного по черзі запиту. Другий шлях, описаний в п. 2, видачею останньої редакції дублів тільки тих вузлів, які за ними зараз звертаються. Ясно, що при цьому, щоб забезпечити автентичність дублікатів останньої версії об'єкта, У2К, що використовує метод відстеження активних дублікатів об'єкта, в разі зупинки, збою або тиражування нового дубліката об'єкта спочатку повинен оновити вміст старого дубліката об'єкта.

    6. Результати імітаційного моделювання У2К

    Для порівняння У2К та інших відомих [7, 8] алгоритмів взаємного виключення застосуємо підхід імітаційного експериментування з алгоритмами. Програмну реалізацію запропонованого та існуючих алгоритмів взаємного виключення виконаємо на основі системи FreePastry [9, 10]. Розроблена програма, стартуючи, створює набір вузлів, розставлених згідно мережевий топології Pastry. Цілі моделювання - перевірити масштабованість і завантаження мережі службовим трафіком (т. Е. Визначити число повідомлень).

    Одним з головних якостей алгоритму взаємного виключення є його придатність до масштабованості мережі, т. Е. До збільшення кількості вузлів мережі. Для експериментального комп'ютерного дослідження масштабованості У2К в порівнянні з іншими, хорошими за цим показником, алгоритмами, виконуємо їх однакову програмну реалізацію. Для цього слід реалізувати на ЕОМ комп'ютерні моделі мереж і запустити на комп'ютері кілька раундів роботи змоделюють-

    3000 4000

    Ч1СЛО вузлів

    Мал. 2. Порівняння алгоритмів по середній кількості повідомлень

    ванних мереж. Виконуємо кілька раундів моделювання (в середньому понад десяти) і знаходимо середні значення експериментальних результатів. У кожному раунді кожна мережа (точніше її модель) проробляє весь той обсяг роботи, який проробляють вузли в реальній мережі. При цьому від раунду до раунду може змінюватися число вузлів мережі, а також число запитів доступу до об'єктів, що посилаються безліччю випадково обраних вузлів. Робиться це в такий спосіб, що однакові показники параметрів мережі залишаються незмінними для всіх порівнюваних в тому ж раунді алгоритмів. А саме, в кожному раунді вузол навмання звільняє 50% утримуваних їм об'єктів. Число об'єктів, дублікатів та запитів в кожному раунді постійно і становить 65, 10 і 20 відповідно.

    На рис. 2 представлено порівняння У2К з алгоритмами Sigma [7], E2E [8] і NONE2E [8] за середнім числом повідомлень. Як видно з малюнка, все залежно майже лінійні щодо числа вузлів. У У2К завантаження мережі службовим трафіком в середньому в 2 рази менше, ніж в наскрізному Е2Е алгоритмі. Отже, У2К має кращі властивості

    по масштабованості. У правій частині рис. 2 представлені відносини вибіркового середньоквадратичного відхилення про до середнього х кількістю повідомлень. Як видно з наведених даних, представлені на малюнку залежно характеризуються порівняно малої стохастичную (відносини О / - - одиниці або один, два десятка%), т. Е. Близькі до функціональних. Це підтверджує справедливість висновків за результатами імітації.

    висновки

    Описано нові алгоритми тиражування дублікатів і взаємного виключення в п2п. Обґрунтовано актуальність розробки і приведені модель системи, загальний опис алгоритмів, їх операції та властивості. Отримані результати імітації алгоритму взаємного виключення виявили, що він володіє набагато кращою ефективністю, ніж існуючі алгоритми, і добре масштабується. Таким чином, алгоритм здатний підтримувати більшу кількість вузлів. Запропоновані алгоритми інваріантні до його різної мережевої реалізації в структурованих п2п.

    СПИСОК ЛІТЕРАТУРИ

    1. Мартін Дж. Системний аналіз передачі даних. - М .: Світ, 1975. - Т. 1. - 256 с.

    2. Обейдат А.А., Губарєв В.В. Огляд алгоритмів розподіленого взаємного виключення в динамічних пірінгових системах // Зб. наукових праць НГТУ. - 2007. - № 2 (48). - С. 63-68.

    3. Ganesan P., Gummadi P.K., Garcia-Molina H. Canon in G major: Designing DHTS with hierarchical structure // ICDCS. - Tokyo, 2004. - P. 263-272.

    4. Kumar A. Hierarchical Quorum Consensus: A New Algorithm for Managing Replicated Data // IEEE Transactions on Computers. -1991. - V. 40. - № 9. - P. 996-1004.

    5. Stoica I., Morris R., Karger D., Kaashoek M.F., Balakrishnan H. Chord: A scalable peer-to-peer lookup service for internet applications // Proc. of ACM SIGCOMM. - 2001 [Електронний ресурс]. - Режим доступу: - URL: http://iptps04.cs.ucsd.edu/ pa-pers / karger-subgroup.pdf /. - 15.05.2007.

    6. FIPS 180-1, «Secure hash standard», Tech. Rep. Publication 180-1, Federal Information Processing Standard (FIPS), National Institu-

    te of Standards and Technology, US Department of Commerce, Washington, D.C., April, 1995.

    7. Shiding Lin, Qiao Lian, Ming Chen, Zheng Zhang. A practical distributed mutual exclusion protocol in dynamic peer-to-peer systems // 3rd International Workshop on Peer-to-Peer Systems (IPTPS'04). - San Diego, CA, USA, Feb., 2004. - P. 1-10.

    8. Muhammad M., Cheema A.S., Gupta I. Efficient mutual exclusion in peer-to-peer systems // 6th IEEE / ACM International Conference on Grid Computing. - 2005. - P. 296-299.

    9. Hoye J. Freepastry [Електронний ресурс]. - Режим доступу: http://freepastry.rice.edu/FreePastry/. - 15.01.2007.

    10. Rowstron A., Druschel P. Pastry: Scalable, distributed object location and routing for large-scale peer-to-peer systems // Proceedings of Middleware, Nov. 2001 [Електронний ресурс]. - Режим доступу: research.microsoft.com/~antr/PAST/pastry.pdf. - 15.01.2007.

    Надійшла 03.04.2009 р.


    Ключові слова: розподілені системи / пирингові системи / взаємне виключення / інтернет-додатки

    Завантажити оригінал статті:

    Завантажити