서비스체인을 운영하시다 보면 SCN (Servicechiain Consensus Node)를 추가/삭제를 하고 싶은 경우가 있습니다. 서비스체인은 BFT 합의 알고리즘을 사용합니다만 처음 추가하였던 노드가 노드의 추가/삭제 권한이 있습니다. 그렇기 때문에 아래와 같은 과정을 통해서 노드 추가가 가능합니다.
만약 여러개의 노드를 추가 하고 싶다면 아래의 방법을 원하는 노드의 갯수만큼 반복을 하면 됩니다.
신규 Consensus 추가 방법
1. 새롭게 node를 추가하기위해서는 신규 node의 nodekey 생성해야합니다.
- kgen을 이용한 nodekey 생성하여 node의 address와 nodekey file을 확인 할 수 있습니다.
> kgen --file
Created : keys/nodekey
Created : keys/node_info.json
> cat keys/nodekey
99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2%
> cat keys/node_info.json
{
"Address": "0xb2221f2acd44fef464040434249fd732c4766691",
"Nodekey": "99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2",
"NodeInfo": "kni://f4d08c8a8d4b9f55310648619429a293664dba405321b08ab91d2551c48133295a103b1b547778b39bf03cd0bb1b77826741707c518a6e7f6c3155478cbf1f85@0.0.0.0:32323?discport=0"
}%
2. validator 추가
- Servicechain의 경우 single governancemode로서 첫번째 노드가 governance기능을 담당하게 됩니다.
- RPC/IPC등으로 attach 하여 아래 명령을 통해 신규 node를 validator에 추가 할 수 있습니다.
이때 주소값은 조금전 kgen으로 생성한 nodekey의 Address값 입니다.
그리고 아래 명령어를 통해 확인 가능합니다.
> governance.vote("governance.addvalidator","0xb2221f2acd44fef464040434249fd732c4766691")
"Your vote was successfully placed."
> istanbul.getValidators()
["0x8dbf4f0b1785e93c103a9735dc3e1cbf3b5fcb04", "0xb2221f2acd44fef464040434249fd732c4766691"]
- validator를 추가하고 SCN0의 log를 확인하면 추가된 노드가 Block 생성을 하지 않고 있기 때문에 round change가 발생하며 신규 block을 생성하지 못합니다.
3. 신규 Node의 실행
- 신규 Node를 위한 /data directory를 생성하여 SCN0의 /data를 복사하여 chain data를 가져옵니다.
- 이후 /data/klay/nodekey 파일을 1에서 생성한 nodekey로 변경합니다.
- 그리고 신규 노드를 실행합니다.
4. 신규 Node의 연결
새롭게 node를 추가하기위해서는 신규 node의 nodekey 생성해야합니다.
- kgen을 이용한 nodekey 생성하여 node의 address와 nodekey file을 확인 할 수 있습니다.
> kgen --file
Created : keys/nodekey
Created : keys/node_info.json
> cat keys/nodekey
99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2%
> cat keys/node_info.json
{
"Address": "0xb2221f2acd44fef464040434249fd732c4766691",
"Nodekey": "99c436cda0d8827006a9fe1427f3668f55c48afdee2b21d90c143af4a10ef6d2",
"NodeInfo": "kni://f4d08c8a8d4b9f55310648619429a293664dba405321b08ab91d2551c48133295a103b1b547778b39bf03cd0bb1b77826741707c518a6e7f6c3155478cbf1f85@0.0.0.0:32323?discport=0"
}%
validator 추가
- Servicechain의 경우 single governancemode로서 첫번째 노드가 governance기능을 담당하게 됩니다.
- RPC/IPC등으로 attach 하여 아래 명령을 통해 신규 node를 validator에 추가 할 수 있습니다.
이때 주소값은 조금전 kgen으로 생성한 nodekey의 Address값 입니다.
> governance.vote("governance.addvalidator","0xb2221f2acd44fef464040434249fd732c4766691")
"Your vote was successfully placed."
- 그리고 아래 명령어를 통해 확인 가능합니다.
> istanbul.getValidators()
["0x8dbf4f0b1785e93c103a9735dc3e1cbf3b5fcb04", "0xb2221f2acd44fef464040434249fd732c4766691"]
-
validator를 추가하고 SCN0의 log를 확인하면 추가된 노드가 Block 생성을 하지 않고 있기 때문에 round change가 발생하며 신규 block을 생성하지 못합니다.
-
신규 Node의 실행
- 신규 Node를 위한 /data directory를 생성하여 SCN0의 /data를 복사하여 chain data를 가져옵니다.
- 이후 /data/klay/nodekey 파일을 1에서 생성한 nodekey로 변경합니다.
- 그리고 신규 노드를 실행합니다.
-
신규 Node의 연결 : 이제 기존 노드와 신규 노드를 연결 합니다.
-
수동연결
addPeer 명령을 통해 수동으로 연결하는 방식입니다. (여러 노드의 경우 불편함으로 아래 자동연결을 참고해주세요.) -
기존 노드의 nodeInfo 확인
노드의 kni값의 앞부분은 kgen에서 생성한 해당 노드의 nodekey와 일치하는 값으로 kgen에서 생성한 파일에서 확인 가능하며 또는 아래와 같이 ipc/rpc에서 확인 가능합니다. 그리고 나머지 ip/port는 해당 노드의 ip와 kscn.conf에 설정한 port로 설정하면 됩니다.
-
> admin.nodeInfo
{
id: "cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6",
ip: "0.0.0.0",
kni: "kni://cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6@0.0.0.0:0",
listenAddr: ":12323",
...
}
- 신규 노드에서 기존 노드로 연결 요청
> admin.addPeer("kni://cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6@localhost:12323")
6. 자동연결
static-nodes.json파일을 작성하여 모든 노드의 /data 디렉토리에 추가하여 자동연결이 가능하도록 합니다. 이 파일을 최초 노드 start시 load하기 때문에 변경한 이후에는 노드를 재시작해야합니다.
> cat > static-nodes.json
[
"kni://cbffe1b1be860bdce927114e2f9368fb944c74b511513b15d257959bfbc39ef6ae6470558c76909d2bf08e1414176b0fa7c9151d58a8a1777bc3b4e3cb9913f6@localhost:12323",
"kni://6f9f01b5498ad86ea79f3268df6d4530e912837ca186d11c8510b46ce0e43ddd0ca5b69eeaf7b1b8857ab08dbd3b1d676229f2a9262f91df87940e0ebe92df94@localhost:22323",
"kni://f2e968783b786328a5cf2612191a446984b06f164644385a3dc119a87786070cdfb5d8d5ad797e64e97bf02aabfb7d2f400093bbb9180fcdac4b2eba5cefc589@localhost:32323",
"kni://af752bb67191a8ece929d515e5cffd3440254e3496a28a57cfa46ca5e2b7af559c14cd81baa050f945963b5f79749828723123529298dd92dda02cb8b923a1e3@localhost:42323"
]
^Z
[1] + 19704 suspended cat > static-nodes.json
7. 블록 생성 확인
신규 노드를 기존 노드와 연결을 시킨다면 새롭게 블럭을 생성하는 것을 확인 가능합니다.
FAQ
- 신규 노드가 연결이 되지 않습니다.
- node가 validatorSet에 추가 되지 않았다면 해당 노드는 연결이 거부됩니다.
- validator의 갯수에 따라서 HA가 되는 기준이 무엇인지요?
- 1 ~ 3개의 validator의 경우에는 1개 라도 연결이 안된경우에는 추가 블록 생성이 안됩니다.
- 4 (N)개 이상의 validator가 등록된 경우 F개의 장애 노드가 있더라도 블록생성은 유지합니다. F = (N - 1)/2
- 다만 N개가 순차적으로 proposer가 되는데 장애노드가 proposer가 된 시점에는 3초후 round change가 발생되며 proposer가 변경되어 진행되게 됩니다.