Каковы хорошие алгоритмы для обеспечения согласованности между несколькими файлами в сети?

Каковы хорошие алгоритмы для обеспечения согласованности в нескольких файлах?

Это школьный проект. Я должен реализовать на C некоторую репликацию по сети.

У меня есть 2 сервера,

Сервер A1 Сервер A2

Оба сервера имеют свой собственный файл с именем «data.txt».

Если я что-то пишу в один из них, мне нужно обновить другой.

У меня также есть другой сценарий с 3 серверами.

Сервер B1 Сервер B2 Сервер B3

Мне нужно, чтобы они делали почти то же самое.

Хотя это было бы довольно просто реализовать. Если бы один или два сервера вышли из строя, при восстановлении им пришлось бы обновляться.

Я уверен, что есть алгоритмы, которые эффективно решают эту проблему. Я знаю, чего я хочу, я просто не знаю точно, что я ищу!

Может кто-нибудь указать мне правильное направление, пожалуйста?

Спасибо!


person nmdias    schedule 11.10.2012    source источник


Ответы (3)


Фундаментальная проблема здесь известна как «теорема CAP', которая определяет три свойства, которыми обладает распределенная система. могу иметь:

  • Непротиворечивость: чтение данных из системы всегда возвращает самые последние данные.
  • Доступность: каждый ответ либо успешен, либо нет (не просто ждать, пока все не восстановится)
  • Устойчивость к разделам: система может работать, когда ее серверы не могут обмениваться данными друг с другом (отключение сервера — один из особых случаев).

Теорема CAP утверждает, что у вас может быть только два из них. Если ваша система непротиворечива и терпима к разделам, то она теряет условие доступности — возможно, вам придется подождать, пока раздел не восстановится, прежде чем вы получите ответ. Если у вас есть согласованность и доступность, у вас будет время простоя, когда есть раздел или достаточно серверов. Если у вас есть доступность и устойчивость к разделам, вы можете читать устаревшие данные или иметь дело с конфликтующими записями.

Обратите внимание, что это применяется отдельно между чтением и записью — у вас может быть доступная и устойчивая к разделам система для чтения, но непротиворечивая и доступная система для записи. Это в основном система ведущий-ведомый; в разделе запись может завершиться ошибкой (если они находятся не на той стороне раздела), но чтение будет работать (хотя они могут возвращать устаревшие данные).

Поэтому, если вы хотите быть доступным и толерантным к разделам для чтения, один простой вариант — просто назначить один хост единственным, который может выполнять запись, и синхронизировать с него (например, используя rsync из скрипта cron или что-то в вашем C). проект, вы просто периодически копируете файл, используя простой сетевой код, и делаете дополнительную копию сразу после его изменения).

Однако, если вам нужна устойчивость к разделам для записи, это более сложно. У вас может быть два сервера, которые не могут общаться друг с другом, оба выполняют запись, а позже должны выяснить, какие данные выигрывают. В основном это означает, что вам нужно будет сравнить две версии при синхронизации и решить, какая из них победит. Это может быть так же просто, как «пусть победит самая высокая отметка времени», или вы можете использовать векторные часы, как в Dynamo, чтобы реализовать более сложную политику — что здесь подходит, зависит от вашего приложения.

person bdonlan    schedule 11.10.2012
comment
Если вы сохраняете обновления, будьте осторожны с тем, что происходит в сценариях с разделенным мозгом — убедитесь, что ваша система продолжает удовлетворять вашим ограничениям согласованности, даже если у вас есть эти буферы ожидающих обновлений. Распределенные алгоритмы до крайности нетривиальны :) Вы также можете найти это полезное чтение: en. wikipedia.org/wiki/Paxos_(computer_science) - person bdonlan; 03.11.2012

Ознакомьтесь с rsync и узнайте, как Dropbox работает.

person Jacob    schedule 11.10.2012

При каждой записи на сервер A разветвляйте процесс для записи одного и того же содержимого на сервер B. Таким образом, все операции записи на сервер A реплицируются на сервер B. Если у вас несколько серверов, сделайте разветвленный процесс для записи на все резервные серверы.

person sunmoon    schedule 11.10.2012