Ahorre tiempo, nervios y horas hombre

Nuestros proyectos son generalmente regionales, y los clientes, generalmente ministerios. Pero, además del sector público, las organizaciones privadas también usan nuestros sistemas. Prácticamente no hay problemas con ellos.

Por lo tanto, los proyectos principales son regionales, y a veces hay problemas con ellos. Por ejemplo, con rendimiento, cuando en regiones de 20k nuestros preciosos usuarios están en el período de implementación de nuevas funcionalidades en servidores de productos. Es un dolor ...

Mi nombre es Ruslan y estoy involucrado en escoltar los sistemas de información del Grupo BARS y desarrollar un robot asesino para DBAs seriales brutales . El ayuno no es para los débiles de corazón: muchas letras e imágenes.



/ awr


Algunas de nuestras aplicaciones se ejecutan en Oracle DBMS. Hay proyectos en el DBMS PostgreSQL. Oracle tiene algo maravilloso: recopilar estadísticas sobre la carga en el DBMS, que resalta los problemas existentes e incluso ofrece recomendaciones para su eliminación: el Depósito de carga de trabajo automático (AWR). En un momento (es decir, en el momento del dolor), los desarrolladores pidieron constantemente recopilar informes AWR para el análisis de rendimiento . Honestamente fuimos al servidor DBMS, recopilamos informes, nos los arrastramos y los enviamos para su análisis a producción. Una vez después del 5 comenzó a tensarse ... después del 10 - para causar irritación ...

Un día, uno de mis colegas expresó la idea de que todo lo que se haga más de una vez debería automatizarse. Hasta el momento de la molestia, para ser honesto, no pensé en ello y traté de automatizar todo lo que se puede automatizar, pero a menudo no tenía demanda y era más investigación que aplicación.

Y luego pensé: "Los administradores no son necesarios para generar un informe ..." . Después de todo, recopilar un informe es ejecutar el script sql @ $ ORACLE_HOME / rdbms / admin / awrrpt.sql y recoger el informe del servidor para nosotros ... Oh sí, no dejamos que el desarrollo salga a la venta.

Luego busqué en Google la información necesaria, creé una función del artículo a modo de prueba, extraje el script y un milagro: el informe se recopiló y se puede guardar localmente. Las funciones creadas donde los informes AWR a menudo se necesitaban, les dijeron a los desarrolladores cómo usarlo.

Alrededor de este tiempo, en mi tiempo libre, después de hablar con @BotFather, creé un bot de Telegram para mí, solo por diversión. Me atornillé un simple funcional allí: para mostrar la hora actual, los tipos de cambio, el clima, le enseñé a enviar cumplidos a mi esposa (entonces una niña) en un horario. Quizás en ese momento enviar cumplidos era la funcionalidad más buscada de mi bot, mi esposa lo agradeció.

Entonces. Los desarrolladores nos escriben en Telegram, les enviamos un informe en Telegram ... Pero, ¿qué pasa si no nos escriben a nosotros, sino al bot? De hecho, será mejor para todos, el informe será recibido más rápido y, lo más importante, por nosotros. Entonces, la idea de la primera funcionalidad buscada nació para mi bot.

Comencé la implementación. Lo hice, como lo logré, en PHP (en realidad nuestra aplicación está en PHP, lo entiendo más que Python). El codificador es más o menos mío, así que no mostraré mi código :) El

bot vive en nuestra red corporativa, tiene acceso a ciertos proyectos, incluidas las bases de datos de destino. Para no molestarme con los parámetros en el comando o el menú, atornillé esta funcionalidad a un chat grupal con notificaciones de monitoreo. Entonces, el bot sabe de inmediato en qué base de datos recopilar el informe.

Habiendo recibido un comando de la forma / awr N, donde N es la cantidad de horas completas para las que se necesita un informe (de forma predeterminada, 1 hora), incluso durante una semana, si la base de datos no se reinicia, el bot comienza a funcionar de inmediato, recopila el informe, lo publica como una página web y allí mismo (casi allí mismo) proporciona un enlace a un informe muy necesario.

Seguimos el enlace y aquí está, el informe de AWR:



Como se esperaba, los desarrolladores hicieron frente a esta generación de informes, incluso alguien agradeció.

Habiendo apreciado la conveniencia del equipo, los gerentes de proyecto de otras regiones querían lo mismo, porque sobre todo obtienen luli del cliente que se preocupa por el rendimiento y la disponibilidad de los sistemas. Se agregó un bot a otros chats. Todavía lo usan, y me alegro por eso.

Más tarde, colegas de CIT escribieron sobre cómo recopilamos informes, también querían hacerlo. No los agregué a nuestros chats, creé un chat separado con la generación de informes en un horario y a pedido.

/ pgBadger


Tenemos otras aplicaciones en PHP junto con PostgreSQL. Se implementó la recopilación del informe pgBadger para aquellos que lo necesitan con el mismo principio: en los chats grupales. Al principio lo usaron, pero luego se detuvieron. Corte funcional como innecesario.

/ deber


En nuestro departamento hay turnos nocturnos y, en consecuencia, hay un horario. Está en las tablas de google. No siempre es conveniente buscar un enlace, abrir un cronograma, buscarlo usted mismo ... Uno de los antiguos colegas también jugó con su bot Telegram e introdujo en el chat de nuestro departamento notificaciones sobre el inicio de un turno de servicio para los empleados del departamento.El bot analiza el horario, determina el asistente por la fecha actual y, de acuerdo con el horario o por solicitud, informa quién está en servicio hoy. Resultó genial, cómodo. Es cierto que no me gustó mucho el formato del mensaje. Además, para los empleados de otro departamento (por ejemplo, el centro de negocios "Medicina"), la información sobre el personal de servicio en otras áreas no es realmente necesaria, pero usted necesita saber quién es el oficial de servicio en la "Medicina" en caso de problemas. Decidí "tomar prestada" la funcionalidad, pero cambiar lo que no me gustó. Hice un formato de mensaje conveniente para mí y para otros, eliminando información redundante.

/ tnls


Después de la "prueba de la pluma" de la automatización a través del bot Telegram, aparecieron muchas ideas diferentes, pero quería hacer las cosas estrictamente necesarias. Decidí mantener estadísticas sobre las apelaciones. Para acceder a los proyectos de nuestros clientes, hemos implementado el llamado "servidor de salto" o el servidor de reenvío. Las conexiones VPN se generan en él, luego a través de ssh, los puertos de aplicaciones, las bases de datos y otras sondas auxiliares se envían a nuestra red local para facilitar el acceso a los proyectos de nuestros empleados, sin problemas con las conexiones VPN. Es suficiente configurar una conexión VPN a nuestra red corporativa.

Las estadísticas de llamadas sugirieron que a menudo, después de la caída de uno de los túneles (en caso de problemas de red, por tiempo de espera, por ejemplo), recurren para restaurar el acceso al proyecto. En la mayoría de los casos, solo reiniciar la conexión es suficiente y todo se arregla. Hagámoslo tú mismo. Aquí está el comando:


"Fall" a través del elemento de menú deseado, seleccione su proyecto, espere un minuto y todos estén contentos y satisfechos ...

Al recibir el comando, con un ligero movimiento de los bytes y bits, el bot se conecta al servidor de reenvío, sabiendo de antemano qué reenvío debe reiniciarse, y hace su trabajo: restaura la conexión con el proyecto. Escribí instrucciones para resolver tales problemas por mi cuenta. Y nos contactaron solo si la herramienta provista no funciona ...

/ ecp_to_pem


Las estadísticas adicionales mostraron que a menudo es necesario convertir la firma digital Crypto Pro al formato pem ( Base64 ) para diversas integraciones, y tenemos muchas de ellas. Tarea: toma el contenedor, lo copia en una computadora con Windows con la utilidad P12FromGostCSP instalada (por cierto, paga), la convierte a pfx y convierte pfx usando OpenSSL (con soporte para cifrado GOST) a pem. No es muy conveniente, pero lo quiero con el clic de un dedo.

Google nuevamente vino al rescate. Encontró la utilidad de alguna persona amable . Recogido, como está escrito en README - ganado. Enseñó al bot a trabajar con la utilidad y obtuvo una conversión casi instantánea.


En el momento de la implementación final, se emitió una orden para cambiar a un nuevo formato de cifrado: gost-2012. Por lo que recuerdo, la utilidad en ese momento solo funcionaba con el viejo GOST (2001), quizás en general era otra utilidad similar de otra buena persona, no recuerdo exactamente.
Después de la transición al nuevo GOST, la funcionalidad del bot se eliminó por razones de seguridad. Lo implementé en un contenedor acoplable.

Dockerfile, de repente quien necesita:
FROM ubuntu:16.04                                                                                                                                                                        
RUN apt update && apt -y install git sudo wget unzip gcc g++ make && \                       
   cd /srv/ && git clone https://github.com/kov-serg/get-cpcert.git && \                    
   cd get-cpcert && chmod +x *.sh && ./prepare.sh && ./build.sh && \                        
   mkdir -p /srv/{in,out} && \                                                              
   echo '#!/bin/bash' > /srv/getpem.sh && \                                                 
   echo 'cd /srv/get-cpcert' >> /srv/getpem.sh && \                                         
   echo './get-cpcert /srv/in/$CONT.000 $PASS > /srv/out/$CONT.pem' >> /srv/getpem.sh && \  
   chmod +x /srv/getpem.sh                                                                  ENTRYPOINT /srv/getpem.sh


Para realizar la conversión, debe colocar el contenedor de origen (un directorio del formulario xxx.000) en el directorio / srv / in, y recoger el pem finalizado en / srv / out.

Para convertir:

 docker run -t -i -e CONT='<   ( ".000")>' -e PASS='<  >' -v /srv/in:/srv/in -v /srv/out:/srv/out --name ecptopem <  >/med/ecptopem:latest 

/ emstop y / emstart


Una vez, nuestra empresa obtuvo un Oracle DBA muy bueno, con más experiencia en la administración del DBMS y en el desarrollo. Y no sucedió de inmediato con una conexión ssh a los servidores DBMS: o no sabe dónde conectarse y cómo, entonces los accesos no se describen claramente, es imposible reenviar algo a sí mismo. Bueno, estamos felices de ayudar, hablamos sobre cómo conectarnos y enviamos Enterprise Manager para ello. Pero con ssh todavía no funcionó. Uno de los colegas lo explicó simplemente: Pura sangre DBA :) Decidimos que si necesitamos ajustar algo en el servidor, lo haremos nosotros mismos.

EM se bloquea bajo una carga pesada y lo reinicia ... necesita conectarse a través de ssh y reiniciar a través del terminal. "Los administradores lo saben bien", decidió nuestro nuevo colega. Cargas grandes en el DBMS no son infrecuentes con nosotros, las solicitudes para reiniciar EM también son frecuentes. Luego el mismo escenario: tensión, irritación y la búsqueda de una solución al problema. Entonces en el mismo grupo de chats apareció el comando: / emstop y / emstart.



/ matar


En el caso de una fuerte competencia en la base, y esto a veces sucede, debe descargar rápidamente la base de datos. La forma más rápida es matar el proceso problemático ... Para hacer esto, conéctese a través de ssh, kill -9 ... ¡El bot ayudará!



Alexey apreció al equipo y le dio un nombre cariñoso: "Kilyalka" o una pistola.
Una vez, después de ver cómo Alex está intentando y sufriendo, cada vez que ingreso / mato xxx para cada uno de los procesos, decidí agregar "multilateralismo" a nuestra arma: ¡



Eso es mejor! ¡Todo para ti, Alex, solo trabaja, querido!

Naturalmente, el acceso a un comando tan importante estaba limitado por user_id: "protección contra el tonto". Al ver cómo Lesha acertó los procesos en el servidor de la base de datos, varias personas intentaron ingresar un comando con un número de proceso aleatorio, pero no puedes engañar a mi robot inteligente, se negó de inmediato.

/ alertlog


Bueno, por si acaso, hice un comando:
/ alertlog <número de líneas> : obtener el número especificado de líneas alertlog'a El
bot extrae el registro de alertas y lo envía a nuestro servicio, como pastebin, llamado pyste, y envía un enlace para pegar al chat de solicitud.

/ cheques


Luego vino una solicitud para monitorear el rendimiento real de nuestra aplicación. Hasta ahora, el soporte técnico para el proyecto ha estado recopilando estos datos a mano. No es un trato! Nuestros valientes probadores han desarrollado casos de prueba para esto. El registro de prueba resultante no es muy conveniente de leer, un usuario inexperto comprenderá durante mucho tiempo y no el hecho de que resaltará la información necesaria. Y no nos gusta hacer con nuestras manos lo que no podemos hacer con nuestras manos ... ¡Una nueva tarea para el bot!



El comando / cheques muestra un menú sencillo e inequívoco, ¡esta vez nuestros muchachos aprendieron a usar este comando sin instrucciones!

Cuando selecciona el elemento deseado, en lugar del menú, aparece una notificación sobre el inicio de la prueba para que los usuarios impacientes no ejecuten nuestra prueba 100500 veces:



Dependiendo del elemento de menú seleccionado, se inicia una prueba específica desde nuestra red, es decir, desde la máquina donde vive el bot (el jmeter está preconfigurado allí, las pruebas necesarias se colocan ...) o inmediatamente desde el centro de datos (desde la máquina preparada al lado de la aplicación), de modo que al probar elimine los retrasos de la red, bueno, o minimícelos.

Después de completar la prueba y recibir el registro, el bot lo analiza y muestra el resultado en una forma "legible para humanos":



Colección de métricas


La funcionalidad ha "ingresado" y los gerentes de proyecto que lo deseen han recibido dicha función para sus regiones. Y un Gerente de Proyecto compasivo dijo: "¡Quiero tener estadísticas a tiempo!" Alguien de CIT le dijo que sería conveniente controlar todo esto en Zabbix. Zabbix, entonces Zabbix ...

Pensé que era necesario prepararse para la necesidad de duplicar la solución ... Diseñé la idea en un contenedor acoplable. En el contenedor, de acuerdo con el cronograma (cada 10 minutos), se inicia jmeter, agrega el registro en un lugar específico, php lo analiza y muestra los datos necesarios en forma de página web. Zabbix usa la tecla web.page.get para obtener esta página, selecciona regularmente los datos necesarios para ciertos elementos dependientes y construye un gráfico.



Parece que no estuvo mal. Observando el gráfico, nosotros, en primer lugar, vemos la velocidad aproximada de la aplicación, y si se detectan picos en el gráfico, sabemos aproximadamente dónde está el "tapón". Todo es simple Hasta ahora, ha resultado tener demanda solo para una región, pero estoy listo para replicarla para aquellos que lo deseen.

Desarrollo de aplicaciones


Las estadísticas sobre tareas del mismo tipo no hace mucho tiempo arrojaron ideas para simplificar y facilitar el trabajo. En algunos proyectos, en servidores de aplicaciones, es necesario instalar los contenedores clave de Crypto Pro, hay muchos de ellos y la firma digital caducará con el tiempo. A veces, 2 tareas "vuelan" por día. Pero consideré que usar el bot para estos fines no era seguro y decidí que haría la funcionalidad directamente en la aplicación. Naturalmente con autorización y control de acceso. Si tiene los privilegios necesarios, estará disponible un elemento de menú adicional para trabajar con firmas digitales, instalación, eliminación, visualización de información, etc. En este momento, la funcionalidad está en desarrollo. Al final resultó que esto no es muy difícil, debe leer las instrucciones un poco, mirar ejemplos de código, preguntar a colegas más experimentados en desarrollo y hacerlo.En el proceso de investigación, aparecieron ideas para agregar a la aplicación. No construiré planes napoleónicos: hay desarrollo, que cada uno haga lo suyo. Pero por ahora es interesante, lo estoy haciendo yo mismo.

Planes


Como dije, muchas ideas diferentes nacieron para usar nuestro bot y no solo, en general, digamos, ideas para "puntos de automatización", muchas de ellas fueron olvidadas, ya que no tuve tiempo de escribirlas. Ahora trato de escribir todo lo que me viene a la mente, y recomiendo que otros hagan lo mismo.

Pero Alex no se olvida de tirar su lista de deseos. De lo último:
/ kill_sql SQL_ID - mata todas las sesiones con una consulta SQL_ID
/ kill_block - mata la sesión de bloqueo de raíz
/ show_em - muestra una imagen de rendimiento EM
Trick, quiere unir DBA desde el teléfono =) ¡

Así es como trabajamos por el bien de la Patria!

¿Y cómo te salvas de las tareas rutinarias y poco interesantes?

Espero que la lectura haya sido interesante, y tal vez incluso útil para alguien, y no tuve tiempo de cansar al lector ... Buena suerte para todos.

All Articles