Я работаю над веб-приложением, которое находится где-то между почтовой службой и социальной сетью. Я чувствую, что у него есть потенциал для роста в будущем, поэтому я обеспокоен масштабируемостью.Extreme Sharding: одна база данных SQLite для пользователя
Вместо того, чтобы использовать одну централизованную базу данных MySQL/InnoDB и затем разбивать ее на время, я решил создать отдельную базу данных SQLite для каждого активного пользователя: один активный пользователь на «осколок».
Таким образом, резервная копия базы данных будет такой же простой, как копирование каждого пользователя файла базы данных в удаленное место один раз в день.
Масштабирование будет таким же простым, как добавление дополнительных жестких дисков для хранения новых файлов.
Когда приложение растет за пределами одного сервера, я могу связать серверы на уровне файловой системы с помощью GlusterFS и запустить приложение без изменений или создать простую прокси-систему SQLite, которая позволит каждому серверу манипулировать SQL-файлами на соседних серверах ,
Проблемы с параллелизмом будут минимальными, потому что каждый HTTP-запрос будет касаться только одного или двух файлов базы данных за раз, из тысяч, а SQLite только блокирует при чтении в любом случае.
Я уверен, что этот подход позволит моему приложению масштабироваться грациозно и поддерживать много крутых и уникальных функций. Я пари неправильно? Я что-то пропустил?
ОБНОВЛЕНИЕ Я решил пойти с менее экстремальным решением, которое работает до сих пор. Я использую фиксированное количество осколков - 256 баз данных sqlite, если быть точным. Каждый пользователь назначается и привязывается к случайному осколку простой хэш-функцией.
Большинство функций моего приложения требуют доступа только к одному или двум осколкам для каждого запроса, но есть, в частности, тот, который требует выполнения простого запроса на 10-100 различных черепах из 256, в зависимости от пользователя. Тесты показывают, что это займет около 0,02 секунды или меньше, если все данные будут кэшироваться в ОЗУ. Думаю, я смогу жить с этим!
UPDATE 2,0 Я портировал приложение к MySQL/InnoDB и был в состоянии получить примерно такую же производительность для обычных запросов, но для этого один запроса, который требует осколка ходьбы, InnoDB в 4-5 раза быстрее. По этой причине и по другой причине я отказываюсь от этой архитектуры, но я надеюсь, что кто-то найдет для нее пользу ... спасибо.
Это довольно старый пост, и ваш опыт с Gluster, вероятно, сейчас не слишком уместен, но вы в конечном итоге пытаетесь выполнить sqlite над glusterFS? – jberryman 2011-09-09 21:37:42
Для людей, рассматривающих исследования по такой архитектуре, я рекомендую посмотреть на openord actordb; каждый актер представляет собой силос sqlite, а силосы распределяются и реплицируются с использованием протокола raft - http://www.actordb.com/ – 2016-07-20 13:39:43