Настройка клиента Ethereum с высокой пропускной способностью
Я пытаюсь настроить сервер (или набор серверов), который может выступать в качестве узла Ethereum, на который я могу отправлять большое количество запросов (до 100 в секунду) для получения данных из цепочки блоков, таких как учетная запись сальдо, транзакции и т. д. (например, Etherscan). Поправьте меня, если я ошибаюсь, но я не думаю, что такая система могла бы быть возможной с обычным клиентом четности или geth, работающим на одном сервере с цепочечными данными на SSD, так что я собираюсь сделать следующее: follwing:
- Настройте клиент четности с SSD на сервере A, который будет действовать как обычный узел
- Синхронизировать данные цепочки на другом SSD на сервере B
- Настройте клиент четности на сервере B, который не подключен к сети Ethereum и использует данные цепочки, скопированные с сервера A. Не обрабатывает транзакции.
- Транзакции, балансы и т. Д. Могут запрашиваться в RPC-сокете сервера B.
Причиной такой настройки является то, что сервер B имеет минимальные накладные расходы, что позволяет обрабатывать гораздо больше запросов.
Мне интересно, имеет ли смысл использовать эту настройку, или это вообще возможно. Лучше было бы использовать более простое решение, но я не могу найти много информации о том, как работают сервисы блокчейна с высокой пропускной способностью. Буду очень признателен за любые указатели.
2 ответа
Поправьте меня, если я ошибаюсь, но я не думаю, что такая система могла бы быть возможной с обычным клиентом Parity или Geth, работающим на одном сервере с цепочкой данных на SSD.
Я рад исправить вас: Parity может легко обрабатывать 1_000 запросов RPC в секунду на оборудовании потребительского уровня.
Если вам нужно 10_000 запросов в секунду, вы все равно можете достичь этого с помощью одного экземпляра Parity на корпоративном сервере высокого класса с 128 ГБ ОЗУ и резервным флеш-хранилищем Raid-0. Обязательно настройте огромный размер кэша с помощью Parity:
parity --cache-size 65536
Вы могли бы даже пойти дальше в оптимизации, поместив весь блокчейн в память, установив --data-dir
к TMPFS.
Если вам все еще нужно больше, я бы запустил несколько установок, подобных описанным выше, и поставил балансировщик нагрузки перед установкой, которая направляет запросы, отсортированные по типу, на доступные машины сзади.
Раскрытие: я работаю на Паритет. Однако я думаю, что подобная статистика верна для Геты.
Я думаю, что лучшим вариантом будет блок предварительной обработки. Запустите экземпляр клиента Ethereum, выполните итерации по всем блокам и предварительно обработайте их (извлеките всю необходимую информацию и сохраните ее в базе данных). Это позволит более гибко реагировать на ваши запросы.
Допустим, вы хотите получить список транзакций с определенной учетной записи. Этого нельзя сделать с помощью текущего ETH RPC API (я имею в виду не оптимизированным способом). Лучше всего было бы предварительно обработать все блоки, извлечь все транзакции и разместить их в базе данных, чтобы вы могли запрашивать транзакции, поступающие с определенного адреса.
Запуск API поверх созданной вами базы данных сделает ваш сервер более производительным.