El proceso de sangre y lágrimas en una biblioteca

Principio de separación lectura-escritura

El principio de separación de lectura y escritura: deje que la base de datos maestra (maestra) maneje las operaciones de adición, modificación y eliminación transaccionales (INSERT, UPDATE, DELETE), y la base de datos esclava (esclava) maneje las operaciones de consulta SELECT.
Método de implementación de separación lectura-escritura: use el registro binlog de los datos maestros y ejecútelo nuevamente desde la base de datos

Razón

Examen 2020 para la industria educativa

A principios de 2020, una neumonía causada por el nuevo coronavirus circulaba en China. Al mismo tiempo, la fábrica estaba cerrada y la escuela cerrada. Todos los estudiantes tomaron clases en línea. Todos los sistemas educativos se cargaron por completo para brindar apoyo a la educación en línea. ** Soporte educativo en línea de la plataforma. Dado que el sistema generalmente no tiene mucha simultaneidad, siempre hemos usado una sola biblioteca para leer y escribir, y a nivel de código, no hemos considerado ningún problema que pueda surgir de la separación de lectura y escritura. Inesperadamente, este brote causó que los usuarios de la plataforma aumentaran directamente a un millón de niveles. En este momento, leer y escribir en una sola biblioteca no es suficiente. Fuimos directamente a 6 bases de datos e hicimos una arquitectura maestra de 6 esclavos.

Leer y escribir implementación de código por separado

Después de reunir la arquitectura de datos, de repente descubrimos que nuestra capa de aplicación no admite la separación del modo de lectura y escritura. En este momento, el líder me dio esta ardua tarea, y estaba avergonzado en ese momento. ¿Qué tal estas cosas? Utilizamos un marco basado en thinkPHP, pero no hay un código separado para leer y escribir. ¡Solo miré el código para leer y escribir de THINKPHP y descubrí que no es difícil! Luego cambié el código directamente, de acuerdo con las siguientes ideas
(1) al leer, seleccione aleatoriamente una biblioteca de la biblioteca para conectar
(2) coloque la conexión en el grupo de procesos, de modo que la próxima vez que la obtenga directamente del grupo de conexiones Obtenga
(3) y luego separe el método de consulta inferior y el método de inserción de acuerdo con la separación de lectura-escritura para separar la biblioteca de lectura o biblioteca de escritura relevante durante
media hora, cambie el código y pruebe, y se realizará pronto. Encuéntrelo mientras lo revisa y conéctese

Pregunta de colegas

El método de consulta y el método de ejecución son mixtos

Un colega ha cuestionado, ¿cómo puede implementar un método como el código anterior no está estandarizado, como el método de inserción, actualización, eliminación utilizado por el método de consulta? ? ? Aunque volé un tiempo en ese momento, y luego verifiqué el código y descubrí que alguien realmente lo usaba de esa manera, solo se puede resolver.
La solución también es muy simple, grosera, y el código será feo, pero era imposible cambiar un poco el código en ese momento, los riesgos y los costos eran demasiado altos
(1) Los primeros 6 caracteres y los primeros 4 caracteres se truncaron en el método quer
(2) Convierta caracteres a mayúsculas
(3) Determine si los caracteres son iguales para mostrar y seleccione
(4) Si el juicio es exitoso, ajuste directamente la llamada al método execte

La pesadilla comienza

Debido a que no me queda mucho tiempo para usarlo oficialmente mañana, me conecté en línea después de una simple prueba esa noche. Pero la pesadilla siguió

Transacción no procesada

Después de conectarse, hay muchos trabajos que no se pueden enviar, y los usuarios informarán rápidamente. Me sorprendió el sudor frío en ese momento. Rápidamente recordé que el trabajo solo cambió el código para leer y escribir. Rápidamente saqué el código y lo registré para verificarlo. Resultó que la interfaz de envío es muy simple. Simplemente verifique los datos para enviar . No veo ningún problema con el código, veo qué más afectará y luego descubrí que se inició una transacción antes de la consulta de la interfaz. Luego perseguí el código subyacente y descubrí que al abrir una transacción, se puede abrir en múltiples bases de datos. Que pasa ¡Cambia el canto!
La idea también es simple y grosera
(1) abrir la transacción, revertir y enviar la transacción para habilitar directamente la conexión de la base de datos principal, asegurando que la transacción solo esté habilitada en la base de datos principal
(2) detectar si hay una transacción al ejecutar la consulta, si hay una transacción, todas las declaraciones de consulta están habilitadas Conexión a la biblioteca principal

Inserte la interfaz para consulta inmediata

Después de conectarse, hay una interfaz para cargar recursos para usted. El usuario dijo que lo cargué. ¿Por qué mostró que no se cargó? Inmediatamente revisé el registro y descubrí que el registro existe. Eché un vistazo más de cerca al código. El código es addData escrito de esta manera y luego getData en la salida. Luego combiné las características de la separación de lectura y escritura y descubrí que si inserto datos y consulto inmediatamente, se descubre que es posible que no haya datos de la biblioteca debido al problema de los datos de sincronización.
Que pasa ¡Cambia el canto!
La idea también es un
análisis simple y crudo del problema: la mayoría de las consultas en cuestión aparecen en casos como "los datos se acaban de insertar en la base de datos, y una copia de los datos se lee inmediatamente de la base de datos para emitir un juicio". En este momento, puede que no haya datos en la biblioteca, pero la biblioteca principal ,
(1) Para el código de "consulta inmediatamente después de insertar", se utiliza la consulta de la biblioteca principal en lugar de la consulta de la biblioteca secundaria.
(2) Abra la consulta de la biblioteca principal M () -> connectMaster ();
(3) Cierre la consulta de la biblioteca principal M () -> disconnectMaster ();

Optimización

Optimice el código que se consulta inmediatamente después de la inserción

El código estuvo en línea por un período de tiempo, pero descubrimos que necesitamos parchear el código que se insertó en la consulta de inmediato y descubrimos que se movió un lugar, lo que nos puso en una condición muy desfavorable.
Estaba pensando en todo el flujo de trabajo y las características y resolví una solución a este problema. La idea es la siguiente
(1) Ponga el nombre de la tabla en el momento de la inserción en una matriz
(2) Al consultar, verifique si la matriz existe en la matriz. Si existe este campo en la matriz temporal de la segunda consulta
(3) Si hay un cambio en el campo, vaya directamente a la biblioteca principal para consultar y
ordenar, es decir: en el proceso de una solicitud de interfaz, si se ha realizado una operación de actualización, todas las operaciones de consulta posteriores se realizarán desde la biblioteca principal. Ir en la consulta.

Hay un problema

Todavía no hay solución para la sincronización de consultas en la interfaz

Después de agregar la interfaz al final, realice inmediatamente la siguiente solicitud de la interfaz detallada. En este momento, aún puede haber un problema de que no se puedan encontrar los datos. Si puede encontrar una solución al problema, puede discutirlo.

Publicado 2 artículos originales · elogiado 1 · visita 74

Supongo que te gusta

Origin blog.csdn.net/weixin_42088262/article/details/105353237
Recomendado
Clasificación