Проблемы с производительностью с MySQL Proxy
Один или несколько клиентов имеют MySQl как часть своего решения.
Они настроили его так, чтобы иметь общую базу данных master и определенную ведомую базу данных для каждого клиента (у них более 10 подчиненных). Для этого они используют MySQL-прокси.
Они сталкиваются с некоторыми проблемами производительности, включая вставки / обновления баз данных, ставящиеся в очередь, и занимающие довольно много времени для записи в подчиненные базы данных.
Можете ли вы предложить, как это можно улучшить? Существуют ли инструменты, которые могут помочь определить причину проблемы? Похоже ли это на стандартный подход (общий мастер с клиентскими подчиненными, управляемыми через прокси-сервер MySQL)?
Любой совет будет принят во внимание.
Спасибо,
Энди
1 ответ
У меня было такое же поведение, но моя проблема была следующей:
одно из моих обновлений заканчивалось с ошибкой, прокси-сервер mysql (и специфичный для rw-splitter.lua) обрабатывает эту ситуацию, как будто соединение может быть повторно использовано другим клиентом, и возвращает соединение в пул. Это означает, что когда клиент получает ошибку и пытается выполнить откат транзакции, он передается другому соединению или новому соединению из пула и не имеет никакого эффекта. Между тем, сбой процесса UPDATE, в котором произошла ошибка транзакции, был заблокирован, пока транзакция не будет откатана по таймауту (но в моем случае и у mysql-proxy по умолчанию это 28800 секунд), поэтому довольно долго.
Проблема была решена.
Patch:
найти в rw-splitter.lua следующий блок:
is_in_transaction = flags.in_trans
local have_last_insert_id = (res.insert_id and (res.insert_id > 0))
if not is_in_transaction and
not is_in_select_calc_found_rows and
not have_last_insert_id then
и изменить его на
if res.query_status == proxy.MYSQLD_PACKET_ERR and is_in_transaction then
if is_debug then
print ("(read_query_result) ERROR happened while transaction staying on the same backend")
end
return
end
is_in_transaction = flags.in_trans
local have_last_insert_id = (res.insert_id and (res.insert_id > 0))
if not is_in_transaction and
not is_in_select_calc_found_rows and
not have_last_insert_id then