Maxwell, De MariaDB a Kafka
Y si os dijera que podeis enviar todas las transacciones de MariaDB a Kafka sin tener que hacer practicamente nada? si, de verdad. Esto es Maxwell
Que es Maxwell
Maxwell es un demonio escrito en Java que te permite pasar todos las transacciones de MariaDB / MySQL a Kafka, de forma nativa y segun ellos mismo, con un buen rendimiento.
Yo lo he probado y de repente, se ha puesto como el streamer de-facto en todos nuestros entornos. Se acabo la replicacion de Binlog de MariaDB, se acabo Debezium, se acabaron un monton de cosas…La vida sonrie y todo es mas facil, joer.
Como funciona?
SE-RIA-LI-ZA-CION, ya esta.
Lee todas las transacciones del binlog y los convierte a mensajes de Kafka y los mete en los topics que te de la gana. Es simple y maravilloso. Podria ponerme en modo politico a decir mil cosas vacias, pero es que no tiene mas.
Todos los progresos los guarda en la base de datos que aparece como maxwell, tanto el servidor como el binlog como la posicion del mismo. Esto lo hace muy facil para resetearlo: te cargas la bd y listo.
Bootstraping
Permite el bootstrapping, esto es, meter una tabla entera con un select * from database.table, con lo que puedes importar las tablas a toda pastilla y luego seguir sincronizando con el.
Tiene su miga, ya que hay que meter un registro en la tabla maxwell.bootstrap teniendo mucho cuidado de que base de datos, tabla y sobretodo client_id metes.
Te quedaria algo como asi:
1 |
|
Ahora, solo a esperar que se conecte y empieze el bootstrap.
Caracteristicas
Ventajas
- Simple, mas que el mecanismo de un chupete
- Se actualiza bastante a menudo
- Lo Devs responden bastante rapido en el gitHub
- Tiene muchas opciones de configuracion pero sin nada, funciona cuasi del tiron
- Te permite hacer bootstraping de las tablas para hacer una carga inicial, despues, sincroniza
- Te coneta con RabbitMQ, Kinesis, Kafka….casi todas. Una delicia
- Como es JMX, tiene metricas y te las expone el solo en un endpoint
Desventajas
- Hombre, no es enterprise-made y se nota.
- La documentacion tiene fallos o cosas mal explicadas (como hacer el bootstraping)
- Estaria guay que tuviera algun tipo mas de control en el momento de la conexion al binlog (se desconecta mucho)
- El sistema de bootstraping, no es muy intuitivo ( o yo soy un zote )
- NO SOPORTA OFICIALMENTE MARIADB. Si, como lo leeis. Pero lo haran y si no usais ejem….idempotencia (cof cof cof…) no pasa nada. Lo explico mas abajo.
Desplegandolo…
Este es el fichero de configuracion que estamos usando nosotros, debidamente limpiado:
1 | cat config.properties |
Explicando algunas partes:
host & replication host Contempla la posibilidad de replicar del servidor 1 y guardar toda la info de donde esta replicando en el servidor 2.client_id Podemos tener varios Maxwell haciendo pulling de diferentes tablas del mismo servidor para tener paralelismo, solo cambia el client_idkafka_topic=stream_%{table} Esto me parece que es de lo mejor, permite que definas esa variable para realizar el stream de la tabla a su topic con o sin prefijo. Nosotros, filtramos luego las tablas y las BBDDs.include_db & include_tables estos filtros funcionan en conjunto, esto esto, que si declaro tablas pero no bases de datos, buscara en todas las bases de datos. Al poner base de datos, buscara en esas bases de datos, las tablas.metrics_type Otra pasada y ademas, bastante completas (si las pones juntos con el Maxwell Exporter, la delicia del Grafanologo! )http_diagnostics Otra cosa guay lista, un healcheck para controlar con Zabbix, Nagios o Icinga.bootstraper sync o async. Async hace el bootstraping levantando otro hilo y sin bloquear el sincronizador principal. Pero, tarda mas.
Conclusion
Soluciones ahi afuera hay varias, pero a mi me gusta mucho esta. No es la mejor seguro, pero tiene un punto de equilibrio que nos parece bueno porque:
- es tonta y muy facil de administrar, si se te muere, limpias la reinicias y listo
- para ser free, tiene un monton de conectores
- El perfomance es mas que bueno, segun dicho por los Dev, una vm de 4 cores y poquita RAM, 5K/s sin despeinarse
- Se deja desplegar muy biena traves de ansible. Incluso lo tengo montado como servicio que monitoriza el PID y cuando se cae la conexion a la BD, lo levanta el solo. Y encima trunca el log….perfecto!
- Los logs son muy descriptivos, entendibles.
- Los DEV estan ahi y la mejoran. No me entrañaria nada que sacaran una version comercial. Yo la compraria
No soporta MariaDB….pero da casi lo mismo
Paso que un dia probandolo, se fue al carajo por que segun decia en los logs no entendia la siguiente transaccion DROP DATABASE IF EXIST DATABASE1 Efectivamente, no soporte idempotencia de MariaDB. Teneis que arrancar el demonio a mano en el siguiente evento, sorry. Asi que ya sabeis, nada de hacer las cosas bien: a partir de ahora todos los scripts de sql sin idempotencia }:)
En nuestro modelo de datos, encaja a la perfeccion. Estuvimos probando el Tungsten el cual casi fue el elegido, pero demasiado opensource y artesanal el tema de materializar a Hive. Esto no materializa a Hive, peeeeeero para eso tenemos el kafka-connect y en ejercito de javadevs que lo saben dejar bonito.
Ademas, permite que solo entre entornos tengamos que replicar los kafka usando el KafkaMirror. Nada mas. Menos overhead de administracion y otro tanto de ahorro en el ancho de banda.
Ale, he dicho!