как просто справиться с (очень) короткой задержкой репликации MySQL - PullRequest
1 голос
/ 03 февраля 2012

У меня есть приложение (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) перед чтением или после написания ... не очень элегантно

1 Ответ

0 голосов
/ 03 февраля 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...