Я пытаюсь использовать Paxos для поддержания консенсуса между узлами в файле размером около 50 МБ, который постоянно изменяется на отдельных узлах. Я сталкиваюсь с проблемами практичности. Требования:
- Синхронизируйте файл размером 50 МБ на сотнях узлов
- Внести изменения в этот файл, которые могут быть внесены с любого узла и которые вряд ли будут напрямую конкурировать друг с другом, распространятся по сети в течение нескольких секунд максимум.
- Новые узлы, которые присоединяются к сети, могут в течение нескольких минут (‹1 час) создать весь файл, следуя сообщениям Paxos.
Проблема, с которой я столкнулся, заключается в том, что, похоже, нет способа достичь обеих целей 2 и 3.
Вот варианты, которые я рассмотрел до сих пор:
- Синхронизировать весь файл каждый раунд - совершенно непрактично, раунды Paxos занимали бы минуты
- Синхронизировать только изменения в файле - целесообразно для целей 1 и 2, но нарушает цель 3, поскольку новые узлы смогут синхронизировать только весь файл после изменения каждой единицы состояния.
- Синхронизировать изменения и случайный фрагмент файла каждый раунд - я не уверен, позволяет ли это Paxos. Узлы смогут проверять изменения относительно своих собственных (с учетом новых изменений) и смогут проверять случайную часть файла относительно указанной части своей версии, но практично ли это?
Я думаю, что третий вариант лучше, но я не уверен, позволяет ли это Paxos. Идея состоит в том, чтобы ограничить объем данных, которыми обмениваются каждый раунд, возможно, до 1500 байтов и заполнить эти 1500 байтов в первую очередь изменениями в файле. В большинстве раундов файл будет неизменным, а раунды, в которых что-то изменилось, скорее всего, будут меньше, чем 100 байтов измененного состояния, поэтому другие 1400 байтов могут быть заполнены некоторой частью файла, что позволит создавать новые узлы. вверх весь файл с течением времени. Это практично? Эта проблема уже решена?