Как упростить процесс или начать распределенную мнезию - PullRequest
2 голосов
/ 05 июля 2011

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

Моя проблема: я хочу, чтобы второе развертывание моего игрового сервера автоматически обнаруживало случай mnesia на первом узле, копировало его схему БД и становилось кластером для первого.

Я проверил проект schemafinder на http://code.google.com/p/schemafinder/ и хочу понять, как он это делает, но это кажется довольно сложным.

Если бы какое-либо тело желало дать мне какое-то просветление, я был бы более благодарен.

Заранее спасибо

1 Ответ

2 голосов
/ 06 июля 2011

Вы хотите, чтобы один и тот же игровой сервер был доступен на кластере машин. Первый шаг, который вы сделали, это нормально: сделать базу данных доступной для репликации на удаленных компьютерах. Однако важно, чтобы вы проектировали весь игровой сервер слоями. Пусть игровой сервер сам по себе будет собственным приложением, собственным пакетом. Затем создайте отдельную базу данных. Эта база данных может быть фрагментирована, реплицирована на нескольких компьютерах.
Таким образом, вы можете создать слой доступа к данным для вашего игрового сервера, на котором он будет использовать API уровня доступа к данным для доступа к вашей базе данных на удаленной машине или локально. во время работы без сбоев в обслуживании. Нехорошо иметь каждый экземпляр игрового сервера со своей собственной схемой Mnesia, если вы не уверены, что данные, которые будут находиться в этой базе данных, не будут связаны: {local_content,true}.

Безопаснее иметь одинаковую схему Mnesia (она есть на вашем уровне хранения данных), реплицированную на несколько компьютеров. Тогда у вас есть хорошо спроектированные столы. Раскройте API в модулях, которые управляют вашими игровыми данными. Отсюда начните строить уровень доступа к данным ( <b>NOTE: Am talking of the 3-tier Logical Architecture, the Physical Architecture can take any form as long as it caters for Hardware and Network Failures.</b>). На уровне доступа к данным построен отказоустойчивый доступ к узлу базы данных. Методы, которые вы здесь указали, отвлекут уровень Application (Business Logic) от решения проблем с подключением, делая удаленные вызовы процедур для узлов базы данных e.t.c. Кроме того, эти методы должны быть способны обнаруживать ошибки «узел недоступен» и могут во время выполнения повторить вызов к другому узлу реплики базы данных без того, чтобы игровые серверы заметили это вмешательство. Уровень доступа к данным может выполнять балансировку нагрузки на узлах базы данных путем эффективного мультиплексирования вызовов приложения к базе данных между узлами базы данных (зависит также от доступности и механизма переключения при сбое). Хватит с этим разговаривать ....
В любом случае, краткое изложение того, что я изложил, заключается в том, что важно, чтобы вы отделяли Mnesia от своих игровых серверов. Делая это, вы можете управлять приложением-сервером в одиночку, а позже также беспокоиться о доступе к данным отдельно. Отделение вашей физической и логической структуры базы данных от других частей вашего проекта повысит гибкость и доступность. В будущем вы сможете изменить дизайн и вещи базы данных без изменения уровня доступа к данным. Вы даже можете переключиться на другую СУБД, такую ​​как Riak или Membase Server в будущем, не изменяя свою игровую логику.

Другое дело: избегайте копирования схем здесь и там. Проектируйте реплицированную / распределенную архитектуру базы данных с самого начала. Не заставляйте игровые серверы копировать схемы mnesia с узла на узел, чтобы стать кластером. Пусть игровой сервер беспокоится об игровой логике и прочем, а слой доступа к данным - об игровых данных. Некоторое просветление там, я надеюсь, это поможет. Успех!

...