Архитектура
Архитектура
Дэвид Хьюз преследовал три цели, создавая mSQL:
- mSQL должна быть быстрой.
- mSQL должна быть компактной.
- mSQL должна обеспечивать множественность одновременных подключений.
Высокая скорость была главной целью mSQL. Поскольку в большинстве коммерческих SQL-серверов разработчики стараются реализовать полную спецификацию SQL2, а кроме того, и собственные расширения языка, им приходится расплачиваться производительностью и размерами. MSQL, напротив, жертвует некоторыми наиболее изощренными возможностями коммерческих серверов в пользу скорости. Для проекта Minerva требовалась возможность быстрого выполнения большого числа простых SQL-запросов. Именно это позволяет делать mSQL.
Скорость и размеры идут рука об руку. Как обнаружил Хьюз, если начать с самого основания и реализовать лишь самые необходимые функции, можно разработать SQL-сервер, который будет требовать столь мало ресурсов, что для его успешного использования не потребуется отдельной машины. В результате, mSQL обладает значительной частью функциональности основных РСУБД, требуя значительно меньших ресурсов.
Скорости и размера, достигнутых в mSQL, было бы достаточно для того, чтобы успешно заменить Postgres в проекте Minerva. Хьюз, однако, хотел изменить и ту модель поведения, которая, собственно, заставила его искать альтернативу. Хьюз спроектировал mSQL так, чтобы та могла обрабатывать множественные одновременные подключения в рамках одного процесса. В результате получается маленький, быстрый, эффективный SQL-сервер, способный одновременно обрабатывать несколько запросов - локально или по сети.
Для реализации своих проектных целей Хьюзу пришлось ограничить функциональность сервера. Диалект SQL, поддерживаемый mSQL, является подмножеством стандарта ANSI SQL2, содержащим наиболее употребительные команды, такие как CREATE, INSERT, SELECT, UPDATE и DELETE. Хьюз отказался от ресурсоемких операций, вроде поддержки транзакций. В том типе приложений, которые используют mSQL, функциональность, опущенная Хьюзом, обычно не требуется.
mSQL является однопоточным сервером с очередью. Одновременно к серверу может подключиться любое число клиентов - до определенного предела. При отправке клиентом запроса к серверу mSQL ставит запрос в синхронную очередь и обрабатывает все запросы последовательно по одному. Эффективность такого решения зависит, таким образом, от способности сервера быстро обработать каждый запрос. Если запросы вовремя не обрабатывать, очередь будет расти, что в итоге приведет к краху сервера из-за превышения системных ограничений. Поэтому скорость является решающим фактором для успешной работы mSQL. На Рисунок 5-1 показана работа очереди mSQL и однопоточная работа.
Однопоточная сущность mSQL устраняет необходимость в пакетной обработке. Поскольку запросы выполняются поочередно, они не способны помешать один другому. Конечно, было бы неплохо, если бы mSQL поддерживала транзакции, но в них нет необходимости для нормальной работы ядра базы данных при тех целях, которые ставились перед mSQL.
mSQL поддерживает два типа соединений со стороны клиента. Удаленные клиенты подключаются к серверу через известный порт TCP/IP. Используя TCP/IP, база данных mSQL может предоставлять доступ любому компьютеру в мире через Интернет. Локальные соединения тоже могут производиться через TCP/IP, но лучшей производительности можно добиться, используя стандартный сокет Unix, что эффективнее примерно на 20%.