26-8-31 @blaze.apps의 trim 증인서버 구축 방법
@blaze.apps가 1기가 크키의 block_log로 증인 노드를 구축할 수 있는 방법을 올렸습니다.
그동안 제가 직접 해보려고 했는데 컴파일링하지 못해 실패했습니다.
@blaze.apps에게 부탁했고 이렇게 만들었습니다.
앞으로 증인노드가 점점 커지고 있기 때문에 이렇게 하는 방안도 고민을 해야 할 것 같습니다.
이방법으로 노드를 돌리고 있는데 성공적으로 잘 돌아가고 있습니다.
block_log 파일을 잘라내는 것도 성공적입니다.
@blaze.apps가 올린 포스트는
https://www.steempro.com/@blaze.apps/run-a-trimmed-steem-witness-node-in-minutes-mtdmya3z
입니다. 참고해서 설치하면 매우 쉽게 가능합니다.
아래의 글은 guide.me글을 한글로 번역한 것입니다
몇 분 안에 Steem 증인 노드 실행하기 (트리밍 스냅샷 + Docker)
이 가이드는 사전 동기화된 상태 스냅샷을 사용하여 Steem 노드를 메인넷과 동기화합니다. 제네시스 블록부터 시작하여 약 1억 1천만 개의 블록(~400GB 이상)을 동기화하는 대신, 최근 ~1GB의 원시 블록 기록(트리밍된 block_log를 통해)만 유지합니다. 전체 계정/체인 상태(잔액, 포스트, 투표 등)는 스냅샷 날짜 기준으로 완전하고 최신입니다.
결과물: 라이브 블록을 검증하고 적용하는 노드로, 모든 풀 노드와 동일하지만 매우 오래된 블록을 다른 피어에게 제공할 수 없습니다(제한 사항 참조). 이는 투표/증인 운영에 적합합니다. 아카이브/API 노드가 아닙니다.
사전 준비 사항
- Docker 및 Compose 플러그인 (
docker compose version이 작동해야 함) git,lz4- ~50GB의 여유 디스크 공간 (압축 스냅샷 다운로드에 ~19GB, 압축 해제 후 ~28GB — 아카이브를 삭제하면 다시 ~28GB로 줄일 수 있음)
- 8GB 이상의 RAM
- 사전 빌드된 이미지를 가져오는 데 몇 분 (또는 직접 빌드하려면 20~30분 — 선택 사항: 직접 이미지 빌드하기 참조)
1. 코드 가져오기
git clone https://github.com/blazeapps007/steem.git
cd steem
git checkout trim-test-46c7d93d
브랜치가 중요합니다: steemit/steem의 공식 0.23.1 릴리스에 트림 패치가 적용되었으며, 스냅샷의 온디스크 스키마가 작성된 정확한 CMake 플래그로 빌드되었습니다. 자세한 내용은 '정확한 브랜치/플래그가 중요한 이유'를 참조하세요. (이 경로에서는 서브모듈을 초기화할 필요가 없습니다. 직접 이미지를 빌드하는 경우에만 필요합니다.)
2. 이미지 가져오기
docker pull steemblazer/trimmed-steem:latest
이 이미지는 스냅샷이 생성된 정확한 LOW_MEMORY_NODE / ENABLE_MIRA / CLEAR_VOTES / SKIP_BY_TX_ID 플래그와 일치하는 사전 빌드된 이미지입니다. 직접 소스에서 빌드하려면 이 단계를 건너뛰고 '선택 사항: 직접 이미지 빌드하기'를 참조한 후, docker-compose.yml의 image:를 로컬 태그로 지정하세요.
3. 스냅샷 다운로드 및 압축 해제
curl -L -o witness_node_data_dir.tar.lz4 https://pub-1f381b2bd7c04cbba634ee9deac91a06.r2.dev/witness_node_data_dir.tar.lz4
tar --use-compress-program=lz4 -xf witness_node_data_dir.tar.lz4
이 명령은 현재 디렉토리의 witness_node_data_dir/로 바로 압축을 해제합니다. 올바르게 생성되었는지 확인하세요. block_log, block_log.index, block_log.offset 및 많은 rocksdb_* 디렉토리가 보여야 합니다.
ls witness_node_data_dir/blockchain
노드가 깨끗하게 시작되는 것을 확인한 후(5단계), 아카이브를 삭제하여 디스크 공간을 확보할 수 있습니다.
rm witness_node_data_dir.tar.lz4
4. 설정 파일 생성
템플릿을 복사하여 config.ini로 사용하세요.
cp contrib/trimmed_config.ini witness_node_data_dir/config.ini
이 템플릿은 실제 운영 중인 증인 구성에서 가져온 것이므로, 광범위한/중복 시드 노드 목록, 적절한 p2p/shared-file 튜닝, 분할 stderr+파일 로깅이 이미 포함되어 있습니다. plugin = witness는 활성화되어 있지만 증인 ID는 주석 처리되어 있습니다. 복사하기 전에 다음 두 줄을 편집하여 자신의 증인 계정명과 서명 키를 추가하세요.
# name of witness controlled by this node (e.g. initwitness )
witness = "your-witness-account"
# WIF PRIVATE KEY to be used by one or more witnesses or miners
private-key = 5Kxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
보안 참고:
private-key는 증인의 전용 서명 키(witness_set_properties작업을 통해 설정됨)여야 하며, 계정의 소유자/활성 키가 아닙니다.config.ini를 git에 커밋하거나 공유하지 마세요. 서명 키를 가진 사람은 누구나 귀하를 대신하여 블록에 서명할 수 있습니다(그러면 증인이 패널티를 받거나 비활성화됨). 이 파일을 비밀번호처럼 취급하세요.아직 증인 ID가 없는 동기화 노드만 원한다면
witness/private-key를 주석 처리된 상태로 두고(plugin = witness도 제거) — 안전하게 시작하고 확인할 수 있습니다.
5. 시작하기
저장소 루트에는 이미 docker-compose.yml이 있으며, 사전 빌드된 이미지를 가리키고 방금 압축 해제한 ./witness_node_data_dir 디렉토리를 마운트합니다.
services:
witness:
image: steemblazer/trimmed-steem:latest
container_name: steem-witness
# 인바운드 P2P 연결을 허용하려면 주석 해제하세요 (실제 증인에게 권장되지만 동기화에는 필요하지 않음)
# ports:
# - "2001:2001"
volumes:
- ./witness_node_data_dir:/steem
command: --data-dir=/steem
restart: unless-stopped
logging:
driver: "json-file"
options:
max-size: "50m"
max-file: "3"
가져오는 대신 직접 이미지를 빌드한 경우(선택 사항: 직접 이미지 빌드하기 참조), image:를 로컬 태그(예: steem-witness:trimmed)로 변경하세요. 그렇지 않으면 그냥 시작하세요.
docker compose up -d
docker compose logs -f
다음과 같은 내용이 표시되어야 합니다.
block_log.cpp:125 open ] Using data offset: 411320856405
chain_plugin.cpp:616 plugin_startup ] Started on blockchain with 109084430 blocks
p2p_plugin.cpp:688 plugin_startup ] P2P Plugin started
p2p_plugin.cpp:212 handle_block ] Got 3 transactions on block 109085716 ...
블록 번호가 약 3초마다 증가하면 동기화되어 라이브 상태인 것입니다. Ctrl-C를 누르면 로그 팔로우가 종료되지만 컨테이너는 중지되지 않습니다.
지속적인 유지 관리: 재트리밍
block_log는 새로운 블록이 도착함에 따라 계속 커집니다. 스냅샷은 영구적으로 디스크 공간을 제한하지 않고 새로운 시작을 제공할 뿐입니다. 주기적으로 노드를 중지한 상태에서 재트리밍하세요(steemd가 파일을 열어둔 상태에서 트리밍하면 이름이 바뀐 백업 파일에 쓰기가 자동으로 연결되어 문제가 발생할 수 있음).
docker compose stop
cd witness_node_data_dir/blockchain
bash /path/to/steem/programs/util/trim_block_log.sh
cd -
docker compose start
기본적으로 약 1GB로 트리밍됩니다. programs/util/trim_block_log.sh 상단의 target_size를 편집하여 크기를 변경할 수 있습니다. 잘라낸 내용의 block_log.org 백업 파일이 생성됩니다. 노드가 깨끗하게 다시 시작되는 것을 확인한 후 삭제해도 됩니다.
rm witness_node_data_dir/blockchain/block_log.org
선택 사항: 직접 이미지 빌드하기
steemblazer/trimmed-steem을 가져오지 않으려면 소스에서 동일한 이미지를 빌드할 수 있습니다.
git submodule update --init --recursive
docker build -f Dockerfile.trimmed-witness -t steem-witness:trimmed .
최신 멀티코어 시스템에서 20~30분이 소요됩니다. 커피 한 잔 하세요.
Dockerfile.trimmed-witness의 LOW_MEMORY_NODE / ENABLE_MIRA / CLEAR_VOTES / SKIP_BY_TX_ID 빌드 인수를 편집하지 마세요. 스냅샷이 생성된 방식과 일치해야 합니다. 그렇지 않으면 Column family not found 오류와 함께 steemd가 시작되지 않습니다. '정확한 브랜치/플래그가 중요한 이유'를 참조하세요.
그런 다음 docker-compose.yml의 image:를 사전 빌드된 이미지 대신 steem-witness:trimmed로 지정하세요(5단계 참조).
문제 해결
Column family not found: ... / You have to open all column families at startup. steemd 빌드의 스키마가 스냅샷과 일치하지 않습니다. 수정하지 않은 steemblazer/trimmed-steem:latest를 사용하거나, 직접 빌드했다면 정확한 trim-test-46c7d93d 브랜치의 Dockerfile.trimmed-witness에서 수정 없이 빌드되었는지 확인하세요. 다른 steemd 빌드(다른 이미지, 다른 브랜치, 또는 동일한 브랜치라도 다른 cmake 플래그)를 이 스냅샷과 혼합하지 마세요.
Too many open files / While open directory: ... Too many open files / You have to open all column families at startup. steemd/MIRA는 각각 많은 파일을 가진 수십 개의 개별 rocksdb_* 열 패밀리를 엽니다. 기본 컨테이너당 파일 설명자 제한(종종 1024 소프트)으로는 충분하지 않습니다. docker-compose.yml은 이미 이에 대한 높은 ulimits.nofile을 설정합니다. 해당 Compose 파일을 사용하지 않는 경우(예: 일반 docker run), --ulimit nofile=1048576:1048576을 직접 추가하세요.
일반 작동 중 로그에 가끔 basic_ios::clear: iostream error가 나타납니다. 예상되며 무해합니다. 피어가 트림 창보다 오래된 블록을 요청했지만 더 이상 제공할 수 없는 경우입니다. 동기화나 검증에 영향을 미치지 않습니다.
시작 후 처음 몇 초 동안 attempting to push a block that is too old (assert_exception)가 나타납니다. 이 역시 예상됩니다. 초기 P2P 핸드셰이크 중 여러 시드 피어가 순서가 약간 잘못된 블록을 알리는 일반적인 노이즈입니다. 그 후 동기화는 정상적으로 계속됩니다.
정확한 브랜치/플래그가 중요한 이유
RocksDB(MIRA 스토리지 계층을 통해)는 각 체인 객체의 인덱스를 별도의 열 패밀리에 저장하며, 예상되는 열 패밀리 집합은 C++ 객체 유형이 컴파일되는 방식에서 파생됩니다. 특히 comment_object와 transaction_object는 LOW_MEMORY_NODE 및 SKIP_BY_TX_ID 빌드 플래그에 따라 인덱스를 추가하거나 제거합니다. 다른 플래그로 빌드된 steemd 바이너리가 이 스냅샷을 열면 디스크에 있는 것과 다른 열 패밀리 집합을 기대하고 시작을 거부합니다. trim-test-46c7d93d 브랜치(steemit의 0.23.1 릴리스에 트림 패치를 추가한 것)는 이 스냅샷을 생성한 것과 비교하여 체인 객체의 레이아웃을 변경하지 않으므로, 실제로 일치해야 하는 것은 기본 소스 개정이 아닌 플래그입니다.
제한 사항
- 이 노드는 다른 피어에게 전체 기록 블록을 제공할 수 없습니다. 최근 ~1GB(그리고 다음 트림까지 계속 증가)의 블록 테일만 디스크에 있습니다. 합의에는 완전히 참여하지만(검증하고 블록을 생성할 수 있음) 아카이브나 블록 탐색기 API 노드는 아닙니다.
- 일단 트리밍되면 원본 트리밍되지 않은 블록 기록은 이 노드에서 복구할 수 없습니다. 전체 아카이브 기록이 필요하면 대신 제네시스부터 별도의 풀 노드를 실행하세요.
This post has been upvoted by @italygame witness curation trail
If you like our work and want to support us, please consider to approve our witness
Come and visit Italy Community
High-Yield Curation by @steem-seven
Your content has been supported!
Maximize your passive income!
Delegate your SP to us and earn high rewards
Click here to see our Tiered Reward System
We are the hope!