Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Синхронизация БД между проектами #6

Closed
akokarev opened this issue Aug 21, 2015 · 4 comments
Closed

Синхронизация БД между проектами #6

akokarev opened this issue Aug 21, 2015 · 4 comments

Comments

@akokarev
Copy link
Collaborator

Необходимо реализовать синхронизацию БД между проектами.

  1. Синхронизировать новые точки WiFi (таблица free)
  2. Синхронизировать измененные точки WiFi
  3. Синхронизировать пользователей (таблица users)
@akokarev
Copy link
Collaborator Author

По 1-му пункту все выглядит просто - у нас есть id автоинкремент, используем его:

  1. Запоминаем последний id в синхронизированных базах (last_id)
  2. При следующей синхронизации просим у соседа все точки начиная с last_id+1
  3. По аналогии с upload.php загружаем полученные точки
  4. Запоминаем last_id

Этот способ довольно дешевый по ресурсам (храним только 1 поле, загружаем только новые данные). Но если участников проекта будет больше 2х, то для каждого нужно хранить last_id, 1-я БД должна быть главной, 2-ю и 3-ю не стоит синхронизироваться между собой (иначе в 1-ю базу одни и те же данные попадут дважды). Измененные данные не обновляются. Возможна ситуация, когда 2 пересекающиеся загрузки во 2-й и 3-й базе после синхронизации с 1-й базой будут поразному отображены во всех базах.

@akokarev
Copy link
Collaborator Author

Другой вариант сохранять загруженные файлы CSV и передавать их другим проектам. Масса плюсов - данные добавляются и обновляются одновременно во всех базах. Но мне эта идея не очень нравиться.

@akokarev
Copy link
Collaborator Author

Еще есть идея создать 2-ю таблицу с точками для несинхронизированных данных. Т.е. при загрузке CSV данные грузятся не в таблицу free, а в таблицу free_new. При поиске, отображении карты, подсчете статистики учитывать обе таблицы. При обновлении в главную базу отправлять только данные из таблицы free_new. Чтобы не было путаницы с изменившимися данными, в upload.php при совпадении делать не UPDATE в таблице free, а INSERT в таблицу free_upd (еще одна таблица для синхронизации).

Процесс синхронизации:
У базы-клиента есть накопленные изменения в таблицах free_new и free_upd. А может и нет данных для синхронизации. Тоже самое можно сказать и про базу-сервер.

  1. Клиент отправляет данные из free_new серверу и очищает таблицу.
  2. Сервер добавляет эти данные в базу:
    2.1 если точка уже есть в базе, то сравнивает дату добавления
  • если уже имеющиеся на сервере данные новее, то добавляет их в свою free_upd
  • если данные клиента новее - сервер обновляет таблицу free и добавляет их в free_upd
    2.2 если точки нет в базе - добавляет в таблицу free и free_new
  • Клиент отправляет данные из free_upd и очищает её.
  • Сервер повторяет действия пункта 2, 2.1, 2.2 (пункт 2.2 возможно лишний)

Теперь на сервере находятся актуальные данные и обновления нужно довести до всех клиентов. Но сначала объединим таблицы free_new и free_upd
0. Сервер добавляет данные из free_upd в free_new, новые строки добавляет, совпадающие безусловно обновляет (без проверки по времени), флаги доставки сбрасываются. Таблица free_upd очищается.

  1. Сервер соединяется поочередно с каждым клиентом и отправляет таблицу free_new (только не доставленные данные). В случае успешной отправки для каждой строки ставит флаг успешной отправки данному клиенту. Для каждого клиента свой флаг.
  2. Клиент добавляет данные в базу:
    2.1 если точка уже есть в базе, то сравнивает дату добавления
  • если уже имеющиеся у клиента данные новее, то игнорирует их
  • если данные сервера новее - клиент обновляет таблицу free и проверяет их наличие в free_upd:
    2.1.1 если данные есть в таблице free_upd, то удаляет их из free_upd (иначе мы их бесконечно будем синхронизировать)
    2.2 если точки нет в базе - добавляет в таблицу free
  • Сервер удаляет из таблицы free_new строки, где выставлены все влаги доставки.

Думаю этот способ предпочтительнее. Можно подумать о синхронизации каждого с каждым.
В том виде, как описано выше, таблицы free_new сервера и клиента отличаются - у сервера есть флаги доставки для каждого клиента. Флаги можно объединить в одно поле, таблицы у клиента и сервера сделать одинаковыми, просто клиент не будет использовать флаги, а в случае необходимости будет легко переведен в режим сервера. совпадения проверять по ключу (в данный момент это bssid:essid:password:pin)

@akokarev
Copy link
Collaborator Author

Было интересно, пока были желающие поднять клоны проекта. По всей видимости смысла в этой фиче нет.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants