PDOException: пакеты вышли из строя. Ожидается 0, получено 1. Размер пакета = 23 - PullRequest
1 голос
/ 07 августа 2020

У меня есть проект Laravel Spark, который использует Horizon для управления очередью заданий с помощью Redis.

Локально (в моем ящике Homestead, Ma c OS) все работает, как ожидалось, но на нашем новая капля Digital Ocean (подготовленная Forge), которая представляет собой оптимизированную для памяти 256 ГБ, 32 виртуальных ЦП, 10 ТБ и 1x 800 ГБ VPS, я продолжаю получать сообщение об ошибке:

PDOException: Packets out of order. Expected 0 received 1. Packet size=23

Или какой-то вариант этой ошибки, где информация о размере пакета может отличаться.

После многих часов / дней отладки и исследований я наткнулся на множество сообщений в StackOverflow и других местах, которые, кажется, указывают на то, что это можно исправить, выполнив ряд вещей, перечисленные ниже:

  1. Установить PDO::ATTR_EMULATE_PREPARES в мою базу данных. php config. Это абсолютно не влияет на проблему и фактически вызывает другую проблему, при которой целые числа преобразуются как строки.

  2. Установите DB_HOST на 127.0.0.1 вместо localhost, чтобы он использует TCP вместо сокета UNIX. Опять же, это не имеет никакого эффекта.

  3. Установите DB_SOCKET на путь сокета, указанный в MySQL, войдя в MySQL (MariaDB) и запустив show variables like '%socket%';, который перечисляет сокет путь как /run/mysqld/mysqld.sock. Я также оставляю DB_HOST равным localhost. Это тоже не действует. Я заметил одну вещь: для переменной pdo_mysql.default_socket установлено значение /var/run/mysqld/mysqld.sock, я не уверен, является ли это частью проблемы?

  4. Я значительно увеличил MySQL настройки конфигурации из /etc/mysql/mariadb.conf.d/50-server.cnf на следующие:

    • key_buffer_size = 2048M
    • max_allowed_packet = 2048M
    • max_connections = 1000
    • thread_concurrency = 100
    • query_cache_size = 256M

Я должен признать, что изменение этих настроек было крайней мерой / хваткой в ​​сценарии типа str aws. Тем не менее, это в какой-то степени облегчило проблему, но не решило ее полностью, поскольку MySQL по-прежнему дает сбой в 99% случаев, хотя и на более позднем этапе.

Что касается очереди, я имеют в общей сложности 1,136 workers, разделенных между 6 супервизорами / очередями, и все это обрабатывается через Laravel Horizon, который запускается как демон.

Я также использую Laravel Websockets PHP пакет для широковещательной передачи, которая также запускается как демон.

Моя текущая конфигурация среды следующая (конфиденциальная информация опущена).

APP_NAME="App Name"
APP_ENV=production
APP_DEBUG=false
APP_KEY=thekey
APP_URL=https://appurl.com
LOG_CHANNEL=single

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=databse
DB_USERNAME=username
DB_PASSWORD=password

BROADCAST_DRIVER=pusher
CACHE_DRIVER=file
QUEUE_CONNECTION=redis
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

MAIL_MAILER=smtp
MAIL_HOST=smtp.gmail.com
MAIL_PORT=587
MAIL_USERNAME=name@email.com
MAIL_PASSWORD=password
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=name@email.com
MAIL_FROM_NAME="${APP_NAME}"

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION="us-east-1"
AWS_BUCKET=

PUSHER_APP_ID=appid
PUSHER_APP_KEY=appkey
PUSHER_APP_SECRET=appsecret
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

AUTHY_SECRET=

CASHIER_CURRENCY=usd
CASHIER_CURRENCY_LOCALE=en
CASHIER_MODEL=App\Models\User
STRIPE_KEY=stripekey
STRIPE_SECRET=stripesecret

# ECHO SERVER
LARAVEL_WEBSOCKETS_PORT=port

Настройка сервера выглядит следующим образом:

  • Макс.загрузка файла Размер: 1024
  • Максимальное время выполнения : 300
  • PHP Версия : 7,4
  • Версия MariaDB : 10.3.22

Я проверил все журналы (см. Ниже) во время сбоя сервера MySQL / уходит, а в журналах MySQL вообще ничего нет. Никакой ошибки. Я также ничего не вижу в:

  • /var/log/nginx/error.log
  • /var/log/nginx/access.log
  • /var/log/php7.4-fpm.log

I ' m в настоящее время все еще копаюсь и отлаживаю, но сейчас я в тупике. Я впервые сталкиваюсь с этой ошибкой.

Может ли это быть из-за слишком быстрого попадания в базу данных (чтение / запись)?

Немного информации о том, как работают очереди .

  1. У меня есть начальный контроллер, который отправляет задание в очередь.
  2. Как только это задание завершается, оно запускает событие, которое затем запускает процесс запуска нескольких других слушателей / событий последовательно, все это зависит от завершения предыдущих заданий до того, как будут запущены новые события и новые слушатели / задания берут на себя работу.
  3. Всего транслируется 30 событий.
  4. Всего существует 30 слушателей.
  5. Всего 5 заданий.

Все они работают последовательно в зависимости от запущенного слушателя / задания и события, которое оно запускает.

Я также наблюдал за laravel.log вживую, и когда происходит ошибка sh, вообще ничего не регистрируется. Хотя иногда я получаю production.ERROR: Failed to connect to Pusher. независимо от того, вылетает MySQL или нет, поэтому я не думаю, что это имеет какое-либо отношение к этой проблеме.

Я даже заметил, что ограничение скорости API Laravel было Hit, поэтому я решил резко увеличить это значение с 60 до 500. По-прежнему никакой радости.

Наконец, похоже, не имеет значения, какое событие, задание или прослушиватель запущено, поскольку ошибка возникает на случайных. Итак, не уверен, что это код c, хотя вполне может быть.

Надеюсь, я предоставил достаточно справочной и подробной информации, чтобы получить некоторую помощь с этим, но если я что-то пропустил , пожалуйста, дайте мне знать, и я добавлю это к вопросу. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...