Klaytn v1.5.0 State Migration: 노드 스토리지 절약하기

Tech at Klaytn
Klaytn
Published in
15 min readAug 4, 2020

이 포스팅은 Klaytn v1.5.0의 새로운 기능인 State Migration을 소개합니다. State Migration은 Klaytn 블록체인 노드에서 특정 시점을 기준으로 과거 State Trie를 제거하고 새로운 State Trie만을 노드 스토리지에 저장함으로써 노드 스토리지 사용량을 최대 75% 절약하는 기능입니다.

전체 포스팅 목록은 여기에서 확인하세요.

Overview

State Trie란?

Klaytn은 모든 Account 정보를 트리 형태 자료 구조(Merkle Patricia Trie)에 저장합니다. 이 트리를 State Trie라고도 하며 트리는 Klaytn Node 스토리지에 저장됩니다.

State Trie는 Klaytn 블록체인의 모든 블록마다 존재합니다. 즉, Klaytn의 블록 1개는 Account들의 정보를 저장하는 State Trie 1개를 가집니다.

State Migration이란?

State Migration이란 어떤 시점을 정하고 그 시점 블록에 있는 State Trie만을 남기고 그 이전 시점 블록들의 State Trie는 노드 스토리지에서 모두 삭제하는 기능입니다. 특정 시점에서 생성된 Block의 State Trie와 이후의 State Trie만 보관하면 EN (Endpoint Node)에는 EN 운영에 필요한 최신 체인 데이터만 남습니다. 따라서, State Migration을 하면 스토리지 공간을 크게 절약할 수 있습니다.

State Migration은 아래 단계로 구성됩니다.

1. Migration 블록을 결정

어떤 블록의 State Trie를 EN 스토리지에 남겨둘지 정합니다. State Trie를 백업하고 싶은 시점과 그 시점의 블록을 결정하는 작업입니다.

<그림 1. Klaytn 블록체인 각 블록과 State Trie >
<그림 2. Migration 블록을 결정 >

2. Migration 블록의 State Trie 복사 시작

Migration 블록을 결정했다면 새로운 EN 스토리지를 생성합니다. Migration 블록의 State Trie는 기존 EN 스토리지에 저장되어 있습니다. 이 Migration 블록의 State Trie를 순회하면서 State Trie를 새로운 EN 스토리지로 복사합니다.

참고: 이 Migration 블록의 State Trie를 복사하는 동안 새로운 블록은 계속해서 블록체인에 추가됩니다.

<그림 3. Migration 블록의 State Trie를 순회하며 복사한 데이터를 새 스토리지에 저장 >

3. 복사된 State Trie 검증

Migration 블록의 모든 State Trie를 새로운 스토리지에 복사했다면 모든 데이터가 제대로 복사되었는지 검증합니다.

4. 기존 EN 스토리지 삭제 및 새로운 EN 스토리지에 기록 시작

검증이 끝나면 기존 EN 스토리지를 삭제하고 새로운 EN 스토리지에 Migration 블록의 다음 블록부터 State Trie를 저장합니다.

<그림 4. 기존 스토리지를 삭제하고 새 데이터는 새 스토리지에 저장 >

권장 사양

State Migration 기능을 사용하려면 AWS를 기준으로 최소 m5.4xlarge 이상의 instance가 필요하며 State Migration을 완료하려면 평균적으로 약 50시간이 걸립니다(Klaytn 메인 체인인 Cypress 기준). 이는 최신 블록을 PN (Proxy Node)로부터 받아 이 블록의 트랜잭션을 처리하는 동시에 이 특정 Block의 State Trie를 순회하며 이들을 EN 스토리지에 복사하고 State Trie의 모든 내용이 정확하게 복사되었는지 확인하는 데 걸리는 시간입니다(m5.8xlarge에서는 약 30시간 소요).

준비 사항

State Migration을 수행하려면 Klaytn을 1.5.0으로 업데이트해야 합니다. Klaytn을 업데이트하기 위해 Klaytn 1.5.0 바이너리를 다운받은 후 기존 EN을 중지하고 1.4.x 바이너리를 1.5.0 바이너리로 교체한 후에 Klaytn을 다시 설치하십시오. Klaytn을 업데이트하는 과정은 사용자 환경에 따라 달라질 수 있습니다. 자세한 내용은 EN 설치 가이드를 확인하십시오.

State Migration 시작하기

State Migration 실행하기

State Migration을 실행하려면 Klaytn API에서 Admin API를 사용해야 합니다. Klaytn에 IPC로 접속하거나 RPC/WS에서 admin API를 임시로 활성화하여 접속합니다. Klaytn 접속 및 Admin API 사용에 관한 자세한 내용은 링크1, 링크2를 확인하십시오.

> ken attach ~/datadir/ken.ipc
Welcome to the Klaytn JavaScript console!
instance: Klaytn/v1.5.0+94c52174fe/linux-amd64/go1.14.1
datadir: /data/kend/data
modules: admin:1.0 debug:1.0 governance:1.0 istanbul:1.0 klay:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> admin.startStateMigration()
null

State Migration을 성공적으로 시작했다면 코드블록 admin.startStateMigration()null을 반환합니다. State Migration을 시작하면 EN은 블록체인에 추가될 블록들에 담긴 트랜잭션들을 처리하면서, Migration 블록의 State Trie를 순회하며 이를 새로운 EN 스토리지에 복사합니다.

State Migration 시작 로그:

INFO[07/20,20:44:35 +09] [5] State migration is prepared expectedMigrationStartingBlockNumber=29911450INFO[07/20,20:55:51 +09] [5] State migration is started block=29911450 root=06b082d~60b893INFO[07/20,20:56:06 +09] [44] Add a new stakingInfo to stakingInfoCache and stakingInfoDB blockNum=29894400INFO[07/20,20:56:06 +09] [46] Start setting a new database for state trie migration blockNum=29911450INFO[07/20,20:56:06 +09] [46] LevelDB configurations path=/data/kend/data/klay/chaindata/statetrie_migrated_29911450/0 levelDBCacheSize=36 openFilesLimit=97 useBufferPool=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000INFO[07/20,20:56:06 +09] [46] LevelDB configurations path=/data/kend/data/klay/chaindata/statetrie_migrated_29911450/1 levelDBCacheSize=36 openFilesLimit=97 useBufferPool=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000INFO[07/20,20:56:06 +09] [46] LevelDB configurations path=/data/kend/data/klay/chaindata/statetrie_migrated_29911450/2 levelDBCacheSize=36 openFilesLimit=97 useBufferPool=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000INFO[07/20,20:56:06 +09] [46] LevelDB configurations path=/data/kend/data/klay/chaindata/statetrie_migrated_29911450/3 levelDBCacheSize=36 openFilesLimit=97 useBufferPool=true compressionType=none compactionTableSize(MB)=2 compactionTableSizeMultiplier=1.000INFO[07/20,20:56:06 +09] [46] Created a new database for state trie migration newStateTrieDB=/data/kend/data/klay/chaindata/statetrie_migrated_29911450

State Migration 모니터링

State Migration 진행 상태를 로그로 확인하기

State Migration을 진행 시 아래와 같이 주기적으로 상태 로그를 확인할 수 있습니다.

10초 주기로 출력되는 진행 상태 로그

INFO[07/20,20:56:28 +09] [5] State migration progress progress=0% totalRead=2321 totalCommitted=0 pending=37134 read=2321 readElapsed=22.184223002s processElapsed=33.163185ms written=0 writeElapsed=17.257µs elapsed=22.217s totalElapsed=22.21783843sINFO[07/21,08:44:33 +09] [5] State migration progress progress=64.917% totalRead=106657041 totalCommitted=106654913 pending=13469 read=19456 readElapsed=11h36m47.910769711s processElapsed=5m7.371806884s written=19717 writeElapsed=5m25.733869118s elapsed=10.147s totalElapsed=11h48m26.757580868s

State Migration 진행 상태를 RPC API로 확인하기

또 아래와 같이 RPC API로 현재 State Migration 진행 상태를 확인할 수 있습니다. 아래 코드는 State Trie 복사가 약 64% 완료되었음을 나타냅니다.

> admin.stateMigrationStatus
{
committed: 106743172,
err: "null",
isMigration: true,
migrationBlockNumber: 29911450,
pending: 12036,
progress: 64.9169921875,
read: 106745105
}

복사한 State Trie 검증하기

State Trie를 복사하면 아래와 같은 로그가 출력됩니다. 이제, State Trie의 모든 내용이 빠짐없이 복사되었는지 검증하는 작업을 진행합니다.

검증 진행 상태는 아래와 같은 로그를 통해 파악할 수 있습니다.

검증 진행 상태 로그:

INFO[07/23,11:11:22 +09] [5] State migration progress progress=100% totalRead=368572444 totalCommitted=368572444 pending=0 read=5374 readElapsed=61h36m58.773140567s processElapsed=17m45.115580174s written=6488 writeElapsed=16m36.198342833s elapsed=4.207s totalElapsed=62h15m15.550216445s
INFO[07/23,11:11:22 +09] [5] State migration : Copy is done totalRead=368572444 totalCommitted=368572444 totalElapsed=62h15m15.550264864s committed per second=1644.564
INFO[07/23,11:11:22 +09] [6] CheckStateConsistencyParallel is started root=0x06b082dd3a077dee8fa7d0016ea9e96f64d8d40f3332ecff44c779b35f60b893 len(children)=16
INFO[07/23,11:11:32 +09] [6] CheckStateConsistencyParallel progress cnt=35793
...

State Migration 종료

State Migration 종료 로그 확인하기

State Trie 검증이 완료되면 State Migration이 종료됩니다. 아래와 같은 로그가 출력되면 State Migration이 정상 종료된 것입니다.

State Migration 종료 로그:

INFO[07/25,09:20:12 +09] [6] CheckStateConsistencyParallel is done cnt=649698856 err=nil
INFO[07/25,09:20:12 +09] [5] State migration is completed copyElapsed=62h15m15.550264864s checkElapsed=46h8m50.500767758s

결과 확인: 체인 데이터가 차지하는 스토리지 용량 변화 확인

Klaytn 메인 체인인 Cypress의 체인 데이터 용량은 아래와 같습니다.

> du -d1 -h
651G ./statetrie
56G ./body
2.7G ./misc
240K ./bridgeservice
60G ./header
6.5G ./txlookup
40G ./receipts
815G .

새로운 EN을 부팅한 후, 이 EN에서 Cypress를 대상으로 State Migration을 실행하면 이 EN에 저장되는 Cypress 체인 데이터 용량은 아래와 같이 줄어듭니다.

> du -d1 -h
129G ./statetrie_migrated_29911450
61G ./body
3.0G ./misc
240K ./bridgeservice
69G ./header
7.3G ./txlookup
47G ./receipts
315G .

(State Trie외에 다른 항목에서 용량이 증가한 것은 Migration을 진행하는 동시에 새로운 블록이 생성됨에 따라 증가한 것입니다.)

State Migration 실행 시 주의사항

State Migration시 주의해야 할 부분들은 아래와 같습니다:

  • Migration 이후에는 이전의 state trie가 삭제됨으로 이전 시점의 account의 상태는 조회가 불가능 합니다.
  • Migration 진행 중에 노드를 재시작하지 마십시오. 노드를 재시작하면 State Migration도 처음부터 다시 진행되어 소요 시간이 늘어납니다.
  • 낮은 성능의 Instance에서 State Migration을 실행하면 소요 시간이 매우 늘어날 수 있습니다.(최소 m5.4xlarge 스펙을 권장합니다.)
  • HDD가 아니라 반드시 IOPS 3000이상의 SSD를 사용해야 합니다.
    (Klaytn은 잦은 IO로 인해 IOPS 요건을 만족해야만 합니다.)

결론

위와 같이, State Migration을 완료하면 Klaytn EN에 체인 데이터를 저장하는 데 필요한 스토리지 용량을 크게 줄일 수 있습니다. 물론, 이러한 State Migration을 EN 운영자가 일일이 수행하는 것은 운영자 입장에게 부담일 수 있습니다. 그래서, Klaytn Team은 곧 Cypress의 최신 체인 데이터를 Migration하여 공개할 예정입니다.이 공개 데이터를 사용하면, EN 운영자는 State Trie를 직접 복사하고 검증하지 않고도 Cypress의 최신 체인 데이터를 자신의 EN으로 곧바로 Migration할 수 있습니다. Klaytn Team은 언제나 여러분이 Klaytn을 좀 더 빠르고 편리하게 활용할 수 있는 기능을 개발하고자 노력합니다.

다음 소식을 기다려주세요~! 감사합니다.

--

--