본문 바로가기
Unity/[Asset] DarkRift 2 - Study

* DarkRift 2 실행 - 리눅스 (우분투) .feat consul

by ejrtks 2022. 8. 2.

** 이어지는 가이드 입니다. 이전 글을 반드시 읽으세요.

[ 우분투 Cousul 설치 및 서버 구성 - Consul/Study :: Linux-Ubuntu ]

https://ejrtks.tistory.com/3

 

* 참고 자료 : https://github.com/DarkRiftNetworking/DarkRift/wiki/Installing-DR-Pro-on-Linux

 

GitHub - DarkRiftNetworking/DarkRift: DarkRift Networking by Unordinal

DarkRift Networking by Unordinal. Contribute to DarkRiftNetworking/DarkRift development by creating an account on GitHub.

github.com

리눅스에서 exe를 실행 할 수 없다. 물론 wine으로 서버를 실행 해도 되지만 다크리프트 개발자가 방법을 만들어 두었다.

1. dotnet-sdk를 설치한다.

wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update && \
  sudo apt-get install -y dotnet-sdk-6.0

3. DarkRift Linux 용 콘솔이 필요하다. 방법은 두가지인데, 이걸 다운 받거나 커스터마이징 할 수 있다.

DarkRiftLinuxServer.zip
0.27MB

커스터마이징은 https://github.com/DarkRiftNetworking/DarkRift

 

GitHub - DarkRiftNetworking/DarkRift: DarkRift Networking by Unordinal

DarkRift Networking by Unordinal. Contribute to DarkRiftNetworking/DarkRift development by creating an account on GitHub.

github.com

이 곳에 접속하여 모든 소스를 받고 에디터로 DarkRift.Server.Console 프로젝트를 클래스라이브러리 형식으로 빌드한다.

이 빌드 파일들을 따로 압축하여 리눅스 OS로 옮긴다.

4. DarkRift Config 작성

   consul을 사용하기 위해서는 server.config와 cluster.config가 둘다 필요하다. 작성 법은 공식 문서에 나와 있다. 다음은 예시

  1. server.config 작성

      server.config 파일은 기본으로 제공된다. 자주 쓰는 부분은 가장 아래에 0.0.0.0 4296 의 , 서버 아이피 를 결정해주는 부분이 있다. 그리고 이 글의 주제인 서버 레지스터 기능이다.

아래 부분을 찾는다.

....
<server maxStrikes="3" />
....

 

찾은 부분을 이렇게 바꿔준다. 

<server maxStrikes="3" serverGroup ="groupName"/>

	<serverRegistry advertisedHost="xxx.xxx.xxx.xxx">
		<serverRegistryConnector type="ConsulServerRegistryConnector">
			<settings consulAddress="http://xxx.xxx.xxx.xxx:8500" serviceName ="service" />
		</serverRegistryConnector>
	</serverRegistry>

        *  groupName은 후술할 cluster.config 에 포함된 이름이어야 한다. 내가 지금 켜고자 하는 서버의 종류에 맞는 이름을 넣어둔다. 철자 안틀리게 조심 !! ** 참고 : 공식 문서

        * advertiseHost와 advertisedPort는 서버의 아이피주소다. server.config 파일의 가장 아래에 서버 아이피를 지정해주는 부분이 다음과 같이 있다.

<listener name="DefaultNetworkListener" type="BichannelListener" address="0.0.0.0" port="4296">

          0.0.0.0 은 advertisehost와 같은 아이피어야 한다.

    https://www.consul.io/docs/architecture/gossip

 

Gossip Protocol | Consul by HashiCorp

Consul uses a gossip protocol to manage membership and broadcast messages to the cluster. All of this is provided through the use of the Serf library. The gossip protocol used by Serf is based on SWIM: Scalable Weakly-consistent Infection-style Process Gro

www.consul.io

    관련 라이브러리.

      https://www.serf.io/

 

Serf by HashiCorp

Serf is a decentralized solution for cluster membership, failure detection, and orchestration. Lightweight and highly available.

www.serf.io

 

          ** 중간에 ConsulServerRegistryConnector라는 문구가 있는데 , 이 부분을 통해서 다크리프트 서버가 주변 서버를 탐색한다. 이 타입은 다크리프트로 서버를 만들때 포함되는 스크립트인데 

https://github.com/DarkRiftNetworking/consul-server-registry-connector

 

GitHub - DarkRiftNetworking/consul-server-registry-connector: DarkRift ServerRegistryConnector plugin for Consul

DarkRift ServerRegistryConnector plugin for Consul - GitHub - DarkRiftNetworking/consul-server-registry-connector: DarkRift ServerRegistryConnector plugin for Consul

github.com

여기에서 받아서 src 폴더나 test 폴더 뒤져보면 나온다. 혹은 

https://github.com/DarkRiftNetworking/darkrift-cli

 

GitHub - DarkRiftNetworking/darkrift-cli: Command Line Interface tool for DarkRift

Command Line Interface tool for DarkRift. Contribute to DarkRiftNetworking/darkrift-cli development by creating an account on GitHub.

github.com

이 파일을 받아서 모든 src와 test 폴더를 뒤져보면 대충 예시가 나와 있다. 정말 대충 나와있다.,,

     ** 다크리프트 디스코드 참조

server.config에서 마지막으로 추가 해야할 부분은 <plugins loadByDefault="false">로 되어있는 부분이다.

아래를 추가한다.

...
<plugins loadByDefault="true">
    <plugin type="HttpHealthCheck" load="true">
      <settings
        port="wxyz"
        host="abc.def.hij.klm"
        path="/health" />
      </plugin>
  </plugins>
...

이 부분을 추가후 저장하며 이때의 port는 ConsulServerRegistryConnector.cs 에서

healthCheckUrl 그리고 AgentServiceCheck 클래스를 생성할 때 필요하다.  다음 부분을 추가한다.

 

private readonly string healthCheckUrl = "http://abc.def.hij.klm:wxyz/health";

AgentServiceCheck healthCheck = new AgentServiceCheck()
{
    HTTP = healthCheckUrl,
    Interval = healthCheckPollInterval,
    DeregisterCriticalServiceAfter = healthCheckTimeout
};

AgentServiceRegistration service = new AgentServiceRegistration
{
    ID = id.ToString(),
    Name = serviceName,
    Address = host,
    Port = port,
    Tags = new string[] { "group:" + group },
    Meta = properties,
    Check = healthCheck,
};

try
{
    await client.Agent.ServiceRegister(service);
}
catch (Exception e)
{
    Logger.Error("Failed to register server with Consul as an exception occurred.", e);
    throw e;
}

** client.Agent.ServiceResister와 client.Catalog.Resister가 있는 데 , 공식 지원안내에 따르면 ServiceResister를 사용하라고 권고한다.

결국 serviceName, host, port, healthCheckUrl 은 server.config와 스크립트 내에서 서로 같은 값을 가져야한다.

다음 cluster.config 작성 법이다. 

<?xml version="1.0" encoding="utf-8" ?>

<cluster>
	<groups>
		<group name="group1" visibility="external">
			<connectsTo name="group2" />
		</group>

		<group name="group2" visibility="internal" />
        <group name="group3" visibility="internal" />
	</groups>
</cluster>

이렇게 맞춰주면 된다. external은 수나사로 생각하면 되고 internal은 암나사로 생각하면된다.

 

암나사는 어디에 연결될 필요가 없으므로 connectTo를 적어줄 필요가 없고 수나사는 암나사를 지향해야 하므로 작성해야한다. 여기나오는 group1 2 3같은 이름은 server.config에 등장하는

<server maxStrikes="3" serverGroup ="group1"/>

이부분의 이름과 같으면 된다. 내가 구동하고자하는 서버 이름을 잘 보고 넣어야한다. 

이 모든 과정을 거치고 나서

5. dll 이 포함된 디렉토리로 이동 후, 서버를 실행한다. ( 예시 )

cd (DarkRift.Server.Console.dll가 있는 디렉토리)
sudo dotnet Lib/DarkRift.Server.Console.dll

 

6. consul 내에서 leader가 정해지지 않으면 에러를 뱉어낼 수 있다. 그러므로 consul bootstrap_expect 값을 잘 확인해서 consul의 실행 개수를 맞춰주자.

 

댓글