Допустим, у нас есть 3 сервера в локальной сети:

APP - сервер приложений php

MASTER - главный сервер Mysql db

SLAVE - подчиненный сервер Mysql db (реплицирующий MASTER)

В одном блоке кода (php) APP вставляется в MASTER , получая last_insert_id, который затем использует для выбора данных, которые он только что вставил из SLAVE . .

Итак, вопрос в том, произойдет ли репликация вовремя, чтобы SLAVE получил данные от MASTER ? Влияет ли на это нагрузка на ГЛАВНЫЙ или ПОДЧИНЕННЫЙ ?

И, наконец, если есть проблема с доступностью данных, есть ли способ гарантировать получение последних данных от SLAVE ?

3
ae. 17 Авг 2009 в 09:06

2 ответа

Лучший ответ

Поскольку время репликации MySQL - это неконтролируемая переменная (даже при правильной реализации могут возникнуть проблемы, которые останавливают репликацию или блокируют ее), лучше не полагаться на репликацию данных. Вы можете разбить проблему на две ситуации:

1) Я являюсь пользователем, выполняющим операцию CUD, я ожидаю, что послесловия операции R будут отражать только что внесенные мной изменения. В этом случае вам абсолютно необходимо получить данные от мастера, потому что пользователь ожидает, что его изменение возымело эффект.

2) Я внешний пользователь, я не знаю, что произошла команда CUD, и мне вообще все равно, поэтому возвращение устаревших данных приемлемо (в 99% реализаций, иначе вы, вероятно, не использовали бы PHP * ).

Альтернативой №1 было бы информирование пользователя о том, что его изменение распространяется и приемлемо в некоторых ситуациях, например многие веб-сайты сообщают вам, что отображение x может занять до y минут, вот эта ситуация в действии.

  • Если вам нужны мгновенные обновления, вы можете попробовать записать в слой кеша, который опрашивается вместе с (потенциально ненадежными) данными БД. Что-то вроде memcached было бы первым кандидатом.
5
Aea 17 Авг 2009 в 12:01

Это зависит от того, насколько быстро ваш ВЕДОМЫЙ сервер реплицирует данные с вашего ГЛАВНОГО сервера.

Если он напрямую связан с командами INSERT, UPDATE и DELETE, то есть когда вы что-то вставляете, вы фактически вставляете это в обе, скорее всего, он будет доступен в любом из них.

Если ВЕДОМЫЙ сервер реплицирует MASTER с помощью задачи, которая запускается так часто, чтобы получить данные от MASTER, что было бы дешевле, чем выполнение 2 запросов для каждого 1 запроса, это будет означать, что данные недоступны до тех пор, пока задача не будет выполнена. побежал.

0
Tyler Carter 17 Авг 2009 в 09:14