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


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

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

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

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

Оба сервера имеют свой собственный файл под названием "data.txt "

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

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

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

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

В то время как это было бы довольно просто реализовать. Если один или два сервера должны были быть выключены, то при возвращении они должны были бы обновить себя.

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

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

Спасибо!

3 2

3 ответа:

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

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

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

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

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

Проверьте rsync и как работает Dropbox.

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