Для некоторых ресурсов в распределенной системе может потребоваться взаимоисключающий доступ. Блокировка
Сервис - это сервис, отвечающий за предоставление или отказ клиентам в таком эксклюзивном доступе. В этом проекте вы реализуете простую реплицируемую службу блокировки высокой доступности.
Блокировка клиент-сервер. Служба блокировки состоит из двух программных компонентов:
клиентская библиотека и сервер. Сервер отвечает за поддержание информации о том, кому был предоставлен доступ к какому-либо ресурсу. Клиентская библиотека {которую вы должны внедрить {отвечает за обеспечение доступности сервиса для клиентов, которым необходимо его использовать. Библиотека должна предоставлять клиентам две функции:
в четкости (int l l n t i d, int s i d);
ВНУТРЕННИЙ (int l l n t i d, int s s d);
Первая функция позволяет клиенту, идентифицированному клиентом, запрашивать эксклюзивный доступ к ресурсу, идентифицированному остатоком, а вторая позволяет клиенту освободить этот эксклюзивный доступ. Вы можете предположить, что клиенты и ресурсы могут быть уникально идентифицированы по некоторому числовому идентификатору.
Далее, запрос на получение должен возвращать: 2, если сервер в данный момент недоступен, 1, если клиент
получение вызовов на ресурсе, который уже был получен другим клиентом; или 0, если сервер работает, и доступ к ресурсу предоставлен (или уже предоставлен этому клиенту).
Вызов освобождения имеет аналогичные возвращаемые значения: 2, если сервер в данный момент недоступен; 1, если клиент вызывает release для ресурса, для которого он никогда не вызывал acqu; или 0, если сервер работает, и операция разблокирования прошла успешно.
Реплицированный сервер. Чтобы обеспечить высокую доступность, вы должны сделать свой сервер избыточным.
Вы должны сделать это, превратив ваш \ сервер "в набор процессов {один мастер плюс n реплик.
Реплики должны синхронизироваться с ведущим с помощью надежного протокола многоадресной рассылки.
Клиенты подключаются только к главному устройству, выполняя операции получения / выпуска непосредственно к нему. Всякий раз, когда новый запрос поступает к мастеру, мастер должен передать этот запрос всем репликам. После получения таких многоадресных запросов от мастера реплики должны обновить свое внутреннее состояние, чтобы отразить их. Основная задача синхронизации реплик заключается в том, что если мастер выйдет из строя, система может продолжить работу, если одна из реплик займет ее место.
Для обеспечения правильной работы ваш надежный протокол многоадресной рассылки должен гарантировать, что даже при наличии сбоев:
1. либо все правильные реплики доставляют сообщение, либо ни одна не делает, и;
2. Единственный случай, в котором разрешен случай \ или ничего ", - это сбой мастера, прежде чем какая-либо правильная реплика сможет доставить сообщение.
Обратите внимание, что мы не заботимся о сбойных репликах: они могут доставлять или не доставлять сообщение. Чтобы выполнить эту задачу, мы предлагаем вам адаптировать протокол двухфазной фиксации (2PC), но помните следующее: в отличие от \ обычной "2PC, сбойные реплики не приводят к тому, что сообщение не доставляется, и это единственный случай, когда вы нужно беспокоиться о том, когда координатор падает.
Failover. Когда мастер отказывает, новый мастер должен вступить во владение. Вы должны предоставить
механизм для установки нового мастера (например, реплика может принять специальный \ стать мастером "
сообщение, которое может быть выдано клиентом при сбое текущего мастера).
Кроме того, клиенты должны каким-то образом иметь возможность связаться с новым мастером, как только он будет на месте. Делать вещи
Проще говоря, допустимо запрашивать все реплики при каждом запросе, чтобы определить, какая из них является главной.
1
Предположения сервера . При реализации сервера вы должны сделать следующие предположения.
1. Набор реплик xed, и реплики могут аварийно завершить работу, но реплики никогда не восстанавливаются;
2. количество ресурсов, которые могут быть получены и освобождены, фиксировано и известно заранее;3. базовая сеть ненадежна и не гарантирует FIFO (если вы используете UDP, вы должны это учитывать).
Допущения клиентской библиотеки.
1. Если мастер завершает работу в середине запроса, функции получения / выпуска могут возвращать код ошибки 2, а затем код клиента может повторять запрос до тех пор, пока не будет установлен новый мастер;
- клиентская библиотека должна правильно выполнять отработку отказа после выбора нового мастера; то есть он должен каким-то образом найти текущего мастера.