300 lines
8.4 KiB
Markdown
300 lines
8.4 KiB
Markdown
# Agave Sync Recipe
|
|
|
|
Data: 2026-03-13
|
|
Aktualizacja: 2026-03-15
|
|
|
|
Ten plik opisuje praktyczna recepture rozruchu Agave na `mevnode_sol` w dwoch trybach:
|
|
|
|
- `catch-up mode`: celem jest dogonienie sieci
|
|
- `product mode`: celem jest obsluga workloadow RPC i Yellowstone dla reszty systemu
|
|
|
|
## Plik sterujacy
|
|
|
|
Aktualny start validatora jest skladany przez:
|
|
|
|
- `/usr/local/bin/agave-validator.sh`
|
|
|
|
Usluga systemd:
|
|
|
|
- `agave-validator.service`
|
|
|
|
## Catch-up Mode
|
|
|
|
Stan wdrozony na `mevnode_sol` 2026-03-15 podczas przejscia na `Agave 3.1.9`.
|
|
|
|
Cel:
|
|
|
|
- maksymalnie odchudzic runtime podczas syncu
|
|
- nie wystawiac Yellowstone
|
|
- nie budowac ciezkiego profilu RPC
|
|
|
|
Wlaczone:
|
|
|
|
- `--private-rpc`
|
|
- `--rpc-bind-address 127.0.0.1`
|
|
- `--rpc-port 8899`
|
|
- `--accounts-db-cache-limit-mb 32768`
|
|
- `--no-voting`
|
|
- `--limit-ledger-size 50000000`
|
|
- `--minimal-snapshot-download-speed 25000000`
|
|
- `--maximum-snapshot-download-abort 8`
|
|
- `--use-snapshot-archives-at-startup always`
|
|
- `--known-validator 7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW`
|
|
- `--only-known-rpc`
|
|
- dodatkowy `--entrypoint 51.89.11.213:8001` dla Frankfurtu
|
|
|
|
Wylaczone:
|
|
|
|
- `--geyser-plugin-config /etc/agave/geyser.json`
|
|
- `--full-rpc-api`
|
|
- `--enable-accounts-disk-index`
|
|
- `--accounts-index-path /data/ledger/accounts_index`
|
|
- `--account-index ...`
|
|
|
|
Wazne:
|
|
|
|
- `--accounts-index-path` nie moze zostac, jesli `--enable-accounts-disk-index` jest wylaczone
|
|
- zostawienie samego `--accounts-index-path` powoduje start failure Agave
|
|
|
|
## Product Mode
|
|
|
|
To jest profil po pelnym syncu, kiedy node ma znowu obslugiwac reszte systemu.
|
|
Stan finalny z 2026-03-15:
|
|
|
|
Wlaczone:
|
|
|
|
- `--geyser-plugin-config /etc/agave/geyser.json`
|
|
- `--full-rpc-api`
|
|
- `--enable-accounts-disk-index`
|
|
- `--accounts-db-cache-limit-mb 32768`
|
|
- `--maximum-full-snapshots-to-retain 1`
|
|
- `--maximum-incremental-snapshots-to-retain 1`
|
|
- `--use-snapshot-archives-at-startup when-newest`
|
|
- `--known-validator 7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW`
|
|
- `--only-known-rpc`
|
|
|
|
Cel:
|
|
|
|
- Yellowstone dla `mevnode_bot`
|
|
- ciezsze metody RPC
|
|
- nizszy swap niz przy czysto pamieciowym accounts index
|
|
|
|
Uwaga:
|
|
|
|
- w aktualnym wdrozeniu nie ma `--accounts-index-path`
|
|
- w aktualnym wdrozeniu nie ma `--account-index program-id`
|
|
- samo `--enable-accounts-disk-index` zmniejsza presje na swap, ale nie przyspiesza ciezkich `getProgramAccounts`
|
|
- retencja snapshotow `1/1` nie jest tutaj opcjonalna; to jest kluczowy bezpiecznik operacyjny
|
|
|
|
## Dlaczego retencja `1/1` jest krytyczna
|
|
|
|
Na `mevnode_sol` katalog `/data/state` jest jednym filesystemem `2 TB`, na ktorym siedza jednoczesnie:
|
|
|
|
- `accounts`
|
|
- `accounts disk index`
|
|
- archiwa snapshotow
|
|
- tymczasowe `tmp-snapshot-archive-*`
|
|
|
|
Przy profilu:
|
|
|
|
- `--full-rpc-api`
|
|
- `--enable-accounts-disk-index`
|
|
- `--geyser-plugin-config /etc/agave/geyser.json`
|
|
|
|
sam katalog `accounts` potrafi zajmowac ponad `1 TB`, a snapshoty i pliki tymczasowe potrafia dopchnac `/data/state` do `100%`.
|
|
|
|
Wniosek praktyczny:
|
|
|
|
- `--maximum-full-snapshots-to-retain 1`
|
|
- `--maximum-incremental-snapshots-to-retain 1`
|
|
|
|
to nie jest tylko "porzadek na dysku", tylko warunek utrzymania zapasu miejsca na:
|
|
|
|
- prace `accounts disk index`
|
|
- tworzenie nowego snapshotu
|
|
- restart z lokalnego full + incremental
|
|
|
|
Bez tego Agave moze dojsc do `ENOSPC`, przestac odpowiadac po RPC albo wymusic awaryjny cleanup przed restartem.
|
|
|
|
## Dlaczego nie 8 GB
|
|
|
|
W tej sesji nie bylo twardych danych, ze samo `8 GB` rozwiazuje problem. Przy `32 GB` host nie byl pod presja pamieci:
|
|
|
|
- RAM hosta: okolo `186 GiB`
|
|
- available memory: okolo `143 GiB`
|
|
- swap praktycznie nieuzywany
|
|
|
|
Problem wygladal bardziej na zbyt ciezki profil catch-up niz na brak RAM.
|
|
|
|
## Obserwacje z 2026-03-13
|
|
|
|
Przed przelaczeniem na `catch-up mode`:
|
|
|
|
- `geyser` byl wylaczony
|
|
- nadal wlaczone byly `--full-rpc-api` i `--enable-accounts-disk-index`
|
|
- node nie nadganial heada; lokalny slot rosl wolniej niz publiczny mainnet
|
|
|
|
Po przelaczeniu na `catch-up mode`:
|
|
|
|
- Agave wystartowalo poprawnie bez `full-rpc-api`
|
|
- Agave wystartowalo poprawnie bez `accounts-disk-index`
|
|
- aktywny proces nie ma juz `geyser`, `full-rpc-api` ani `accounts-disk-index`
|
|
|
|
## Kolejnosc wdrozenia z 2026-03-15
|
|
|
|
Poniżej jest praktyczna kolejnosc, ktora byla wykonana na `mevnode_sol`.
|
|
|
|
1. Zatrzymac usluge:
|
|
|
|
```bash
|
|
sudo systemctl stop agave-validator.service
|
|
```
|
|
|
|
2. Wyczyscic `ledger` i `state`:
|
|
|
|
```bash
|
|
sudo rm -rf /data/ledger/*
|
|
sudo rm -rf /data/state/*
|
|
```
|
|
|
|
3. Zbudowac i podmienic Agave na `3.1.9`:
|
|
|
|
- build z taga `v3.1.9`
|
|
- instalacja do `/opt/agave-v3.1.9`
|
|
- przelaczenie `/opt/agave -> /opt/agave-v3.1.9`
|
|
|
|
4. Wystartowac lekki `catch-up mode`:
|
|
|
|
- bez `geyser`
|
|
- bez `--full-rpc-api`
|
|
- bez `--enable-accounts-disk-index`
|
|
- bez `--accounts-index-path`
|
|
- z `--use-snapshot-archives-at-startup always`
|
|
|
|
5. Wymusic szybki source snapshotu z Frankfurtu:
|
|
|
|
- `--known-validator 7mF8NZJdREuM1uwYcvKffuY9QJBEoHhNp4hZ4NS2fuXW`
|
|
- `--only-known-rpc`
|
|
- `--entrypoint 51.89.11.213:8001`
|
|
|
|
6. Poczekac az `catch-up mode` dojdzie do `getHealth=ok`.
|
|
|
|
7. Zmienic startup snapshotow z `always` na `when-newest`.
|
|
|
|
Powod:
|
|
|
|
- przy `always` kazdy restart wymuszal ladowanie z archive
|
|
- `when-newest` zostawia Agave mozliwosc uzycia nowszego archive, ale nie wymusza tej sciezki przy kazdym restarcie
|
|
|
|
8. Wlaczyc `--full-rpc-api` i zrestartowac.
|
|
|
|
9. Po ponownym syncu wlaczyc `--enable-accounts-disk-index` i zrestartowac.
|
|
|
|
Powod:
|
|
|
|
- przy `full-rpc` bez `accounts-disk-index` swap byl praktycznie zapychany
|
|
- po wlaczeniu `accounts-disk-index` swap spadl prawie do zera
|
|
|
|
10. Po kolejnym syncu wlaczyc `geyser`.
|
|
|
|
Praktycznie:
|
|
|
|
- dopiac `--geyser-plugin-config /etc/agave/geyser.json`
|
|
- upewnic sie, ze `libpath` z configu istnieje
|
|
- na `mevnode_sol` trzeba bylo utworzyc symlink:
|
|
|
|
```bash
|
|
sudo mkdir -p /opt/agave/plugins
|
|
sudo ln -sfn /opt/agave.live-3.1.10-20260314-0903/plugins/v12.1.0+solana.3.1.10 /opt/agave/plugins/current
|
|
```
|
|
|
|
11. Po wlaczeniu geysera zweryfikowac:
|
|
|
|
- `10.91.0.1:10000` nasluchuje
|
|
- `10.91.0.1:8999/metrics` odpowiada
|
|
- w logu jest:
|
|
- `Geyser plugin: accounts_update_notifier: true, transaction_notifier: true, entry_notifier: true`
|
|
|
|
12. Na koncu ustawic retencje snapshotow:
|
|
|
|
- `--maximum-full-snapshots-to-retain 1`
|
|
- `--maximum-incremental-snapshots-to-retain 1`
|
|
|
|
Cel:
|
|
|
|
- ograniczyc wzrost `/data/state/snapshots`
|
|
- zostawic minimalny zestaw do restartu
|
|
- nie dopuscic do zapchania `2 TB` `/data/state`, na ktorym siedza tez `accounts` i `accounts disk index`
|
|
|
|
13. Po syncu usuwac tylko stare snapshoty, nie ruszajac:
|
|
|
|
- aktualnego full snapshotu
|
|
- najnowszego ukonczonego incremental
|
|
- aktywnego `tmp-snapshot-archive-*`
|
|
|
|
To byl praktyczny cleanup, ktory odzyskal kilkaset GB, bez psucia restart path.
|
|
|
|
## Jak sprawdzac stan
|
|
|
|
Jednym poleceniem snapshot kluczowych metryk:
|
|
|
|
```bash
|
|
./scripts/ops/agave-metrics.sh mevnode
|
|
```
|
|
|
|
Skrypt zbiera:
|
|
|
|
- health RPC i lokalny slot
|
|
- publiczny head i `lag_slots`
|
|
- porty `8899` / `8999` / `10000`
|
|
- `rss_mb`, `pcpu`, `pmem`
|
|
- `mem_available_mb`, `swap_used_mb`
|
|
- `vm_us`, `vm_sy`, `vm_id`, `vm_wa`
|
|
- ostatnie `rcvbuf_errors_delta_recent`
|
|
|
|
Status uslugi:
|
|
|
|
```bash
|
|
ssh mevnode 'systemctl --no-pager --full status agave-validator.service | sed -n "1,20p"'
|
|
```
|
|
|
|
Czy Yellowstone jest wylaczony:
|
|
|
|
```bash
|
|
ssh mevnode 'ss -ltnp | grep -E ":(8899|10000|8999)\\b" || true'
|
|
```
|
|
|
|
Szybki health:
|
|
|
|
```bash
|
|
ssh mevnode "printf '%s' '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getHealth\"}' | curl -sS -H 'Content-Type: application/json' -d @- http://10.91.0.1:8899"
|
|
```
|
|
|
|
Pomiar, czy node nadgania:
|
|
|
|
```bash
|
|
ssh mevnode 'for i in 1 2 3; do ts=$(date +%s); pjson=$(printf "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\",\"params\":[{\"commitment\":\"processed\"}]}" ); pubjson=$(printf "{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"getSlot\"}" ); p=$(curl -sS -m 6 -H "Content-Type: application/json" -d "$pjson" http://10.91.0.1:8899 | sed -n "s/.*\"result\":\\([0-9][0-9]*\\).*/\\1/p"); pub=$(curl -sS -m 6 -H "Content-Type: application/json" -d "$pubjson" https://api.mainnet-beta.solana.com | sed -n "s/.*\"result\":\\([0-9][0-9]*\\).*/\\1/p"); echo "$ts $p $pub"; sleep 10; done'
|
|
```
|
|
|
|
Interpretacja:
|
|
|
|
- jesli lokalny `processed` rosnie szybciej niz publiczny head, node nadgania
|
|
- jesli lokalny `processed` rosnie wolniej, lag dalej narasta
|
|
|
|
## Re-enable Po Sync
|
|
|
|
Nie wlaczac wszystkiego naraz.
|
|
|
|
Kolejnosc rekomendowana:
|
|
|
|
1. `--full-rpc-api`
|
|
2. `--enable-accounts-disk-index`
|
|
3. `--geyser-plugin-config /etc/agave/geyser.json`
|
|
4. retencja snapshotow `1/1`
|
|
|
|
Po kazdym etapie:
|
|
|
|
- restart `agave-validator.service`
|
|
- poczekac na `getHealth=ok`
|
|
- dopiero potem przechodzic do nastepnego etapu
|