از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پیدا کردن منبع Aborted_connects در MySQL
How to track the source of Aborted_connects in MySQL
دیروز برای یک یاز شرکتهایی که به آنها خدمات مدیریت سرور و سرویس ارائه میکنیم مشکلی را بررسی رو رفع کردم که با دو مشکل روی سرورهای دیتابیس و اپلیکیشن مواجه بودند
ارور server has gone away
ارور Got an error reading communication packets
در این آموزش سعی دارم نحوه ردگیری منشا ( و نه رفع ون در سطح دیتابیس سرور رو ) مرورکنم
دروهله اول دستور زیر رو اجرا کنید تا ببنید که به چه تعدا کانکشن لغو شده ) Aborted Connection وجود دارد )
mysqladmin ext | grep Abort
خروجی به شکل زیر می باشد
| Aborted_clients | 14835 |
| Aborted_connects | 15598 |
این دو متغیر وضعیتی در واقع بیربط به مشکل ما هستند (راهنمای MySQL , MariaDB را ه آنها رو توضیح میدهد مطالعه کنید
اولی مربوط به تعداد ارور هایی است که کلاینت دریافت کرده است ، : چون سرور کانکشن های غیر فعال را بعد از مدتی بسته است ، و با افزایش wait_timeout در تنظیمات دیتابیس سرور این مشکل را حل کردم
ارور دوم هم نشان نمی دهد کانشکن فعالی بسته شده اصلا ، بلکه نشان دهنده کانکشن هایی است که به هر دلیل برقرار نشده است .ممکن است مشکل شبکه باشد و یا مشکلی در پرمیژن یا و حتی اطلاعات اشتباه در اتصال به دیتابیس سرور و یا هر چیز دیگری ، اولین چیز یمه من بررسی کردم وجود Packet loss احتمالی بین دیتابیس سرور و سرور اپلیکیشن ( وب سرور ) بود ، که بر اساس بررسی با پینگ و وضعیت وضعیت ترافیک سرور هیچ پکت لاستی وجود نداشت و حتی یک کانشکن هم دراپ نشده بود( با دستور ifconfig -a میتوانید وضعیت اینترنفیس را بررسی کنید ) خروجی زیر نمونه آن است
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 1.2.3.4 netmask 255.255.255.0 broadcast 1.2.3.255
ether 00:00:12:34:56:78 txqueuelen 1000 (Ethernet)
RX packets 57934296 bytes 7510198686 (6.9 GiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 48838314 bytes 119023516734 (110.8 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
پس از اینکه از این موضوع مطمئن شدم 0 حداقل برای اطمینان خودم این را چک کردم ، در صورت یکه عملا دو سرور در یک شبکه داخلی قرار داشتند ) به ابزار و دستور tcdump در لینوکس رجوع کردم ، تا ببنیم برای این کانکشن ها چه اتفاقی می افتد ، دستورات زیر را برای بررسی این موضوع اجرا کردم تا ببینم چه زمانی یک کانشکن Abort می شود .
mysqladmin ext | grep Abort | grep -v 0
و همزمان tcpdump را هم در پنجره دیگری اجرا کردم
tcpdump -s 1500 -w tcp.out port 3306
بعد از اینکه aborted conection را دیدم tcpdummp را متوقف کردم و در فایل نتیجه به جستجو پرداختم فایل خروجی در همان مسیری که در آن دستور را راجرا کنید با عنوان tcp.out ایجاد می شود ) و می توانید با دستور
tcpdump -r tcp.out
) آن را مشاهده کنید ، در خروجی چیز بدی اتفاق نیافتاده بوده و در واقع در لایه شبکه چیز مشکل داری دیده نمی شود ، از ابزار strings برای متنهایی که در دستوارت ارسال شده بود استفاده کردم
strings tcpdump.out
Host ‘XXX.XX.XX.XXX’ is not allowed to connect to this MySQL server
من آدرس های ای پی رو ناشناس کردم ، اما بر اساس ارور فوق بعد از بررسی جدول grants مای اس کیو ال سرور مشخص شد که یوزرها بعضا دارای دسترسی به سرور از ای پی خاصی نبودند که حل شد
من زیاد ار tcpdump استفاده نمی کنم ، اما روش استفاده ای که توضیح دادم تمرین خوبی بود که دوست داشتم در وبلاگ رسانگار با شما به اشتراک بزارم