Настройка моего сервера для интенсивно используемого API
9
Я скоро куплю несколько серверов для приложения, которое я собираюсь запустить, но у меня есть опасения по поводу моей установки. Я ценю любые отзывы, которые я получаю.
У меня есть приложение, которое будет использовать API, который я написал. Другие пользователи / разработчики также будут использовать этот API. Сервер API будет получать запросы и передавать их на рабочие серверы. API будет хранить только mysql db запросов для целей регистрации, аутентификации и ограничения скорости.
Каждый рабочий сервер выполняет свою работу, и в будущем я буду добавлять дополнительные рабочие серверы для выполнения заданий. Файл конфигурации API будет отредактирован, чтобы принять к сведению новые рабочие серверы. Рабочие серверы будут выполнять некоторую обработку, а некоторые сохранят путь к изображению в локальной базе данных для последующего извлечения через API для просмотра в моем приложении, некоторые вернут строки результатов процесса и сохранят их в локальной базе данных. ,
Эта установка выглядит эффективной для вас? Есть ли лучший способ реструктурировать это? Какие вопросы я должен рассмотреть? Пожалуйста, смотрите изображение ниже, я надеюсь, что это помогает пониманию.
Как упоминает Крис, ваш API-сервер является единственной точкой отказа в вашем макете. То, что вы настраиваете, - это инфраструктура очереди сообщений, которую многие люди внедрили раньше.
Продолжайте идти по тому же пути
Вы упоминаете получение запросов на сервере API и вставляете задание в БД MySQL, работающую на каждом сервере. Если вы хотите продолжить этот путь, я предлагаю удалить уровень сервера API и спроектировать рабочих так, чтобы каждый из них принимал команды непосредственно от ваших пользователей API. Вы можете использовать что-то простое, например, циклический DNS, чтобы распределить каждое пользовательское соединение API напрямую на один из доступных рабочих узлов (и повторить попытку, если соединение не удалось).
Используйте сервер очереди сообщений
Более надежные инфраструктуры очереди сообщений используют программное обеспечение, разработанное для этой цели, например ActiveMQ . Вы могли бы использовать RESTful API ActiveMQ для приема запросов POST от пользователей API, и незанятые работники могут получить следующее сообщение в очереди. Однако это, вероятно, излишне для ваших нужд - оно рассчитано на задержку, скорость и миллионы сообщений в секунду.
Используйте Zookeeper
В качестве среднего уровня вы можете захотеть взглянуть на Zookeeper , даже если он не является сервером очереди сообщений. Мы используем на $ work именно для этой цели. У нас есть набор из трех серверов (аналогичных вашему API-серверу), на которых выполняется серверное программное обеспечение Zookeeper, и есть веб-интерфейс для обработки запросов от пользователей и приложений. Веб-интерфейс, а также внутреннее подключение Zookeeper к рабочим имеют балансировщик нагрузки, который позволяет нам продолжать обработку очереди, даже если сервер не работает в целях обслуживания. Когда работа завершена, работник сообщает кластеру Zookeeper, что работа завершена. Если работник умирает, эта работа будет отправлена на другую работу для завершения.
Другие проблемы
Убедитесь, что задания выполнены, если работник не отвечает
Как API узнает, что задание выполнено, и получит его из базы данных работника?
Попробуйте уменьшить сложность. Вам нужен независимый сервер MySQL на каждом рабочем узле, или они могут общаться с сервером MySQL (или реплицированным MySQL Cluster) на сервере (ах) API?
Безопасность. Кто-нибудь может представить работу? Есть ли аутентификация?
Какой работник должен получить следующую работу? Вы не упоминаете, как ожидается, что задачи займут 10 мс или 1 час. Если они быстрые, вы должны удалить слои, чтобы уменьшить задержку. Если они медленные, вы должны быть очень осторожны, чтобы короткие запросы не застревали за несколькими долгосрочными.
Большое спасибо за ваш отличный ответ. Я знал, что уровень API был узким местом, но это был единственный способ добавить больше рабочих серверов, не сообщая пользователям приложения вручную. Полностью прочитав ваш ответ, я понял, что да, было бы лучше, если бы у каждого работника был свой API. Хотя код будет дублироваться по мере того, как я добавлю больше работников, он будет более производительным для моего сценария.
Абс
@Abs - Спасибо за мой первый голос! Если вы решите удалить уровень API, я предлагаю не выполнять циклический перебор DNS и устанавливать HAProxy (предпочтительно пару), как описано в этой статье . Таким образом, вам не нужно иметь дело с таймаутами.
Фанатик
@ Возможно, вам не нужно удалять уровень API, но добавление избыточности (аварийное переключение CARP или подобное) было бы важным соображением для устранения единой точки отказа ...
voretaq7
Что касается обмена сообщениями, я бы посоветовал внимательно посмотреть на RabbitMQ, прежде чем вы решите: rabbitmq.com
Антониус Блох
2
Самая большая проблема, которую я вижу, - это отсутствие планирования отработки отказа.
Ваш сервер API является большой единственной точкой отказа. Если он выходит из строя, то ничего не работает, даже если ваши рабочие серверы все еще работают. Кроме того, если рабочий сервер выходит из строя, то служба, предоставляемая этим сервером, больше не доступна.
Я предлагаю вам взглянуть на проект Linux Virtual Server ( http://www.linuxvirtualserver.org/ ), чтобы получить представление о том, как работает распределение нагрузки и отработка отказа, а также понять, как они могут принести пользу вашему дизайну.
Есть много способов структурировать вашу систему. Какой путь лучше - это субъективный вызов, на который вы лучше всего ответите. Я предлагаю вам сделать некоторые исследования; взвесить компромиссы различных методов. Если вам нужна информация о методе имплантации, отправьте новый вопрос.
Как бы вы реализовали механизм аварийного переключения в этом сценарии? Общий обзор был бы великолепен.
Абс
Из вашей диаграммы вы должны исследовать Linux Virtual Server (LVS). Перейдите на linuxvirtualserver.org и начните изучать все, что можете.
Крис Тинг
Интересно, я буду смотреть на это и отказоустойчивости вообще. Любые другие комментарии по моей настройке? Какие-нибудь другие опасности, с которыми я мог столкнуться?
Абс
@Abs: Есть много проблем, с которыми вы можете столкнуться. В вашем вопросе много субъективных частей, и я не хочу, чтобы вы рассказали о том, что лично я сделаю. Мне не нужно поддерживать ваши настройки; вы делаете. Мой реальный ответ - узнать об отказоустойчивости и высокой доступности.
Самая большая проблема, которую я вижу, - это отсутствие планирования отработки отказа.
Ваш сервер API является большой единственной точкой отказа. Если он выходит из строя, то ничего не работает, даже если ваши рабочие серверы все еще работают. Кроме того, если рабочий сервер выходит из строя, то служба, предоставляемая этим сервером, больше не доступна.
Я предлагаю вам взглянуть на проект Linux Virtual Server ( http://www.linuxvirtualserver.org/ ), чтобы получить представление о том, как работает распределение нагрузки и отработка отказа, а также понять, как они могут принести пользу вашему дизайну.
Есть много способов структурировать вашу систему. Какой путь лучше - это субъективный вызов, на который вы лучше всего ответите. Я предлагаю вам сделать некоторые исследования; взвесить компромиссы различных методов. Если вам нужна информация о методе имплантации, отправьте новый вопрос.
источник