Подключитесь к настройке мастер-мастер MySQL из кода - PullRequest
1 голос
/ 24 октября 2011

Для нового веб-сайта мы должны подключиться к настройке мастер-мастер MySQL. Это веб-сайт .NET, использующий NHibernate, но то же самое относится и к Java или любому другому языку. Мы выбрали эту настройку, потому что хотим, чтобы сайт продолжал работать, если база данных выйдет из строя. Нам не нравятся простои.

Возможно, у меня полное недопонимание того, как работает настройка master-master (в MySQL), но, как я вижу, вы подключаетесь к своей базе данных, как обычно, но за кадром MySQL реплицирует данные между двумя базами данных. Если вы делаете запись, она может перейти либо к мастеру 1, либо к мастеру 2, о котором вы обычно не знаете (за исключением того, что идентификатор автоинкремента вернул бы другое значение). Если мастер А каким-то образом выйдет из строя, мастер Б все равно будет работать, поэтому простоя не будет, мастер А будет игнорироваться до тех пор, пока он снова не повысится, данные не будут реплицированы, и, если все в порядке, мастер А снова вернется в поле.

ЕСЛИ это правильно, и, пожалуйста, поправьте меня, если мои рассуждения неверны, вам нужно сделать что-то особенное на случай, если один мастер выйдет из строя? Если я подключусь к 192.168.1.50 (который является мастером А), что произойдет, если мастер А выйдет из строя? Будет ли MySQL каким-то образом автоматически соединять меня с 192.168.1.51 (мастер B), чтобы мой сайт продолжал работать?

Если я НЕ прав, как тогда работает репликация мастер-мастер MySQL? Нужно ли указывать каждый запрос, на каком мастере он должен быть выполнен? Это не имеет никакого смысла, верно, поскольку, если мастер А отключится, тогда все мои запросы к мастеру А все равно будут терпеть неудачу, и настройка мастер-мастер мне совсем не поможет.

Так что, в принципе, я думаю, что мой вопрос на самом деле:

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

Я что-то упустил? Спасибо!

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Может быть, у меня полное недопонимание того, как работает настройка master-master (в MySQL), но, как я вижу, вы подключаетесь к своей базе данных, как обычно, но за кадром MySQL реплицирует данные между двумя базами данных. Если вы делаете запись, она может перейти либо к мастеру 1, либо к мастеру 2, о котором вы обычно не знаете (за исключением того, что идентификатор автоинкремента вернет другое значение)

Это неверно.

Репликация MySQL работает, записывая зафиксированные данные (т.е. измененные строки или фактические операторы SQL, в зависимости от режима репликации) в журнал репликации, затем отправляя этот журнал ведомым, где они воспроизводят их и вносят те же изменения. ,

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

Этот метод примитивен, но эффективен. Это также традиционно было реальная боль в задней части, чтобы управлять и поддерживать. Если это вообще возможно, не используйте multi-master в пользу других решений. Я использую multi-master в производстве и могу сказать это по опыту.

Если я подключусь к 192.168.1.50 (который является мастером А), что произойдет, если мастер А выйдет из строя? Будет ли MySQL каким-то образом автоматически соединять меня с 192.168.1.51 (мастер B), чтобы мой сайт продолжал работать?

Когда вы подключаетесь к одному компьютеру в многоканальном цикле, вы только подключены к этому одному компьютеру. Если вам нужно иметь возможность подключаться к нескольким компьютерам, если один из них не работает, вам нужно будет справиться с этим обстоятельством вручную, либо путем внесения изменений в ваш код, либо с помощью промежуточного балансировщика нагрузки.

Хуже того, когда одна машина в цикле останавливается , цикл прерывается. Допустим, у вас есть три, A, B и C. Цикл будет A => B => C => A. Если B выключится, A больше не сможет передавать обновления на C, что означает, что C будет единственным безопасным устройство для подключения до тех пор, пока не вернется B и не восстановится цикл.

Что касается автоинкремента, взгляните на auto_increment_increment и auto_increment_offset, две серверные переменные, которые делают возможным автоинкремент в настройках репликации с несколькими хозяевами. Ни при каких обстоятельствах не следует использовать автоинкремент в мультимастере без установки этих двух переменных.

0 голосов
/ 25 марта 2013
Server=serverAddress1, serverAddress2, serverAddress3;Database=myDataBase;Uid=myUsername;Pwd=myPassword;

Вы можете использовать эту строку подключения.но я не пытался.

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