Поддерживают ли какие-либо базы данных автоматическое / синхронизированное закрытие баз данных? - PullRequest
0 голосов
/ 31 января 2010

Мы хотели бы реализовать архитектуру приложения, в которой у нас есть большое количество баз данных на диске, один файл базы данных для каждого клиента.

Когда пользовательский запрос поступает, база данных открывается (если это еще не сделано).

После определенного периода времени бездействия база данных автоматически закрывается сервером, освобождая тем самым ресурсы сервера базы данных.

Благодаря этой архитектуре мы можем иметь на диске большое количество баз данных, но в любой момент их можно загрузить только на подмножество.

Проблема в том, что лишь немногие базы данных поддерживают концепцию автоматического закрытия базы данных. Похоже, что MIcrosoft SQL server позволяет это, но мы используем все технологии с открытым исходным кодом, поэтому SQL-сервер не подходит.

Мы рассмотрим любую бесплатную или открытую технологию баз данных вообще, но я не вижу ни одной, которая поддерживает функцию автоматического закрытия.

Кто-нибудь знает что-то другое?

ОБНОВЛЕНИЕ: поиск решения на основе Linux, а не Windows.

Спасибо

Ответы [ 5 ]

1 голос
/ 31 января 2010

Вы убедились, что это действительно проблема?Я только упоминаю, что, поскольку стоимость открытой базы данных, вероятно, довольно мала, в частности, «открытие», скорее всего, состоит в синхронизации любых ожидающих транзакций, ожидающих базу данных, и выполнении базовой проверки непротиворечивости (особенно при загрузке нескольких страниц сохраненных данных).на диске).

Как только это будет сделано, без каких-либо действий на сервере не будет большого количества данных для обслуживания.

Если подумать, самая базовая функциональностьсистемы БД заключается в управлении кэшированием страниц базы данных с помощью памяти.Когда делается запрос на часть данных, система находит фактическую страницу на ней и проверяет ОЗУ, чтобы определить, загружена ли она.Если нет, он загружает его с диска.

Если вы также заметили, большая часть метаданных БД хранится в базе данных.Это означает, что когда система хочет что-то узнать, она эффективно использует себя для поиска информации, в частности подсистемы кэширования страниц данных.

Как и любой другой кэш, поскольку данные устарели и больше не нужны, они сбрасываютсяпри необходимости верните обратно на диск и обновите.

Таким образом, это означает, что после того, как база данных будет «открыта», любая информация, действительно необходимая для поддержания ее состояния, вероятно, будет поддерживаться через подсистему кэширования данных, а для неиспользуемойбаза данных, выпущенная обратно на диск, чтобы освободить место для текущего трафика.

Вот почему мне любопытно, если вы проверили свои кандидатские БД, чтобы увидеть, сталкивались ли вы с проблемами по этому поводу, или если база данных дажеимеет понятие «открытие базы данных».

Когда мы обсуждаем это как клиент, основное внимание уделяется соединениям с сервером базы данных.Но как только все они будут закрыты, я не думаю, что система собирается сохранить какой-либо значительный объем данных в памяти о конкретной неактивной базе данных.

В конце концов, все (ВСЕ) данныев базе данных хранится «то же самое», таблица представляет собой таблицу, является таблицей, индекс представляет собой индекс, является индексом, особенно на центральном сервере, где все страницы данных управляются как один большой «суп» данных.

Единственная проблема, с которой вы можете столкнуться - это то, что ваша база данных создает файл специально для каждой базы данных, и этот файл остается открытым.В конце концов вы можете исчерпать файловые дескрипторы.

Но большинство современных систем этого не делают, они хранят все в большом массиве файлов независимо от того, в какой базе данных или схеме они находятся (за исключением конкретной таблицы).выделение пространства, которое вы делаете или сервер позволяет, конечно).

Так что, по сути, я не думаю, что это проблема, так как я не думаю, что современные базы данных действительно делают такие различия, которыеВы говорите о себе.Несколько баз данных или схем являются логическим артефактом в системе, а не технической реализацией, и что все страницы данных оказываются в одном и том же кэше и используют одни и те же ресурсы независимо от того, из какой схемы, базы данных, таблицы или индекса они получены..

Я бы проверил выбранную вами базу данных, чтобы убедиться, что это проблема.Например, вы можете создать базы данных 1M, максимально уменьшить объем памяти для базы данных, а затем просто начать циклически проходить через них, открывая столько раз, сколько считаете нужным (10, 100, 1000 и т. Д.), И посмотреть,у вас есть какие-либо проблемы.

Наконец, я не "знаю" ничего из этого для какой-либо конкретной базы данных, это просто инстинкт инстинкта того, как исторически реализованы базы данных.

0 голосов
/ 05 мая 2010

Я предполагаю, что под "закрытием баз данных" вы подразумеваете, что они освободят свою кеш-память? Поскольку на самом деле нет смысла «закрывать» реальные файлы на диске, использование их ресурсов незначительно.

Некоторые движки баз данных используют дисковый кеш операционной системы. MySQL-механизм хранения MySQL является примером, но не предлагает гарантий целостности, что исключает многие его применения. Однако другие движки MySQL, такие как InnoDB, не предлагают этого.

PostgreSQL изначально использует кэш операционной системы в качестве кэша второго уровня; в то время как кэш первого уровня (shared_buffers) по-прежнему потребляет память все время, обычно он устанавливается на 10-25% вашей памяти даже на серверах, критичных к производительности. Остальное бесплатно для кэширования на уровне ОС и будет при необходимости выделяться для базы данных, а также доступно для других приложений, когда это необходимо.

0 голосов
/ 31 января 2010

Я понимаю, что у вас может быть достаточно клиентов для процесса, чтобы получить нехватку файловых дескрипторов. Как насчет пула соединений с БД?

Когда поступает запрос пользователя, проверьте, открыта ли БД этого пользователя. Если это так, используйте соединение и сбросьте флаг времени последнего доступа

Если БД этого пользователя не открыта, откройте соединение, установите время последнего доступа и используйте соединение (если нет доступного соединения, выведите ошибку). Кроме того, раскройте процесс / поток / облегченный процесс / как вы его называете в своей среде, которая проверяет:

Если в пуле имеется достаточное количество неиспользуемых соединений, поток завершается

Если нет, отсканируйте последние 5% -25% последних обращений или те, которые не использовались в последнюю минуту / час / день (все, что подходит для вашего шаблона пользовательских запросов), и закройте их, перейдя в неиспользованный пул

Убедитесь, что вы храните достаточно доступных подключений в неиспользованном пуле для обработки входящих запросов.

0 голосов
/ 31 января 2010

mySql с заданием cron.

Кроме того, mySql занимает очень мало места (по сравнению с Sql Server) ... Одним из примеров является то, что он не перегружает память (и да, я знаю, что можно ограничить использование памяти Sql Server).

mySql также имеет пул соединений, который очень эффективен и полезен.

0 голосов
/ 31 января 2010

У меня есть эта идея и предполагается, что вы используете Windows:

  1. Ваша база данных будет работать как служба, и у каждого клиента будет свое уникальное имя службы.
  2. Вы пишете командный файл, который запускает / останавливает эту службу.
  3. пакетный файл будет вызываться с вашего сервера в любое время.
...