Symbolノードに不具合が発生して何をやっても正常化せず、どうにもならなくなったのでOSクリーンインストールから再構築した話です。
目次
Symbolノードがリストから消えた
2021年3月にSymbolメインネットがローンチして以来、Symbolノード(peer, api)を2台構築して運用しています。
https://cryptocat-xym-node.com:3001/node/server
https://cryptocat-xym-node2.com:3001/node/server
いつもあひきさん(@ahikicoin)のSymbolノードリストと公式のノードリストを見てブロック高が遅れてないかとかバージョンは最新かとかをチェックしてるのですが、ある日リストから1台のノードが消えている事に気が付きました。
しかし、上記のアドレスにアクセスしても正常にレスポンスが返ってきておりsymbol-bootstrap healthCheck
も正常、最新ブロックに同期できているので一見動作は正常に見えました。
ハーベスト報酬も入っています。
なので、ツールのバグかラグがあるのかな?しばらくほっとけば直るだろう、と思って1日放置しましたがリストから名前は消えたままです。
そこでノードにSSHで接続してログやdockerのプロセスを確認したところ、以下の事がわかりました。
- 2~3分程度でエラーでdockerの一連のプロセスが落ちる→再起動するを繰り返す
- 起動している時は正常に動作する
dockerのプロセスが落ちている時は当然レスポンスは無い為、リストから消えていたのでしょう。
中途半端に動作するから少し気付きにくい症状です。
参考スペック
さくらのVPSの16Gプランを使用しておりスペックは高い方だと思います。
おかげでランニングコストもなかなか…
- CPU:8Core
- メモリ:16GB (+48GBスワップ)
- SSD:1600GB
- 料金:13,200円/月 (石狩プラン)
メモリ容量やディスクのI/Oが不足していると不具合が起きる可能性があるらしいですが、このスペックでリソース不足と言われたらまともにノード運営できる人の負担がエラい事になる…
XYMの価格が上がればペイできると思いますけどね!
余談ですが石狩を選んでいるのは寒い地方の為コストが安いのと、北海道地震で停電が起きた時に自社発電機で乗り切ったさくらインターネットさんへの信頼によるものです。
復帰の為に試した事
- docker再起動
- OS再起動
- symbol-bootstarp 再インストール
symbol-bootstrap config -p mainnet -a dual -c my-preset.yml --upgrade
で設定ファイル反映symbol-bootstrap compose --upgrade
でdockerを再構築symbol-bootstrap resetData
で初期化- targetフォルダ以下を全削除
全部ダメでした。
特に下2つはTanuson Slackでも不具合あった時に解決事例ありだったので期待していましたが、ダメだったので結局OSをクリーンインストールして再構築する事にしました。
再構築自体は別に難しくないのですが、現在の委任者様とかハーベスト関連の情報を引き継ぐ為にはなんかの情報をバックアップしておかないと多分完全別ノードになってしまう…!
と思ったのでTanuson Slackや記事を色々漁った所、偉大なる先人達による有益な情報がありました。
- カスタムプリセット.yml(例: my-preset.yml)、target/addresses.yml とそれを作った時のパスワード、ドメイン名を大事に保管しておけば完全復元可能
- addresses.ymlをカスタムプリセットに記述してパスワード入力して反映させる
- addresses.ymlをカスタムプリセットに記述する時はコピペじゃダメで、正しい書き方がある
づ~さんはメインネットローンチの遥か昔から技術的な検証を行って色々と情報展開してくれており、マジ神です。
ちなみにアドレスの設定さえ正しく復元していれば画像の③のharvesters.datは無くても同期が完了した時には自動的に委任者様の情報も含めて復元されていました。
念の為にバックアップしておけば自動で戻らなくても対応できるので安心です。
addresses.ymlをカスタムプリセットに転記する際はコピペしただけだと上手くいきません。
目指せ北海道さんの記事を見て正しい書き方に修正したところ、成功しました。
Symbolノード運用格闘記(ノード復旧編)【ShizuiNet】
移行・再構築の手順
- カスタムプリセット.yml、target/addresses.ymlとパスワード、ドメイン名をローカルPCなどに保管
- OS再インストール
- npm/node.js/docker/docker-compose/symbol-bootstrapインストール
- カスタムプリセット.ymlにaddresses.ymlのprivateKeyを転記して反映 (※移行で最重要!)
- symbol-bootstrapを起動 (docker-compose.yml生成)
- 通信確認
- docker ps で数分で再起動を繰り返している症状が再現していないか確認
- ノードリストへの反映確認
再構築はこの方の記事が参考になります。
さくらのVPSでNEM Symbol のテストネットノード構築
大事なノードの家財道具をバックアップ
SFTPなどを利用するなりコピペするなりしてローカルPCなどに保管しておきましょう。
- カスタムプリセット.yml
- target/addresses.yml
- ドメイン名
VPSの管理画面からOSを再インストール
私はさくらのVPSを利用していますが、その他の会社でもコンソールのどこかにOS再インストールができそうなボタンがあるはずです。
自分の場合はUbuntuの20.04 LTSをインストールしました。
メモリのスワップ領域を追加
私が借りているVPSのプランはCPU8コア、メモリ16GB、SSD1600GBのハイスペックプランですが、それでも公式の推奨要件によるとメモリ32GB必要との事なので、スワップ領域を追加して合計32GB以上にする事で対応します。
16GBのスワップ領域を追加する場合、以下のコマンドを実行します。
sudo fallocate -l 16G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile sudo swapon --show #追加された領域を確認 free -m #全体の領域を確認
環境を整えてsymbol-bootstrapをインストール
まっさらのOSなのでまずはaptのアップデートとnpm、Node.js、docker、docker-composeのインストールが必要です。
まずはaptのアップデート。
sudo apt update
nodejs v14.x、npmのインストール
sudo curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - sudo apt-get install -y nodejs sudo npm install -g npm@latest #最新版をインストール #バージョン確認 node -v npm -v
symbol-bootstrapのインストール
sudo npm install -g symbol-bootstrap@latest #最新版 #バージョン確認 symbol-bootstrap -v
dockerのインストール
sudo apt install -y apt-transport-https ca-certificates gnupg-agent software-properties-common sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerprint 0EBFCD88 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" sudo apt install -y docker-ce docker-ce-cli containerd.io #バージョン確認 docker -v
docker-composeのインストール
最新版のバージョンを見て数字を変更しましょう。
※v1系(1.x.x)とv2系(v2.x.x)でvの有無が違うので注意
v2系で挙動がおかしければ1系の最新版にした方がいいかもしれません。
https://github.com/docker/compose/releases
sudo curl -L https://github.com/docker/compose/releases/download/v2.1.1/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose #バージョン確認 docker-compose -v
このままrootユーザーでdockerを起動するとエラーが発生する為、ubuntuユーザーでdockerを操作できるようにし、一度ログアウトしてSSHログインし直します。
sudo usermod -aG docker ubuntu sudo systemctl restart docker.service exit #ログアウトして再ログイン必要
この後はubuntuユーザーで作業します。
(※rootユーザーでsymbol-bootstrapを操作すると不都合が起きる)
ubuntuユーザーの初期フォルダ(/home/ubuntu)にsymbol-bootstrap用のフォルダを作成し、カスタムプリセットを作成します。
(※フォルダ名は任意でOK)
mkdir -p ~/symbol-bootstrap
カスタムプリセットへaddress記載して反映
以前のノードの委任者やアドレスを引き継ぐ場合はここが一番重要です!
addresses.ymlのmain/tranport/remote/vrfの4つのprivateKeyをカスタムプリセット.ymlではmainPrivateKey/transportPrivateKey/remotePrivateKey/vrfPrivateKeyという項目名に変え、ENCRYPTED:にはそれぞれ対応したPrivateKeyを転記します。
publicKeyとaddressは転記不要です。
これをやらない場合は新しいアドレスが生成され、全く別のノードとなってしまいます。
version: 2 networkType: 104 nemesisGenerationHashSeed: 57F7DA206CB6AEDAA2D9F1843393F04CD45856C7700802E0D5F31A402072B2D6 sinkAddress: NHA5NTECC7B2Q3BGM6FJGXFLPVAJAT6QBMVB5CQ nodes: - name: node friendlyName: 'max50,8-Core,16GB(+48GB)Memory,SSD1600GB' roles: 'Peer,Api' main: privateKey: >- ENCRYPTED:1a62190f0YmycNDke8cdkNYze73+TVH9lSmlJKfwp3Fw5LL/xeZsY/LV8FnJw5s/VMAKHqX2Q33NwiyNTU= publicKey: ED93868B2C3A8247639DCA713E7129802C4C1E0ED29878F2FB62ACDE7E70AF4A address: NBWFSYOX3HG5K7C4ZNUQHI4D5PLNU3SISEYHVLQ transport: privateKey: >- ENCRYPTED:a3bbc8096a1iMqUEkn6bTvNvpRD7ooZiaA6GlZSiEaQE1nQ3lMIK8fXWwVh7kZ6w0w9k1G9qDq78Ct9qcs= publicKey: 2EA6F43363C381F90A3D0C99F9B649FD56CC31B2FC0987256D565B603BF7F0CA address: NA5QRYCEQN3HIQ3DUH5K7TGVNAD3QWVQXBOZJZI remote: privateKey: >- ENCRYPTED:8650759f47X2WvRTqO21hDC83oG5ndJFcih3R4w/ONW6VoT74sisNIWkTl2Y+c4ZHzWd9v1pxyYpfHXFus= publicKey: 1332FC053E1AC122FCAA357FF053B03ADD15B6550A70E32DB6EA65F6E59A4E2A address: NC3PRWVVMZYILGOSWKXMNR7DOXDM6KBV3M4RYXY vrf: privateKey: >- ENCRYPTED:bb3e56a3095v9KWSA3i83vUMJxoMMbEVCZ+vg5/mLCJk20dcHPzfOdq0T9wfaFqU3VPn7Li7vqrIURlsYw= publicKey: 11DE08DEEC5258F9168D2827EBCAD05B6A7F455B4FFFAF2DAF6636F03C214382 address: NDFY5CPY2PWWTM5CYH23GMATR27QINKVKQOHVAI
maxUnlockedAccounts: 50 beneficiaryAddress: NKX3E527EJNOBZVF5S2XLSPMDOYKUF minFeeMultiplier: 10 nodes: - host: 'cryptocat-xym-node.com' friendlyName: max50,8-Core,16GB(+48GB)Memory,SSD1600GB roles: 'Peer,Api' mainPrivateKey: >- ENCRYPTED:1a62190f0YmycNDke8cdkNYze73+TVH9lSmlJKfwp3Fw5LL/xeZsY/LV8FnJw5s/VMAKHqX2Q33NwiyNTU= transportPrivateKey: >- ENCRYPTED:a3bbc8096a1iMqUEkn6bTvNvpRD7ooZiaA6GlZSiEaQE1nQ3lMIK8fXWwVh7kZ6w0w9k1G9qDq78Ct9qcs= remotePrivateKey: >- ENCRYPTED:8650759f47X2WvRTqO21hDC83oG5ndJFcih3R4w/ONW6VoT74sisNIWkTl2Y+c4ZHzWd9v1pxyYpfHXFus= vrfPrivateKey: >- ENCRYPTED:bb3e56a3095v9KWSA3i83vUMJxoMMbEVCZ+vg5/mLCJk20dcHPzfOdq0T9wfaFqU3VPn7Li7vqrIURlsYw= httpsProxies: - excludeDockerService: false
カスタムプリセットを作成したらsymbol-bootstrap config -p mainnet -a dual -c カスタムプリセット.yml
で設定を反映させます。
パスワードを聞かれるので、移行元のノードで設定したパスワードを入力しましょう。
この時生成されるtarget/addresses.ymlのprivateKeyの値は変わっていると思いますが、暗号化を解除した中身は同じです。
publicKeyとaddressは変わりません。
暗号化する際は中身が同じでも解読方法の推測を避ける為、暗号化対象の本文以外にソルトと言って関係ない文字列を混ぜて暗号化するのがセオリーなのです。
symbol-bootstrapと同じdocker-compose.ymlでSSL対応したい場合はhttpsProxies: ~ excludeDockerService: falseを記載しましょう。
httpsProxyが自動的に生成されます。(※ドメインが必要)
httpsProxyをDockerから除外するのを無効(false)にする=httpsProxy有効化という事らしいです。(初期値:true)
わかりにくいですね…笑
symbol-bootstrapを起動!
symbol-bootstrap start -d
でsymbol-bootstrapを起動します。
先程入力したパスワードと同じです。
チェック用のコマンドでエラーが発生していない事を確認しましょう。
symbol-bootstrap healthCheck symbol-bootstrap verify
また、今回の不具合の「数分毎にdockerが落ちて再起動を繰り返す」が発生していないかを確認する為、
docker ps
を数分おきに入力してCREATEDが5分、10分、20分…1時間以上経過している事と、ノードリストに記載されて最新ブロックに同期できているかを確認します。
これらに問題無ければ正常に移行完了です!
まとめ
- カスタムプリセット.yml、target/addresses.ymlとパスワード、ドメイン名を保管しておけば移行・復元は自由
- addresses.ymlをカスタムプリセット.ymlに転記する時の書き方に注意!
- 不具合が発生してもとりあえずOSクリーンインストールして再構築すれば直る
- おかしいと思ったらdockerが再起動していないか
docker ps
で起動時間を見た方がよい - ノードリストから消えたら多分不具合発生してる
- づ~さんや、目指せ北海道さんを始め先人達に感謝!