Проблемы с производительностью с 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
Другие вопросы по тегам