Kpfu.ru



Федеральное государственное автономное образовательное учреждение высшего образованияКАЗАНСКИЙ (ПРИВОЛЖСКИЙ) ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТВЫСШАЯ ШКОЛА ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ И ИНФОРМАЦИОННЫХ СИСТЕМНаправление подготовки: 09.03.03 – Прикладная информатикаВЫПУСКНАЯ КВАЛИФИКАЦИОННАЯ РАБОТАКластеры.Построение отказоустойчивого решения на базе открытого ПО. Работа завершена:?___?_____________2017 г. Студент группы ______ ____________________ Т.А.Светликова Работа допущена к защите:Научный руководительСтарший системный администратор, GDC ?___?_____________201 г. ____________________ А.А. Иванов Директор Высшей школы ИТИС ?___?_____________201 г. __________________ А.Ф. Хасьянов Казань – 2017 г.Содержание TOC \o "1-3" \h \z \u Введение. PAGEREF _Toc484384087 \h 31.Обзорная часть PAGEREF _Toc484384088 \h 51.1 История. PAGEREF _Toc484384089 \h 51.2 О кластере. PAGEREF _Toc484384090 \h 71.2.1Высокая доступность. PAGEREF _Toc484384091 \h 101.2.1Непрерывная доступность (Fault tolerant) PAGEREF _Toc484384092 \h 131.2.3Вычислительные кластеры PAGEREF _Toc484384093 \h 161.3 Рынок PAGEREF _Toc484384094 \h 181.3.1 PowerHA PAGEREF _Toc484384095 \h 191.3.2 Windows PAGEREF _Toc484384096 \h 221.3.3 HP Serviceguard PAGEREF _Toc484384097 \h 311.3.4. Red Hat Enterprise Linux Cluster PAGEREF _Toc484384098 \h 331.3.5 Solaris Cluster PAGEREF _Toc484384099 \h 372.Реализация PAGEREF _Toc484384100 \h 392.1 Демон PAGEREF _Toc484384101 \h 412.2 Сервисное приложение PAGEREF _Toc484384102 \h 482.3 Клиентское приложение. PAGEREF _Toc484384103 \h 50Вывод. PAGEREF _Toc484384104 \h 53Список литературы. PAGEREF _Toc484384105 \h 55Приложение PAGEREF _Toc484384106 \h 57Введение.Компьютерные технологии не стоят на месте, а все больше и больше развиваются, и они имеют все большее влияние в бизнес-процессе предприятий, поэтому необходимо, чтобы вычислительные ресурсы были доступны максимально долгое время. Для успешного проведения бизнеса компаниям с развитой сетевой инфраструктурой необходимы надежные сервера. Примерами таких компаний являются интернет магазины; предприятия, в которых есть специальный системы, работающие в режиме реального времени; банки, с огромной сетью филиалов. Серверы в таких компаниях должны работать и предоставлять услуги двадцать четыре часа в сутки ежедневно. Каждый год фирмы теряют все большие суммы при выходе оборудования из строя или его простое. В эту сумму входят прибыль, которую предприятие могло бы получить, стоимость информации, которая была утеряна, стоимость технического обслуживания оборудования, себестоимость самого оборудования, количество клиентов, которое фирма может потерять и т.д. Есть большое количество вариантов создания относительно надежной системы. К таким относятся дисковые массивы RAID, которые объединяют несколько физических дисков в логический; это позволяет не прекращать обработку обращений к хранящейся информации, если из строя выйдет один или несколько физических дисков. Также используются резервирование блоков питания, чтобы при отказе одного из них, оборудование продолжало работать. Если произойдет отключение электричества, поддержку работоспособности могут обеспечить бесперебойные блоки питания. Для того, чтобы избежать отказ оборудования, при поломке одного процессора используются многопроцессорные системы. Но ни один из способов не поможет, если откажут все оборудования. Именно для таких случаев были разработаны кластеры. Первой реализацией кластеров можно считать системы ?горячего резерва?, которые были популярны во времена, когда стали популярны мини-компьютеры. Некоторое количество таких систем, входят в состав сети серверов, находятся в резерве и простаивают, но, как только сломается какая-либо из основных систем, они включаются в работу и выполняют необходимые функции. Получается, что некоторые сервера полностью имеют полную копию других и могут заменить их, в случае поломки или отказа последних. Но это не выгодно, так как часть оборудования просто дублирует другую и не выполняет никакую другую полезную функцию, и нагрузка распределяется неравномерно. Для того, чтобы оборудование не простаивало, а выполняло какие-либо полезные действия были придуманы кластеры.Таким образом, в нашей жизни невозможно обойти без кластерных технологий. Исходя из всего вышеизложенного определилась проблема, для решения которой была поставлена цель: реализовать HA-кластера. В связи с эти определились задачи:Дать описание кластеровДать общую характеристику кластеровИзучить виды кластеровПроанализировать наиболее популярные на современном рынке кластерные высокой доступностиРеализовать свой кластерОбзорная частьВ обзорно-аналитической главе будет проведен обзор предметной области, рассмотрены аналоги системы, их преимущества и недостатки.1.1 История.Изначально кластерные технологии использовались при развертывании компьютерных сетей. Немалую роль в появлении высокоскоростной передачи между компьютерами имела возможность объединения вычислительных ресурсов. Лаборатория Xerox PARC вместе с группой разработчиков протокола TCP/IP разработали и закрепили стандарты сетевого взаимодействия уже в начале 1970-ых годов. Была разработана операционная система Hydra (?Гидра?), которая работала на компьютерах PDP-11, которые выпускала компания DEC. На базе это ОС был разработан кластер, который был назван C.mpp в 1971 году в Америке в городе Питтсбург, который находится штате Пенсильвания. Однако, только в 1983 году научились распределять задачи и распространять файлы с помощью компьютерных сетей, огромный вклад в разработку этого внесла компания Sun Microsystems, которая предоставила операционную систему на основе BSD, которая имела название SunOS.Первым коммерческим проектом кластера стал ARCNet, созданный компанией Datapoint в 1977 году, однако этот продукт не принес прибыль компании, поэтому разработка кластеров была заморожена до 1984 года. В этом году компанией DEC был создан кластер VAXcluster, который был построен для ОС VAX/VMS. Каждый из этих кластеров мог не только производить совместные вычисления, но и предоставлял возможность совместного использования файловой системы и других составляющих, при этом не теряя целостность файлов и неизменность данных. На данный момент VAXCluster (называемый теперь VMSCluster) входит в сотав операционной системы HP OpenVMS, которая использует процессоры Alpha и Itanium.Также есть еще несколько первых разработок кластера, которые преобрели популярность. Такими продуктами являются класера Himalaya, который разработан компанией Tandem в 1994 году, а также Parallel Sysplex, который был разаботан компанией IBM также в 1994 году.Большей часть разработкой кластеров, которые состояли из персональных компьютеров, занимался проект Parallel Virtual Machine. Первый релиз данной программы произошёл в 1989 году. Это программное обеспечение предоставляло возможность из нескольких обычных компьютеров собрать один виртуальный суперкомпьютер. Появилась возможность очень быстро и просто создавать кластера. Данные дешевые кластера были даже лучше по производительности, чем производительность мощностей коммерческих систем.Разработку кластеров, состоящих из ПК в данной области продолжило Американское аэрокосмическое агентство NASA в 1993г. И уже в 1995 году появился кластер Beowulf. Это также поспособствовало развитию grip-сетей, который были созданы вместе с системами UNIX.1.2 О кластере.Термин ?кластер? имеет множество определений. Для некоторых главной составляющей является отказоустойчивость, для других — масштабируемость, для третьих — управляемость. Классическое определение кластера звучит примерно так: ?кластер — параллельная или распределенная система, состоящая из нескольких связанных между собой компьютеров и при этом используемая как единый, унифицированный компьютерный ресурс?. Следовательно, кластер – это некоторое количество серверов или компьютеров, которые объединены в одну сеть, которой можно управлять, и работают как неразделимый механизм. Для работы кластера необходимо, чтобы на любой узле (ноде, компьютере, сервере) была запущена своя копия ОС.Грегори Пристер как-то дал определение кластерным технологиям: ?Кластер представляет собой одну из разновидностей распределенной или параллельной системы?. Этот человек сыграл немалую роль на начальном этапе создания кластеров. Именно он был одним из ранних архитекторов кластерных решений.Однако эксперты Aberdeen Group дали более глобальное определение кластеру. По их мнению, кластер - это система, которая может работать как единый целый механизм, обеспечивает высокую отказоустойчивость, имеет централизованное управление всеми ресурсами и общую файловую систему и, кроме того, обеспечивает гибкость конфигурации и легкость в наращивании ресурсов.Все узлы кластера объединены в единую сеть, с помощью коммутационных каналов, через которые сервера могут обмениваться информацией. Каждый узел следит за состоянием других узлов, а также отправляет необходимую информацию, которая может включать в себя конфигурационные данные, данные об общих системах хранения и их работоспособности. Процедура обмена данной информацией называется heartbeat (?сердцебиение?, или ?пульс?), и если кластер получил этот сигнал, следовательно сервер-адресант работает исправно. Если в какой-то момент один из узлов перестает посылать heartbeat-сигналы, то остальные узлы начинают считать его неисправным и кластер начинает перенастраиваться. Сигналы ?сердцебиения? могут передаваться по одному каналу с какими-либо данным, но при создании крупных систем, лучше выделить для этого другой канал, чтобы не происходила потеря сигнала. С помощью таких сигналов также можно определить узел, который будет контролировать работу остальных узлов.Бывает ситуация, когда приложение перестает быть доступным для пользователя, этот период называется время простоя (или отключения). Есть классификация простоев, которая состоит из двух категорий:запланированные:замена оборудования;обслуживание;обновление программного обеспечения;резервное копирование (автономное резервное копирование);тестирование (периодическое тестирование необходимо для проверки кластеров);разработка;незапланированные:ошибки администратора;отказы приложений;отказы оборудования;ошибки операционной системы;стихийные бедствия.Таким образом, кластерные технологии должны обеспечивать доступность сервиса при любых простоях, как запланированных, так и незапланированных.. Наиболее популярными приложениями, которые лучше запускать в кластерах, являются:базы данных;системы управления ресурсами предприятия (ERP);средства обработки сообщений и почтовые системы;средства обработки транзакций через Web и Web-серверы;системы взаимодействия с клиентами (CRM);системы разделения файлов и печати.Также есть у кластеров есть своя классификация. Обычно различают следующие основные виды кластеров:отказоустойчивые кластеры (High-availability clusters, HA, кластеры высокой доступности)кластеры непрерывной доступности (Fault tolerant)вычислительные кластеры 1.2.1Высокая доступность.Высокодоступные кластера обозначаются аббревиатурой HA (англ. High Availability — высокая доступность). Данные кластеры позволяют предоставить высокую доступность сервиса. Количество узлов в HA кластере всегда избыточное, чтобы при отказе одного или нескольких, можно было бы запустить сервис на других. Минимальное количество узлов в данном кластере составляет два. В противном случае повысить доступность не получиться. Существует большое количество программ, которое предоставляют решение для HA-кластера.Существует три варианта построение высокодоступного кластера:с холодным резервом или активный/пассивный. В этом случае активный узел обрабатывает все запросы, а пассивный включается в работу только лишь при отказе активного. Пример — резервные сетевые соединения, в частности, Алгоритм связующего дерева. Например связка DRBD и HeartBeat.с горячим резервом или активный/активный. Все ноды принимают и обрабатывают запросы, и при отказе одного из них, нагрузка распределяется по оставшимся нодам. Следовательно, при отказе одного узла кластер переконфигурируется. Примеры — практически все кластерные технологии, например, Microsoft Cluster Server. OpenSource проект OpenMosix.с модульной избыточностью. Данный вариант самый трудозатратый. Его используют только в случаях, когда простой системы невозможен. В это конфигурации один и тот же запрос может выполняться несколькими узлами и выдается результат любого узла. Следовательно, очень важно, чтобы результаты всех узлов были идентичными (либо различия незначительны). Примеры — RAID и Triple modular redundancy.Некоторые решения кластеров могут сочетать несколько вариантов построения кластеров. Так, например, Linux-HA может обслуживать очень рискованные запросы всеми узлами, это называется режим обоюдной поглощающей конфигурации, а другие запросы могут равномерно распределяться между узлами.Высокая доступность кластеризация является метод, используемый для минимизации времени простоя и обеспечить непрерывное обслуживание, когда некоторые компоненты системы терпят неудачу. Kластеры HA состоит из множества узлов, которые взаимодействуют и обмениваются информацией через общие сетках памяти данных и являются отличным способом, чтобы обеспечить высокую доступность системы, надежность и масштабируемость.Учитывая эти разнообразные элементы высоко-доступность требует:Тщательное и полное планирование физических и логических процедур доступа и эксплуатации ресурсов, от которых зависит приложение. Эти процедуры помогают избежать сбоев в первую очередь.Пакет мониторинга и восстановления, что позволяет автоматизировать обнаружение и восстановление после ошибок.Хорошо контролируемый процесс для поддержания аппаратных и программных аспектов конфигурации кластера, сохраняя при этом доступны приложения.Отказоустойчивый кластеры предоставляют решение задач, таких как:24 часа в сутки 7 дней недели любые приложения готовы к запуску, независимо от отказов в работе операционной системы, устройств хранения, приложения или инфраструктуры;держать очень высокий показатель SLA (перевыполнение обязательств);при предоставляемом оборудовании (базе, инфраструктуре) гарантировать максимальную высокую доступность;обеспечение целостности и доступности приложения в кластере, а также ПО;быстрое восстановление данных при поломках;уменьшение количество сбоев, чтобы не происходило простоев ОС, а также увеличение скорости развертывания нового оборудования;тщательный контроль за доступностью очень важных приложениями, таких как базы данных;гарантирование высокой доступности в виртуальных, реальных и смешанных средах.Преимущества высокой доступности:все компоненты стандартизированы и могут быть запущенные на существующих серверах и машинах;могут кластеризовать большую часть существующих приложениймогут работать с очень большим вариантом работают практически со всеми приложениями (зависит только от умения того, кто осуществляет внедрение);работают с большинством существующих типов дисков и сетей;стоимость таких приложений относительно невысока.Непрерывная доступность (Fault tolerant) Для того, чтобы можно было предоставить полностью отказоустойчивый сервис, нужно, чтобы постоянно была точная копия узла, на котором запущен необходимый сервис. При создании копии после поломки оборудования придется потратить некоторое время на копирования или может случиться ситуация, при которой невозможно будет достать необходимую информацию из проблемного узла и это приведет к утере информации.Именно для таких ситуаций существует способ создания непрерывно доступного кластера. Существует два способа реализации такого решения: аппаратный и программный.Аппаратный способПри этом способе создаются два сервера, один из которых выполняет запросы, а другой полностью его копирует. При этом они оба независимо производят вычисления. Также есть узел, который проверяет и сверяет получившиеся результаты и выполняет поиск ошибок. Если невозможно исправить получившуюся ошибку, то сервер, который считается неисправным, отключается.В этом случае оборудование будет простаивать не более 32 секунд в год. Чтобы получить такие результаты необходимо пожертвовать большими деньгами на приобретение данного оборудования. По подсчетам одной российской компании на данный кластер придется потратить порядка $1 600?000Программный способ.Самым известным программным продуктом для реализации непрерывно доступного кластера в настоящее время является vSphere от VMware.Но данный способ реализации имеет свои ограничения, такие как:Определенный процессор на физической машинеIntel архитектуры Sandy Bridge (или новее). Avoton не поддерживается.AMD Bulldozer (или новее).Сетка, с пропускной способностью в 10-гигабит, через которую общаются виртуальные машиныКоличество виртуальных машин на физической не должно превышать 8Количество виртуальных процессов виртуальной машины не более 4Количество виртуальных процессов на хосте не более 8Не поддерживаются снэпшотыISO-образы должны быть находиться в общем хранилище, чтобы все машины имели к ним доступ.Было проведено несколько экспериментов, результатами которых стал вывод, что при использовании FT от VMware виртуальные машины начинали работать значительно медленнее, производительность упала на ~47%. Для каждой физической машины необходимо приобретать свою лицензию. Тем самым необходимо потратить минимум $1750 на одну лицензию, а также приобрести годовую подписку на техподдержку за + $550. Стоимость такого кластера может составлять $100?000Поэтому кластеры непрерывной доступность лучше использовать только в крайних случаях. Только если от приложения требуется постоянная доступность, или сервера используют очень часто или же, если сервера действительно очень важны.Таким образом, несмотря на преимущества систем непрерывной доступности, есть немало трудностей при внедрении и эксплуатации таких решений.1.2.3Вычислительные кластеры Этот вид кластеров необходим, когда нужно в очень быстрый срок произвести большое количество вычислений, в частности, когда производятся научные исследования. Для таких серверов более важна скорость и качество проведения вычислений, и не очень важно скорость операций ввода-вывода. Вычислительные кластера разделяют вычисления на параллельные ветки. Для того, чтобы эти ветки могли обмениваться данными, есть специальные сетевые каналы. В каждой конфигураций кластера существует головная машина, которая регулирует работу остальных нод кластера. Сами вычислительные процессы происходят на вычислительных узлах, при этом количество вычислительных процессов не превышает количества процессоров на узле.. На головном узле не происходит никаких вычислений.Пользователь обращается только к головному узлу. Доступа к вычислительным узлам у него не должно быть. Программа и пользователь не взаимодействуют друг с другом, нет нужды вводить что-либо с клавиатуры или ждать вывода на экран. Пользователь не следит за тем, как происходят вычисления. На вычислительных серверах устанавливается операционная ситсема семейства ОС Unix, так как эта ОС поддерживает многопользовательский и многозадачный режимы.Для всех узлов существует общая файловая система, к которой может обратиться любой вычислительный узел. Для этой файловой системы выделен специальный файл-сервер. Но при этом несколько узлов не могут одновременно записывать данные в один файл, но могут записывать в разные. Также возможно создать локальный диск на каждом вычислительном узле кластера. В них можно хранить какие-нибудь временные файлы, которые удаляются при завершении работы программы.Типовые задачи для расчетных кластеров:решение задач механики жидкости и газа, теплопередачи и теплообмена, электродинамики, акустики;моделирование аэрогазодинамических процессов;моделирование физико-химических процессов и реакций;моделирование сложного динамического поведения различных механических систем;решение задач цифровой обработки сигналов, финансового анализа, разнообразных математических задач, визуализации и представления данныханализ и расчет статической и динамической прочности;газодинамика, термодинамика, теплопроводность и радиочастотный анализ;моделирование задач любой степени геометрической сложности;рендеринг анимации и фотореалистичных VFX эффектов1.3 РынокНаиболее популярными отказоустойчивыми кластерами являются:PowerHAWindows ClustersHP ServiceguardRed Hat Enterprise Linux ClusterSolaris Cluster1.3.1 PowerHAIBM PowerHA (ранее HACMP) является приложением IBM для обеспечения высокой доступности кластеров на AIX Unix и Linux для IBM System платформ и стенды для высокой доступности кластера Multiprocessing. Первый релиз продута был а 1991 году, данная версия является уже 20ой и называется PowerHA SystemMirror для AIX 7.1.В приложении 1 находиться таблица, которая сравнивает PowerHA c существующими решениями.PowerHA кластер может включать до 32 узлов, каждый из которых может либо активно работать (активный), либо находиться в режиме ожидания (пассивный).В разных узлах кластера могут быть разные файловые системы. Главными преимуществами кластера высокой доступности от компаний IBM для IBM Server? pSeries являются:Данное решение уже очень давно на рынке и может считаться качественным;Гибкость (большая часть приложений, которые могут работать в системе AIX, могут запускаться в кластере PowerHA);Качественая техподдержка клиентовиспользование доступных аппаратных компонентов (pSeries);Единой точкой отказа (single point of failure, SPOF) является любой отдельно взятый компонент в составе кластера, который в случае сбоя делает приложение недоступным для конечных пользователей.Во избежание возникновения единых точек отказа необходимы:избыточные (резервные) серверы;избыточные сетевые пути;избыточные пути хранения (данных);избыточное хранение (зеркальное отображение/RAID);мониторинг;обнаружение и диагностика отказов;автоматическое перемещение (failover) приложения при сбое;автоматическая реинтеграция ресурсов.HACMP включает следующее:Процесс планирования HACMP и документация включают в себя советы и рекомендации по наилучшей практике для установки и поддержания высокой доступности кластера HACMP.После того, как кластер находится в рабочем состоянии, HACMP обеспечивает автоматизированный мониторинг и восстановление для всех ресурсов, от которых зависит приложение.HACMP предоставляет полный набор инструментов для поддержания кластера при сохранении приложения доступными для клиентов.HACMP позволяет:Быстро и легко создать базовую двух узлов HACMP кластера с помощью помощника двухузловом конфигурации кластера.Настройка среды HACMP с помощью онлайн-планирования рабочих таблиц для упрощения первоначального планирования и настройки.Проверка конфигурации HACMP с помощью Test Tool Cluster. Вы можете оценить, как кластер ведет себя в соответствии с набором определенных обстоятельствах, например, когда узел становится недоступным, сеть становится недоступной, и так далее.Обеспечить высокую доступность приложений за счет устранения единых точек отказа в среде HACMP.Leverage функции высокой доступности, доступные в AIX?.Управление, как кластер обрабатывает отказы компонентов.Безопасные взаимодействия кластера.Настройка быстрого диска захват для групп томов, управляемых диспетчером логических томов (LVM).Монитор компоненты HACMP и диагностировать проблемы, которые могут возникнутьПри планировании внедрения решения HACMP следует учитывать следующие аспекты:тщательное проектирование и подробное планирование;устранение единых точек отказа;выбор соответствующего оборудования;надлежащее внедрение (без использования упрощенных подходов);упорядоченные методы системного администрирования и управление изменениями;документированные процедуры эксплуатации;всесторонний?тестовый план?и тщательное тестирование1.3.2 Windows Еще одним новшеством является режим кластеризуемой роли File Server в Windows Server 2012, который получил название Scale-Out File Server. Теперь реализована поддержка двух типов кластеризации, названия которых полностью звучат как File Sever for General Use и Scale-Out File Server (SOFS) for application data. Каждая из технологий имеет свои сферы применения, а также свои достоинства и недостаткиFile Sever for General Use представляет собой хорошо известный тип кластера Active-Passive. В свою очередь SOFS представляет собой кластер Active-Active, являясь действительно отказоустойчивой конфигурацией. Для совместного доступа к соответствующим папкам используется опция Continuously Available.Процент доступностиКачество доступностиРазрешенные незапланированные простои99 %3.7 дней99.9 %8.8 часов99.99 %53 минут99.999 %5.3 минутУсовершенствования отказоустойчивого кластера в Windows Server 2012:Улучшенная масштабируемость. По сравнению с отказоустойчивой кластеризации в Windows Server 2008 R2, число узлов кластера поддерживается увеличилась с 16 до 64 в Windows Server 2012. Число кластерных ролей или виртуальных машин, также увеличилось с 1000 до 8000 (до 1,024 на узел) в новой платформеCluster Shared усовершенствования томов. Общие тома кластера (CSV) были введены в Windows Server 2008 R2, чтобы обеспечить общее хранилище для кластерных виртуальных машин. CSV была расширена в Windows Server 2012 и позволило обеспечить хранение дополнительных сгруппированных ролейОбновление узлов кластера отработки отказа. Cluster-Aware Update (KAU) была введена в Windows Server 2012 для включения обновлений программного обеспечения, которые будут автоматически применяться к операционной системе хоста или других компонентов системы на узлах отказоустойчивого кластера при сохранении доступности в процессе обновления. KAU сокращение времени обслуживания за счет автоматизации, что было ранее очень повторяющихся задач.Кворум улучшения. Новые возможности функции кворума кластера в Windows Server 2012 включены упрощенную конфигурацию кворума, поддержка определения того, какие узлы кластера имели голоса при определении кворума и динамический кворум, который предоставляет администратору возможность автоматического управления кворума назначение голосов для узла, основанного на состояние узла.Другие усовершенствования. Некоторые из многих других усовершенствований, отказоустойчивая кластеризация в Windows Server 2012 включены упрощенную миграцию параметров конфигурации кластерной ролей, более надежной интеграции с доменными службами Active Directory, улучшенные тесты проверки кластера, улучшена поддержка Windows PowerShell, Node Режим обслуживания, кластерные задачи, новые кластерные роли, как ISCSI Target, гостевые кластеры с использованием виртуальных Fibre Channel и многое другое. Многие из усовершенствований Hyper-V в Windows Server 2012 также имеют отношение к отказоустойчивой кластеризации, например, виртуальная машина приоритезация, упреждение, чтобы закрыть с низким приоритетом виртуальных машин, мониторинг виртуальной машины здоровья, Hyper-V Replica брокер, и т.д. на.В приложении 2 указаны размеры по умолчанию для кластера Windows ServerВажно знать о кластерах то, что они являются наименьшей единицей, в котором выделяется дисковое пространство. Каждый кластер может содержать один файл не более. Таким образом, если вы создаете 1 KB файл и размер кластера 4 KBS, 3 KBS пустого пространства в кластере не будут доступны для других файлов. Если один кластер не является достаточно большим, чтобы сохранить весь файл, остальные данные файла будут идти в следующий доступный кластер, а затем следующий, пока файл полностью сохраняется.Корпорация Майкрософт поддерживает отказоустойчивое кластерное решение, только если оно соответствует следующим требованиям:Все аппаратные компоненты в отказоустойчивом кластерном решении помечены как ?Сертифицировано для Windows Server?2008?R2?.Полная конфигурация кластера (серверы, сеть и хранилище) может удовлетворить всем проверкам мастера проверки конфигурации.Выполнены рекомендации производителей оборудования в части обновлений встроенного и обычного программного обеспечения. Обычно это означает необходимость использования самых последних обновлений встроенного и обычного программного обеспечения. Иногда производитель может рекомендовать конкретные обновления, отличающиеся от самых новых.Требования к оборудованию отказоустойчивого кластера:Серверы. Рекомендуется использовать набор соответствующих компьютеров, содержащих одинаковые или аналогичные компоненты.Сетевые адаптеры и кабель (для сетевого взаимодействия). Сетевое оборудование, как и остальные компоненты отказоустойчивого кластерного решения, должно быть помечено как ?Сертифицировано для Windows Server?2008?R2?. При использовании iSCSI сетевые адаптеры должны быть предназначены либо только для сетевого взаимодействия, либо только для iSCSI, одновременное использование для обеих целей не допускается.Контроллеры устройств или соответствующие адаптеры для хранилищаДля интерфейсов Serial Attached SCSI или Fibre Channel. Если используются интерфейсы Serial Attached SCSI или Fibre Channel, во всех кластеризованных серверах контроллеры запоминающих устройств, предназначенные для системы хранения данных кластера, должны быть идентичны. В них должна использоваться одна и та же версия встроенного программного обеспечения.Для iSCSI. Если используется iSCSI, у каждого сервера в кластере должен быть один или несколько сетевых адаптеров или адаптеров шины, предназначенных для системы хранения данных кластера. Сеть, используемая для iSCSI, не может использоваться для сетевого взаимодействия. Во всех серверах кластера сетевые адаптеры, используемые для подключения нужного хранилища iSCSI, должны быть одинаковыми, рекомендуется использовать адаптеры Gigabit Ethernet или адаптеры с большей скоростью.Для iSCSI нельзя использовать сгруппированные сетевые адаптеры, так как их работа с iSCSI не поддерживается.Хранилище. Необходимо использовать общее хранилище, совместимое с Windows Server?2008?R2.В большинстве случаев хранилище должно содержать несколько отдельных дисков (LUN), настроенных на аппаратном уровне. Для некоторых кластеров один из дисков работает как диск-свидетель (описан в конце этого раздела). Другие диски содержат файлы, необходимые для кластеризованных служб или приложений. К хранилищу предъявляются следующие требования:Чтобы использовать встроенную поддержку дисков, включенную в отказоустойчивый кластер, используйте базовые, а не динамические диски.Рекомендуется отформатировать разделы в системе NTFS. При наличии диска-свидетеля или использовании общих томов кластера раздел каждого из них должен быть NTFS.Для общих томов кластера нет особых требований, за исключением требования к NTFS. Для стиля раздела диска можно выбрать либо стиль с основной загрузочной записью (MBR), либо раздел с таблицей GUID разделов (GPT).При развертывании сети хранения данных (SAN) для использования с отказоустойчивым кластером: Подтверждение совместимости хранилища. Проверьте у производителей и поставщиков, что хранилище, включая драйверы, встроенное программное обеспечение и прикладное программное обеспечение, используемые для хранилища, совместимо с отказоустойчивыми кластерами в Windows Server?2008?R2.Отказоустойчивые кластеры предъявляют к хранилищу следующие новые требования:Улучшения, введенные в отказоустойчивых кластерах (в сравнении с серверными кластерами в Windows Server?2003), требуют, чтобы хранилище правильно отвечало на определенные команды SCSI. Чтобы подтвердить совместимость хранилища, запустите мастер конфигурации. Кроме того, можно связаться с поставщиком хранилища.Драйвер минипорта, используемый для хранилища, должен работать вместе с драйвером хранилища Microsoft Storport.Изоляция устройств хранилища, один кластер на устройство. У серверов из различных кластеров не должно быть доступа к одним и тем же устройствам хранилища. В большинстве случаев LUN, используемый для одного набора серверов кластера, должен быть изолирован от всех остальных серверов с помощью маски или зонирования LUN.Возможность использования программного обеспечения многопутевого ввода-вывода. В фабриках хранилищ высокой доступности программное обеспечение многопутевого ввода-вывода позволяет развернуть отказоустойчивые кластеры, используя несколько адаптеров шины. Это обеспечивает максимальный уровень избыточности и доступности. Для Windows Server?2008?R2 многопутевое решение должно быть основано на Microsoft Multipath I/O (MPIO). Поставщик оборудования будет, как правило, использовать для оборудования специфический для устройства модуль MPIO (DSM), хотя Windows Server?2008?R2 включает один или несколько DSM как часть операционной системы.Для отказоустойчивого кластера необходима следующая инфраструктура сети и административная учетная запись со следующими разрешениями домена:Настройки сети и IP-адреса. При использовании для сети идентичных сетевых адаптеров используйте на этих адаптерах одинаковые настройки связи (такие как скорость, дуплексный режим, управление потоком и тип среды передачи). А также, сравните настройки сетевого адаптера и коммутатора, к которому подключен адаптер, и убедитесь, что никакие настройки не противоречат друг другу.При использовании частных сетей, для которых отсутствует маршрутизация в оставшуюся часть сетевой инфраструктуры, убедитесь, что в каждой из этих частных сетей используется уникальная подсеть. Это необходимо, даже если каждому сетевому адаптеру назначен уникальный IP-адрес. Например, если два узла кластера размещаются в центральном офисе, использующем одну физическую сеть, а еще два узла - в филиале, использующем другую физическую сеть, не задавайте для обеих сетей 10.0.0.0/24, даже если каждому сетевому адаптеру назначен уникальный IP-адрес.DNS. Серверы кластера должны использовать для разрешения имен службу DNS. Может использоваться протокол динамического обновления DNS.Роль домена. Все серверы кластера должны находиться в одном домене Active Directory. Рекомендуется, чтобы для всех серверов кластера была задана одна и та же роль домена (либо рядовой сервер, либо контроллер домена). Рекомендуемой является роль рядового сервера.Контроллеры домена. Рекомендуется, чтобы серверы кластера были рядовыми серверами. В этом случае в домене, содержащем отказоустойчивый кластер, контроллерами домена будут другие серверы.Клиенты. К клиентам не предъявляется никаких особых требований, за исключением очевидных требований к связи и совместимости: клиенты должны обладать возможностью подключаться к серверам кластера, и на них должно работать программное обеспечение, совместимое со службами, предлагаемыми серверами кластера.Учетная запись для администрирования кластера. При создании кластера или при добавлении в него серверов необходимо войти в домен от имени учетной записи с правами администратора и разрешениями на доступ ко всем серверам этого кластера. Эта учетная запись не обязана быть учетной записью из группы?Администраторы домена?- она может быть учетной записью пользователя домена, входящей в группу?Администраторы?на каждом кластеризованном сервере. Кроме того, если учетная запись не входит в группу?Администраторы домена, учетной записи (или группе, членом которой является учетная запись) должно быть делегировано разрешение?Создание объектов-компьютеров?в домене.?1.3.3 HP Serviceguard HP Serviceguard (так жеMC/ServiceGuard) выпускается компанией HP для операционный систем Linux и HP-AUX c 1990 года. Представляет собой отказоустойчивый кластер вида active/passive. В настоящее время максимальное число узлов, поддерживаемых в Serviceguard кластере 16.Возможности:Повышение эффективности использования ресурсов благодаря улучшенной балансировке рабочих нагрузок в кластере.Решение HP Serviceguard использует оптимальный механизм размещения пакетов в зависимости от нагрузки, который позволяет выбирать узлы с максимальной свободной емкостью.Комплексная защита от сбоев программного и аппаратного обеспечения, виртуализации, сети и хранилищ.Решение HP Serviceguard обеспечивает защиту критических компонентов, например приложений, базы данных и связанных ресурсов. Оно поможет обнаружить любые сбои, связанные с аппаратным и программным обеспечением, ОС, слоем виртуализации, гостевыми ОС виртуальных машин, сетью и хранилищем.Дополнительные функции разрешения конфликтов помогут предотвратить потери и повреждения данных кластера.Благодаря удобной интеграции HP Matrix Operating Environment можно не только более гибко и эффективно использовать ресурсы, но и постоянно поддерживать необходимые уровни обслуживания за счет аварийного переключения после сбоев или аварий.Полная поддержка физических и виртуальных сред серверов.Полная интеграция по доступной цене для синхронизации переноса аппаратных ресурсов и лицензий ПО с сервером при аварийном переключении.Совместимость с Serviceguard Extensions, инструментами и решениями аварийного восстановления.HP Serviceguard объединяет удобство текущих инструментов/расширений и управление Serviceguard Extension для Oracle Real Application Cluster (SGeRAC), Serviceguard Extension для SAP (SGeSAP), Enterprise Cluster Master Toolkit (ECMT) и Network File Server (NFS) Toolkit.Благодаря совместимости с решениями Serviceguard Metrocluster и Continentalclusters Disaster Recovery процесс аварийного переключения значительно упрощается.Конфигурация кластера:Системный администратор настраивает параметры конфигурации кластера и делает первоначальный запуск кластера; после того, кластер саморегулируется. Параметры конфигурации для кластера включают имя кластера и узлов, сетевые параметры для синхронизации кластера, кластера блокировки информации, а также временные параметры. Параметры кластера вводятся с помощью диспетчера ServiceGuard или путем редактирования конфигурационного файла кластера ASCII. Параметры, которые вы вводите, используются для построения бинарного файла конфигурации, который распространяется на все узлы в кластере. Этот бинарный файл конфигурации кластера должен быть одинаковым на всех узлах кластера.1.3.4. Red Hat Enterprise Linux ClusterМаксимальное количество узлов кластера поддерживается высокой доступности Add-On 16Не поддерживается:Общая архитектураOracle RAC на GFS2 Прокатные обновления между любым основным выпуском аппаратные средстваКластер, у которого количество узлов больше 16 Место храненияИспользование MD RAID для хранения данных кластера Мгновенный снимок кластерных логических томов не поддерживается, если этот том не был включен исключительно на одном узле Использование нескольких SAN-устройств для зеркала GFS / GFS2 или кластерных логических томов на разных подмножествах узлов кластера СетьCorosync с использованием широковещания вместо многоадресного в RHEL (за исключением демонстрационных и предпродажных обязательств)В RHEL 5.6+ широковещательный режим поддерживается с некоторыми ограничениями в качестве альтернативы для многоадресной рассылки.В RHEL 6.2+ одноадресное UDP будет полностью поддерживается в качестве альтернативы Multicast.Ресурсы HAИспользование NFS в активной / активной конфигурации поверх либо GFS или GFS2Использование NFS и Samba в большинстве GFS / GFS2 инстансахRHCS (Red Hat Cluster Suite) состоит из:Cluster infrastructure - Обеспечивает основные функции нод для совместной работы в качестве кластера: управление конфигурационными файлами, управления пользователями, управление безопасностью.High-availability Service Management - обеспечивает аварийное переключение услуг с одной ноды кластера к другой в случае, когда нода становится неработоспособной.Cluster administration tools - Конфигурация и инструменты управления для настройки, конфигурирования и управления кластером Red Hat. Инструменты предназначены для использования с Cluster infrastructure, HA и Service Management, а также Storage.Linux Virtual Server (LVS) – Программа маршрутизации, которая обеспечивает IP-Load-Balancing. LVS работает в паре резервных серверов, которые распределяют запросы клиентов равномерно на реальных серверах, которые находятся за серверами LVS.Дополнительного пакета (и не является частью Red Hat Cluster Suite):GFS - GFS (Global File System) или GFS2 (Global File System 2) кластерная файловая система для использования с RHCS. GFS / GFS2 позволяет нескольким узлам предоставить общий доступ к хранилищу на уровне блоков, как если бы хранилище было подключены локально на каждом узле кластера.Cluster Logical Volume Manager (CLVM) - обеспечивает управление томами хранения кластераGlobal Network Block Device (GNBD) - вспомогательный компонент GFS / GFS2, который экспортирует хранения на уровне блоков для Ethernet. Также в состав Red Hat кластера входит Pacemaker. Кластер настроенный с Pacemaker состоит из отдельных демонов (контроль узлов кластера), скриптов (управление услугами), а также подсистемы управления ресурсами (контроль разрозненных ресурсов). Следующие компоненты образуют архитектуру Pacemaker:Cluster Information Base (CIB)Демон информации, который использует XML для распространения и синхронизации текущей конфигурации и информации о состоянии от назначенного координатора (DC) - нода, назначенная Pacemaker для хранения и распределения состояния и действия кластера с помощью CIB - ко всем остальным нодам кластера.Cluster Resource Management Daemon (CRMd)Действия ресурса кластера перенаправляются через этот демон. Ресурсы, управляемые CRMd с помощью клиентских систем, могут быть запрошены, перемещены, и изменены, когда это необходимо.Каждый узел кластера также включает в себя локальный менеджер ресурсов демон (LRMD), который действует в качестве связующего звена между CRMD и ресурсами. LRMD передает команды от CRMD до агентов, таких как запуск и остановка и передачи информации о состоянии.Shoot the Other Node in the Head (STONITH)STONITH действует как ресурс кластера в Pacemaker, который обрабатывает запросы, принудительно выключая узлы и удаляя их из кластера для обеспечения целостности данных. 1.3.5 Solaris ClusterSolaris Cluster (так же Sun Cluster) разработана корпорацией Sun Microsystems, но в 2010 году его выкупила компания Oracle. Продукт разработан для операционной системы Solaris.Кластеризация используется для повышения доступности программных сервисов, таких как базы данных, общий доступ к файлам по сети, электронной коммерции, веб-сайтов или других приложений. Sun Cluster работает, имея избыточные компьютеры или узлы, где один или несколько компьютеров продолжают предоставлять услуги, если другой терпит неудачу. Узлы могут быть расположены в том же самом центре обработки данных или на разных континентах.Для устранения единых точек отказа, конфигурация Solaris Cluster имеет избыточные компоненты, в том числе несколько сетевых подключений и хранилища, которые многократно соединены через сеть хранения данных.Solaris Cluster является примером программного обеспечения кластеризации на уровне ядра. Некоторые из процессов, которые работают как нормальные системные процессы, но у них есть какой-то особый доступ к операционной системе или функциям ядра в хост-системах.В июне 2007 года Sun выпустила исходный код Solaris Cluster через сообщество OpenSolaris HA Clusters.Oracle Solaris Clusters обеспечивает:Снижение незапланированных простев: Интеграция с Oracle Solaris на уровне ядра, Oracle Solaris Cluster предлагает самый быстрый и надежный способ обнаружения сбоев на серверах и хранилищах Oracle. Архитектура управления ошибками и самовосстановление Oracle Solaris помогают ограничить влияние аппаратных сбоев, обеспечивая автоматизированное восстановление на всех уровнях: сервера, системы хранения данных и сети. Малая вероятность запланированных простоев: Планируемое время простоя может быть связано с несколькими причинами: изменения аппаратного обеспечения, обновления программного обеспечения и реконфигурации среды. Oracle Solaris Cluster может помочь уменьшить или даже предотвратить запланированное время простоя. Управляет живой миграции для виртуализированных рабочих нагрузок, развернутых на зоне Oracle Solaris Kernel и Oracle VM для SPARC доменов, чтобы снизить влияние на техническое обслуживание. Поддержка Oracle Solaris Image Packaging System позволяет быстрее и безопаснее делать системные обновления.Ускоренное служба восстановления: Oracle Solaris Cluster может расширить возможности существенные HA, такие услуги как передача данных и приложений восстановления после сбоя, ограничивая перебои в обслуживании из-за локальных проблем, сводя к минимуму ошибки человека. РеализацияПрактической частью моей дипломной работы является реализация High Availability кластера.Я реализую свой HA-кластер для одноплатного компьютера Raspberry Pi, на который установлена операционная система Raspbian GNU/Linux 8.0. Кластер представляет собой имитатор исполнительного механизма, для того, чтобы отобразить режимы работы платы. Raspberry Pi – это одноплатный компьютер размером с банковскую карту. Приложение разрабатывалось на плате Raspberry Pi версии 3В. На этой плате имеются все составляющие обычного компьютера, такие как: процессор, оперативная память, разъём HDMI, композитный выход, USB, Ethernet, Wi-Fi и Bluetooth.Raspbian GNU/Linux – операционная система, основанная на Debian GNU/Linux для Raspberry Pi. В настоящее время эта ОС официально предоставляется Raspberry Pi Foundation, как основная операционная система для одноплатных компьютеров. ОС состоит из базовый про гамм и утилит, которые можно запустить на Raspberry Pi. Все еще находится в активной разработке.Реализованный мной кластер состоит из:Демона, который реализован на C++Сервисного приложения, которое реализовано на pythonКлиентского приложения, которое реализовано на pythonДемон стартует при загрузке операционной системы. Клиентское и сервисное приложение запускаются демоном. Демон и сервисное приложение запускаются на обоях машинах. Сервисное приложение запускается на локалхосте машины, и оно будет доступно только с самой платы. Клиентское приложение можно запустить с помощью сервисного на одной любой ноде, оно запускается с публичным адресом. В случае, когда другой узел перестает посылать heartbeat-сигналы, он считается неисправноым, и если на нем было запущено клиентское приложение, оно перезапускается на работающем узле.2.1 Демон Демон в Linux – это процесс, который работает в фоновом режиме и не взаимодействует с пользователем. Демон стартует при запуске операционной системы и завершает свою работу при выключении системы. Демон запускается на обеих нодах. В качестве языка реализации был выбран С++ версии 4.9. Этот язык наиболее удобным для разработки демона, так как синтаксис языка прост и понятен, его можно скомпилировать прямо в машинный код, поэтому он является одним из самых быстрых языков в мире, так же у него очень много компиляторов, которые могут работать на различных платформах. Стандартные библиотеки этого языка работают во многих платформах. Все библиотеки, работающие в Си, будут работать и в C++. В качестве среды разработки выбор пал на Eclipse C/C++ Development Tools (CDT). Возможности этой среды включают в себя: поддержку для создания проектов и управляемой сборки для различных инструментальных цепей, стандартную сборку, навигацию по источникам, различные исходные инструменты знаний, такие как иерархия типов, диаграмма вызовов, браузер, браузер макроопределений, редактор кода с подсветкой синтаксиса, сворачивание и гиперссылка для навигации, рефакторинга исходного кода и генерации кода, визуальных средств отладки, в том числе памяти, регистров и разборщиков.Для реализации демона необходимо было изучить принцип работы демона в linux, и узнать, как можно реализовать его на языке С++. Также нужно было изучить принцип работы сетевого общения по udp (сокеты) и запустить в каждой ноде udp-сервер и udp- клиент. Для успешного запуска и работы демона были реализованы данные функции:int LoadConfig(char* FileName) - для загрузки конфигураций из файлаint WriteLog(string Msg, ...) – для записи логов в файлvoid *Client(void*) – для запуска udp-клиентаvoid *Server(void*) – для запуска udp-сервераvoid ServiceApp() – для запуска сервисного приложенияvoid ClientApp() – для запуска клиентского приложенияvoid *Monitoring(void*) – для проверки переменных, отвечающих за статус соседней ноды и клиентского приложенияint InitWorkThread() – для инициализации потоков для клиента, сервера и мониторингаint WorkProc() – следит за работой InitWorkThread() и возвращает статус главному потокуvoid InitVars() – для инициализации глобальных переменныхint Daemon() – главный поток, который следит за состоянием дочернего потока WorkProc и, в зависимости от кода завершения, может либо завершить работу или перезапустить дочерний поток WorkProc()static void signal_error(int sig, siginfo_t *si, void *ptr) – для обработки сигналов и вывод ошибок в логint SetFdLimit(int MaxFd) - для установки максимального количества дескрипторов, которое может быть открыты. При исчерпывании дескрипторов невозможно будет открыть файл или создать сокетvoid SetPidFile(string Filename) – для создания PID файлаint main(int argc, char** argv) – главная функция, которая создает поток.После считывания конфигурационного файла, каждая функция начинает выводить в лог всю необходимою информацию. Запись в лог файл осуществляется функцией fput, которая позволяет записывать строку в файл.Реализация демона:При страте ОС запускается демон и считывает информацию из конфигурационного файла:Где:log_file файл, в который записываются логи демона;my_ip – ip- адрес данной ноды;listen_port – порт, который слушает нода;another_ip – ip- адрес соседней ноды;another_port – порт, на который будет посылаться пакет;timeout – время, через которое демон определит другую ноду как недоступную и, при необходимости, запустить приложение у себя;app - пусть до запускаемого клиентского приложения.Для считывания xml документа используется библиотека TinyXml, которая находится в директиве "tinyxml.lib".Инициализируются переменные, которые будут отвечать за статус клиентского приложения и соседней ноды. В начале все переменные равны 0.int node_status; // статус соседней ноды: ?0? – выключена, ?1? - включенаint need_start_app; // необходимость запуска или остановки клиентского приложения на данной ноде: ?0? – не нужно запускать, ?1? – нужно, ?-1? – нужно остановитьint diff_need_start; // необходимость запуска или остановки клиентского приложения на соседней ноде: ?0? – не нужно запускать, ?1? - нужно, ?-1? – нужно остановитьint diff_app_status; // статус клиентского приложения на соседней ноде: ?0? – не запущено, ?1? - запущеноint my_app_status; // статус приложения на данной ноде: ?0? – не запущено, ?1? - запущеноtime_t last_time; // время последнего прибывшего пакета от соседней нодыИнициализируется дочерний поток, который будет следить за работой потока демонаНовый поток создается с помощью команды fork(), эта команда создаёт процесс-потомок, который является почти полной копией процесса родителя и она возвращает идентификатор PID потомка родителю, с помощью этого идентификатора родитель может ?убить? потомка. Далее уже в потомке необходимо будет разрешить все права для создания новых файлов, с помощью команды umask(0). Чтобы не произошло проблем с размонтированием дисков, необходимо сменить корневую директорию chdir("/"). Для того, чтобы демон не имел доступ к консоли и не выводил ничего, необходимо закрыть все дескрипторы ввода, вывода и ошибок командами close(STDIN_FILENO), close(STDOUT_FILENO), close(STDERR_FILENO) – это позволит сэкономить ресурсы. Создается новый поток демон, который может передать необходимые сигналы потоку родителю.Далее создаются потокиПотоки создаются с помощью библиотеки POSIX thread (pthread). Она позволяет создавать новый параллельный поток процессов. Для потоков требуется меньше накладных расходов, чем для ?forking?а. Все потоки внутри процесса имеют одинаковое адресное пространство. За создание нового потока отвечает функция pthread_create(thread, attr, start_routine, arg), где thread – это уникальных идентификатор для потока, attr - Объект непрозрачного атрибута, который может использоваться для установки атрибутов потока (можно NULL), start_routine – вызываемая функция, arg – единственный аргумент функции типа void (может быть NULL). Для того, чтобы два потока одновременно не обращались к одной переменной, необходимо на время блокировать доступ к ней, для этого есть специальная функция pthread_mutex_lock, и для разблокировки pthread_mutex_unlock. Область памяти, на которую ссылается код между этими функциями блокируется при вызове первой и освобождается, при вызове второй.Создаются 4 потока:Client:Udp-клиент, который инициализирует соединение и каждые 2 секунды посылает значение переменных diff_need_start и my_app_status.Server:Udp-сервер, который инициализирует соединение и принимает пакеты и сохраняет время последнего прибывшего пакета и записывает в лог информацию. В пакете содержится информация, которая сохраняется в переменные need_start_app и diff_app_status.Monitor:Функция, которая следит за состоянием соседней ноды, а также отвечает за запуск или остановку клиентского приложения. На блоксхеме изображен алгоритм работы функции. Далее показана блоксхема работы функции монитор. Запуск и остановка клиентского приложения осуществляется функцией мониторинга. Для остановки клиентского приложения используется PID процесса, в котором оно было запущено.ServerceApp Поток запускает приложение сервисаВ данном случае время недоступности клиентского приложения, при отказе сервера, на котором оно запущено, зависит от значения переменной timeout и времени, которое занимает поднятия web-сервера.2.2 Сервисное приложениеСервисное приложение реализовано на Python 3 c использованием фреймворка, для создания web-приложений, Flask. Flask – это небольшой фреймворк для создания веб-сайтов. Flask является простым, но быстро расширяемым ядром.Сервисное приложение запускается каждым демоном на обеих нодах. Необходимые данные о статусе приложения и ноды считываются из файла, который генерирует демон.Администратор, может сам выбрать, ноду, на которой запустить, а также остановить сервисное приложения. После чего данные о запуске и остановке клиентского приложения передаются демону.Чтобы запустить сервер используется функция app.run(host='0.0.0.0',port=8081), где host – это ip-адрес, а port – это порт, на котором подниается сервер. Для того, чтобы привязать функцию к URL используются декораторы. Вызов декоратора выглядит так @app.route('/', methods=['GET', 'POST']). Это означает, что при вводе в адресной строке браузера '' сервер вернет страницу, которая описана в функции под декоратором. При запрашивании браузером метода GET, сервером должна предоставляется html страница. Проверить вызываемый метод можно с помощью условие request.method = 'GET', после которого необходимо вернуть html страницу с помощью функции return render_template('index_3.html') Если происходит вызов метода POST, значить браузер хочет сообщить некоторую информацию серверу, и сервер должен ее обработать и что-то вернуть браузеру, это проверяется с помощью условия request.method = 'POST'. Проверка нажатия кнопки происходит с помощью метода request.form['submit'] == 'This node', где 'This node' это название кнопки в html коде. Далее можно вернуть любую страниу, с помощью метода return redirect(url_for('.contact')) , где contact, это функция, которая привязана к декоратору.Для успешного запуска сервера также необходимо создать html страницы, которые будут предоставляться при запросе браузера. Все страницы, которые будут необходимы для работы сервера должны находиться подпапке templates, которая находиться в той же папке, что и скрипт питона. В html коде также описывается метод POST, который включается в себя кнопки, на которые будет нажимать администратор. 2.3 Клиентское приложение.Реализовано на Python 3 c использованием фреймворка, для создания web-приложений, Flask. Клиентское приложение запускается демоном, при поступлении сигнала о запуске из серверного приложения. Клиентское приложение управляет работой физического моторчика, который двигается вокруг своей оси, в зависимости от выбранного варианта. Чтобы запустить сервер используется функция app.run(host='0.0.0.0',port=8081), где host – это ip-адрес, а port – это порт, на котором подниается сервер. Для того, чтобы привязать функцию к URL используются декораторы. Вызов декоратора выглядит так @app.route('/', methods=['GET', 'POST']). Это означает, что при вводе в адресной строке браузера '' сервер вернет страницу, которая описана в функции под декоратором. При запрашивании браузером метода GET, сервером должна предоставляется html страница. Проверить вызываемый метод можно с помощью условие request.method = 'GET', после которого необходимо вернуть html страницу с помощью функции return render_template('index_3.html') Если происходит вызов метода POST, значить браузер хочет сообщить некоторую информацию серверу, и сервер должен ее обработать и что-то вернуть браузеру, это проверяется с помощью условия request.method = 'POST'. Проверка нажатия кнопки происходит с помощью метода request.form['submit'] == 'Left', где 'Left' это название кнопки в html коде, после чего запускается метод, который управляет макетом. Далее можно вернуть любую страницу, с помощью метода return redirect(url_for('.web_function')) , где web_function, это функция, которая привязана к декоратору.Для успешного запуска сервера также необходимо создать html страницы, которые будут предоставляться при запросе браузера. Все страницы, которые будут необходимы для работы сервера должны находиться подпапке templates, которая находиться в той же папке, что и скрипт питона. В html коде также описывается метод POST, который включается в себя кнопки, на которые будет нажимать администратор. Пока клиент удерживает одну из кнопок, происходит поворот мотора на импровизированном моторе, После того, как кнопка была опущена, мотор прекращает свое движение.Вывод.Главным преимуществом кластерных решений являются обеспечение более высокий уровень доступности, по сравнению с единичным сервером или компьютером, высокая степень масштабируемости и также удобство в администрировании. Высокий уровень доступности позволяет уменьшить время, во время которого сервис не предоставляется. Клстерное решение может гарантировать, что в случае отказа, какого-либо модуля сервера, его функции продолжит выполнять другой сервер.В дипломной работе было проведено исследование кластерных технологий, дана общая характеристика кластеров и из видов. Также были рассмотрены аналоги, существующие на рынки. После чего было реализовано свое кластерное решение, которое работает на всех дистрибутивах ОС Linux. Также было реализовано приложения, которые осуществляли управление кластером и приложение, которое работало в кластере и позволяло управлять макетным механизмом. Список литературы. (%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0)(%D0%B2%D0%B5%D0%B1-%D1%84%D1%80%D0%B5%D0%B9%D0%BC%D0%B2%D0%BE%D1%80%D0%BA)Приложение Приложение 1.РешениеВремя простоя (отключения)Доступность данныхСтоимостьАвтономное (Standalone)ДниС последней резервной копииБазовые затраты на аппаратное и программное обеспечение ($)Улучшенное автономное (Enhanced standalone)ЧасыДо последней транзакцииДвойные затраты на аппаратное обеспечение ($$)Кластеры?высокой доступности?(High availability clusters)МинутыДо последней транзакцииДвойные затраты на аппаратное обеспечение и дополнительное обслуживание ($$+)Отказоустойчивые вычислительные системы (fault-tolerant computing)Никогда не отключаютсяБез потери данныхСпециализированное аппаратное и программное обеспечение, очень дорогостоящее ($$$$$$)PowerHAМинутыДо последней транзакцииДвойная или тройная стоимость аппаратного обеспечения + дополнительные затраты на связь ($$$$)Приложение 2.Volume Size Cluster Size FAT16 FAT32 exFAT NTFS ReFS 7 MBs to 16 MBs 512 bytes N/A 4 KBs 512 bytes N/A 17 MBs to 32 MBs 512 bytes N/A 4 KBs 512 bytes N/A 33 MBs to 64 MBs 1 KB 512 bytes 4 KBs 512 bytes N/A 65 MBs to 128 MBs 2 KBs 1 KB 4 KBs 512 bytes N/A 129 MBs to 256 MBs 4 KBs 2 KBs 4 KBs 512 bytes N/A 257 MBs to 512 MBs 8 KBs 4 KBs 32 KBs 512 bytes N/A 513 MBs to 1024 MBs 16 KBs 4 KBs 32 KBs 1 KB 64 KBs 1025 MBs to 2 GBs 32 KBs 4 KBs 32 KBs 4 KBs 64 KBs 2 GBs to 4 GBs 64 KBs 4 KBs 32 KBs 4 KBs 64 KBs 4 GBs to 8 GBs N/A 4 KBs 32 KBs 4 KBs 64 KBs 8 GBs to 16 GBs N/A 8 KBs 32 KBs 4 KBs 64 KBs 16 GBs to 32 GBs N/A 16 KBs 32 KBs 4 KBs 64 KBs 32 GBs to 2 TBs N/A * 128 KBs 4 KBs 64 KBs 2 TBs to 16 TBs N/A * 128 KBs 4 KBs 64 KBs 16 TBs to 32 TBs N/A * 128 KBs 8 KBs 64 KBs 32 TBs to 64 TBs N/A * 128 KBs 16 KBs 64 KBs 64 TBs to 128 TBs N/A * 128 KBs 32 KBs 64 KBs 128 TBs to 256 TBs N/A * 128 KBs 64 KBs 64 KBs Файл MainDaemon.cpp#if !defined(_GNU_SOURCE)#define _GNU_SOURCE#endif#include <stdio.h>#include <stdlib.h>#include <pthread.h>#include <string.h>#include <sys/file.h>#include <execinfo.h>#include <unistd.h>#include <errno.h>#include <wait.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/time.h>#include <sys/resource.h>#include <sstream>#include "tinystr.h"#include "tinyxml.h"#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <string>#include "string.h"#include <time.h>#include <unistd.h>#include <cstring>using namespace std;// лимит для установки максимально кол-во открытых дискрипторов#define FD_LIMIT 1024*10// константы для кодов завершения процесса#define CHILD_NEED_WORK 1#define CHILD_NEED_TERMINATE 2#define PID_FILE "/var/run/my_daemon.pid"pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER;int node_status;int need_start_app;int diff_need_start;int diff_app_status;int my_app_status;time_t last_time;int stop_app;int timeout;string log_file;string my_ip;int my_port;string diff_ip;int diff_port;string my_app;// функция записи логаint WriteLog(string Msg, ...) {FILE *f = fopen(log_file.c_str(), "a");if (f == NULL) {return -1;} else {char buffer[80];time_t seconds = time(NULL);struct tm *timeinfo = localtime(&seconds);strftime(buffer, 80, "%a %B %d %H:%M:%S %Y", timeinfo);char third[1024];snprintf(third, sizeof third, "%s\t%s", buffer, Msg.c_str());fputs(third, f);}fclose(f);return 1;}// функция загрузки конфигаint LoadConfig(char* FileName) { TiXmlDocument *xml_file = new TiXmlDocument(FileName); if (!xml_file->LoadFile()) { printf("file have errors"); return -1; } TiXmlElement *xml_1 = 0; xml_1 = xml_file->FirstChildElement(); TiXmlElement *xml_2 = 0; xml_2 = xml_1->FirstChildElement("log_file"); log_file = xml_2->GetText(); xml_2 = xml_1->FirstChildElement("my_ip"); my_ip = xml_2->GetText(); xml_2 = xml_1->FirstChildElement("listen_port"); my_port = atoi(xml_2->GetText()); xml_2 = xml_1->FirstChildElement("another_ip"); diff_ip = xml_2->GetText(); xml_2 = xml_1->FirstChildElement("another_port"); diff_port = atoi(xml_2->GetText()); xml_2 = xml_1->FirstChildElement("timeout"); timeout = atoi(xml_2->GetText()); xml_2 = xml_1->FirstChildElement("my_app"); my_app = xml_2->GetText(); return 1;}void *Client(void*) {int m_sock; // дескриптор сокетаsockaddr_in m_addr; // переменная адреса интерфейсаsockaddr_in s_addr; // переменная адреса получателяstring my_addr = my_ip; // Адрес локального интерфейсаstring ip_addr = diff_ip; // Адрес получателя/* Создание сокета и присвоение значения дескриптору сокета для UDP пакетов * PF_INET - IP protocol family * SOCK_DGRAM - Raw protocol interface */if ((m_sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket");pthread_exit(NULL);}WriteLog("[CLIENT] Started\n");/* Обнуляем переменную m_addr и забиваем её нужными значениями */bzero(&m_addr, sizeof(m_addr));m_addr.sin_family = AF_INET; // обязательно AF_INET!m_addr.sin_port = htons(0); // 0 - выдать порт автоматом/* Переводим адрес в нужный нам формат */if (inet_aton(my_addr.c_str(), &m_addr.sin_addr) == 0) {WriteLog("[CLIENT] Creating address failed\n");perror("inet_aton");close(m_sock);pthread_exit(NULL);}WriteLog("[CLIENT] Bind\n");/* Биндим сокет */if (bind(m_sock, (struct sockaddr*) &m_addr, sizeof(m_addr)) < 0) {WriteLog("[CLIENT] Bind failed\n");perror("bind");close(m_sock);pthread_exit(NULL);}/* Обнуляем переменную s_addr и забиваем её нужными значениями */bzero(&s_addr, sizeof(s_addr));s_addr.sin_family = AF_INET;s_addr.sin_port = htons(diff_port);/* Переводим адрес в нужный нам формат */if (inet_aton(ip_addr.c_str(), &s_addr.sin_addr) == 0) {WriteLog("[Client] Inet ation failed\n");perror("inet_aton");close(m_sock);pthread_exit(NULL);}/* Засыпаем адресата пачкой пакетов */string msg;while (1) {pthread_mutex_lock(&mutex1);WriteLog("[CLIENT] Sent\n");if ((my_app_status == 1) && (diff_need_start == 1)) {msg = "10";}if ((my_app_status == 1) && (diff_need_start == 0)) {msg = "10";}if ((my_app_status == 0) && (diff_need_start == 1)) {msg = "01";}if ((my_app_status == 0) && (diff_need_start == 0)) {msg = "00";}if (sendto(m_sock, msg.c_str(), 3, MSG_NOSIGNAL,(struct sockaddr*) &s_addr, sizeof(s_addr)) < 0) {perror("sendto");close(m_sock);pthread_exit(NULL);}pthread_mutex_unlock(&mutex1);sleep(2);}WriteLog("[CLIENT] Failed/n");/* Закрываем сокет и выходим из программы */close(m_sock);pthread_exit(NULL);}void *Server(void*) {int m_sock; // дескриптор сокетаsockaddr_in m_addr; // переменная адреса интерфейсаstring my_addr = my_ip; // Адрес локального интерфейса/* Создание сокета и присвоение значения дескриптору сокета для UDP пакетов * PF_INET - IP protocol family * SOCK_DGRAM - Raw protocol interface */if ((m_sock = socket(PF_INET, SOCK_DGRAM, 0)) < 0) {perror("socket");pthread_exit(NULL);}WriteLog("[SERVER] Started\n");/* Обнуляем переменную m_addr и забиваем её нужными значениями */bzero(&m_addr, sizeof(m_addr));m_addr.sin_family = AF_INET; // обязательно AF_INET!m_addr.sin_port = htons(my_port); // 0 - выдать порт автоматом/* Переводим адрес в нужный нам формат */if (inet_aton(my_addr.c_str(), &m_addr.sin_addr) == 0) {WriteLog("[SERVER] Creating address failed\n");perror("inet_aton");close(m_sock);pthread_exit(NULL);}WriteLog("[SERVER] Bind\n");/* Биндим сокет */if (bind(m_sock, (struct sockaddr*) &m_addr, sizeof(m_addr)) < 0) {WriteLog("[SERVER] Bind failed\n");perror("bind");close(m_sock);pthread_exit(NULL);}/* Получаем пакеты от отправителя */char recvline[3];int bytesrecv;while (1) {if ((bytesrecv = recvfrom(m_sock, recvline, 3, MSG_NOSIGNAL,(sockaddr*) NULL, NULL)) < 0) {perror("recvfrom");close(m_sock);pthread_exit(NULL);}pthread_mutex_lock(&mutex1);last_time = time(NULL);if (node_status == 0) {WriteLog("[SERVER] Another node online\n");node_status = 1;}WriteLog("[SERVER] Heartbeat\n");if (strcmp(recvline, "00") == 0) {diff_app_status = 0;}if (strcmp(recvline, "01") == 0) {if ((my_app_status == 0) && (diff_app_status == 0)) {need_start_app = 1;}}if (strcmp(recvline, "10") == 0) {diff_app_status == 1;}pthread_mutex_unlock(&mutex1);}/* Закрываем сокет и выходим из программы */WriteLog("[SERVER] Failed/n");close(m_sock);pthread_exit(NULL);}void *Monitoring(void*) {WriteLog("[MONITOR] Started\n");while (1) {pthread_mutex_lock(&mutex1);WriteLog("[MONITOR] Status check\n");stringstream ss;if (need_start_app == 1) {need_start_app = 0;if ((my_app_status == 0) && (diff_app_status == 0)) {WriteLog("[MONITOR] Start application\n");my_app_status = 1;//start app}}if (node_status == 1) {time_t current_time = time(NULL);double diff = difftime(current_time, last_time);if (diff > timeout) {WriteLog("[MONITOR] Another node offline\n");node_status = 0;WriteLog("[MONITOR] Checking the status of the another application\n");if (diff_app_status == 1) {WriteLog("[MONITOR] Start application\n");diff_app_status = 0;my_app_status = 1;//need start app} else {WriteLog("[MONITOR] Application on another server is not running\n");}}}pthread_mutex_unlock(&mutex1);sleep(7);}pthread_exit(NULL);}// функция мониторингаint InitWorkThread() {int rc1, rc2, rc3;pthread_t thread1, thread2, thread3;/* Create independent threads each of which will execute functionC */if ((rc1 = pthread_create(&thread1, NULL, &Client, NULL))) {WriteLog("[DEAMON] Client creation failed");}if ((rc2 = pthread_create(&thread2, NULL, &Server, NULL))) {WriteLog("[DEAMON] Server creation failed");}if ((rc3 = pthread_create(&thread3, NULL, &Monitoring, NULL))) {WriteLog("[DEAMON] Monitor creation failed");}/* Wait till threads are complete before main continues. Unless we *//* wait we run the risk of executing an exit which will terminate *//* the process and all threads before the threads have completed. */pthread_join(thread1, NULL);pthread_join(thread2, NULL);pthread_join(thread3, NULL);return 1;}// функция обработки сигналовstatic void signal_error(int sig, siginfo_t *si, void *ptr) {void* ErrorAddr;void* Trace[16];int x;int TraceSize;char** Messages;// запишем в лог что за сигнал пришелWriteLog("[DAEMON] Signal: %s, Addr: 0x%0.16X\n", strsignal(sig),si->si_addr);/* #if __WORDSIZE == 64 // если дело имеем с 64 битной ОС // получим адрес инструкции которая вызвала ошибку ErrorAddr = (void*)((ucontext_t*)ptr)->uc_mcontext.gregs[REG_RIP]; #else // получим адрес инструкции которая вызвала ошибку ErrorAddr = (void*) ((ucontext_t*) ptr)->uc_mcontext.gregs[REG_EIP]; #endif */// произведем backtrace чтобы получить весь стек вызововTraceSize = backtrace(Trace, 16);Trace[1] = ErrorAddr;// получим расшифровку трасировкиMessages = backtrace_symbols(Trace, TraceSize);if (Messages) {WriteLog("== Backtrace ==\n");// запишем в логfor (x = 1; x < TraceSize; x++) {WriteLog("%s\n", Messages[x]);}WriteLog("== End Backtrace ==\n");free(Messages);}WriteLog("[DAEMON] Stopped\n");// остановим все рабочие потоки и корректно закроем всё что надоDestroyWorkThread();// завершим процесс с кодом требующим перезапускаexit(CHILD_NEED_WORK);}// функция установки максимального кол-во дескрипторов которое может быть открытоint SetFdLimit(int MaxFd) {struct rlimit lim;int status;// зададим текущий лимит на кол-во открытых дискриптеровlim.rlim_cur = MaxFd;// зададим максимальный лимит на кол-во открытых дискриптеровlim.rlim_max = MaxFd;// установим указанное кол-воstatus = setrlimit(RLIMIT_NOFILE, &lim);return status;}int WorkProc() {struct sigaction sigact;sigset_t sigset;int signo;int status;// сигналы об ошибках в программе будут обрататывать более тщательно// указываем что хотим получать расширенную информацию об ошибкахsigact.sa_flags = SA_SIGINFO;// задаем функцию обработчик сигналовsigact.sa_sigaction = signal_error;sigemptyset(&sigact.sa_mask);// установим наш обработчик на сигналыsigaction(SIGFPE, &sigact, 0); // ошибка FPUsigaction(SIGILL, &sigact, 0); // ошибочная инструкцияsigaction(SIGSEGV, &sigact, 0); // ошибка доступа к памятиsigaction(SIGBUS, &sigact, 0); // ошибка шины, при обращении к физической памятиsigemptyset(&sigset);// блокируем сигналы которые будем ожидать// сигнал остановки процесса пользователемsigaddset(&sigset, SIGQUIT);// сигнал для остановки процесса пользователем с терминалаsigaddset(&sigset, SIGINT);// сигнал запроса завершения процессаsigaddset(&sigset, SIGTERM);// пользовательский сигнал который мы будем использовать для обновления конфигаsigaddset(&sigset, SIGUSR1);sigprocmask(SIG_BLOCK, &sigset, NULL);// Установим максимальное кол-во дискрипторов которое можно открытьSetFdLimit(FD_LIMIT);// запускаем все рабочие потокиstatus = InitWorkThread();if (!status) {// цикл ожижания сообщенийfor (;;) {// ждем указанных сообщенийsigwait(&sigset, &signo);break;}}WriteLog("[MONITOR] Stopped/n");// вернем код не требующим перезапускаreturn CHILD_NEED_TERMINATE;}void SetPidFile(string Filename) {FILE* f;f = fopen(Filename.c_str(), "w+");if (f) {fprintf(f, "%u", getpid());fclose(f);}}void Init_vars() {node_status = 0;need_start_app = 0;diff_app_status = 0;my_app_status = 0;stop_app = 0;diff_need_start = 0;last_time = time(NULL);}int Daemon() {int pid;int status;int need_start = 1;sigset_t sigset;siginfo_t siginfo;WriteLog("[DAEMON] Started\n");// настраиваем сигналы которые будем обрабатыватьsigemptyset(&sigset);// сигнал остановки процесса пользователемsigaddset(&sigset, SIGQUIT);// сигнал для остановки процесса пользователем с терминалаsigaddset(&sigset, SIGINT);// сигнал запроса завершения процессаsigaddset(&sigset, SIGTERM);// сигнал посылаемый при изменении статуса дочернего процессsigaddset(&sigset, SIGCHLD);// сигнал посылаемый при изменении статуса дочернего процессsigaddset(&sigset, SIGCHLD);// пользовательский сигнал который мы будем использовать для обновления конфигаsigaddset(&sigset, SIGUSR1);sigprocmask(SIG_BLOCK, &sigset, NULL);// данная функция создат файл с нашим PID'омSetPidFile(PID_FILE);Init_vars();// создаём потомкаpid = fork();if (pid == -1) // если произошла ошибка{// запишем в лог сообщение об этомWriteLog("[MONITOR] Fork failed (%s)\n", strerror(errno));} else if (!pid) // если мы потомок{// данный код выполняется в потомке// запустим функцию отвечающую за работу демонаstatus = WorkProc();// завершим процессexit(status);} else // если мы родитель{for (;;) {// данный код выполняется в родителе// ожидаем поступление сигналаsigwaitinfo(&sigset, &siginfo);// если пришел сигнал от потомкаif (siginfo.si_signo == SIGCHLD) {// получаем статус завершениеwait(&status);// преобразуем статус в нормальный видstatus = WEXITSTATUS(status);// если потомок завершил работу с кодом говорящем о том, что нет нужны дальше работатьif (status == CHILD_NEED_TERMINATE) {// запишем в лог сообщени об этомWriteLog("[DAEMON] Childer stopped\n");// прервем циклbreak;} else if (status == CHILD_NEED_WORK) // если требуется перезапустить потомка{// запишем в лог данное событиеWriteLog("[DAEMON] Childer restart\n");}} else // если пришел какой-либо другой ожидаемый сигнал{// запишем в лог информацию о пришедшем сигналеWriteLog("[DAEMON] Signal %s\n", strsignal(siginfo.si_signo));// убьем потомкаkill(pid, SIGTERM);status = 0;break;}}}// запишем в лог, что мы остановилисьWriteLog("[DAEMON] Stopped\n");// удалим файл с PID'омunlink(PID_FILE);return status;}int main(int argc, char** argv) {int status;int pid;// если параметров командной строки меньше двух, то покажем как использовать деманаif (argc != 2) {printf("Usage: ./my_daemon filename.cfg\n");return -1;}// загружаем файл конфигурацииstatus = LoadConfig(argv[1]);if (!status) // если произошла ошибка загрузки конфига{printf("Error: Load config failed\n");WriteLog("Error: Load config failed\n");return -1;}FILE *f = fopen(log_file.c_str(), "w");if (f == NULL) {printf("Could not open log file");} else {char buffer[80];time_t seconds = time(NULL);struct tm *timeinfo = localtime(&seconds);strftime(buffer, 80, "%a %B %d %H:%M:%S %Y", timeinfo);char third[1024];snprintf(third, sizeof third, "%s\t%s", buffer, "Start\n");fputs(third, f);}fclose(f);// создаем потомкаpid = fork();if (pid == -1) // если не удалось запустить потомка{// выведем на экран ошибку и её описаниеprintf("Start Daemon Error: %s\n", strerror(errno));return -1;} else if (!pid) // если это потомок{// данный код уже выполняется в процессе потомка// разрешаем выставлять все биты прав на создаваемые файлы,// иначе у нас могут быть проблемы с правами доступаumask(0);// создаём новый сеанс, чтобы не зависеть от родителяsetsid();// переходим в корень диска, если мы этого не сделаем, то могут быть проблемы.// к примеру с размантированием дисковchdir("/");printf("run!");// закрываем дискрипторы ввода/вывода/ошибок, так как нам они больше не понадобятсяclose(STDIN_FILENO);close(STDOUT_FILENO);close(STDERR_FILENO);// Данная функция будет осуществлять слежение за процессомstatus = Daemon();return status;} else // если это родитель{// завершим процес, т.к. основную свою задачу (запуск демона) мы выполнилиreturn 0;}}Service.pyfrom flask import Flask, render_template, redirect, url_forfrom flask import requestapp = Flask(__name__)app_status="off"node_status="on"@app.route('/', methods=['GET', 'POST'])def contact(): global app_status global node_status if request.method == 'POST': if request.form['submit'] == 'This node': app_status= "on" return redirect(url_for('.contact')) elif request.form['submit'] == 'Another node': app_status="on" return redirect(url_for('.contact')) elif request.form['submit'] == 'Stop app': app_status="off" return redirect(url_for('.contact')) else: pass # unknown elif request.method == 'GET': return render_template('index_3.html',node_status=node_status, app_statu s=app_status )if __name__ == '__main__': app.run(host='0.0.0.0',port=8081,debug=True)Client.pyfrom flask import Flask, render_template, redirect, url_forfrom flask import requestapp = Flask(__name__)@app.route('/test', methods=['GET', 'POST'])def contact1(): if request.method == 'POST': if request.form['submit'] == 'Return': return redirect(url_for('.contact')) #pass # do somethin #print "Left gjhgjh" else: pass # unknown elif request.method == 'GET': return render_template('index_2.html')@app.route('/', methods=['GET', 'POST'])def my_client(): if request.method == 'POST': if request.form['submit'] == 'Left': #pass # do somethin print ("Left")return redirect(url_for('.my_client')) elif request.form['submit'] == 'Right': print ("Roght")return redirect(url_for('. my_client')) else: pass # unknown elif request.method == 'GET': return render_template('index.html')if __name__ == '__main__': app.run(host='0.0.0.0',port=8081,debug=True)index.html <html> <head> <title>Client app</title> </head> <body> <h2>Client</h2> <form method="POST"> <input type="submit" name="submit" value="Left"> <input type="submit" name="submit" value="Right"> </form> </body></html>Index_3.html<html> <head> <title>Service app</title> </head> <body> <h1>Service app</h1> <h2>Node 1</h2> <form method="POST"> <p>Anoter node status: {{node_status}} </p> <p>Application status: {{app_status}} </p> {% if app_status in "on" %} <input type="submit" name="submit" value="Stop app"> {% else %} {% if node_status in "off" %} <p>Run application on: </p> <input type="submit" name="submit" value="This node"> {% else %} <p>Run application on: </p> <input type="submit" name="submit" value="This node"> <input type="submit" name="submit" value="Another node"> {% endif %} {% endif %} </form> </body></html> ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download

To fulfill the demand for quickly locating and searching documents.

It is intelligent file search solution for home and business.

Literature Lottery