Рекомендации по архитектуре кэширования для конкретного сценария

НАСТРОЙКА:

У нас есть файл. Net, которое распределено по 6 локальным серверам, каждый с локальной базой данных (ORACLE), 1 основным сервером и 1 машиной для балансировки нагрузки. Запросы поступают на балансировщик нагрузки, который перенаправляет входящие запросы на один из 6 локальных серверов. В определенные промежутки времени данные собираются на главном сервере и перераспределяются на 6 локальных серверов, чтобы иметь возможность принимать решения на основе полных данных.

Каждый локальный сервер имеет компонент кеширования, который кэширует входящие запросы на основе различных параметров (местоположение, входящие параметры и т. Д.). С каждым запросом локальный сервер решает, перейти к базе данных (ORACLE) или получить ответ из кеша. Однако в обоих случаях локальный сервер должен перейти к базе данных, чтобы выполнить 1 вставку и 1 обновление на запрос.

ПРОБЛЕМА:

В пиковый день каждый локальный сервер получает 2000 запросов в секунду, и система начинает замедляться (ЦП: 90%). Я пытаюсь увеличить емкость перед добавлением еще одного локального сервера. После выполнения некоторых тестов узкое место, как всегда, кажется неизбежным: 1 вставка и 1 обновление на запрос к базе данных.

ИСПЫТАННЫЕ МЕТОДЫ

Чтобы уменьшить частоту, я создал службу Windows, которая находится между БД и приложением .NET. Он содержит конвейерный сервер и получает каждую вставку и обновление от основного приложения .NET и сохраняет их в Hashtable. Затем новая служба через определенные промежутки времени отправляется в базу данных один раз для выполнения пакетных вставок и обновлений. Дело было в том, чтобы реже заходить в базу данных. Хотя это имело положительный эффект, это не повлияло на загрузку системы так, как я ожидал. Большая часть нагрузки на ЦП приходится на oracle.exe по мере увеличения количества запросов в секунду.

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

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

Заранее благодарю, надеюсь, я разъяснил свой вопрос.

6
задан omerkirk 12 April 2011 в 08:38
поделиться