Ошибка Postfix — connect to mysql server: Too many connections

Thank you for reading this post, don't forget to subscribe!

Столк­нул­ся с необыч­ной ошиб­кой во вре­мя рабо­ты postfix. Ошиб­ка не слож­ная, но пер­вые при­зна­ки этой ошиб­ки стран­ные и вызы­ва­ют вопро­сы. Это меша­ет быст­ро разо­брать­ся в ситуации

Нача­лось все с того, что ино­гда я стал на почту полу­чать вот такие оповещения:

Пер­вое что при­шло в голо­ву, когда уви­дел такое сооб­ще­ние — что-то с фай­ло­вой систе­мой или с дис­ком. Ошиб­ка на тему невоз­мож­но­сти запи­си оче­ре­ди на это наме­ка­ет. Все вни­ма­тель­но про­ве­рил на севе­ре, оши­бок с дис­ком не заметил.

Подоб­ные сооб­ще­ния при­хо­ди­ли не часто, сер­вер при этом нор­маль­но рабо­тал, мони­то­ринг ника­ких про­блем не видел, тесто­вые пись­ма про­ле­та­ли. Когда подоб­ные ошиб­ки ста­ли появ­лять­ся все чаще, начал раз­би­рать­ся подробнее.

Сер­вер доста­точ­но нагру­жен­ный, поэто­му его maillog читать неудоб­но, но при­шлось. В логе обна­ру­жил сле­ду­ю­щие предупреждения:

Тут ста­ло все понят­но. Сра­ба­ты­ва­ет огра­ни­че­ние mysql сер­ве­ра на коли­че­ство парал­лель­ных запро­сов. При­чем ошиб­ка воз­ни­ка­ет не посто­ян­но, а вре­мя от вре­ме­ни, ско­рее все­го во вре­мя всплес­ков нагруз­ки. У меня mysql сер­вер это отдель­ная маши­на. Идем на этот сер­вер, захо­дим в кон­соль mysql и про­ве­ря­ем пара­метр max_connections. Если вы его не тро­га­ли, то по-умол­ча­нию он будет равен 100.

Про­ве­ря­ем это в кон­со­ли mysql:

Я уже изме­нил на 200, поэто­му у меня такое зна­че­ние. Сде­лал я это сле­ду­ю­щей коман­дой mysql:

Пара­метр при­ме­ня­ет­ся сра­зу же, без пере­за­груз­ки. Что­бы после пере­за­пус­ка сер­ве­ра, зна­че­ние оста­лось рав­ным 200, добав­ля­ем в my.cnf в сек­цию [mysqld] сле­ду­ю­щий парметр.

Для того, что­бы посмот­реть коли­че­ство теку­щих соеди­не­ний, исполь­зуй­те сле­ду­ю­щую коман­ду в mysql консоли:

Когда вы управ­ля­е­те поч­то­вы­ми сер­ве­ра­ми Postfix с помо­щью соеди­не­ний SQL для поис­ка инфор­ма­ции об име­нах поль­зо­ва­те­лей, рас­по­ло­же­ни­ях поч­то­вых ящи­ков / maildir на дис­ке,  в сво­ем main.cf, у вас что-то вроде:

Но, таким обра­зом, каж­дый про­цесс (пост­фикс­ный про­цесс) исполь­зу­ет одно соеди­не­ние MySQL. Каж­дое сооб­ще­ние, кото­рое про­хо­дит через ваш сер­вер, будет откры­вать и закры­вать соеди­не­ние MySQL. Веро­ят­но, это рабо­та­ет на про­стом поч­то­вом сер­ве­ре, кото­рый обра­ба­ты­ва­ет 3 домен­ных име­ни и око­ло 15 обыч­ных поч­то­вых ящи­ков, но если у вас есть тыся­чи писем в час, кото­рые про­хо­дят через ваш поч­то­вый сер­вер, это может созда­вать мно­го-мно­го бес­по­лез­ной нагруз­ки на ваш сервер.

Про­стой спо­соб заста­вить Postfix исполь­зо­вать мень­ше соеди­не­ний - это про­сто поме­стить «proxy:» перед все­ми опе­ра­то­ра­ми «mysql:» в main.cf. Вы буде­те иметь:

Таким обра­зом, Postfix направ­ля­ет все запро­сы SQL через один из двух сво­их демо­нов, назы­ва­е­мых proxymap (исполь­зу­ет­ся для полу­че­ния инфор­ма­ции из базы дан­ных) и proxywrite (исполь­зу­ет­ся для запи­си инфор­ма­ции в базу данных).