Как дать возможность оператору отправить заказ на нужную пиццерию?
Как формировать консолидированные отчёты по двум точкам?
Как синхронизировать меню, цены, акции, дисконты, купоны - всё, что может измениться в любой момент?
Вариант master/slave в MySQL сразу не рассматривал, потому что схема должна быть такой, чтобы пережить атомную бомбардировку: уцелевшие пиццерии должны продолжить автономную работу несмотря на оборванные провода и исчезнувшие соединения.
Это можно сделать через REST: куча писанины и куча новых ошибок.
Либо обращаться к базе удалённо.
Пару дней обдумывал это. Второй вариант позволял максимально использовать уже написанный код. Но не хотелось создавать новых сетевых дырдочек, в которых так увлекательно колупаться фомкой.
Немножко почитал интернеты и понял, что понадобится:
autossh - надстройка над ssh, поддерживающая соединение в рабочем состоянии, пока это возможно;
И всё.
К слову, Гугл по поиску autossh в третьей позиции даёт ветку под названием "Чтоб вы знали: autossh - полное дерьмо". Я её внимательно изучил. Она меня не убедила.
Ещё нужен скрипт для управления autossh как службой, он находится здесь и отлично встраивается в Debian.
Смотав это всё синей изолентой, получаем на сервере А новый порт MySQL, открытый в тьму внешн базу данных сервера Б, без создания новых дырок, через зашифрованное, автоматически устанавливающееся и магически восстанавливающееся соединение.
Дальше - с отвёрткой в зубах - в PHP-класс работы с SQL. Здесь делаем выбор параметров соединения из массива предопределённых вариантов. Важно: если сервером указывать localhost, запрос такого-то порта будет проигнорирован. Поэтому указываем 127.0.0.1. Вроде хрен и редька, а вот хрен.
Настало время первой проверки. Пишем коротенький скрипт, который запрашивает максимальные идентификаторы из таблиц заказов серверов, разнесённых на некоторое количество километров:
Холишыт, это действительно работает!
Дальше так: в интерфейс операторов, принимающих заказы с доставкой, добавляем выбор пиццерии:
Чуть позже по умолчанию будет та, чей этот клиент географически.
И теперь, если запрошена недефолтная пиццерия, просто пересоздаём класс базы данных с указанием другого соединения, и наш старый код пишет заказ в таблицы нужной пиццерии.
Дальше надо поэкспериментировать и понять, как лучше строить консолидированные отчёты: federated table?
Ну и автоматические обновление настроечных данных: надо переписать методы класса работы с БД, чтобы запросы можно было автоматически проигрывать на выбранном или всех доступных соединениях.