singletons cluster의 구조는 다음과 같다.
[사진 1]
3개의 docker instance에 singletonsimple 를 배포하고 기동하면 자동으로 cluster 설정이 이루어 지고 Leader Node가 설정되어 진다.
Leader Node는 3개의 Node중에 선택되어지고 Leader Node가 죽으면 다른 Node가 Leader가 된다.
singletonsimple 프로젝트의 yang 파일을 보면 총 3개의 RPC가 존재한다.
- global-rpc
- routed.rpc
- local-rpc
먼저 rpc를 등록해주는 SingletonSimpleProvider.java 파일의 소스코드의 일부분을 살펴보자
1 | public class SingletonSimpleProvider implements ClusterSingletonService { |
위 클래스는 ClusterSingletonService를 implements 받는데 이 클래스에서 Override 된 instantiateServiceInstance 메소드에 등록된 RPC가 cluster로 묶인 Node들에서 공유가 되는 것이다.
위에서 말했듯이 자동으로 Leader Node가 설정되어지는데 리더로 설정된 Node에서만 instantiateServiceInstance 가 실행되고 나머지 Node들은 실행되지 않는다.
공식 문서에 따르면 ClusterSingletonService 에는 EOS(Entity Ownership Service)에대한 복잡한 알고리즘을 처리하는 로직이 포함되어 Leader Node가 죽을 경우 살아있는 다른 Node가 Leader가 되도록 한다.
RPC 기능 설명
singletonsimple 프로젝트를 보면 3개의 RPC가 선언 되어 있다고했다. 각 RPC에 대해 자세히 알아보자
1.local-rpc
- 가장 기본적인 RPC 기능을 한다. local-rpc는 Provider class에 init 메소드에 등록이 되어 각 Node에서 karaf를 구동시킬때 자동으로 등록되어져 REST 방식으로 호출하여 사용가능하다.
2.global-rpc
global-rpc는 Provider class의 instantiateServiceInstance 메소드에서 등록이 되는데 instantiateServiceInstance메소드는 Leader Node에서만 실행이 된다고 하였다. Leader Node 가 instantiateServiceInstance 메소드를 실행하면 global-rpc 가 SAL에 등록이 되고 나머지 두개의 Node에도 광고가 된다. 실제로는 Leader Node에만 global-rpc가 등록되어 진것이지만 다른 두개의 Node에서도 해당 RPC를 사용 할 수 있다.
만약 Leader Node가 죽었을 경우 다른 Node가 Leader 가 되고 instantiateServiceInstance 이 실행되어 global-rpc가 등록되어진다.
위 사진1 에서는 Node1 이 Leader가 된 경우에 Leader1의 Global RPC만 접근이 가능하여 RESTCONF <---> Global RPC 로 되어있고 Node2,3 는 RESTCONF <-x-> Global RPC 라고 되어진것이 바로 이뜻이다.-x->--->
global-rpc를 실제로 동작시켜 보면 다음과 같다.
[사진2]
[사진3]
사진 2를 보면 2번 Node(172.17.0.3)에서 global-rpc를 호출 하였고 이에 대한 응답으로 다음 결과를 받았다.1
2
3
4
5
6
7
8
9
10
11
12
13
14{
"output": {
"ip-address": [
"fe80:0:0:0:42:acff:fe11:2%eth0",
"172.17.0.2",
"0:0:0:0:0:0:0:1%lo",
"127.0.0.1"
],
"host-name": "member-1",
"output-param": "Some input-param",
"invocations": 4,
"jvm-uptime": 145673203
}
}
응답받은 결과를 보면 host-name = member-1 , ip = 172.17.0.2 으로 출력된것을 보아 첫번째 Node의 RPC가 호출된것으로 보인다.
사진3은 ODL의 로그인데 실제로 2번 Node 에서 Global rpc를 호출 했지만 실제로 응답한것은 1번 Node라는것을 확인 할 수 있다.
다음으로 1번 Node를 강제로 죽여 Leader Node를 변경하여 보자.
[사진4]
위 그림4를 보면 1번 Node의 ODL을 죽이면 자동으로 2,3번 Node로 1번 Node가 죽었다는 Notification이 날라가고 Leader 선출 과정을 거쳐 2번 Node가 Leader로 선출 되었음을 알 수 있다.
3.routed-rpc
routed rpc의 동작방식은 global rpc와 거의 동일하다. 다른점이 있다면 instantiateServiceInstance메소드에서 RPC를 등록할때에 RpcMemberKey를 설정할수 있는데 routed-rpc를 호출할때 여기서 설정한 key 값을 이용해 호출을 할 수 있다.
routed-rpc 역시 Leader Node에서만 등록이되어 사용이 가능하고 호출은 어떤 노드에서나 가능하다.
[사진5]