2013-02-11 3 views
0

У одного из клиентов или клиентов есть конец MySQl как часть их решения.Проблемы с производительностью с MySQL-прокси

Они сконфигурировали его, чтобы иметь общую основную базу данных и конкретную рабочую базу данных для каждого клиента (они имеют 10 + ведомых устройств). Для этого они используют MySQL proxy.

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

Можете ли вы предложить, как это можно улучшить? Существуют ли инструменты, которые могут использоваться для определения проблем, с которыми они сталкиваются? Это похоже на стандартный подход к вам (общий мастер с подчиненными клиентами подчиненными, управляемыми через прокси MySQL)?

Любые советы будут оценены.

Спасибо,

Энди

ответ

0

У меня было такое же поведение, но моя беда была следующей:
один из моих обновлений заканчивал с ошибкой, MySQL прокси (и Rw-splitter.lua конкретного) лечения такая ситуация, как соединение, может быть повторно использована другим клиентом и возвращает соединение с пулом. Это означает, что, когда клиент получает ошибку и пытается выполнить транзакцию с откатом, она передается другому соединению или новому соединению из пула и не имеет никакого эффекта. Между тем неудачный процесс UPDATE, который имел ошибку в транзакции, был заблокирован, пока транзакция не будет откатываться по тайм-ауту (но в моем случае и mysql-proxy по умолчанию это 28800 секунд), так что довольно долго.

Проблема была решена.

Patch:

находка Вайсс-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 
Смежные вопросы