Я работаю над веб-приложением, которое находится где-то между почтовой службой и социальной сетью. Я чувствую, что в будущем он может стать очень большим, поэтому я обеспокоен масштабируемостью.
Вместо того, чтобы использовать одну централизованную базу данных MySQL / InnoDB, а затем разделить ее, когда наступит это время, я решил создать отдельную базу данных SQLite для каждого активного пользователя: один активный пользователь на «осколок».
Таким образом, резервное копирование базы данных будет таким же простым, как копирование небольшого файла базы данных каждого пользователя в удаленное местоположение один раз в день.
Расширение будет так же просто, как добавление дополнительных жестких дисков для хранения новых файлов.
Когда приложение выходит за пределы одного сервера, я могу связать серверы вместе на уровне файловой системы, используя GlusterFS, и запустить приложение без изменений или настроить простую систему прокси SQLite, которая позволит каждому серверу манипулировать файлами sqlite на соседних серверах.
Проблемы с параллелизмом будут минимальными, поскольку каждый HTTP-запрос будет затрагивать только один или два файла базы данных за один раз, а в любом случае SQLite только блокирует чтение.
Готов поспорить, что этот подход позволит моему приложению изящно масштабироваться и поддерживать множество интересных и уникальных функций. Я ставлю неправильно? Я что-то упустил?
ОБНОВЛЕНИЕ Я решил использовать менее экстремальное решение, которое пока работает нормально. Я использую фиксированное количество шардов - 256 баз данных, если быть точным. Каждый пользователь назначается и связывается со случайным осколком с помощью простой хэш-функции.
Большинству функций моего приложения требуется доступ только к одному или двум шардам на запрос, но есть один, который требует выполнения простого запроса от 10 до 100 различных шардов из 256, в зависимости от пользователя. Тесты показывают, что для кэширования всех данных в ОЗУ потребуется около 0,02 секунды или меньше. Я думаю, что могу жить с этим!
ОБНОВЛЕНИЕ 2.0 Я портировал приложение на MySQL / InnoDB и смог добиться примерно одинаковой производительности для обычных запросов, но для этого одного запроса, требующего обхода осколка, innodb работает в 4-5 раз быстрее. По этой и другой причине я отказываюсь от этой архитектуры, но я надеюсь, что кто-то где-то найдет для нее применение ... спасибо.