Настройка клиента Ethereum с высокой пропускной способностью

Я пытаюсь настроить сервер (или набор серверов), который может выступать в качестве узла Ethereum, на который я могу отправлять большое количество запросов (до 100 в секунду) для получения данных из цепочки блоков, таких как учетная запись сальдо, транзакции и т. д. (например, Etherscan). Поправьте меня, если я ошибаюсь, но я не думаю, что такая система могла бы быть возможной с обычным клиентом четности или geth, работающим на одном сервере с цепочечными данными на SSD, так что я собираюсь сделать следующее: follwing:

  1. Настройте клиент четности с SSD на сервере A, который будет действовать как обычный узел
  2. Синхронизировать данные цепочки на другом SSD на сервере B
  3. Настройте клиент четности на сервере B, который не подключен к сети Ethereum и использует данные цепочки, скопированные с сервера A. Не обрабатывает транзакции.
  4. Транзакции, балансы и т. Д. Могут запрашиваться в 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 поверх созданной вами базы данных сделает ваш сервер более производительным.

Другие вопросы по тегам