Как сделать мое Java-приложение масштабируемым и отказоустойчивым? - PullRequest
8 голосов
/ 02 февраля 2011

В упрощенном виде мое Java-приложение можно описать следующим образом:

Это веб-приложение, работающее на сервере Tomcat с интерфейсом SOAP.Приложение использует JPA / Hibernate для хранения данных в базе данных MySQL.Сохраненные данные состоят из списка пользователей, списка хостов и списка URI, указывающих на огромные файлы (10 ГБ) в файловой системе.Вся система состоит из центрального сервера, на котором выполняется мое приложение, и нескольких рабочих узлов.Пользователь может подключиться к интерфейсу SOAP и попросить систему скопировать принадлежащие ему файлы на определенный рабочий хост, где он затем может каким-то образом проанализировать данные (мы не можем использовать NFS, нам нужно скопировать данные влокальное дисковое хранилище рабочего хоста).Затем база данных сохраняет для каждого пользователя, на котором рабочий хост хранятся его файлы.

В настоящий момент система работает с одним центральным сервером с приложением Tomcat и базой данных MySQL, а также с 10 рабочими хостами и около 30 пользователями, которыеу меня хранится 100 файлов (в среднем 10 ГБ), распределенных по рабочим хостам.

Но в будущем мне придется масштабировать систему в 100-1000 раз.Поэтому мне, возможно, придется иметь дело с 10000 пользователями, 100000 файлами и 10000 хостами.И система также должна стать отказоустойчивой, чтобы у меня не было ни одного центрального сервера (который сейчас является единственной точкой отказа в системе), а может быть несколько.Кроме того, если один из рабочих хостов выходит из строя, система должна быть уведомлена, поэтому она не пытается копировать файлы на этом сервере.

Теперь у меня вопрос: какие технологии Java можно использовать, чтобы сделать мое приложение масштабируемыми отказоустойчивый?Какую архитектуру вы бы порекомендовали?Должен ли я по-прежнему иметь огромную базу данных, хранящую всю информацию обо всех файлах, хостах и ​​пользователях в системе в одном месте, или мне лучше распределить базу данных по нескольким хостам и каким-то образом синхронизировать их?

1 Ответ

14 голосов
/ 02 февраля 2011

Необходимая технология называется Архитектура.

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

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

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

...