Как упростить процесс или начать распределенную мнезию
В настоящее время я занимаюсь разработкой игрового сервера, моя архитектура такова, что каждый игровой сервер будет экземпляр mnesia db при первом запуске. Допустим, я хочу создать второй узел, и я планирую просто развернуть тот же игровой сервер на этом втором узле.
Моя проблема: я хочу, чтобы второе развертывание моего игрового сервера автоматически обнаруживало случай mnesia на первом узле, копировало его схему БД и становилось кластером для первого.
Я проверил проект schemafinder по адресу http://code.google.com/p/schemafinder/ и хочу понять, как он это делает, но это кажется довольно сложным.
Если бы какое-то тело желало дать мне какое-то просветление, я был бы более благодарен.
заранее спасибо
1 ответ
Вы хотите, чтобы один и тот же игровой сервер был доступен на кластере машин. Первый шаг, который вы сделали, это нормально: сделать базу данных доступной для репликации на удаленных компьютерах. Однако важно, чтобы вы проектировали весь игровой сервер слоями. Пусть игровой сервер сам по себе будет собственным приложением, собственным пакетом. Затем создайте свою базу данных отдельно. Эта база данных может быть фрагментирована, реплицирована на несколько машин.
Таким образом, вы можете создать слой доступа к данным для своего игрового сервера, на котором он будет использовать API уровня доступа к данным для доступа к вашей базе данных на удаленной машине или локально во время выполнения без прерывания работы. Нехорошо иметь каждый экземпляр игрового сервера со своей собственной схемой Mnesia, если вы не уверены, что данные, которые будут находиться в этой базе данных, не будут связаны: {local_content,true}
,
Безопаснее иметь одну и ту же схему Mnesia (которая находится на вашем уровне хранения данных), реплицированную на несколько компьютеров. Тогда у вас есть хорошо спроектированные столы. Раскройте API в модулях, которые управляют вашими игровыми данными. Отсюда начнем строить Уровень доступа к данным (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.
). На уровне доступа к данным построен отказоустойчивый доступ к узлу базы данных. Методы, которые вы здесь поместите, будут абстрагировать прикладной (бизнес-логический) уровень от обработки проблем с подключением, выполнения удаленных вызовов процедур к узлам базы данных и т. Д. Кроме того, эти методы должны быть способны обнаруживать ошибки "узел недоступен" и могут во время выполнения повторить вызов другой узел реплики базы данных без игровых серверов, замечающих это вмешательство. Уровень доступа к данным может выполнять балансировку нагрузки на узлах базы данных путем эффективного мультиплексирования вызовов приложения к базе данных между узлами базы данных (зависит также от доступности и механизма переключения при сбое). Хватит с этим разговаривать....
В любом случае, краткое изложение того, что я изложил, заключается в том, что важно отделить Mnesia от своих игровых серверов. Делая это, вы можете управлять приложением-сервером в одиночку, а позже также беспокоиться о доступе к данным отдельно. Отделение вашей физической и логической структуры базы данных от других частей вашего проекта повысит гибкость и доступность. В будущем вы сможете изменить дизайн и вещи базы данных без изменения уровня доступа к данным. Вы даже можете в будущем включить другую СУБД, например, Riak или Membase Server, не меняя свою игровую логику.
Другое дело: избегайте копирования схем здесь и там. Проектируйте реплицированную / распределенную архитектуру базы данных с самого начала. Не заставляйте игровые серверы копировать схемы mnesia с узла на узел, чтобы стать кластером. Пусть игровой сервер беспокоится об игровой логике и прочем, а слой доступа к данным - об игровых данных. Некоторое просветление там, я надеюсь, это поможет. Успех!