Каковы хорошие алгоритмы для обеспечения согласованности между несколькими файлами в сети?
Каковы хорошие алгоритмы для сохранения согласованности в нескольких файлах?
Это школьный проект. Я должен реализовать в C, некоторую репликацию по сети.
У меня 2 сервера,
Сервер A1 Сервер A2
Оба сервера имеют свой собственный файл под названием "data.txt "
Если я пишу что-то одному из них, мне нужно, чтобы другой был обновлен.
У меня также есть другой сценарий, с 3 серверами.
Сервер B1 Сервер B2 Сервер B3
Мне нужно, чтобы они делали почти то же самое.
В то время как это было бы довольно просто реализовать. Если один или два сервера должны были быть выключены, то при возвращении они должны были бы обновить себя.
Я уверен, что существуют алгоритмы, которые эффективно решают эту проблему. Я знаю, чего хочу, я просто не знаю точно, что я ищу!
Может кто-нибудь указать мне правильное направление, пожалуйста?
Спасибо!
3 ответа:
Фундаментальная проблема здесь известна как " теорема CAP ", которая определяет три свойства, которыми может обладать распределенная система:
Теорема CAP утверждает, что у вас может быть только два из них. Если ваша система непротиворечива и терпима к разделам, то она теряет условие доступности - возможно, вам придется подождать, пока раздел восстановится, прежде чем вы получите ответ. Если у вас есть согласованность и доступность, вы будете иметь простои, когда есть раздел, или достаточное количество серверов не работает. Если у вас есть доступность и допуск секционирования, вы можете прочитать устаревшие данные или иметь дело с конфликтующими данными. пишет.
- согласованность: чтение данных из системы всегда возвращает самые последние данные.
- доступность: каждый ответ либо успешен, либо терпит неудачу (не просто ждать, пока все восстановится)
- допуск к разделению: система может работать, когда ее серверы не могут взаимодействовать друг с другом (сервер, находящийся в нерабочем состоянии, является одним частный случай этого)
Обратите внимание, что это применяется отдельно между чтением и записью - вы можете иметь доступную и толерантную к разделам систему для чтения, но согласованную и доступную систему для записи. Это в основном система master-slave; в разделе Запись может завершиться неудачей (если они находятся на неправильной стороне раздела), но чтение будет работать (хотя они могут возвращать устаревшие данные).
Поэтому, если вы хотите быть доступными и терпимыми к разделам для чтения, один простой вариант-просто назначить один host как единственный, который может делать записи и синхронизацию с него (например, используя rsync из скрипта cron или что - то еще-в вашем проекте C, вы просто периодически копируете файл, используя какой-то простой сетевой код, и делаете дополнительную копию сразу после его изменения).
Однако, если вам нужен допуск секционирования для записи, это более сложно. Вы можете иметь два сервера, которые не могут разговаривать друг с другом, оба делают записи, а позже должны выяснить, какие данные выигрывают. Это в основном означает, что вам нужно будет сравнить две версии при синхронизации и решить, что выигрывает. Это может быть так же просто ,как "пусть победит самая высокая временная метка", или вы можете использовать векторные часы, как в Dynamo для реализации более сложной политики - что здесь уместно, зависит от вашего приложения.