Вопрос архитектуры для производительности и масштабируемости - PullRequest
2 голосов
/ 09 января 2011

У меня высокопроизводительная система (ну, я думаю, но пока нет на 100%), полностью написанная на C #, и я думаю, что я допустил некоторые большие архитектурные ошибки при проектировании. Причина в том, что его нелегко масштабировать.

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

Эта система имеет большое количество одновременных соединений данных, поступающих в систему, которые в конечном итоге попадут в базу данных после обработки. В настоящее время мы получаем около 300 записей / соединений в минуту.

Система спроектирована следующим образом.

  1. Вся система размещена на сервере win 2003 с 8 ГБ ОЗУ / 4 vCPU в Амазонке
  2. C # Сокет-сервер, который получает данные и помещает их в MSMQ
  3. Процессор для данных и вставки в таблицу базы данных sql server 2008. Одна из основных таблиц содержит около 3 ГБ данных даже после очистки периодических данных. Это имеет правильные индексы, и в настоящее время отчеты достаточно быстры даже для удаленного местоположения.
  4. Эти обработанные данные затем отправляются в MQ, который затем обрабатывается для правил, которые будут генерировать определенные оповещения
  5. Есть несколько других связанных программ, кроме перечисленных выше

Теперь основное беспокойство вызывает масштабируемость процессора на шаге (3) и масштабируемость Sql server 2008. Поскольку размер одновременных соединений увеличивается вместе с данными sql-сервера, это усложняет мою жизнь.

Я предложил 2 варианта. Одним из них является серьезная замена серверных процессоров, учитывая тот факт, что нынешняя система полностью построена на технологиях Microsoft.

Для всех опций, для основной самой большой таблицы используйте решение для хранения с балансировкой нагрузки (с репликацией потока) postgresql / pgpool III. Другие таблицы и схемы останутся в SQL Server 2008. Это дает мне экономически эффективное решение для хранения базы данных.

Вариант 1: - Заменить MSMQ на JBOSS & HornetQ - Поместите процессор данных на шаге 3 в управляемый контейнером "управляемый сообщениями компонент" в контейнере JBOSS ejb, который предоставит мне варианты для балансировки нагрузки и кластеризации.
- Эта опция потребует, чтобы я переместил основную часть моего решения в unix / linux (я рассматриваю fedora)

Вариант 2: - Замените MSMQ очередями ActiveMQ (кластеризованными и с балансировкой нагрузки). - Напишите приложение Java, которое будет обрабатывать сообщения очереди и заботиться о сохранении базы данных.
Эта опция позволит мне увеличить количество серверов linux с экземпляром кластера activemq и новым экземпляром приложения java.

Вариант 3: - Замените MSMQ очередями ActiveMQ (кластеризованными и с балансировкой нагрузки). - Используйте только текущий процессор данных (с некоторыми небольшими изменениями для передачи данных в postgresql) Эта опция заставит меня остаться с Windows

Обратите внимание, что система представляет собой систему реального времени. Достаточно, если система защищена от неисправностей на 99%. Это не торговая система, поэтому я могу позволить себе небольшую потерю данных.

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

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

Muthu

Добавлено для уточнения:

Извинения за то, что не ясно. 1. Вопрос на самом деле о масштабируемости архитектуры. Особенно горизонтальная масштабируемость. 2. Текущая средняя нагрузка составляет около 300 в минуту, и она не может быть точно распределена в течение одной минуты. 3. В следующие 8-12 месяцев нагрузка может увеличиться в 10 раз.

Проблема в том, что мы продавали около 50 устройств в месяц, и теперь отдел продаж слишком быстро нарастает.Я считаю, что это может удвоиться.

Сервер Sql имел около 8 ГБ данных, и мы ограничили объем хранилища на устройство, и это помогло уменьшить размер.В настоящее время самая большая таблица разделена на 1 раздел на 200 устройств, и запросы являются разумными.Но я вижу узкое место на стороне Sql с масштабируемостью.

Так что даже если сервер Sql установлен на другом сервере, будет ограничение на количество одновременных обновлений, которые я могу сделать на sqlсервер.Я не вижу опции горизонтальной масштабируемости с балансировкой нагрузки для сервера Sql (хотя она поддерживает параметр высокой доступности с кластеризацией).я неправильно понял MS Sql в балансировке нагрузки?

Ответы [ 2 ]

1 голос
/ 09 января 2011

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

В Java я бы сделал в вашей ситуации (и я полагаю, что в любой технологии было бы так же просто) использовать пакеты данных,

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

1 голос
/ 09 января 2011

Производительность и масштабируемость - это совершенно разные вещи, и их не следует путать.Итак, мой первый вопрос: «О чем на самом деле ваш вопрос?».

Немного упрощен, но: повышение производительности означает, что вы выполняете заданную задачу за меньшее время.Масштабируемость измеряет способность вашей системы увеличивать пропускную способность при добавлении ресурсов.

Масштабируемость - это все об архитектуре, поэтому я немного озадачен, почему вы уделяете столько внимания инструментам, а не самой архитектуре.MSMQ вполне масштабируем по нескольким причинам, и SQL Server не очень хорошо масштабируется (как большинство реляционных БД), но очень хорошо справляется с сценариями масштабирования.

Вы говорите, что ваша главная задача - процессор данных,Поскольку я предполагаю, что входящие соединения не зависят друг от друга, одним стандартным решением было бы перейти на физический двухуровневый и настроить другой компьютер только для SQL Server (так или иначе SQL Server нравится).Тогда SQL Server может беспокоиться о (дисковых) операциях ввода-вывода и использовать всю оперативную память своего компьютера, в то время как сетевой обработчик / процессор данных записывает циклы ЦП, которые легко масштабируются (или уменьшаются) с помощью нескольких копий на разных компьютерах, которые обрабатываютсябалансировщик нагрузки).

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

...