Lightning Network ノードのDBの冗長化/バックアップ
Lightning Network ノードのDBバックアップ
冗長化/バックアップ
- DBのレプリケーションによるチャネルの最新状態の保持
- チャネルの開閉時のバックアップ(SCB: Static Channel Backup)
考え方
- データベースは、同期的なレプリケーションを行えば、冗長化が可能
- データベース上でチャネルの最新状態を維持できなくなったら、SCBを利用して相手のノードに強制閉鎖の依頼が必要。
- 閉鎖は自分でやらずに相手に依頼する。さもないと相手にPenalty Txを発行されて資産を失う。
- 閉鎖せずにオフチェーンTxを継続した場合の言及は見つからなかった。本来の履歴におけるCommitment TxがRevokeされていない状況になるため、恐らく損することになる(要出典)。
SCB (Static Channel Backup)
- DLP (Data Loss Protection)
- 最新状態を維持できなくなった時に、相手のチャネルに強制閉鎖を依頼する仕組み。
- SCB (Static Channel Backup)
- チャネルの開閉状態のみ記録した上で、DLPを利用できるようにしたもの。
- LNDの場合
-
channel.backup
ファイルを元に、Bobに強制閉鎖の依頼の通知を飛ばす。 -
channel.backup
ファイルは、チャネル開閉時に更新される。 - SCBのデータのバックアップの取り方
-
- CLNの場合
-
emergency.recover
ファイルがチャネルを開いた際に更新される
-
LNDのデータベース
DBのデフォルトがbboltで、単一ファイルに書き込むKVSなので障害に弱い(モバイルノードでの運用には便利)。
障害耐性のために、代わりに etcd, PostgreSQL(, SQLite3?) が使える。
etcd を使う場合は、LNDノードもクラスター化できる。
(Leader Electionにetcdの機能を使う。)
The leader election feature currently relies on etcd to work both for the election itself and for the replicated data store.
Is leader election supported for Postgres?
No, leader election is not supported by Postgres itself since it doesn't have a mechanism to reliably determine a leading node. It is, however, possible to use Postgres as the LND database backend while using an etcd cluster purely for the leader election functionality.
DBにPostgreSQL等を使用する場合は、同期的なレプリケーション(Synchronous Replication)にすべき。
In case a replication architecture is planned, streaming replication should be avoided, ... synchronous mode, albeit slower, is paramount for lnd data integrity across the copies, as it will finalize writes only after the slave confirmed successful replication.
(補足) bboltを使用する場合
bbolt (デフォルトで使われるKVS) は、channel.db
にファイルで保存される。バックアップはほぼ不可能。
基本的に channel.db
はmigrateに利用し、restoreでは使用しない。
ファイルからのバックアップは、クラッシュしたノードから直接取得するなど、確実に最新の状態の記録が保証されている時にのみ行うこと。
bboltでも長らく運用実績が存在する。モバイルノードなどの環境で便利。
bboltを安定して使用したい場合、ファイルシステムレベルで冗長化したほうがいい(RAIDやZFS/Btrfsなど)。
CLN
SQLite3, PostgreSQLに対応している。
エンタープライズとしては、PostgreSQLを使うと良い。
冗長化には、SQLite3はlitestream, PostgreSQLはpg_clusterがある。
同期的なレプリケーションにすべき。
不明点
- DBが落ちなければ、ノードが落ちてもデータは失われないか?
- 特に言及ないし大丈夫だと思うが、わからない。
- 復旧時に相手ピアにオンチェーン化されている可能性はあるだろう。
- CLNでノードを分散する方法は?
Core Lightningのプラグイン一覧
SQLite3のbackup plugin
下記はdatastoreといって、plugin用のデータ管理に関係するもの。今までのDBの議論とは関係ない。