Principales conclusiones

  • El libro mayor de Binance almacena saldos de cuentas y transacciones, al mismo tiempo que permite servicios para realizar transacciones.

  • Crea las condiciones necesarias para un alto rendimiento, disponibilidad 24 horas al día, 7 días a la semana y precisión de datos a nivel de bits.

El papel de Binance Ledger detrás de escena la convierte en una de las tecnologías más importantes de Binance. Aprenda exactamente cómo funciona y los problemas que resuelve en el funcionamiento del intercambio de cifrado más grande del mundo aquí.

¿Alguna vez te has preguntado exactamente qué es lo que motiva a Binance? Con la necesidad de procesar millones de transacciones diariamente a través de una base de usuarios masiva, vale la pena echar un vistazo a lo que Binance tiene bajo el capó.

La base de las operaciones técnicas de Binance es su libro mayor. El libro mayor almacena los saldos y las transacciones de las cuentas y al mismo tiempo habilita los servicios para realizar transacciones.

Binance tiene altos requisitos para el libro mayor

Como puede imaginar, los requisitos para Ledger son altos para que pueda satisfacer la demanda masiva de los usuarios. Hay tres puntos principales que deben considerarse:

  • Alto rendimiento con capacidad para una gran cantidad de TPS (transacciones por segundo) en horas pico.

  • Disponibilidad 24 horas al día, 7 días a la semana sin tiempo de inactividad.

  • Precisión de datos a nivel de bits, sin pérdida de fondos ni errores de transacción.

Veamos un ejemplo de una entrada básica en el Libro mayor. Aquí hay una transacción común en la que la cuenta 1 transfiere 1 BTC a la cuenta 2.

Saldo antes de la transacción:

ID DE LA CUENTA

ACTIVO

BALANCE

1

btc

10

2

btc

0.1

tabla 1

Saldo después de la transacción:

ID DE LA CUENTA

ACTIVO

BALANCE

1

btc

9

2

btc

1.1

Tabla 2

En esta transacción, hay dos comandos:

  1. Cuenta 1    -1 BTC

  2. Cuenta 2 +1 BTC

Cuando se realiza la transacción, se almacenarán dos registros de saldo para auditoría y conciliación.

ID DE LA CUENTA

ACTIVO

DELTA

TX_ID

TIEMPO

100001

btc

-1

tx-001

2022-01-01  01:02:03

100002

btc

+1

tx-001

2022-01-01 01:02:03

Tabla 3

La solución estándar de la industria

Una solución de contabilidad estándar de la industria se basa en una base de datos relacional. Volviendo al ejemplo anterior, los dos comandos de la transacción se pueden traducir en dos declaraciones SQL y ejecutarse en una transacción de base de datos (tabla 4).

comenzar la transacción;

ACTUALIZAR saldo_1 establecer saldo = saldo - 1

DONDE account_id=1 y activo = 'BTC' y saldo - 1 >= 0;

Si la fila 0 se ve afectada, retroceda;

ACTUALIZAR saldo_2 establecer saldo = saldo + 1

DONDE account_id=2 y activo = 'BTC' y saldo + 1 >= 0;

Si la fila 0 se ve afectada, retroceda;

comprometerse;

tabla-4

Las ventajas de la solución.

  1. Es bastante sencillo de implementar.

  2. Es fácil aplicar técnicas comunes de ajuste de bases de datos, como división de lectura/escritura y fragmentación, para mejorar el rendimiento.

  3. No es difícil para los desarrolladores recuperarse de la conmutación por error, así como monitorear y mantener una base de datos comercial.

Las desventajas de la solución.

  1. El TPS caerá bruscamente cuando haya condiciones de carrera debido a bloqueos de filas.

  2. Es difícil escalar horizontalmente para mejorar el rendimiento.

El problema de las cuentas calientes

Desafortunadamente para Binance, la solución industrial demostrada anteriormente no cumple con sus altos requisitos. Cuando ocurre una transacción, debe mantener los bloqueos de fila de cada fila involucrada. Si bien algunas cuentas tienen relativamente pocas transacciones con las que lidiar, hay, por supuesto, cuentas ocupadas con muchas transacciones simultáneas. En este caso, sólo una transacción puede mantener el bloqueo de fila de la cuenta.

Las otras transacciones no pueden hacer nada más que esperar a que se libere el bloqueo. Llamamos a esta situación un problema de cuenta importante y las pruebas internas muestran que el TPS disminuirá al menos 10 veces en esta situación. Puede ver este problema en la tabla 5 a continuación.

Ejemplo de cuenta activa:

Tx 1 (transfiere 1 BTC de la cuenta 1 a la cuenta 2)

Tx 2 (transfiere 2 BTC de la cuenta 1 a la cuenta 3)

comenzar la transacción;

comenzar la transacción;

ACTUALIZAR saldo establecer saldo = saldo - 1

DONDE account_id=1 y activo = 'BTC' y saldo - 1 >= 0;

(fila bloqueada: account_id=1 y activo = 'BTC')

Si la fila 0 se ve afectada, retroceda;

ACTUALIZAR saldo establecer saldo = saldo - 2

DONDE account_id=1 y activo = 'BTC'

y saldo - 2 >= 0;

Si la fila 0 se ve afectada, retroceda;

ACTUALIZAR saldo establecer saldo = saldo + 1

DONDE account_id=2 y activo = 'BTC' y saldo + 1 >= 0;

Si la fila 0 se ve afectada, retroceda;

espera bloquear

comprometerse;

espera bloquear

obtener bloqueo, ejecutar

ACTUALIZAR saldo establecer saldo = saldo + 2

DONDE account_id=3 y activo = 'BTC' y saldo + 1 >= 0;

Si la fila 0 se ve afectada, retroceda;

comprometerse;

tabla-5

La solución de libro mayor de Binance

¿Cómo solucionamos el problema de las cuentas activas?

Una posible solución a nuestro problema es convertir de forma innovadora el modelo de subprocesos múltiples a un modo de subproceso único. Esto evita el problema de la condición de carrera y, como resultado, no habrá un problema de cuenta importante.

Nuevo modelo de hilo

Comunicación basada en mensajes

Después de implementar nuestro nuevo modelo de subprocesos, es necesario resolver un problema de comunicación. La capa de la máquina de estado es de un solo subproceso, pero la capa de red es de múltiples subprocesos, entonces, ¿cómo nos comunicamos de manera eficiente entre los dos?

Un Disruptor [1] es el siguiente paso del rompecabezas. Crea una cola de alto rendimiento y sin bloqueos basada en un diseño de búfer en anillo.

Alta disponibilidad

Hasta ahora, hemos logrado un alto rendimiento utilizando un modelo en memoria y almacenamiento local RocksDB [2]. Pero, una vez más, surge un nuevo desafío. Ahora debemos ocuparnos de la alta disponibilidad de datos.

Para garantizar la coherencia de los datos entre los nodos, utilizamos un algoritmo de consenso Raft [3]. Esto significa que la cantidad de copias de seguridad de datos es igual a la cantidad de nodos no líderes presentes. El algoritmo también garantiza que el sistema seguirá funcionando con al menos la mitad de los nodos en buen estado, para ayudar a proporcionar una alta disponibilidad del servicio.

Funciones del dominio de balsa:

  • Líder. Leader procesa todas las solicitudes de los clientes y replica la operación a todos los seguidores.

  • Seguidor. Los seguidores siguen al líder en todas las operaciones. Si el líder fracasa, uno de los seguidores será elegido nuevo líder.

  • Aprendiz. Los estudiantes son seguidores sin derecho a voto que envían cada registro de cambio de transacción/idempotente a otros servicios.

Roles de dominio de balsa

CQRS (Segregación de responsabilidad de consulta de comando)

Otro criterio clave que queremos garantizar es el mayor rendimiento de escritura del Ledger y su capacidad para condiciones de consulta más diversas. Para ello, necesitamos crear diferentes dominios. El dominio raft proporciona una escritura más eficiente basada en rocksdb + raft, y el dominio de vista escucha los mensajes del dominio raft y los guarda en la base de datos relacional para consultas externas. También podemos implementar la segregación de responsabilidades de consultas de comandos a nivel arquitectónico.

Arquitectura de libro mayor

Arquitectura general

Términos entre Raft y Ledger:

Balsa

Libro mayor

máquinas de estados replicadas

nodos del libro mayor

estado

balance

dominio

transacción

tabla-6

Ver roles de dominio

  • Centro de contabilidad de balsa

Consuma el mensaje producido por el alumno y almacene los datos de transacciones y saldos en MySQL para realizar consultas.

Procesamiento de solicitudes

Una solicitud de transacción pasará primero por la capa de red, la capa de libro mayor (controlador de solicitudes) y la capa de balsa (sincronización de registros de balsa). Luego volverá a la capa del libro mayor (máquina de estado), a la capa de red (controlador de respuestas) y finalmente devolverá una respuesta al cliente.

Los datos se pasan a través de la cola entre las dos capas.

  1. Capa de red: deserialice la solicitud rpc y colóquela en la cola de solicitudes.

  2. Capa de libro mayor: obtenga la solicitud de la cola y prepare el contexto. Luego colocará los metadatos de la solicitud en la cola de balsa.

  3. Capa de balsa: obtenga los metadatos de la solicitud de la cola de balsa y sincronícelos entre todos los seguidores. Luego pondrá el resultado en la cola de aplicación.

  4. Capa de libro mayor: obtenga los datos de la cola de aplicación y actualice la máquina de estado. Luego pondrá el resultado en la cola de respuestas.

  5. Capa de red: obtenga el resultado de la cola de respuestas y construya y serialice los datos de respuesta antes de devolverlos al cliente.

Procesamiento de solicitudes

Recuperación de datos

Cada nodo de Ledger activará una instantánea genérica basada en un período de tiempo. Además, también implementamos una instantánea consistente. Cada nodo se activa en el mismo índice de registro de balsa para garantizar que la máquina de estado sea exactamente la misma cuando cada nodo activa una instantánea. Luego, la instantánea se cargará en S3 para que Checker la verifique y como copia de seguridad en frío.

Cuando Ledger se reinicia, lee la instantánea local y reconstruye la máquina de estado. Luego reproduce el registro de la balsa local y sincroniza el último registro del líder hasta que alcanza el último índice. Si la instantánea local o el registro de la balsa no existe, se obtendrá del líder.

Instantánea y recuperación

Tolerancia a los desastres

Para mejorar la disponibilidad y la tolerancia a fallos, los nodos Ledger se implementan en diferentes zonas. Siempre que más de la mitad de los nodos estén en buen estado, los datos no se perderán y la conmutación por error se completará en un segundo.

Incluso si todo el clúster falla, lo cual existe una probabilidad muy baja, aún podemos restaurar el clúster a través de la instantánea consistente almacenada en Amazon S3 y recuperar los datos perdidos más recientes a través del sistema descendente.

Tolerancia a fallos

Actuación

La siguiente tabla muestra las especificaciones de hardware para la prueba de rendimiento.

Componente

Tipo de instancia

Ancho de banda de red (Gbps)

Ancho de banda de EBS (Gbps)

Tipo de almacenamiento EBS

Líder/Seguidor

M6i.4xgrande

16c64g

Hasta 12,5

Hasta 10

2T GP3 * 3 IOPS6000  625 MB/s

Aprendiz

M6i.4xgrande

16c64g

Hasta 12,5

Hasta 10

2T GP3 * 3 IOPS6000  625 MB/s

Banco

C5.4xgrande

16c32g

Hasta 10

4.750

Sólo volumen raíz

Las pruebas internas demuestran que un clúster de 4 nodos (un líder, dos seguidores y un alumno) puede procesar más de 10.000 TPS. Por diseño, el clúster procesa todas las transacciones una por una. No existe ninguna condición de bloqueo ni de carrera. Entonces, en el escenario de cuenta activa, el TPS es tan alto como en los escenarios normales.

Cuenta caliente TPS

La siguiente figura muestra la latencia de cada transacción. La mayoría de las transacciones podrían finalizarse en 10 ms. Las transacciones más lentas podrían finalizarse en 25 ms.

Latencia ms

Impulsando nuestros servicios con Binance Ledger

Como ha visto, la respuesta de la industria tradicional al problema de las cuentas calientes no satisface las necesidades de Binance y sus clientes. Al utilizar un enfoque diseñado específicamente para la infraestructura de Binance, terminamos con una de las experiencias de intercambio y productos más fluidas disponibles. Estamos felices de compartir con usted nuestra experiencia y esperamos que comprenda mejor lo que implica hacer que un servicio como Binance funcione.

Lea el siguiente artículo para obtener más información sobre nuestra infraestructura tecnológica:

  • (Blog de Binance) Uso de MLOps para crear un canal de aprendizaje automático de extremo a extremo en tiempo real

  • (Blog de Binance) Conozca al CTO: Rohit reflexiona sobre Crypto, Blockchain, Web3 y su primer mes en Binance

Referencias

[1] Disruptor LMAX

[2] RocasDB

[3] El algoritmo de consenso de la balsa