Configurar Componentes de Software Hyperion WAX
Continuando con nuestro artículo sobre la construcción de componentes de software Hyperion WAX, este siguiente subartículo de la serie guiará a través de la configuración de cada uno de estos componentes.
EOS RIO tiene un excelente Repositorio de Documentación Hyperion que incluye detalles sobre cómo configurar todos los componentes de software de Hyperion, sin embargo, en este artículo se cubrirá el proceso de configuración manual para Hyperion usando Elasticsearch 8.x y los componentes de software asociados.
Una vez más, esta serie de Cómo Hacerlo Técnico cubrirá parte del mismo contenido de EOS RIO y agregará matices operacionales desde un punto de vista práctico y nuestra experiencia.
Aprende más sobre EOS RIO Hyperion
Este artículo ha sido actualizado para reflejar la implementación actual de Hyperion en septiembre de 2023.
Configurar Componentes de Software Hyperion WAX
El servicio de Historial Completo Hyperion es una colección de ocho aplicaciones de software construidas por EOS RIO y aplicaciones estándar de la industria.
Este ejemplo de paseo por la configuración tiene todos los componentes de software, excluyendo el nodo SHIP, instalados en un solo servidor Ubuntu 22.04 como por "Construir Componentes de Software Hyperion WAX". Este ejemplo de servidor también está equipado con 16GB de RAM y un moderno CPU de 8 núcleos a 4Ghz, adecuado para ejecutar Historial Completo en el Testnet WAX. También se recomienda deshabilitar el espacio de intercambio del sistema.
Por favor, referencia "Introducción a Hyperion Full History WAX" para sugerencias de infraestructura, especialmente al considerar proporcionar el servicio en Mainnet WAX.
El proceso de configuración para cada uno de estos bloques de construcción primarios se cubre a continuación:
Nodo de Estado-Historia (SHIP) del Software WAX
La implementación de Hyperion WAX requiere acceso a un Nodo de Estado-Historia WAX completamente sincronizado. Este proceso de configuración se cubre extensamente en WAX Technical How To #7.
RabbitMQ
Sigue el proceso de configuración a continuación:
#Habilita la Interfaz de Usuario Web
> sudo rabbitmq-plugins enable rabbitmq_management
#Añade Hyperion como un Host Virtual
> sudo rabbitmqctl add_vhost hyperion
#Crea un USUARIO y CONTRASEÑA (Suplanta con los tuyos)
> sudo rabbitmqctl add_user <USUARIO> <CONTRASEÑA>
#Establece tu USUARIO como Administrador
> sudo rabbitmqctl set_user_tags <USUARIO> administrator
#Establece los permisos de tu USUARIO al Host Virtual
> sudo rabbitmqctl set_permissions -p hyperion <USUARIO> ".*" ".*" ".*"
Verifica el acceso a la Interfaz de Usuario Web usando un navegador:
http://<DIRECCIÓN IP DEL SERVIDOR>:15672
Redis
La versión 7.x de Redis tiene una política de memoria predeterminada complicada de usar toda la memoria disponible sin expulsión, lo que significa que usará toda la memoria disponible hasta que se agote y se bloquee.
Para manejar este desafío, es importante establecer la política de memoria a allkeys-lru (Mantiene las claves más recientemente usadas; elimina las claves menos recientemente usadas). Hemos asignado el 25% de la memoria del Nodo Hyperion a Redis con buenos resultados.
Configura como a continuación:
> sudo nano /etc/redis/redis.conf
###GENERAL###
daemonize yes
supervised systemd
###GESTIÓN DE MEMORIA###
maxmemory 4gb
maxmemory-policy allkeys-lru
> sudo systemctl restart redis-server
> sudo systemctl enable redis-server
Para ver la configuración y estadísticas de memoria de Redis:
> redis-cli
-> info memory
Depura problemas de Redis en los logs:
> sudo tail -f /var/log/redis/redis-server.log
Node.js
Aquí no hay nada que configurar
, sin embargo, asegúrate de estar ejecutando Node.js v16
> node -v
v18.x.x
PM2
Aquí no hay nada que configurar, verifica que estás ejecutando la última versión de PM25.3.0
> pm2 --version
5.3.0
Elasticsearch
Configura Elasticsearch 8.x como a continuación:
> sudo nano /etc/elasticsearch/elasticsearch.yml
cluster.name: <TU NOMBRE DE CLÚSTER>
node.name: <TU NOMBRE DE NODO>
bootstrap.memory_lock: true
network.host: <Dirección IP LAN>
cluster.initial_master_nodes: ["<DIRECCIÓN IP LAN>"]
Además de la configuración anterior, también puede ser ventajoso cambiar el marcador de uso de disco de Elasticsearch (80% es el alto predeterminado) y el número máximo de fragmentos por nodo (1000 es el máximo predeterminado de fragmentos) dependiendo de tu implementación.
> sudo nano /etc/elasticsearch/elasticsearch.yml
cluster.routing.allocation.disk.threshold_enabled: true
cluster.routing.allocation.disk.watermark.low: 93%
cluster.routing.allocation.disk.watermark.high: 95%
cluster.max_shards_per_node: 3000
Configura la configuración de la Máquina Virtual Java como a continuación, no excedas el umbral OOP de 31GB, este ejemplo usará 8GB adecuado para Hyperion en el Testnet WAX y el 50% de la memoria del servidor:
> sudo nano /etc/elasticsearch/jvm.options
-Xms8g
-Xmx8g
Permite que el servicio Elasticsearch bloquee la memoria jvm requerida en el servidor
> sudo systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
Configuración de systemctrl a continuación:
#Recarga Unidades
> sudo systemctl daemon-reload
#Inicia Elasticsearch
> sudo systemctl start elasticsearch.service
#Inicia Elasticsearch automáticamente al arrancar
> sudo systemctl enable elasticsearch.service
Verifica que Elasticsearch esté corriendo:
> sudo systemctl status elasticsearch.service
Depura problemas de Elasticsearch en los logs:
> sudo tail -f /var/log/elasticsearch/gc.log
> sudo tail -f /var/log/elasticsearch/<TU NOMBRE DE CLÚSTER>.log
Prueba la API Rest que por defecto requerirá acceso al certificado del clúster Elasticsearch y se ejecutará como root para acceder al cert:
> sudo su -
root@> curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic https://<DIRECCIÓN IP LAN>:9200
**Ingresa la contraseña "superusuario" de "elastic"***
Enter host password for user 'elastic':
{
"name" : "<TU NOMBRE DE NODO>",
"cluster_name" : "<TU NOMBRE DE CLÚSTER>",
"cluster_uuid" : "exucKwVpRJubHGq5Jwu1_Q",
"version" : {
"number" : "8.10.1",
"build_flavor" : "default",
"build_type" : "deb",
"build_hash" : "a94744f97522b2b7ee8b5dc13be7ee11082b8d6b",
"build_date" : "2023-09-14T20:16:27.027355296Z",
"build_snapshot" : false,
"lucene_version" : "9.7.0",
"minimum_wire_compatibility_version" : "7.17.0",
"minimum_index_compatibility_version" : "7.0.0"
},
"tagline" : "You Know, for Search"
}
Kibana
Elasticsearch 8.x trae algunas eficiencias en cuanto a conectar nodos adicionales y servicios de pila como Kibana al utilizar automáticamente certificados. Esto es genial, por supuesto, sin embargo, el Indexador y la API de Hyperion no tienen un mecanismo en este momento para utilizar un certificado para conectarse a la API REST de Elasticsearch y esta función parece estar vinculada al SSL.
_Tus resultados pueden variar, pero ha sido mi experiencia que la manera más segura de asegurar que el software de Hyperion pueda conectarse a Elasticsearch 8.x sin un certificado es deshabilitar el cifrado para las conexiones de clientes de la API HTTP. Como toda esta comunicación entre nodos ocurre de manera privada en tu
centro de datos, no debería ser un problema._
ACTUALIZACIÓN: Utilizando una instalación fresca de la última versión de Elasticsearch, pude conectar Hyperion con SSL encriptado (HTTPS) dejando la configuración automática del certificado funcionando bien con Kibana. Dejaré ambas opciones en esta guía para ser completo.
Configura Kibana como a continuación:
> sudo nano /etc/kibana/kibana.yml
server.host: "0.0.0.0"
Configuración de systemctrl a continuación:
#Recarga Unidades
> sudo systemctl daemon-reload
#Inicia Kibana
> sudo systemctl start kibana
#Inicia Kibana automáticamente al arrancar
> sudo systemctl enable kibana.service
Verifica que Kibana esté corriendo:
> sudo systemctl status kibana.service
A continuación, demostraré ambas formas de conectar Kibana a Elasticsearch 8.x, utilizando el método automático de certificados y luego utilizando un método local no encriptado con contraseña.
Método de Certificado:
Genera y copia un token de inscripción en el Servidor Elasticsearch para ser utilizado por Kibana:
> sudo /usr/share/elasticsearch/bin/elasticsearch-create-enrollment-token -s kibana
Conéctate a la Interfaz de Usuario Web de Kibana usando un navegador y pega el token de acceso:
http://<DIRECCIÓN IP DEL SERVIDOR>:5601/
Ingresa el Token de Inscripción de Kibana
Obtén el código de verificación de Kibana desde la línea de comandos del servidor Kibana e ingrésalo en la GUI de Kibana:
> sudo /usr/share/kibana/bin/kibana-verification-code
Tu código de verificación es: XXX XXX
Kibana ahora está conectado a Elasticsearch, puedes iniciar sesión con el nombre de usuario "elastic" y la contraseña de "superusuario" de elastic.
Método de Contraseña:
La cuenta kibana_system necesitará ser habilitada con una contraseña en Elasticsearch, copia la salida de la contraseña:
> sudo su - root@> /usr/share/elasticsearch/bin/elasticsearch-reset-password -u kibana_system
Luego agrega las credenciales + detalles del host al archivo de configuración de Kibana y si es necesario, comenta con HASH# la configuración SSL generada automáticamente en el fondo del archivo .yml:
> sudo nano /etc/kibana/kibana.yml
elasticsearch.hosts: ["http://<DIRECCIÓN IP DEL SERVIDOR>:9200"]
elasticsearch.username: "kibana_system"
elasticsearch.password: "<CONTRASEÑA>"
Deshabilita la seguridad xpack para clientes de la API HTTP en Elasticsearch:
#Habilita el cifrado para conexiones de clientes de la API HTTP, como Kibana, Logstash y Agentes
xpack.security.http.ssl:
enabled: false
Finalmente, reinicia Elasticsearch y Kibana:
> sudo systemctl restart elasticsearch.service
> sudo systemctl restart kibana.service
Depura problemas de Kibana en los logs del sistema:
> tail -f /var/log/syslog
Idealmente, sería mejor si se pudieran usar certificados para todo el acceso a la API REST, actualizaré este artículo cuando tenga conocimiento de una solución adecuada.
EOS RIO Hyperion Indexador y API
Hay dos archivos .json necesarios para ejecutar el Indexador y la API de Hyperion. connections.json
y .config.json
connections.json
El siguiente ejemplo de connections.json
está configurado para WAX Testnet, modifica la configuración y la red para tu propia implementación. Esta configuración utiliza un usuario y una contraseña para conectarse a Elasticsearch con HTTP.
> cd ~/hyperion-history-api
> cp example-connections.json connections.json
> sudo nano connections.json
{
"amqp": {
"host": "127.0.0.1:5672",
"api": "127.0.0.1:15672",
"protocol": "http",
"user": "<USUARIO Rabbitmq>",
"pass": "<CONTRASEÑA Rabbitmq>",
"vhost": "hyperion",
"frameMax
": "0x10000"
},
"elasticsearch": {
"protocol": "http",
"host": "<DIRECCIÓN IP DEL SERVIDOR>:9200",
"ingest_nodes": [
"<DIRECCIÓN IP DEL SERVIDOR>:9200"
],
"user": "elastic",
"pass": "<contraseña superusuario>"
},
"redis": {
"host": "127.0.0.1",
"port": "6379"
},
"chains": {
"wax": {
"name": "WAX Testnet", #ACTUALIZA#
"chain_id": "f16b1833c747c43682f4386fca9cbb327929334a762755ebec17f6f23c9b8a12",
"http": "http://<DIRECCIÓN IP DE LA API DE NODEOS>:8888",
"ship": "ws://<DIRECCIÓN IP DE SHIP DE NODEOS>:8080",
"WS_ROUTER_HOST": "127.0.0.1",
"WS_ROUTER_PORT": 7001,
"control_port": 7002
}
}
}
.config.json
El archivo .config.json
se nombra para reflejar el nombre de la cadena en este caso wax.config.json
. La configuración, como antes, necesita ser ajustada para adaptarse a tu propia configuración e implementación utilizando el ejemplo proporcionado como base.
Hay tres fases al iniciar un nuevo Indexador Hyperion, la primera fase es lo que se llama el "Escaneo ABI", que es el modo predeterminado en el software proporcionado example.config.json
.
La siguiente configuración (un servidor de EOSphere) preparará este ejemplo para estar listo para ejecutar la fase de Escaneo ABI de Indexación que se cubrirá en el siguiente artículo.
Configura como a continuación, toma nota de los parámetros #ACTUALIZA#
> cd ~/hyperion-history-api/chains
> cp example.config.json wax.config.json
> nano wax.config.json
{
"api": {
"enabled": true,
"pm2_scaling": 1,
"node_max_old_space_size": 1024,
"chain_name": "WAX Testnet", #ACTUALIZA#
"server_addr": "<DIRECCIÓN IP PARA LA API DEL SERVIDOR>", #ACTUALIZA#
"server_port": 7000,
"stream_port": 1234,
"stream_scroll_limit": -1,
"stream_scroll_batch": 500,
"server_name": "<URL PÚBLICA DE TU SERVIDOR>", #ACTUALIZA#
"provider_name": "<NOMBRE DE TU GUILD>", #ACTUALIZA#
"provider_url": "<URL DE TU ORGANIZACIÓN>", #ACTUALIZA#
"chain_api": "",
"push_api": "",
"chain_logo_url": "<URL DEL LOGO.jpg DE LA CADENA>", #ACTUALIZA#
"enable_caching": false, #DESHABILITADO PARA INDEXACIÓN MASIVA#
"cache_life": 1,
"limits": {
"get_actions": 1000,
"get_voters": 100,
"get_links": 1000,
"get_deltas": 1000,
"get_trx_actions": 200
},
"access_log": false,
"chain_api_error_log": false,
"custom_core_token": "",
"enable_export_action": false,
"disable_rate_limit": false,
"rate_limit_rpm": 1000,
"rate_limit_allow": [],
"disable_tx_cache": true, #DESHABILITADO PARA INDEXACIÓN MASIVA#
"tx_cache_expiration_sec": 3600,
"v1_chain_cache": [
{
"path": "get_block",
"ttl": 3000
},
{
"path": "get_info",
"ttl": 500
}
]
},
"indexer": {
"enabled": true,
"node_max_old_space_size": 4096,
"start_on": 0,
"stop_on": 0,
"rewrite": false,
"purge_queues": false,
"live_reader": false, #DESHABILITADO PARA INDEXACIÓN MASIVA#
"live_only_mode": false,
"abi_scan_mode": true, #ESTABLECIDO PARA MODO DE ESCANEO ABI#
"fetch_block": true,
"fetch_traces": true,
"
disable_reading": false,
"disable_indexing": false,
"process_deltas": true,
"disable_delta_rm": true
},
"settings": {
"preview": false,
"chain": "wax", #ESTABLECE EL ID DE LA CADENA#
"eosio_alias": "eosio",
"parser": "3.2", #ESTABLECE A 1.8 para SHIP < 3.1#
"auto_stop": 0,
"index_version": "v1",
"debug": false,
"bp_logs": false,
"bp_monitoring": false,
"ipc_debug_rate": 60000,
"allow_custom_abi": false,
"rate_monitoring": true,
"max_ws_payload_mb": 256,
"ds_profiling": false,
"auto_mode_switch": false,
"hot_warm_policy": false,
"custom_policy": "",
"index_partition_size": 10000000,
"es_replicas": 0
},
"blacklists": {
"actions": [],
"deltas": []
},
"whitelists": {
"actions": [],
"deltas": [],
"max_depth": 10,
"root_only": false
},
"scaling": {
"readers": 2, #INCREMENTA LOS LECTORES#
"ds_queues": 1,
"ds_threads": 1,
"ds_pool_size": 1,
"indexing_queues": 1,
"ad_idx_queues": 1,
"dyn_idx_queues": 1,
"max_autoscale": 4,
"batch_size": 5000,
"resume_trigger": 5000,
"auto_scale_trigger": 20000,
"block_queue_limit": 10000,
"max_queue_limit": 100000,
"routing_mode": "round_robin",
"polling_interval": 10000
},
"features": {
"streaming": {
"enable": false,
"traces": false,
"deltas": false
},
"tables": {
"proposals": true,
"accounts": true,
"voters": true
},
"index_deltas": true,
"index_transfer_memo": true
"index_all_deltas": true,
"deferred_trx": false,
"failed_trx": false,
"resource_limits": false,
"resource_usage": false
},
"prefetch": {
"read": 50,
"block": 100,
"index": 500
},
"plugins": {}
}
Toda la configuración está ahora lista para pasar a ejecutar el Indexador y la API de Hyperion por primera vez, esto se cubrirá en el siguiente subartículo de WAX Hyperion Full History.
Estas Guías Técnicas para Desarrolladores WAX se crean utilizando material fuente de la Serie Cómo Hacerlo Técnico de EOSphere WAX
Asegúrate de hacer cualquier pregunta en el Telegram de EOSphere.