EOS 풀노드 구축기

ITAM Network에서 EOS 풀노드를 구축하며 습득한 풀노드 구축법을 공유해드립니다.

준비하기(예비지식)

EOS의 가장 핵심적인 Infra는 바로 BP입니다. 그저 블록을 생성하고 트랜잭션을 처리하는 것 이외에 사용자에게 http end point(접속점)를 제공하고 있기 때문인데, BP들의 많은 노력에도 불구하고, 커져가는 EOS 사용자들의 요구 사항을 빠르고 안정적으로 만족시키는 데에는 많은 어려움을 겪고 있는 것으로 보입니다.

특히나 DApp 개발자들이 요구하는 사양은 정보의 쿼리량에 따라서 엄청난 자원으로 소비해야 하는 경우가 흔히 발생합니다만, 이러한 부하를 오롯이 BP들이 감내해야 하는 현재의 상황으로서는 BP의 인프라 확장을 압박하거나 기다리는 방법도 그다지 신통해 보이지 않습니다.

따라서 불가피하게 Transaction의 Action Data를 대량으로 가져와서 의미 있는 작업을 수행해야 하는 DApp의 경우 (예를 들어 어떠한 사용자의 Action 데이터를 가져와서 시간 순서대로 가져와 보여준다든지, history를 보여주는 경우)에는 블록체인의 블록 데이터를 동기화하여 가지고 있는 로컬 서버를 생각하게 될 것입니다.

다만 EOS의 경우 빠르게 블록 사이즈가 커지고 있고, 설치에 필요한 장비도 고사양을 요구하기 때문에 Full Node를 구성하는데 따르는 비용에 대해서 생각해봐야 하고, 잘 결정해야 합니다.

이번 포스팅은 이러한 Full Node 서버를 구축하는 방법과 적절한 시스템 사양을 선택하는데 참고가 되어 드리기 위해 작성되었습니다. 기술적인 기준점을 잡기 위하여 인프라는 AWS를 기준으로 설명하겠습니다.

MongoDB PlugIn

서버의 구성 전에, 실제로 필요한 기능을 수행하기 위하여 Full Node의 동기화가 왜 필요한지에 대해서 고민을 해봐야 합니다. 대부분의 경우 블록 데이터에 대한 history 관련 정보의 fetch(인출, 쿼리)가 그 주요 업무일 것입니다.

그러면 블록을 동기화한 후 어떻게 데이터를 불러오고, 키워드에 따른 정보의 검색을 수행할까요? 물론 블록체인 안의 블록 내용을 하나하나 보는 방법도 있겠지만, 우리는 이미 데이터를 검색하여 가져오는 DB라는 좋은 방법론을 가지고 있습니다. 게다가 EOS의 경우 메인넷 이전의 Dawn 버전부터도 mongodb plugin을 가지고 있습니다.

물론 이 플러그인이 쓸 만하게 된 것은 1.X 대부터라는 생각은 들지만, 이 플러그인은 EOS에서 블록을 동기화 시키면서 트랜잭션을 알맞은 형태로 DB에 저장하는 기능을 제공한다는 것이 중요합니다. 즉 DApp 개발자들은 블록체인의 블록 정보를 하나하나 조회하는 것이 아닌 DB에서 Query를 통해 정보를 조회할 수 있다는 의미이며, DApp을 위하여 Full Node 서버를 구성하는데 DB 플러그인을 쓰지 않는 상황은 그다지 많지 않을 듯 합니다.

본 포스팅에서는 MongoDB Plugin을 연동하여 작업을 진행하고자 합니다.

Nodeos 설치

Nodeos의 경우 설치에 8Gbytes 이상의 RAM 및 20G이상의 여유 공간을 가진 시스템을 요구합니다. 물론 제시된 사양은 운영에 문제가 발생하는 사양이므로, AWS에서 범용적인 형태로 제공되는 T2 인스턴스를 기준으로 하여 t2.xlarge(vcpu:4, RAM:16G)를 선택하였습니다.

AWS에서 EC2 설정을 마쳤다면, 일반적인 설치 방법에 따라서 설치를 진행합니다. dawn이전의 설치 방식은 많은 종속성을 수작업으로 해결해 주는 등의 수고로움이 있었지만, 1.3.X의 현재 버전에서는 설치 스크립트를 이용하여 쉽게 설치할 수 있습니다.

# cd ~
# git clone https://github.com/EOSIO/eos --recursive
.... [다운로드가 진행됩니다.]
# cd eos
# ./eosio_build.sh
.... [종속성 패키지를 포함한 eosio를 빌드합니다. 많은 시간이 소요됩니다.]
# cd build
# make install
.... [eosio실행 파일 및 헤더파일등을 시스템에 복사합니다. 기본적으로 실행파일은 /usr/local/eosio/bin 에 위치하게 됩니다. 필요에 따라서 PATH에 추가하여 사용합니다.]

설치가 완료되면 설정은 나중에 하고, 우선 mongodb부터 설치하도록 합니다.

주의) eosio를 설치하면, mongodb cpp driver 및 mongodb server가 ~/opt 디렉토리에 설치됩니다. 기본적인 mongodb 설정과 함께 실행시키면 되도록 준비되어 있습니다만, 이 포스팅에서는 mongodb를 별도의 ec2 호스트로 분리하여 진행합니다. mongodb 역시 동기화를 위한 실행 시 CPU 및 RAM, HDD 공간 등의 자원을 많이 소모하기 때문입니다.

MongoDB 설치

EOS의 트랜잭션이 양이 많으므로, mongodb 역시 동기화 시 많은 시스템 자원을 필요로 합니다. 특히나 동기화, 또는 체인의 replay 시에는 많은 양의 쿼리가 진행되므로, AWS에서 범용적인 형태로 제공되는 T2 인스턴스를 기준으로 하여 t2.xlarge(vcpu:4, RAM:16G)를 선택하였습니다. 또한 mongodb의 간편한 설치를 위하여 OS는 AWS에서 제공하는 Amazon Linux 2 AMI 버전을 선택하였습니다.

AWS에서 EC2 설정을 마쳤다면, 일반적인 설치 방법에 따라서 설치를 진행합니다. 상세한 설치 과정은 포스팅의 주제에서 벗어나므로 문제 발생 시 다른 문서 등을 참조하시기 바랍니다.

우선 yum 을 이용하여 mongodb를 설치하기 위하여 아래와 같이 리포지토리를 추가합니다.

# vim /etc/yum.repos.d/mongodb-org-3.6.repo
[mongodb-org-3.6]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc

추가한 리포지토리에서 yum 을 이용하여 mongodb를 설치합니다.

yum install mongodb-org

외부 접속을 활성화하기 위하여 설정 파일을 수정합니다.

# vim /etc/mongod.conf
net:
port: 27017
bindIp: 0.0.0.0

노드 서버 최초 실행하기

노드 서버의 설정 파일 및 데이터 저장 디렉토리 등은 최초에 실행되면서 만들어지게 됩니다. 본 포스팅에서는 접근하기 쉬운 방법을 제시하기 위하여, 기본으로 생성되는 파일 위치, 설정 파일을 이용할 예정이므로 최초에 한번 nodeos를 실행시키고, 바로 Ctrl-C 키를 이용하여 종료합니다.

우선 최초 실행을 위해서 genesis 블록의 정보가 필요하므로, genesis 블록 파일을 다운로드 받아야 합니다. 아래의 내용을 붙여넣기 하여 genesis.json으로 저장하여 사용할 수도 있고, 다운로드 받아서 사용할 수도 있습니다.

wget https://eosnodes.privex.io/static/genesis.json
{
"initial_timestamp": "2018-06-08T08:08:08.888",
"initial_key": "EOS7EarnUhcyYqmdnPon8rm7mBCTnBoot6o7fE2WzjvEX2TdggbL3",
"initial_configuration": {
"max_block_net_usage": 1048576,
"target_block_net_usage_pct": 1000,
"max_transaction_net_usage": 524288,
"base_per_transaction_net_usage": 12,
"net_usage_leeway": 500,
"context_free_discount_net_usage_num": 20,
"context_free_discount_net_usage_den": 100,
"max_block_cpu_usage": 200000,
"target_block_cpu_usage_pct": 1000,
"max_transaction_cpu_usage": 150000,
"min_transaction_cpu_usage": 100,
"max_transaction_lifetime": 3600,
"deferred_trx_expiration_window": 600,
"max_transaction_delay": 3888000,
"max_inline_action_size": 4096,
"max_inline_action_depth": 4,
"max_authority_depth": 6
}
}

아래의 옵션을 추가하여 nodeos를 구동합니다.

nodeos --genesis-json=genesis.json

nodeos가 실행되자마자 Ctrl-C를 눌러 종료하도록 합니다.

데이터 저장 볼륨 추가

AWS ec2를 이용하기 때문에 nodeos에서 생산되는 블록 데이터와 mongodb plugin에서 생산되는 데이터베이스 데이터를 저장하기 위한 볼륨을 추가합니다. 본 포스팅 일자(2018.10) 기준으로 블록 데이터는 56G, 데이터베이스는 510G 정도이므로, 각각 200G 볼륨과, 1000G 볼륨 2개를 추가하여, /data, /eosdata 디렉토리로 마운트 하여 사용하도록 하였습니다. ec2에서 볼륨을 추가하는 방법과, 볼륨을 디렉토리로 마운트 하는 방법은 다루지 않도록 하겠습니다.

노드 서버 설정하기

노드 서버를 실행시키기 전 설정 파일을 수정합니다. 기본 설정에서 변경되어야 할 부분이 많지는 않습니다만, 메인넷에 동기화 되어있는 p2p 노드들의 주소들을 적어야 해서 내용이 좀 길어질 수 있습니다.

전반적인 참조는 https://eosnodes.privex.io/ 에서 갱신된 내용을 확인할 수 있습니다.

abi-serializer-max-time-ms = 15000
chain-state-db-size-mb = 4096
https-validate-host = false
mongodb-queue-size = 4096
mongodb-uri = mongodb://XXX.XXX.XXX.XXX:27017/EOS

plugin = eosio::http_plugin
plugin = eosio::chain_plugin
plugin = eosio::mongo_db_plugin

p2p-peer-address = bp.eosbeijing.one:8080
....

상기의 설정 파일은 Full Node 서버를 구축하는 기준점을 잡고자 한 설정이므로, 상세한 설정 파일을 검토하여 사용목적에 알맞은 플러그인 및 설정값을 추천합니다.

노드서버 실행하기 및 결론

이제 마지막으로 nodeos를 실행시켜, 블록이 동기화되는지 확인합니다. 메시지가 많이 상세히 나오므로, console 상에서 충분한 정보를 참조할 수 있습니다.

사실 Full Node 서버를 구성하기 위한 특별한 기술적인 이슈는 없습니다만, 동기화하는 기간이 꽤나 오래 걸리게 됩니다. 이 기간이라는 것이 몇 시간 단위가 아닌, 본 포스트에서 기술한 사양으로 150만 개의 블록(2018.8)를 동기화하는데 약 1주일 반 정도의 시간이 걸렸습니다.

비용 부분에 있어서도 사양 최적화 등을 통해서 조정이 가능할 수 있겠지만, 본 포스트 기준으로 월 약 500$ 정도의 비용이 소모되게 됩니다. 게다가 비용도 비용이지만, 서버를 운영하고, 지속적인 관리가 필요하게 됩니다.

따라서 Full Node 서버의 구성은 개발 시 필요사항 또는 DApp 서비스의 기능에서 반드시 필요한지 등을 상세히 검토하여 결정해야 할 것입니다.


투명한 게임 생태계를 위한 블록체인 플랫폼 ITAM Network

ITAM Network의 미디움을 구독하시면 새롭게 업로드 되는 정보를 가장 빠르게 확인하실 수 있습니다.

ITAM Network의 카카오톡 오픈채팅에서는 ITAM Network와 EOS 개발 관련 이야기를 나눌 수 있습니다. 👫

웹사이트: https://itam.games
카카오톡: https://open.kakao.com/o/g7XFlhJ
텔레그램: https://t.me/itamnetwork