Mysql Debezium разъем для RDS в производстве вызвало взаимоблокировки - PullRequest
0 голосов
/ 04 октября 2019

Мы создаем конвейер данных из Mysql в RDS для упругого поиска для создания поисковых индексов, и для этого используем cdc debezium с его источником mysql и коннектором эластичного приемника.

Теперь, когда mysql находится в rds, мыдолжны предоставить пользователю mysql LOCK TABLE разрешение для двух таблиц, которые мы хотели использовать cdc, как упомянуто в документации.

У нас также есть другие пользователи mysql, выполняющие транзакции, для которых может потребоваться любая из двух таблиц.

Как только мы подключили соединитель mysql к нашей производственной базе данных, была создана блокировка, и вся наша система вышла из строя, после осознания этого мы вскоре остановили kafka и также удалили соединитель, но блокировки все еще увеличивались, и это решалось только послемы останавливаем все новые запросы, не давая нашему производственному коду запускаться и вручную убивая процессы.

Что может быть потенциальной причиной этого и как мы можем предотвратить это?

Ответы [ 3 ]

2 голосов
/ 05 октября 2019

Используйте реплику, чтобы предотвратить выполнение оператора таблицы блокировок, зачем debezium нужна таблица блокировок? все утилиты CDC извлекают события из журналов bin.

1 голос
/ 08 октября 2019

Если блокировка является проблемой, и вы не можете позволить себе компромисс между блокировкой и согласованностью, тогда, пожалуйста, посмотрите на параметр конфигурации snapshot.locking.mode.

1 голос
/ 05 октября 2019

Я только догадываюсь, потому что я не знаю ваш запрос трафика. Я бы предположил, что количество обнаруженных вами блокировок увеличилось в результате невыполнения запросов, которые ожидали освобождения блокировок таблицы.

Я имею в виду следующую последовательность:* Debezium запускает блокировку таблиц на ваших двух столах.

Приложение все еще работает и пытается выполнить запросы, которые обращаются к этим заблокированным таблицам. Запросы начинаются в ожидании снятия блокировки. Они будут ждать до 1 года (это значение по умолчанию lock_wait_timeout). Когда вы потратите несколько минут, пытаясь выяснить, почему ваш сайт не отвечает, накапливается большое количество заблокированных запросов. Потенциально столько, сколько max_connections. После того, как все разрешенные соединения заполнены заблокированными запросами, приложение вообще не сможет подключиться к MySQL. Наконец, вы останавливаете процесс Debezium, который пытается прочитать свой первоначальный снимок данных. Он снимает свои блокировки таблиц.

Сразу же после снятия блокировок таблицы ожидающие запросы могут продолжаться.

  • Но многим из них тоже нужно получать блокировки, если они являются INSERT / UPDATE / DELETE / REPLACE или если они SELECT ... FOR UPDATE или другие операторы блокировки.
  • Поскольку таких запросов в очереди очень много, они с большей вероятностью будут запрашивать перекрывающиеся блокировки, что означает, что им придется ждать завершения друг друга и снимать блокировки.
  • Кроме того, поскольку одновременно выполняются сотни запросов, они перегружают системные ресурсы, такие как ЦП, вызывая высокую нагрузку на систему, что также замедляет их работу. Таким образом, для выполнения запросов потребуется больше времени, и поэтому, если они заблокированы друг для друга, им придется ждать дольше.

Между тем приложение все еще пытается принимать запросы,и поэтому добавляет больше запросов для выполнения. Они также подвержены очереди и исчерпанию ресурсов.

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

Предложение другого ответа использовать реплику чтения для снимка Debezium является хорошим. Если ваше приложение может некоторое время читать из основного экземпляра MySQL, тогда никакие запросы не будут заблокированы для реплики, пока Debezium заблокирует ее. В конце концов, Debezium завершит чтение всех данных и снимет блокировки, а затем перейдет к чтению только binlog. Затем приложение может возобновить использование реплики в качестве экземпляра для чтения.

Если в вашем бинлоге используется GTID, вы сможете настроить инструмент CDC, такой как Debezium, для чтения снимка из реплики, а затем, когда это будет сделано, переключитесь намастер, чтобы прочитать журнал. Но если вы не используете GTID, это немного сложнее. Инструмент должен знать позицию binlog на ведущем устройстве, соответствующую снимку на реплике.

...