как просто справиться с (очень) короткой задержкой репликации mysql

У меня есть приложение (php), работающее с MySQL 5.5 (1 мастер и 1 подчиненный)

Я использую для отправки чтения/записи на ведущий/ведомый.

Когда я создаю новую запись (юзер или что-то в этом роде) я пишу ее на мастере, а когда перезагружаю страницу, я загружаю ее со слейва.

Пример:

...
if ($_GET['id'])
{
    #Load user
    $user = $sql->load('user', $_GET['id']);

    if ($user == false)
    {
        throw exception('User not found');
    }
}
else if ($_POST['create]')
{
    #Create a new user

    $user_id = $sql->insert('user', $_POST);
    $mvc->reload('?id=' . $user_id);
    exit();
}
...

Но когда мастер действительно производительный (быстрая вставка), а репликация нет (лаг = 0,3 - 1 сек), перезагрузка не сработает...

Как лучше всего справиться с этим

Некоторые решения:

  • Оптимизация базы данных для уменьшения лагов (очень сложно)
  • спать(1) перед чтением или после записи... не очень элегантно

person nemenems    schedule 03.02.2012    source источник
comment
10 вопросов, ни голосов, ни одобрений. Ознакомьтесь с часто задаваемыми вопросами...   -  person gbn    schedule 03.02.2012


Ответы (1)


Во-первых, вам нужно определить, может ли ваше приложение работать с задержкой или нет.

Если нет, то вам необходимо убедиться, что данные, которые вы хотите получить, уже доступны на ведомом устройстве. Например, извлеките последний идентификатор из подчиненного устройства и сравните его с идентификатором, который вы собираетесь получить; или сначала попробуйте ведомое устройство, а если строки нет, вернитесь к ведущему (но это перегрузит ведущее устройство запросами новых данных).

Обычно веб-приложение может работать с устаревшими данными. Нет проблем, если другие посетители увидят новый пост через 10 секунд. Но, как вы упомянули, плохо, если автор поста не видит его сразу. Таким образом, вы можете действовать по-разному в зависимости от данных/причины, которые вы извлекаете (например, кешировать информацию о недавнем сообщении в сеансе и в этом случае извлекать из мастера)

person Marki555    schedule 03.02.2012