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