MySQL , una base de datos de código abierto desarrollada por Oracle, impulsa algunas de las cargas de trabajo más importantes de Facebook. Desarrollamos activamente nuevas funciones en MySQL para respaldar nuestros requisitos en constante evolución.
Estas características cambian muchas áreas diferentes de MySQL, incluidos los conectores del cliente, el motor de almacenamiento, el optimizador y la replicación.
Cada nueva versión principal de MySQL requiere mucho tiempo y esfuerzo para migrar nuestras cargas de trabajo.
Los desafíos incluyen:
Nuestra última actualización importante de la versión, a MySQL 5.6, tardó más de un año en implementarse. Cuando se lanzó la versión 5.7, todavía estábamos en medio del desarrollo de nuestro motor de almacenamiento LSM-Tree, MyRocks , en la versión 5.6. Dado que actualizar a 5.7 y al mismo tiempo construir un nuevo motor de almacenamiento habría ralentizado significativamente el progreso en MyRocks.
Optamos por permanecer con 5.6 hasta que MyRocks estuviera completo. MySQL 8.0 se anunció cuando estábamos terminando la implementación de MyRocks en nuestro nivel de servicio de base de datos de usuarios (UDB).
Esa versión incluía características atractivas como la replicación paralela basada en conjuntos de escritura y un diccionario de datos transaccionales que brindaba soporte DDL atómico.
Para nosotros, pasar a 8.0 también traerá las características de 5.7 que nos habíamos perdido, incluido Document Store.
La versión 5.6 se acercaba al final de su vida útil y queríamos mantenernos activos dentro de la comunidad MySQL, especialmente con nuestro trabajo en el motor de almacenamiento MyRocks.
Las mejoras en 8.0, como DDL instantáneo, podrían acelerar los cambios de esquema de MyRocks, pero necesitábamos estar en la base de código 8.0 para usarlo. Dados los beneficios de la actualización del código, decidimos migrar a 8.0.
Compartimos cómo abordamos nuestro proyecto de migración 8.0 y algunas de las sorpresas que descubrimos en el proceso. Cuando analizamos inicialmente el proyecto, estaba claro que pasar a 8.0 sería incluso más difícil que migrar a 5.6 o MyRocks.
Primero configuramos la rama 8.0 para compilar y probar en nuestros entornos de desarrollo. Luego comenzamos el largo viaje para trasladar los parches desde nuestra sucursal 5.6.
Había más de 1.700 parches cuando comenzamos, pero pudimos organizarlos en algunas categorías principales.
La mayor parte de nuestro código personalizado tenía buenos comentarios y descripciones, por lo que pudimos determinar fácilmente si las aplicaciones aún lo necesitaban o si podía descartarse.
Las características habilitadas por palabras clave especiales o nombres de variables únicos también facilitaron la determinación de la relevancia porque pudimos buscar en nuestras bases de código de aplicaciones para encontrar sus casos de uso.
Algunos parches eran muy oscuros y requerían un trabajo de detective (investigar documentos de diseño antiguos, publicaciones y / o comentarios de revisión de código) para comprender su historial.
Clasificamos cada parche en uno de cuatro grupos:
Hicimos un seguimiento del estado y la información histórica relevante de cada parche mediante hojas de cálculo y registramos nuestro razonamiento al lanzar un parche.
Se agruparon varios parches que actualizaron la misma función para la portabilidad. Los parches portados y comprometidos a la rama 8.0 se anotaron con la información de confirmación 5.6.
Las discrepancias en el estado de la migración surgirían inevitablemente debido a la gran cantidad de parches que necesitábamos examinar y estas notas nos ayudaron a resolverlos.
Cada una de las categorías de cliente y servidor se convirtió naturalmente en un hito en el lanzamiento de software. Con todos los cambios relacionados con el cliente transferidos, pudimos actualizar las herramientas de nuestro cliente y el código del conector a 8.0.
Una vez que se transfirieron todas las características del servidor que no eran de MyRocks, pudimos implementar 8.0 mysqld para servidores InnoDB.
La finalización de las funciones del servidor MyRocks nos permitió actualizar las instalaciones de MyRocks.
Algunas de las características más complejas requirieron cambios significativos para la versión 8.0 y algunas áreas tuvieron importantes problemas de compatibilidad.
Por ejemplo, los formatos de eventos binlog de upstream 8.0 eran incompatibles con algunas de nuestras modificaciones personalizadas de 5.6. Los códigos de error utilizados por las funciones de Facebook 5.6 entraron en conflicto con los asignados a las nuevas funciones por upstream 8.0.
En última instancia, necesitábamos parchear nuestro servidor 5.6 para que fuera compatible con la versión 8.0.
Tomó un par de años completar la portabilidad de todas estas características. Para cuando llegamos al final, habíamos evaluado más de 2,300 parches y trasladamos 1,500 de ellos a 8.0.
Agrupamos varias instancias de mysqld en un solo conjunto de réplicas de MySQL. Cada instancia de un conjunto de réplicas contiene los mismos datos, pero se distribuye geográficamente a un centro de datos diferente para proporcionar disponibilidad de datos y compatibilidad con la conmutación por error.
Cada conjunto de réplicas tiene una instancia principal. Las instancias restantes son todas secundarias. El primario maneja todo el tráfico de escritura y replica los datos de forma asincrónica a todos los secundarios.
Comenzamos con conjuntos de réplicas que constan de 5.6 primarios / 5.6 secundarios y el objetivo final era conjuntos de réplicas con 8.0 primarios / 8.0 secundarios.
Seguimos un plan similar al plan de migración de UDB MyRocks .
Cada conjunto de réplicas podría realizar la transición a través de cada uno de los pasos anteriores de forma independiente y permanecer en un paso todo el tiempo que sea necesario.
Separamos los conjuntos de réplicas en grupos mucho más pequeños, que guiamos a través de cada transición. Si encontramos problemas, podríamos retroceder al paso anterior.
En algunos casos, los conjuntos de réplicas pudieron llegar al último paso antes de que comenzaran otros.
Para automatizar la transición de una gran cantidad de conjuntos de réplicas, necesitábamos crear una nueva infraestructura de software.
Podríamos agrupar conjuntos de réplicas y moverlos a través de cada etapa simplemente cambiando una línea en un archivo de configuración. Cualquier conjunto de réplicas que encontrara problemas podría revertirse individualmente.
Como parte del esfuerzo de migración 8.0, decidimos estandarizar el uso de la replicación basada en filas (RBR). Algunas características de la versión 8.0 requerían RBR y simplificó nuestros esfuerzos de migración de MyRocks.
Si bien la mayoría de nuestros conjuntos de réplicas de MySQL ya usaban RBR, los que aún ejecutaban la replicación basada en declaraciones (SBR) no se podían convertir fácilmente.
Estos conjuntos de réplicas generalmente tenían tablas sin claves de cardinalidad alta. Cambiar por completo a RBR había sido un objetivo, pero la larga cola de trabajo necesaria para agregar claves primarias a menudo se priorizaba por debajo de otros proyectos.
Por lo tanto, hicimos que RBR fuera un requisito para 8.0. Después de evaluar y agregar claves primarias a cada tabla, cambiamos el último conjunto de réplicas de SBR de este año.
El uso de RBR también nos brindó una solución alternativa para resolver un problema de aplicación que encontramos cuando movimos algunos conjuntos de réplicas a los primarios 8.0, que se discutirán más adelante.
La mayor parte del proceso de migración 8.0 involucró probar y verificar el servidor mysqld con nuestra infraestructura de automatización y consultas de aplicaciones.
A medida que nuestra flota de MySQL creció, también lo hizo la infraestructura de automatización que usamos para administrar los servidores.
Para garantizar que toda nuestra automatización de MySQL fuera compatible con la versión 8.0, invertimos en la creación de un entorno de prueba, que aprovechó los conjuntos de réplicas de prueba con máquinas virtuales para verificar los comportamientos.
Escribimos pruebas de integración para que cada pieza de automatización se ejecute tanto en la versión 5.6 como en la versión 8.0 y verificamos su corrección. Encontramos varios errores y diferencias de comportamiento a medida que realizamos este ejercicio.
A medida que cada pieza de la infraestructura MySQL se validó con nuestro servidor 8.0, encontramos y solucionamos (o solucionamos) una serie de problemas interesantes:
Queríamos que la transición de las aplicaciones fuera lo más transparente posible, pero algunas consultas de aplicaciones tienen regresiones de rendimiento o fallarían en la versión 8.0.
Para la migración de MyRocks, creamos un marco de prueba de sombra de MySQL que capturaba el tráfico de producción y lo reproducía para probar las instancias.
Para cada carga de trabajo de la aplicación, construimos instancias de prueba en 8.0 y les reproducimos consultas de tráfico oculto. Capturamos y registramos los errores que regresaban del servidor 8.0 y encontramos algunos problemas interesantes.
Desafortunadamente, no todos estos problemas se encontraron durante las pruebas. Por ejemplo, las aplicaciones descubrieron el bloqueo de las transacciones durante la migración.
Pudimos revertir estas aplicaciones a 5.6 temporalmente mientras investigábamos diferentes soluciones.
Nuestra consulta y las pruebas de rendimiento del servidor 8.0 revelaron algunos problemas que debían abordarse casi de inmediato.
El uso de memoria en comparación con 5.6 había aumentado, especialmente para nuestras instancias MyRocks, porque se debe cargar InnoDB en 8.0.
La configuración predeterminada de performance_schema habilitó todos los instrumentos y consumió una cantidad significativa de memoria.
Limitamos el uso de memoria habilitando solo una pequeña cantidad de instrumentos y realizando cambios de código para deshabilitar tablas que no se podían apagar manualmente.
Sin embargo, performance_schema no asignaba toda la memoria aumentada.
Necesitábamos examinar y modificar varias estructuras de datos internas de InnoDB para reducir aún más la huella de memoria. Este esfuerzo redujo el uso de la memoria de 8.0 a niveles aceptables.
Fuente: Blog de Facebook
Si eres un amante de los videojuegos, estás de suerte. Hasta el 20 de noviembre…
La computación cuántica acaba de dar un salto gigante. John M. Martinis, recién galardonado con…
La biografía más vendida del cofundador de Apple, Steve Jobs; escrita por uno de los…
Hubo un tiempo en el que la “seguridad en el hogar” significaba confiar en un…
Elon Musk vuelve a romper todos los esquemas. Los accionistas de Tesla acaban de aprobar…
Los fans de Grand Theft Auto tendrán que esperar un poco más para volver a…