У меня есть два сервера, на которых mysql работает как двойной мастер (каждый сервер является мастером, каждый сервер подчиняется другому). При устранении возможных проблем во время пиковой нагрузки я начал задаваться вопросом, как mysql предотвращает "цикл" команд в таких отношениях.
Мой конкретный вопрос:
Если A подчинен B, а B подчинен A, то что предотвращает передачу команды SQL, которая выполняется на A и которая распространяется на B через их отношения master (A) -> slave (B), от дальнейшего распространения обратно на A через отношения главный (B) -> подчиненный (A)?
Я предполагаю, что в дополнение к самим командам существует какая-то уникальная идентификация для передаваемой команды, так что A знает, что он ранее выполнил команду (предположительно, используя server-id
вариант). Однако мой гугл-фу сегодня слишком слаб, чтобы узнать, как это работает под прикрытием.
Вот как это относится к моей проблеме. Каждые 5 минут я вижу задержку между Read_Master_Log_Pos
и Exec_Master_Log_Pos
. Я понимаю основную причину этого - я считаю, что приложение настроено на выгрузку тонны данных в базу данных с пятиминутными интервалами (на самом деле, при построении 15-секундной разницы между значениями, я предполагаю, что существует постоянное число бегунов каждые 5 минут, через каждые 15 минут и больше каждые 30 минут).
Однако меня действительно беспокоит то, что оба ведомых устройства показывают такую же задержку. Насколько я понимаю, конструкция этого приложения заключается в том, что «активный» (с точки зрения приложения, а не с точки зрения mysql) сервер базы данных всегда будет использоваться, если только этот сервер не был недоступен, и в этом случае приложение будет пытаться использовать «резервную» базу данных. сервер. Если это правда, почему я вижу задержку чтения / выполнения на обоих ведомых устройствах? Если это не так, то есть ли у меня фундаментальное непонимание архитектуры приложения, или "активный" сервер становится перегружен до такой степени, что приложение выходит из строя, даже если сервер никогда не выходит из строя? (эти два последних вопроса не являются вопросами научной фантастики, это просто вопросы, на которые я пытаюсь ответить)
Я читал, что мастер в отношениях mysql master / slave довольно прост в том, что он отправляет все своим подчиненным, и именно подчиненные устройства решают, какие команды, если таковые имеются, выполнять. Если это так, возможно, задержка, которую я вижу на подчиненном сервере по отношению к резервному серверу, вызвана тем, что все эти уже выполненные команды были отключены и должны быть оценены на предмет того, были ли эти команды уже выполнены.
Что касается вашего конкретного вопроса, это комбинация двух вещей:
log-slave-updates
'в my.cnf), что приведет к:Использование mysql-master-master действительно безопасно только в общем случае, если
Если вы можете быть уверены, что сделаете это, тогда хорошо.
Если ваше приложение ОЧЕНЬ тщательно написано с учетом того факта, что оно работает на mysql-master-master (например, будьте очень осторожны с уникальными индексами - убедитесь, что у вас нет нарушения ключа на другом сервере), тогда вы все в порядке. Я не мог легко написать такое приложение.
Конечно, mysql-master-master бесполезен для повышения производительности записи, так как оба сервера также должны делать все записи.