Как сделать мое приложение Java масштабируемым и отказоустойчивым?

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

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

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

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

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

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

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

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

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

8
задан Philip Durbin 23 August 2018 в 01:54
поделиться