Scala + Akka: как создать высокодоступный кластер с несколькими машинами - PullRequest
25 голосов
/ 12 сентября 2010

Мы разрабатываем серверную систему в Scala + Akka для игры, которая будет обслуживать клиентов в Android, iPhone и Second Life.Есть части этого сервера, которые должны быть высокодоступными и работать на нескольких машинах.Если один из этих серверов умирает (например, из-за аппаратного сбоя), система должна продолжать работать.Я думаю, что я хочу, чтобы у клиентов был список машин, к которым они будут пытаться подключиться, подобно тому, как работает Cassandra.

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

Есть ли примеры, показывающие отказоустойчивость этого типа оборудования для Akka?Или у вас есть какие-нибудь мысли о хороших способах сделать это?

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

Но если есть ресурсы, примеры или идеи о том, как разделить состояние между несколькими машинами таким образом, чтобы, если одна из них работалаВещи продолжают работать, я, конечно, ценю их, потому что я обеспокоен тем, что могу заново изобретать колесо здесь.Может быть, существует многоузловой контейнер STM, который автоматически синхронизирует общее состояние между несколькими узлами?Или, может быть, это так легко сделать, что документация не показывает примеры того, как это сделать, или, возможно, я еще не достаточно тщательно провел свои исследования и эксперименты.Будем благодарны за любые мысли или идеи.

Ответы [ 4 ]

5 голосов
/ 12 сентября 2010

HA и управление нагрузкой являются очень важным аспектом масштабируемости и доступны как часть коммерческого предложения AkkaSource.

3 голосов
/ 12 сентября 2010

Вы можете посмотреть, как строятся RedDwarf и его форк DimDwarf . Они оба являются горизонтально масштабируемыми серверами игровых приложений, предназначенных только для сбоев, и DimDwarf частично написан на Scala (новая функция обмена сообщениями). Их подход и архитектура должны вполне соответствовать вашим потребностям :)

3 голосов
/ 12 сентября 2010

Если вы уже перечислили несколько потенциальных хостов в ваших клиентах, то они могут эффективно стать балансировщиком нагрузки.

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

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

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

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

Убедитесь, что ваш список хостов - это действительные имена хостов, а не IP-адреса, которые дают вам большую гибкость в долгосрочной перспективе (т. Е. У вас «всегда будет» host1.example.com, host2.example.com ... и т. Д.) ... даже если вы перемещаете инфраструктуру и меняете IP-адреса).

2 голосов
/ 31 января 2012

2 цента ..

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

Вместо этого не делите состояние между машинамиразделить состояние по машинам.Я не знаю ваш домен, поэтому я не знаю, будет ли это работать.Но, по сути, если вы назначаете определенные агрегаты (в терминах DDD) определенным узлам, вы можете хранить эти агрегаты в памяти (субъект, агент и т. Д.), Когда они используются.Для этого вам нужно будет использовать что-то вроде zookeeper, чтобы координировать, какие узлы обрабатывают, какие агрегаты.В случае сбоя вы можете перенести агрегат на другой узел.

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

Используя Akka, мы получаем удаленное взаимодействие между узлами практически бесплатно.Это означает, что любой узел, обрабатывающий запрос, которому может потребоваться взаимодействие с Агрегатом / сущностью на других узлах, может делать это с RemoteActors.

То, что я здесь изложил, носит очень общий характер, но дает подход к распределенной отказоустойчивости с помощью Akka и ZooKeeper.Это может или не может помочь.Я надеюсь, что это так.

Всего наилучшего, Энди

...