По сути, ваш вопрос: что из вышеперечисленного лучше для мультитенантного SaaS-приложения?
Тысячи маленьких баз данных sqlite могут апеллировать, но не масштабироваться.
Я поочередно рассмотрю ваши вопросы:
- Резервное копирование - это просто: установить версию, zip, загрузить.
Что произойдет, если во время резервного копирования произойдет обновление? Сколько времени занимает резервное копирование (скажем, тысяча аккаунтов по миллиону постов в каждом)? Ваша резервная копия блокирует базу данных на время резервного копирования, или она резервирует согласованное представление данных, или нет? Правильно ли восстанавливается резервная копия базы данных во время обновлений в каждом случае? Вы проверяли эти вещи?
Я думаю, что резервное копирование базы данных sqlite не так просто, как вам кажется, из-за проблемы одновременного доступа.
- SQLITE быстро светит, нет дорогого времени соединения ...
Ваше предположение, что время соединения MySQL будет "дорогим", может быть ложным. У вас есть точные данные? Подключение к серверу через локальную сеть на практике не занимает много времени.
- Настольная схема намного проще: нет необходимости каждый раз проводить различие между счетами
Задумывались ли вы о том, как вы будете выполнять миграцию, если вам когда-нибудь понадобится изменить схему в этих 1000 небольших базах данных? Как это повлияет на сервис?
Теперь я добавлю свои собственные:
- Масштабируемость: если вы полагаетесь на локальную файловую систему с семантикой блокировки (как я полагаю, sqlite делает), вы не можете просто добавить больше веб-серверов, поскольку они будут иметь свои собственные файловые системы.
Поскольку sqlite не является сетевой системой, вы не можете просто добавить больше веб-серверов. Вам нужно будет либо разделить пользователей на несколько серверов и убедиться, что они когда-либо попадут только на свой «домашний» сервер (что может вызвать некоторые проблемы, но могут оказаться жизнеспособными), либо найти какой-то способ разделения базы данных sqlite между серверами. , который не будет красивым, и может стереть любые ощутимые преимущества в производительности, которые он когда-либо имел над (например) MySQL.
- Maintainabiliy - Если ваша команда разработчиков когда-либо внесет изменения в схему базы данных (что не просто возможно, но очень вероятно), ее нужно будет применить к этим 1000 крошечным базам данных. Успешно. С планом отката.
Я думаю, что масштабирование системы с тысячей крошечных баз данных sqlite не будет масштабироваться. В частности, вы, вероятно, в конечном итоге обнаружите, что вместо 1000 крошечных у вас получится 995 крошечных и 5 довольно больших.
Использование выделенного сервера MySQL позволит вам выполнять централизованное резервное копирование и миграцию. Это позволит вам использовать ресурсы этого блока (например, ОЗУ) для кэширования наиболее часто используемых частей базы данных, независимо от того, в какой учетной записи они находятся.
ОЗУ, используемое для кэширования большой базы данных MySQL (например, буферного пула Innodb), может повторно использоваться между запросами и совместно использоваться всеми данными (например, таблицами, строками, столбцами) в ней. База данных sqlite считывает данные с диска каждый раз, когда это необходимо, за исключением одного сеанса.
Мои предложения:
- Рассмотрите вышеупомянутые пункты, игнорируйте их, если вам нравится
- ИЗМЕРЯЙТЕ производительность вашего приложения с высокой имитацией нагрузки на производственное оборудование. Убедитесь, что вы используете производственное оборудование для своего сервера базы данных (например, контроллер рейда с батарейным питанием)
- Сравните, если можете, с реализацией sqlite.