Go-Ethereum

可以將鏈數據拆分到兩個(或更多)位置嗎?

  • June 19, 2021

隨著完整節點的大小迅速增長,我正在尋找一種方法將我的鏈數據拆分到多個硬碟驅動器上。我有一個能夠同步鏈的內部 1TB SSD,然後是一個內部 HDD 和一個外部 SSD,每個 1TB。我的內部驅動器正在迅速裝滿,因此我有興趣將其中一些移植chaindata到其他驅動器中。

我正在使用 Geth(在 Linux 上),但我希望這是一個與客戶端無關的問題,以防其他人在使用不同的客戶端時遇到相同的問題。

謝謝!

Geth 從 v1.9 開始freezer具有https://blog.ethereum.org/2019/07/10/geth-v1-9-0/

冰箱

如果我們不必在昂貴且敏感的 SSD 上浪費如此多寶貴的空間來執行乙太坊節點,而寧願將至少一些數據轉移到便宜且耐用的 HDD 上,那不是很神奇嗎?

在 v1.9.0 版本中,Geth 將其數據庫分為兩部分(由 Péter Szilágyi、Martin Holst Swende 和 Gary Rong 完成):

到目前為止,最近的塊、所有狀態和加速結構都保存在快速鍵值儲存 (LevelDB) 中。這意味著要在 SSD 上執行,因為磁碟 IO 性能都至關重要。

早於截止門檻值(3 個 epoch)的塊和收據會從 LevelDB 移出到自定義冷凍數據庫中,該數據庫由少數僅附加的平面文件支持。由於節點很少需要讀取這些數據,並且只會附加到它們,因此 HDD 應該非常適合覆蓋它。塊 7.77M 的新快速同步將 79GB 數據放入冰箱,將 60GB 數據放入 LevelDB。

冷凍機基礎知識

預設情況下,Geth 會將您的冷凍機放在您的 chaindata 文件夾中,即古代子文件夾中。使用子文件夾的原因是為了避免破壞任何可能在實例周圍或跨實例移動數據庫的自動化工具。您可以通過 –datadir.ancient CLI 標誌明確地將冷凍機放置在不同的位置。

當您從舊版本更新到 v1.9.0 時,Geth 將自動將塊和收據從 LevelDB 數據庫遷移到冰櫃中。如果您當時沒有指定 –datadir.ancient,但想稍後移動它,則需要手動複製現有的 Ancient 文件夾,然後將 –datadir.ancient 設置為正確的路徑啟動 Geth。

冷凍技巧

由於冷凍機(冷數據)與狀態(熱數據)分開儲存,一個有趣的問題是如果兩個數據庫之一失去會發生什麼?

如果冰箱被刪除(或指定了錯誤的路徑),您實際上是從 Geth 下方拉出地毯。該節點將變得不可用,因此它明確禁止在啟動時執行此操作。但是,如果狀態數據庫是一個刪除,Geth 將根據凍結的數據重建其所有索引;然後在頂部進行快速同步以回填缺失的狀態。從本質上講,冰箱可以用作游擊狀態修剪器,以定期清除堆積的垃圾。通過刪除狀態數據庫,而不是冷凍機,節點將進行快速同步以獲取最新狀態,但將重用之前已下載的所有現有區塊和收據數據。

您可以通過 geth removedb 觸發此操作(加上 –datadir 和 –datadir.ancient 標誌,如果您使用自定義標誌);要求它只刪除狀態數據庫,而不是古代數據庫。

請注意,從古代數據庫中重新索引所有事務可能需要一個多小時,並且快速同步只會在之後開始。這可能會在不久的將來變成後台程序。

引用自:https://ethereum.stackexchange.com/questions/84469