Многие бизнес-приложения, которые мы предоставляем нашим клиентам, носят маркетинговый/рекламный характер (лотереи, регистрация на мероприятия и т. д.). Большинство приложений, хотя и очень простые, очень требовательны к базе данных. Представьте себе сайт типа «регистрация» в качестве поддержки для рекламы, которая транслируется, например, во время Суперкубка (да, у нас было несколько).
Хотя мы очень хорошо оптимизировали код нашего веб-приложения, база данных всегда остается проблемой, несмотря на то, что приложение относительно простое. Поток обычно выглядит примерно так:
- Чтение из базы данных для обнаружения существующей записи
- Запись в базу данных, если запись новая
Во многих случаях это все, что нужно нашему приложению для доступа к данным. Однако, учитывая, что это единственная цель приложения, очень важно, чтобы этот простой процесс был значительно оптимизирован.
Для целей этого вопроса у нас есть один сервер с дисковым массивом рейда 5 для файлов данных и другой массив рейда 5 для журналов. В настоящее время используется стандартная 32-разрядная ОС Windows 2003, а сервер имеет 4 ГБ памяти. Некоторые приложения используют стандарт SQL 2005, а другие используют MySQL 5.1. Я прекрасно осознаю, что здесь возможна определенная оптимизация ОС и аппаратного обеспечения, но в первую очередь я хочу удовлетворить свои потребности с точки зрения программного обеспечения. Обширное профилирование показало нам, что дисковый ввод-вывод, как правило, является основным узким местом.
Сказав все это и зная, что кэширование не сильно поможет, так как большинство чтений уникальны и возвращают очень мало данных (часто только бит, указывающий, существует ли запись или нет), я подумываю о том, чтобы сделать прыжок в область in -базы данных в памяти как своего рода уровень кэширования записи в реальную базу данных. Это кажется подходящим вариантом, учитывая, что большая часть нашего большого объема трафика носит спорадический характер и не поддерживается в течение нескольких часов. Кроме того, потенциальная потеря нескольких минут данных из-за сбоя сервера в большинстве случаев допустима.
В простейшей форме я бы модифицировал типичное приложение регистрации, чтобы оно делало следующее:
- Запрос к БД диска и БД памяти для существующих записей
- Если нет, записать данные в БД памяти и вернуться
- Периодически сбрасывать БД памяти на БД диска
У меня вопрос: каковы мои варианты для этой промежуточной базы данных в памяти? Я экспериментировал с хэш-таблицами в памяти, таблицами данных и т. д., но я ищу другие варианты или даже предложения для совершенно другого подхода.