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