ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

پروژه های ما معمولاً منطقه ای هستند و مشتریان معمولاً وزارتخانه ها هستند. اما علاوه بر بخش دولتی، سازمان های خصوصی نیز از سیستم های ما استفاده می کنند. عملا هیچ مشکلی با آنها وجود ندارد.

بنابراین، پروژه های اصلی منطقه ای هستند و گاهی اوقات مشکلاتی در آنها وجود دارد. به عنوان مثال، با عملکرد، زمانی که در مناطقی بیش از 20 هزار کاربر ارزشمند ما در طول دوره ارائه عملکردهای جدید در سرورهای محصول وجود دارد. درد است…

نام من روسلان است و از سیستم های اطلاعاتی گروه BARS و پشتیبانی می کنم توسعه یک ربات کشنده برای DBA های سریال خشن. این پست برای افراد ضعیف نیست - حروف و تصاویر زیادی وجود دارد.

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

/awr

برخی از برنامه های ما بر روی Oracle DBMS اجرا می شوند. همچنین پروژه هایی در PostgreSQL DBMS وجود دارد. Oracle یک چیز شگفت انگیز دارد - جمع آوری آمار در مورد بار روی DBMS، که مشکلات موجود را برجسته می کند و حتی توصیه هایی برای حذف ارائه می دهد - مخزن بار کاری خودکار (AWR). در یک نقطه (یعنی در لحظه درد)، توسعه دهندگان به طور مداوم درخواست جمع آوری کردند گزارش AWR برای تجزیه و تحلیل عملکرد. ما صادقانه به سرور DBMS رفتیم، گزارش ها را جمع آوری کردیم، آنها را برای خودمان بردیم و برای تجزیه و تحلیل به تولید فرستادیم. بعد از دفعه 5 مزاحم شد... بعد از 10 آزار دهنده شد...

یکی از همکاران من زمانی این ایده را بیان کرد که هر کاری که بیش از یک بار انجام می شود باید خودکار باشد. تا لحظه عصبانیت، صادقانه بگویم، من به آن فکر نکردم و سعی کردم همه چیزهایی را که می توان خودکار کرد، خودکار کنم، اما اغلب مورد تقاضا نبود و بیشتر جنبه تحقیقاتی داشت تا کاربردی.

و بعد فکر کردم: "برای تهیه گزارش نیازی به مدیران نیست...". پس از همه، جمع آوری یک گزارش به معنای اجرای اسکریپت sql @$ORACLE_HOME/rdbms/admin/awrrpt.sql و بردن گزارش از سرور به محل شماست... اوه بله، ما اجازه توسعه برای تولید را نمی دهیم.

سپس اطلاعات لازم را در گوگل جستجو کردم، تابع را از مقاله در پایگاه آزمایشی ایجاد کردم، اسکریپت و معجزه را اجرا کردم - گزارش جمع آوری شد و می توان آن را به صورت محلی ذخیره کرد. عملکردهایی را ایجاد کرد که در آن گزارش های AWR اغلب مورد نیاز بود و به توسعه دهندگان گفت که چگونه از آنها استفاده کنند.

در همین زمان، در اوقات فراغت، پس از صحبت با @BotFather، یک ربات تلگرام برای خودم ساختم، فقط برای سرگرمی. من یک عملکرد ساده را در آنجا پیچیدم - زمان فعلی، نرخ ارز، آب و هوا را نشان دادم، به آن یاد دادم که طبق برنامه برای همسرم (در آن زمان دوست دخترم) تعریف بفرستم. شاید در آن زمان، تعریف و تمجید، محبوب ترین قابلیت ربات من بود و همسرم از آن استقبال می کرد.

بنابراین. توسعه دهندگان در تلگرام برای ما می نویسند، ما در تلگرام برایشان گزارش می فرستیم... اگر نه برای ما، بلکه برای یک ربات بنویسند چطور؟ از این گذشته ، برای همه بهتر خواهد بود ، گزارش سریعتر دریافت می شود و مهمتر از همه دور زدن ما. اینگونه بود که ایده اولین قابلیت محبوب برای ربات من متولد شد.

اجرا را شروع کردم. من این کار را تا جایی که می توانستم در PHP انجام دادم (برنامه ما خود به زبان PHP است، من در آن بیشتر از پایتون مهارت دارم). من کدنویس خوبی نیستم، پس کدم را به شما نشان نمی دهم :)

ربات در شبکه شرکتی ما زندگی می کند و به پروژه های خاصی از جمله پایگاه های داده هدف دسترسی دارد. برای اینکه مزاحم پارامترهای تیم یا منو نباشم، این قابلیت را با اعلان‌های نظارتی به چت گروهی اضافه کردم. به این ترتیب ربات بلافاصله می داند که از کدام پایگاه داده باید گزارش را جمع آوری کند.

با دریافت دستوری مانند /awr N، که در آن N تعداد ساعات کاملی است که برای آن گزارش مورد نیاز است (به طور پیش فرض - 1 ساعت)، حتی برای یک هفته، اگر پایگاه داده مجددا راه اندازی نشده باشد، ربات بلافاصله شروع به کار می کند، گزارش را جمع آوری می کند، آن را به عنوان یک منتشر می کند. صفحه وب و بلافاصله (تقریبا همانجا) پیوندی به گزارش بسیار مورد نیاز ارائه می دهد.

لینک را دنبال کنید و در اینجا، گزارش AWR است:

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

همانطور که انتظار می رفت، توسعه دهندگان با تولید چنین گزارشی کنار آمدند و حتی برخی از ما تشکر کردند.

با قدردانی از راحتی تیم، مدیران پروژه از مناطق دیگر نیز همین را می خواستند، زیرا آنها بیشترین دریافت را از مشتری دریافت می کنند و نگران عملکرد و در دسترس بودن سیستم ها هستند. من ربات را به چت های دیگر اضافه کردم. آنها هنوز از آن استفاده می کنند و من از این بابت خوشحالم.

بعداً، همکاران CIT از نحوه جمع‌آوری گزارش‌ها مطلع شدند و خواستند این کار را نیز انجام دهند. من آنها را به چت هایمان اضافه نکردم، یک چت جداگانه با تولید گزارش ها بر اساس یک برنامه زمان بندی و بر اساس درخواست ایجاد کردم.

/pgBadger

ما همچنین برنامه های کاربردی دیگری در PHP در ارتباط با PostgreSQL داریم. من مجموعه گزارش‌های pgBadger را با استفاده از همین اصل - در چت‌های گروهی - برای افراد نیازمند پیاده‌سازی کردم. ابتدا از آن استفاده کردند اما بعد قطع کردند. عملکرد به عنوان غیر ضروری قطع شد.

/وظیفه

بخش ما شیفت شب دارد و بر این اساس برنامه دارد. در Google Sheets موجود است. همیشه راحت نیست که دنبال لینک بگردی، نمودار باز کنی، دنبال خودت بگردی... یکی از همکاران سابق من هم با ربات تلگرامش بازی کرد و آن را به چت دپارتمان ما معرفی کرد. اطلاعیه در مورد شروع شیفت وظیفه برای کارکنان بخش. ربات برنامه را تجزیه می کند، فرد وظیفه را تا تاریخ فعلی تعیین می کند و طبق برنامه یا در صورت درخواست، گزارش می دهد که چه کسی امروز در حال انجام وظیفه است. عالی و راحت معلوم شد. درست است، من قالب پیام ها را دوست نداشتم. همچنین، برای کارمندان بخش دیگری (به عنوان مثال، BC "پزشکی")، اطلاعات در مورد کسانی که در جهت های دیگر وظیفه دارند واقعا مورد نیاز نیست، اما باید بدانید در صورت بروز مشکل چه کسی در "پزشکی" وظیفه دارد. تصمیم گرفتم عملکرد را "قرض بگیرم"، اما آنچه را که دوست نداشتم تغییر دهم. من یک قالب پیام را برای خودم و دیگران راحت کردم و اطلاعات غیر ضروری را حذف کردم.

/tnls

پس از آزمایش اتوماسیون با استفاده از ربات تلگرام، ایده های مختلفی ظاهر شد، اما من می خواستم کارهای کاملا ضروری را انجام دهم. تصمیم گرفتم رهبری کنم آمار در مورد درخواست ها برای دسترسی به پروژه های مشتریان خود، ما یک سرور به اصطلاح "پرش سرور" یا سرور حمل و نقل را پیاده سازی کرده ایم. اتصالات VPN بر روی آن بالا می رود، سپس پورت های برنامه، پایگاه های داده و سایر ارسال های کمکی از طریق ssh به شبکه محلی ما ارسال می شوند تا دسترسی آسان به پروژه های کارمندان ما بدون مشکل در اتصالات VPN باشد. تنها کاری که باید انجام دهید این است که یک اتصال VPN به شبکه شرکتی ما راه اندازی کنید.

آمار درخواست‌ها نشان داده است که اغلب پس از از کار افتادن یکی از تونل‌ها (مثلاً در مورد مشکلات شبکه به دلیل وقفه زمانی)، افراد برای بازگرداندن دسترسی به پروژه با ما تماس می‌گیرند. در بیشتر موارد، فقط راه اندازی مجدد اتصال کافی است و همه چیز خوب است. بیایید این کار را خودتان انجام دهید. دستور اینجاست:
ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

شما وارد آیتم منوی مورد نظر می شوید، پروژه خود را انتخاب می کنید، یک دقیقه صبر می کنید و همه خوشحال و راضی هستند...

پس از دریافت فرمان، با حرکت جزئی بایت ها و بیت ها، ربات به سرور ارسال وصل می شود و از قبل می داند که کدام فوروارد نیاز به راه اندازی مجدد دارد و کار خود را انجام می دهد - اتصال به پروژه را بازیابی می کند. من دستورالعملی نوشتم تا خودتان بتوانید چنین مسائلی را حل کنید. و افراد فقط در صورتی با ما تماس می گرفتند که ابزار ارائه شده کار نمی کرد ...

/ecp_to_pem

آمارهای بیشتر نشان داد که اغلب نیاز به تبدیل است EDS Crypto Pro با فرمت pem(پایه 64) برای ادغام های مختلف، و ما تعداد زیادی از آنها را داریم. وظیفه: یک ظرف بردارید، آن را با ابزار P12FromGostCSP نصب شده در رایانه ویندوز کپی کنید (به هر حال، پرداخت شده)، آن را به pfx تبدیل کنید، و سپس pfx را با استفاده از OpenSSL (با پشتیبانی از رمزگذاری GOST) به pem تبدیل کنید. این خیلی راحت نیست، اما شما آن را در لحظه فشار دادن انگشتان خود می خواهید.

گوگل دوباره به کمک آمده است. پیدا شد فایده برخی افراد مهربان. من آن را همانطور که در README نوشته شده مونتاژ کردم - کار کرد. من به ربات یاد دادم که با ابزار کار کند و تقریباً یک تبدیل فوری دریافت کردم.
ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

در زمان اجرای نهایی، دستور تغییر به فرمت رمزگذاری جدید - gost-2012 صادر شد. تا آنجا که من به یاد دارم، ابزار در آن لحظه فقط با GOST قدیمی (2001) کار می کرد، شاید این ابزار مشابه دیگری از شخص مهربان دیگری بود، دقیقاً به خاطر ندارم.
پس از انتقال به GOST جدید، عملکرد ربات به دلایل امنیتی حذف شد. آن را در یک داکر کانتینر پیاده سازی کرد.

Dockerfile، در صورتی که کسی به آن نیاز داشته باشد:

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

برای تبدیل، باید کانتینر اصلی (دایرکتوری مانند xxx.000) را در پوشه /srv/in قرار دهید و pem تمام شده را به /srv/out ببرید.

برای تبدیل:

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

یک روز، یک اوراکل DBA بسیار باحال، با تجربه زیادی در مدیریت و توسعه DBMS، در شرکت ما شغلی پیدا کرد. و او بلافاصله در اتصال به سرورهای DBMS با ssh دچار مشکل شد: او نمی داند کجا یا چگونه باید متصل شود، دسترسی به وضوح توضیح داده نشده است، یا نمی تواند چیزی را که نیاز دارد برای خودش فوروارد کند. خوب، ما خوشحالیم که به شما کمک می کنیم، به او گفتیم که چگونه ارتباط برقرار کند و مدیر سازمانی را به او فوروارد کردیم. اما هنوز همه چیز با ssh درست نشد. یکی از همکاران من آن را به سادگی توضیح داد: یک DBA اصیل :) ما تصمیم گرفتیم که اگر لازم است چیزی را روی سرور تغییر دهیم، خودمان این کار را انجام دهیم.

EM گاهی اوقات زیر بار سنگین خراب می شود و برای راه اندازی مجدد آن ... باید از طریق ssh وصل شوید و از طریق ترمینال ریستارت کنید. همکار جدید ما تصمیم گرفت: "ادمین ها در این کار خوب هستند." بارهای سنگین روی DBMS برای ما غیر معمول نیست و درخواست برای راه اندازی مجدد EM نیز رایج است. سپس همان سناریو: تنش، تحریک و جستجوی راه حلی برای مشکل. بنابراین در همان چت های گروهی دستورات زیر ظاهر شد: /emstop و /emstart.

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

/کشتن

اگر رقابت شدیدی در پایگاه داده وجود دارد و گاهی اوقات این اتفاق می افتد، لازم است پایگاه داده به سرعت تخلیه شود. سریعترین راه اینه که پروسه مشکل ساز رو بکشی... برای این کار از طریق ssh وصل کن، -9 رو بکش... ربات کمک میکنه!

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

الکسی از تیم قدردانی کرد و نامی محبت آمیز به آن داد - "کیلیالکا" یا یک اسلحه
یک روز، پس از تماشای تلاش و رنج آلکسی، هر بار برای هر یک از فرآیندها وارد xxx/kill می‌شدم، تصمیم گرفتم «چند لوله» را به تفنگ خود اضافه کنم:

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

این بهتر است! همه چیز برای توست، الکسی، فقط کار کن، عزیزم!

طبیعتا چنین تیم مهمی محدود بود دسترسی توسط user_id - "غیر احمقانه". با دیدن اینکه Lesha چگونه به طرز ماهرانه ای فرآیندها را در سرور پایگاه داده می کشد ، چندین نفر سعی کردند دستوری را با یک شماره فرآیند تصادفی وارد کنند ، اما شما نمی توانید ربات هوشمند من را فریب دهید ، او بلافاصله نپذیرفت.

/alertlog

خوب، در هر صورت، من دستور را انجام دادم:
/alertlog <تعداد خطوط> - تعداد مشخص شده خطوط هشدار را دریافت کنید
ربات یک هشدار می کشد و آن را به سرویس ما می فرستد، مانند pastebin، به نام pyste، و یک پیوند به چسب به چت درخواست ارسال می کند.

/چک می کند

بعد یک درخواست برای نظارت بر عملکرد واقعی برنامه ما تا به حال، پشتیبانی فنی پروژه این داده ها را به صورت دستی جمع آوری می کرد. ایرادی نداره! آزمایش کنندگان شجاع ما موارد آزمایشی را برای این کار توسعه داده اند. گزارش آزمایشی به دست آمده برای خواندن خیلی راحت نیست؛ یک کاربر بی تجربه زمان زیادی را برای فهمیدن نیاز دارد و مطمئن نیست که اطلاعات لازم را برجسته کند. و ما دوست نداریم کاری را که با دستانمان نمی توانیم انجام دهیم با دستانمان انجام دهیم... یک کار جدید برای ربات!

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

دستور /checks یک منوی ساده و بدون ابهام را نمایش می دهد؛ این بار بچه های ما یاد گرفتند که چگونه از این دستور بدون دستورالعمل استفاده کنند!

هنگامی که مورد مورد نظر را انتخاب می کنید، به جای منو، یک اعلان در مورد شروع آزمون ظاهر می شود، به طوری که کاربران بی حوصله تست ما را 100500 بار اجرا نمی کنند:

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

بسته به آیتم منوی انتخاب شده، یک آزمایش خاص از شبکه ما راه اندازی می شود، یعنی از دستگاهی که ربات در آن زندگی می کند (jmeter از قبل در آنجا پیکربندی شده است، آزمایش های لازم در آن قرار دارند...) یا مستقیماً از مرکز داده (از یک ماشین آماده در کنار برنامه)، به منظور حذف اتصالات شبکه در هنگام آزمایش تاخیر، یا کاهش آنها به حداقل.

پس از اتمام تست و دریافت گزارش، ربات آن را تجزیه می کند و نتیجه را به صورت "قابل خواندن برای انسان" تولید می کند:

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

مجموعه معیارها

عملکرد فرا رسیده است و مدیران پروژه علاقه مند چنین عملکردی را برای مناطق خود دریافت کرده اند. و یک مدیر پروژه دلسوز گفت: "من می خواهم آمار زمان داشته باشم!" شخصی از CIT به او گفت که نظارت بر همه اینها در Zabbix راحت است. زبیکس، پس زبیکس...

فکر کردم که باید برای نیاز به تکرار راه حل آماده شوم... این ایده را در یک ظرف داکر قرار دادم. در کانتینر، jmeter بر اساس یک برنامه (هر 10 دقیقه یک بار) راه اندازی می شود، لاگ را در یک مکان مشخص قرار می دهد، php آن را تجزیه می کند و داده های لازم را در قالب یک صفحه وب نمایش می دهد. Zabbix با استفاده از کلید web.page.get، این صفحه را دریافت می کند، به طور منظم داده های لازم را برای عناصر وابسته خاص انتخاب می کند و یک نمودار می سازد.

ما در زمان، اعصاب و ساعات کار صرفه جویی می کنیم

فکر کنم بد نبود با مشاهده نمودار، ابتدا سرعت تقریبی برنامه را مشاهده می کنیم و اگر پیک هایی در نمودار شناسایی شوند، تقریباً می دانیم که "plug" کجاست. ساده است. تاکنون فقط برای یک منطقه مورد تقاضا بوده است، اما من آماده هستم آن را برای علاقه مندان تکرار کنم.

توسعه اپلیکیشن

آمار مربوط به کارهای مشابه اخیراً ایده های بیشتری برای ساده سازی و تسهیل کار ایجاد کرده است. در برخی از پروژه ها، در سرورهای برنامه، نیاز به نصب ظروف کلیدی Crypto Pro وجود دارد، تعداد زیادی از آنها وجود دارد و امضای دیجیتال به مرور زمان منقضی می شود. گاهی اوقات 2 کار در روز می رسد. اما من استفاده از یک ربات برای این اهداف را ناامن تلقی کردم و تصمیم گرفتم که عملکرد را مستقیماً در برنامه ایجاد کنم. طبیعتا با مجوز و بررسی حقوق دسترسی. اگر امتیازات لازم را دارید، یک آیتم منوی اضافی برای کار با امضای دیجیتال، نصب، حذف، مشاهده اطلاعات و غیره در دسترس خواهد بود. عملکرد در حال حاضر در دست توسعه است. همانطور که مشخص شد، این کار خیلی سخت نیست، فقط باید دستورالعمل های موجود را کمی بخوانید، به نمونه کد نگاه کنید، از همکاران با تجربه تر در توسعه بخواهید و سپس آن را انجام دهید. در طول فرآیند تحقیق، ایده هایی برای افزودن به برنامه ظاهر شد. من برنامه‌های ناپلئونی نمی‌کنم - توسعه وجود دارد، بگذارید هر کسی به کار خودش فکر کند. اما در حالی که جالب است، من خودم آن را انجام می دهم.

طرح

همانطور که گفتم، بسیاری از ایده های مختلف برای استفاده از ربات ما متولد شد و نه تنها - به طور کلی، بیایید بگوییم، ایده هایی برای "نقاط اتوماسیون"، بسیاری از آنها فراموش شدند، زیرا وقت نوشتن آنها را نداشتم. حالا سعی می کنم هر چیزی که به ذهنم می رسد را یادداشت کنم و به دیگران هم توصیه می کنم همین کار را بکنند.

اما الکسی فراموش نمی کند که خواسته های خود را بیان کند. از جدیدترین ها:
/kill_sql SQL_ID - تمام جلسات را با این درخواست SQL_ID بکشید
/kill_block - جلسه مسدود کردن ریشه را بکشید
/show_em - تصویری از عملکرد EM را نشان دهید
او یک مرد حیله گر است، او می خواهد DBA را از گوشی خود بدوزد =)

اینگونه به نفع وطن کار می کنیم!

چگونه خود را از شر کارهای معمولی و غیر جالب خلاص می کنید؟

امیدوارم خواندن جالب باشد، و شاید حتی برای کسی مفید باشد، و من وقت نداشتم خواننده را خسته کنم ... برای همه ما موفق باشید.

منبع: www.habr.com

اضافه کردن نظر