Как синхронизировать / сделать репликацию файловой бд?
Приветствую!
Есть небольшая база (SQLite), доступ идет через Entity Framework, C#.
Структура довольно простая, плюс есть поле по которому можно найти время изменения каждой записи.
На данный момент клиенты не пишут в базу и синхронизация идет копированием по скрипту. У кого больше база, тот и папа. Иногда все это чистится и тд.
В свое время база была выбрана тк
1. клиенты по большей части имеют очень плохой интернет или не имеют его вообще. Скачать полную версию базы могут редко, последние изменения им тоже не особо нужны.
2. Не пишут в базу.
3. Делают выборку на 30Мб (интенсивное чтение).
Хотелось бы решить часть проблем.
1. Сделать репликацию на клиенты методами самой базы.
2. Дать клиентам писать немного.
Гугл предлагает:
1. Больших братьев, ставить полный сервер на клиент... плюс это немного не то.
2. Сторонние программы для синхронизации (не встраиваемые)
3. NoSql. Не совсем то.
Переписать все можно в довольно больших рамках: сменить EF, сменить базу.
Это не может быть такой уж уникальной проблеммой. Хотелось бы услышать в общих чертах как такое принято делать :)
Можно конечно и ручками, добавить еще одно соединение и делать обновление ручками.
Если у вас клиенты: а) не пишут в базу; б) имеют плохой интернет; в) редко требуют у себя полной копии базы - может проще тогда веб-сервис сделать и выдавать данные по запросу? 30 Мб это конечно довольно много, но может проще ответ web-сервера закэшировать, чем базу синхронизировать? Синхронизация обычно нужна либо для master-master сценариев, либо когда один сервер не справляется с запросами на выборку, и данные копируются на другие сервера (для выполнения read-only запросов).
Кстати, можно и постраничную выдачу добавить, например по 1000 записейза запрос.
Покурив маны я понял что это называется "распределенная база данных" :).
Для энтерпрайза - Oracle, 1C умеет, есть Apache Cassandra. File Replication Service (FRS).
Но опять же надо отдельный сервер.
Для маленьких (embedded) проектов все сложнее.
OneDrive, Dropbox - нарываться на проблемы, плюс OneDrive не умеет делать дельта копи, копирует весь файл. Апи... бэкаплю туда. На вид быстрее копировать в папку и дать им самим делать дело. Тогда уж какой-то BittorentSync.
Мне вот понравился RavenDB, есть Embedded mode, при необходимости поднимает локальный сервер с гуи через броузер. Репликация настраивается в конфиге, дальше он сам. НО, моя программа не опен сорс, дев версия идет с одним пользователем. Влетаем на лицензию (хотя можно попробовать без).
Сейчас смотрю на Riak, его пишут суровые бородатые дядьки на Erlang :) Там это в основе системы. Выглядит обещающе. docs.basho.com/riak/latest
А так, видимо, идея так себе. Проще всего поднять самую дешевую базу на любом хостинге и тихо отправлять туда копию, а на клиенте вытаскивать маленькими частями постоянно в локальную базу.
Альтернатива на SQLite? Ну видимо делить базу на маленькие базы по 10Мб (чтобы все не таскать по сети), делать в одной из них индекс для синхронизации и недо-рейд по остальным. Одну обновляем и копируем обновление в другие. Велосипед тот еще, правда все уже написано в других проектах, его надо только собрать :)
Короч все так себе. Файловых датабаз вообще не очень много )