Estalviem temps, nervis i hores de treball

Els nostres projectes solen ser regionals, i els clients solen ser ministeris. Però, a més del sector públic, les organitzacions privades també utilitzen els nostres sistemes. Pràcticament no hi ha problemes amb ells.

Per tant, els principals projectes són regionals, i de vegades hi ha problemes amb ells. Per exemple, amb el rendiment, quan a les regions hi ha més de 20 usuaris preciosos durant el període de desplegament de noves funcionalitats als servidors de productes. És un dolor…

Em dic Ruslan i suporto els sistemes d'informació de BARS Group i desenvolupant un bot assassí per a DBA en sèrie violents. Aquesta publicació no és per als dèbils de cor: hi ha moltes cartes i imatges.

Estalviem temps, nervis i hores de treball

/awr

Algunes de les nostres aplicacions s'executen amb Oracle DBMS. També hi ha projectes al SGBD PostgreSQL. Oracle té una cosa meravellosa: recopilar estadístiques sobre la càrrega del SGBD, que posa de manifest els problemes existents i fins i tot fa recomanacions per eliminar-les: el dipòsit automàtic de càrrega de treball (AWR). En un moment determinat (és a dir, en el moment del dolor), els desenvolupadors van demanar constantment que recollissin Informes AWR per a l'anàlisi del rendiment. Sincerament, vam anar al servidor DBMS, vam recopilar informes, ens els vam portar i els vam enviar a producció per analitzar-los. Després de la 5a vegada es va tornar molest... després de la 10a es va tornar irritant...

Un dels meus companys va expressar una vegada la idea que tot el que es fa més d'una vegada s'hauria d'automatitzar. Fins al moment de la irritació, per ser sincer, no hi vaig pensar i vaig intentar automatitzar tot allò que es podia automatitzar, però sovint no era demanat i era més una investigació que una naturalesa aplicada.

I llavors vaig pensar: "No calen administradors per generar un informe...". Després de tot, recollir un informe significa executar l'script sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql i portar l'informe del servidor al vostre lloc... Sí, no permetem el desenvolupament per a la producció.

A continuació, vaig buscar a Google la informació necessària, vaig crear la funció a partir de l'article sobre la base de proves, vaig executar l'script i el miracle: l'informe es va compilar i es pot desar localment. Va crear funcions on sovint es necessitaven informes AWR i van dir als desenvolupadors com utilitzar-los.

En aquesta època, en el meu temps lliure, després de parlar amb @BotFather, vaig crear un bot de Telegram per a mi, només per diversió. Vaig introduir una funcionalitat senzilla allà: mostrar l'hora actual, els tipus de canvi, el temps, li vaig ensenyar a enviar compliments a la meva dona (aleshores xicota) segons un horari. Potser, en aquell moment, enviar compliments era la funcionalitat més popular del meu bot, i la meva dona ho va apreciar.

Tan. Els desenvolupadors ens escriuen a Telegram, els enviem un informe a Telegram... Què passa si no ens escriuen a nosaltres, sinó a un bot? Al cap i a la fi, serà millor per a tothom, l'informe es rebrà més ràpidament i, el més important, sense passar-nos. Així va néixer la idea de la primera funcionalitat popular per al meu bot.

Vaig començar la implementació. Ho vaig fer, com vaig poder, en PHP (la nostra aplicació en si és en PHP, en sóc més versat que en Python). No sóc un bon programador, així que no us mostraré el meu codi :)

El bot viu a la nostra xarxa corporativa i té accés a determinats projectes, incloses les bases de dades de destinació. Per no molestar-me amb els paràmetres de l'equip ni amb el menú, he adjuntat aquesta funcionalitat al xat grupal amb notificacions de seguiment. D'aquesta manera, el bot sap immediatament de quina base de dades recollir l'informe.

Havent rebut una comanda com /awr N, on N és el nombre d'hores completes per a les quals es necessita un informe (per defecte - 1 hora), fins i tot durant una setmana, si la base de dades no s'ha reiniciat, el bot comença a funcionar immediatament, recull l'informe i el publica com a pàgina web i immediatament (gairebé allà mateix) ofereix un enllaç a l'informe tan necessari.

Seguiu l'enllaç i aquí teniu l'informe AWR:

Estalviem temps, nervis i hores de treball

Com era d'esperar, els desenvolupadors van fer front a aquesta generació d'informes i alguns fins i tot ens van agrair.

Després d'haver apreciat la comoditat de l'equip, els directors de projectes d'altres regions volien el mateix, ja que reben el màxim del client i estan preocupats pel rendiment i la disponibilitat dels sistemes. He afegit el bot a altres xats. Encara el fan servir i n'estic content.

Més tard, els companys del CIT es van assabentar de com recollim els informes i també van voler fer-ho. No els vaig afegir als nostres xats, vaig crear un xat independent amb la generació d'informes segons un programa i a petició.

/pgBadger

També tenim altres aplicacions en PHP juntament amb PostgreSQL. Vaig implementar la col·lecció d'informes pgBadger per a aquells que ho necessiten utilitzant el mateix principi: en els xats de grup. Al principi el van fer servir, però després van parar. La funcionalitat es va tallar com a innecessària.

/deure

El nostre departament disposa de torns nocturns i, en conseqüència, té un horari. Està a Google Sheets. No sempre és convenient buscar un enllaç, obrir un gràfic, buscar per tu mateix... Un dels meus antics companys també va jugar amb el seu bot de Telegram i el va introduir al xat del nostre departament. notificacions sobre l'inici del torn de treball per als empleats del departament. El bot analitza l'horari, determina la persona de guàrdia per la data actual i, segons l'horari o a petició, informa qui està de guàrdia avui. Va resultar genial i convenient. És cert que no m'ha agradat gaire el format dels missatges. A més, per als empleats d'un altre departament (per exemple, BC "Medicina"), la informació sobre els que estan de servei en altres direccions no és realment necessària, però cal saber qui està de servei a "Medicina" en cas de problemes. Vaig decidir "prestar" la funcionalitat, però canviar allò que no m'agradava. Vaig fer un format de missatge convenient per a mi i per als altres, eliminant la informació innecessària.

/tnls

Després de provar l'automatització amb un bot de Telegram, van aparèixer moltes idees diferents, però volia fer coses estrictament necessàries. Vaig decidir liderar estadístiques de sol·licituds. Per accedir als projectes dels nostres clients, hem implantat l'anomenat “servidor de salt” o servidor de reenviament. S'hi plantegen connexions VPN, després ports d'aplicacions, bases de dades i altres reenviaments auxiliars es reenvien a la nostra xarxa local mitjançant ssh, per accedir fàcilment als projectes dels nostres empleats, sense problemes amb les connexions VPN. Tot el que heu de fer és configurar una connexió VPN a la nostra xarxa corporativa.

Les estadístiques de peticions han demostrat que sovint, després que un dels túnels falla (en el cas de problemes de xarxa, per un temps d'espera, per exemple), la gent es posa en contacte amb nosaltres per restablir l'accés al projecte. En la majoria dels casos, amb només reiniciar la connexió és suficient i tot està bé. Fem-ho tu mateix. Aquí teniu l'ordre:
Estalviem temps, nervis i hores de treball

"Caureu" a l'element del menú desitjat, seleccioneu el vostre projecte, espereu un minut i tothom està content i satisfet...

En rebre una ordre, amb un lleuger moviment dels bytes i bits, el bot es connecta al servidor de reenviament, sabent per endavant quin reenviament s'ha de reiniciar i fa la seva feina: restableix la connexió al projecte. Vaig escriure instruccions perquè pugueu resoldre aquests problemes vosaltres mateixos. I la gent només es va posar en contacte amb nosaltres si l'eina proporcionada no funcionava...

/ecp_to_pem

Més estadístiques van mostrar que sovint és necessari convertir EDS Crypto Pro en format pem(Base 64) per a diverses integracions, i en tenim bastants. Tasca: agafeu un contenidor, copieu-lo a un ordinador Windows amb la utilitat P12FromGostCSP instal·lada (de pagament, per cert), convertiu-lo a pfx i, a continuació, convertiu-lo a pfx mitjançant OpenSSL (amb suport per al xifratge GOST) a pem. No és gaire convenient, però ho vols amb un toc dels dits.

Google ha tornat al rescat. Trobat la utilitat d'alguna persona amable. El vaig muntar tal com estava escrit al README: va funcionar. Vaig ensenyar al bot a treballar amb la utilitat i vaig obtenir una conversió gairebé instantània.
Estalviem temps, nervis i hores de treball

En el moment de la implementació final, es va emetre una ordre per canviar a un nou format de xifratge: gost-2012. Pel que recordo, la utilitat en aquell moment només funcionava amb l'antic GOST (2001), potser era una altra utilitat similar d'una altra persona amable, no ho recordo exactament.
Després de la transició al nou GOST, la funcionalitat del bot es va eliminar per motius de seguretat. Ho hem implementat en un contenidor docker.

Dockerfile, per si algú ho necessita:

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

Per convertir, heu de col·locar el contenidor original (directori com xxx.000) al directori /srv/in i portar el pem acabat a /srv/out.

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 i /emstart

Un dia, un DBA d'Oracle molt genial, amb molta experiència en administració i desenvolupament de DBMS, va aconseguir feina a la nostra empresa. I de seguida va tenir problemes per connectar-se als servidors del SGBD amb ssh: no sap on ni com connectar-se, l'accés no està clarament descrit o no pot reenviar-se a si mateix alguna cosa que necessita. Bé, estem encantats d'ajudar-li, li vam dir com connectar-se i li vam reenviar Enterprise Manager. Però les coses encara no van funcionar amb ssh. Un dels meus col·legues ho va explicar simplement: un DBA de raça pura :) Vam decidir que si hem de modificar alguna cosa al servidor, ho farem nosaltres mateixos.

EM de vegades es bloqueja amb una càrrega pesada, i per reiniciar-lo... cal connectar-se mitjançant ssh i reiniciar-lo a través del terminal. "Els administradors són bons en això", va decidir el nostre nou company. Les càrregues pesades al SGBD no són estranyes per a nosaltres, i les sol·licituds per reiniciar EM també són habituals. Després el mateix escenari: tensió, irritació i recerca d'una solució al problema. Així, en els mateixos xats de grup van aparèixer les ordres següents: /emstop i /emstart.

Estalviem temps, nervis i hores de treball

/matar

Si hi ha una forta competència a la base de dades, i això de vegades passa, cal descarregar-la ràpidament. La manera més ràpida és matar el procés problemàtic... Per fer-ho, connecteu-vos mitjançant ssh, kill -9... El bot us ajudarà!

Estalviem temps, nervis i hores de treball

Alexey va apreciar l'equip i li va donar un nom afectuós: "Kilyalka" o una pistola.
Un dia, després de veure com l'Alexey intentava i patia, entrant /kill xxx cada vegada per a cadascun dels processos, vaig decidir afegir "multi-barrel" a la nostra arma:

Estalviem temps, nervis i hores de treball

Això està millor! Tot és per a tu, Alexey, només treballa, estimat!

Naturalment, un equip tan important era limitat accés per user_id - "infalible". En veure com Lesha mata hàbilment processos al servidor de bases de dades, diverses persones van intentar introduir una ordre amb un número de procés aleatori, però no podeu enganyar el meu bot intel·ligent, es va negar immediatament.

/alertlog

Bé, per si de cas, vaig fer l'ordre:
/alertlog — obtenir el nombre especificat de línies de registre d'alertes
El bot treu un registre d'alertes i l'envia al nostre servei, com pastebin, anomenat pyste, i envia un enllaç a la pega al xat de sol·licitud.

/controls

Després va venir una petició supervisant el rendiment real de la nostra aplicació. Fins ara, el suport tècnic del projecte recopilava aquestes dades manualment. No importa! Els nostres valents verificadors han desenvolupat casos de prova per a això. El registre de prova resultant no és molt còmode de llegir; un usuari sense experiència trigarà molt de temps a entendre-ho i no està segur de ressaltar la informació necessària. I no ens agrada fer amb les nostres mans allò que no podem fer amb les nostres mans... Una nova tasca per al bot!

Estalviem temps, nervis i hores de treball

L'ordre /checks mostra un menú senzill i inequívoc; aquesta vegada els nostres nois van aprendre a utilitzar aquesta comanda sense instruccions!

Quan seleccioneu l'element desitjat, en comptes d'un menú, apareix una notificació sobre l'inici de la prova, de manera que els usuaris impacients no executin la nostra prova 100500 vegades:

Estalviem temps, nervis i hores de treball

En funció de l'element de menú seleccionat, s'inicia una prova específica des de la nostra xarxa, és a dir, des de la màquina on viu el bot (allà està preconfigurat jmeter, es troben les proves necessàries...) o directament des del centre de dades (des d'un màquina preparada al costat de l'aplicació), per tal d'excloure connexions de xarxa en provar retards o reduir-los al mínim.

Després de completar la prova i rebre el registre, el bot l'analitza i produeix el resultat en una forma "llegible per l'home":

Estalviem temps, nervis i hores de treball

Recull de mètriques

La funcionalitat ha arribat i els gestors de projectes interessats han rebut aquesta funció per a les seves regions. I un director de projectes compassiu va dir: "Vull tenir estadístiques de temps!" Algú del CIT li va dir que seria convenient controlar tot això a Zabbix. Zabbix, doncs Zabbix...

Vaig pensar que m'havia de preparar per a la necessitat de replicar la solució... Vaig posar la idea en un contenidor docker. Al contenidor, jmeter s'inicia de manera programada (un cop cada 10 minuts), posa el registre en un lloc determinat, php l'analitza i mostra les dades necessàries en forma de pàgina web. Zabbix, utilitzant la clau web.page.get, rep aquesta pàgina, selecciona regularment les dades necessàries per a determinats elements dependents i crea un gràfic.

Estalviem temps, nervis i hores de treball

Crec que no va resultar malament. Observant el gràfic, en primer lloc, veiem la velocitat aproximada de l'aplicació, i si es detecten pics al gràfic, sabem aproximadament on està el "endoll". És fàcil. Fins ara només ha tingut una demanda per a una regió, però estic disposat a replicar-lo per als interessats.

Desenvolupament d'aplicacions

Les estadístiques sobre tasques similars han donat lloc recentment a més idees per simplificar i facilitar el treball. En alguns projectes, en servidors d'aplicacions, cal instal·lar contenidors clau de Crypto Pro, n'hi ha molts i la signatura digital caduca amb el temps. De vegades arriben 2 tasques al dia. Però vaig considerar que no era segur utilitzar un bot per a aquests propòsits i vaig decidir que crearia la funcionalitat directament a l'aplicació. Naturalment amb autorització i comprovació dels drets d'accés. Si teniu els privilegis necessaris, hi haurà disponible un element de menú addicional per treballar amb signatures digitals, instal·lació, supressió, visualització d'informació, etc. La funcionalitat està actualment en desenvolupament. Com a resultat, això no és gaire difícil, només cal que llegiu una mica les instruccions existents, mireu exemples de codi, pregunteu als companys amb més experiència en desenvolupament i després feu-ho. Durant el procés de recerca, van sorgir idees per afegir a l'aplicació. No faré plans napoleònics: hi ha desenvolupament, que cadascú es preocupi dels seus. Però tot i que és interessant, ho faig jo mateix.

Plans

Com he dit, van néixer moltes idees diferents per utilitzar el nostre bot i no només -en general, diguem-ne, idees per a "punts d'automatització", moltes d'elles es van oblidar, ja que no vaig tenir temps d'escriure-les. Ara intento anotar tot el que em ve al cap, i recomano que els altres facin el mateix.

Però Alexey no s'oblida de donar els seus desitjos. De l'últim:
/kill_sql SQL_ID — mateu totes les sessions amb aquesta sol·licitud SQL_ID
/kill_block - matar la sessió de bloqueig d'arrel
/mostrar_em — Mostrar una imatge del rendiment EM
És un tipus astut, vol cosir DBA des del seu telèfon =)

Així treballem en benefici de la Pàtria!

Com us desfer de les tasques rutinàries i poc interessants?

Espero que la lectura hagi resultat interessant, i potser fins i tot útil per a algú, i no he tingut temps d'avorrir el lector... Molta sort a tots.

Font: www.habr.com

Afegeix comentari