45 MySQL боевой стресс исследование отмечает: главная библиотека проблема, как сделать из библиотеки? (Скажем, 27)

Переключающий из основного Множество правильности

В передней части 24, 25 и 26 первой статье я познакомлю вас с инфраструктурой и ведущим и ведомым репликации MySQL, но это структура основного.

Большинство сценариев приложений Интернет чтение и писать меньше, так что вы ответственный бизнес, вероятно , будет иметь проблемы при чтении производительности в процессе разработки. Читайте и решать проблемы производительности на уровне базы данных, необходимо задействовать следующие две статьи , чтобы обсудить кадр
структуру: мастер мульти-рабыню.

Сегодня эта статья, мы сначала поговорим о правильности мастер мульти-переключатель из. Затем, в следующей статье, а затем мы говорим о правильности логики запроса решения из нескольких кандидатских.

1, базовая структура мульти-мастер

Как показано на фиг. 1 представляет собой базовую структуру с несколькими ведущими.

На фиг.1 базовая структура с мульти-мастер

Чертежи, пунктирные стрелки указывают ожидания отношения, то есть и взаимное резервное копирование A»из библиотеки B, C, D указывает на первичной базы данных А. При условии , с несколькими ведущими, как правило , используется для раздельного чтения и записи, библиотеку хоста , ответственного за все записи и чтения часть, другой
запрос на чтение из библиотеки путем балансировки.

2, в режиме ожидания переключения

То есть, с мульти-архитектуры, основная вина после главной библиотеки в режиме ожидания переключения основной проблемы мы должны сегодня обсудить. Как показано на фиг, 2 является неспособность главной базы данных происходит, результат ожидания переключателя.

Фиг.2 от базовой структуры с несколькими ведущими - в режиме ожидания переключения

По сравнению с основной процедурой передачи обслуживания один из мастер - мульти-структуры после того , как эстафетная передача обслуживания завершена, A «будет новый основной библиотеки, из библиотеки В, С, D должен быть изменен на А». Это происходит потому , что более библиотеки из B, C, D перенаправить этот процесс, резервный
переключатель , соответствующий увеличению сложности.

Далее мы рассмотрим на то, как система коммутации завершит процесс переключения с мульти-магистра.

Во-вторых, на основе основного переключения сайта

Здесь нам необходимо пересмотреть точку знаний.

Когда мы задаем узел B в узле A «из библиотеки, когда нужно выполнить команду главного изменения:

CHANGE MASTER TO 
MASTER_HOST = $ host_name 
MASTER_PORT = $ порт 
MASTER_USER = $ user_name 
MASTER_PASSWORD = $ пароль 
MASTER_LOG_FILE = $ master_log_name 
MASTER_LOG_POS = $ master_log_pos  

1, команда аргументы мастер изменения детальнее

Эта команда имеет так шесть параметров:

MASTER_HOST, MASTER_PORT, MASTER_USER и MASTER_PASSWORD четыре параметра представляют основной резервуар А», IP, порт, имя пользователя и пароль.

Последние два параметра MASTER_LOG_FILE и MASTER_LOG_POS сказал master_log_pos master_log_name лог-файлы из главной библиотеки в этом положении, чтобы продолжить синхронизацию. И это положение, что мы называем сайт синхронизации, который является главной библиотекой и лог-файлы, имена которых соответствует смещению.

Ну, здесь есть проблема, узел B, чтобы установить «из библиотеки, необходимо выполнить мастер команду изменения, неизбежно должны установить параметры этих двух сайтов, но в конце концов должно быть, как установить эти два параметра это?

Узел B включается с сайта библиотеки, A, записывается локально. Тем не менее, тот же журнал, сайт А и А «разные сайты. Поэтому, когда библиотека от B для переключения, вам нужно пройти «чтобы найти сайт синхронизации» эту логику.

2, сайт трудно получить точные, это может занять только приблизительное местоположение. Почему вы говорите?

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

И затем, путем определения, была ли транзакция была выполнена пропуска через библиотеку из В.

1. Способ синхронизации сайта такова, что:

Способ синхронизации сайта таков, что:

1. Дождитесь новой первичной базой данных А «до передачи журнала (лог реле) всех синхронизации завершено;
2.» выполнение шоу мастер команды статуса, полученное на текущей A «дату файла и положении;
3. Библиотека происхождения взять вину время Т;
4. средство синтаксического анализа с mysqlbinlog APOS файлом, чтобы дать время T сайта.

--stop-DateTime mysqlbinlog Файл = Т --start-DateTime = Т

Выходная секция фиг.3 mysqlbinlog

Фигура за значением end_log_pos «123» представлена А «в данном примере, записать новую временную позицию Т Двоичного. Тогда мы можем поставить 123 это значение как $ master_log_pos, с узлом B
команды Изменить магистр.

2, такой процесс принимает значение не точное. Почему?

Предполагается , что у Вас есть такая ситуация, предполагается , что в момент времени Т, Мастер хранилища завершил выполнение оператора INSERT , чтобы вставить строку данных R, и передает Двоичный А «и В, и затем передается на данный момент основной End библиотека
хозяина на потерянную власть.

Ну, на этот раз состояние системы выглядит следующим образом:

1. В из верхнего резервуара, так как синхронизация Двоичных, R уже существует в этой линии;
2. новых первичной базы данных А», R уже существует в этой линии также, после того, как бревно 123 записываются в этом положении;
3. Мы выполнять команды от ведущего изменения библиотеки B, точка а «123 файл местоположения файла, он будет вставить Двоичный эту линию R и данные для выполнения синхронизации из библиотеки к B.

В это время, синхронизация потоков библиотека B сообщит Дублировать запись «id_of_R» для key'PRIMARY ' ошибки, запрос первичного ключа нарушения, то остановить синхронизацию.

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

Подход взять на себя инициативу, чтобы пропустить сделку. Пропустить команды формулировка:

установить глобальный SQL_SLAVE_SKIP_COUNTER = 1; 
начать ведомый;

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

2, другой способ, путем установки slave_skip_errors параметров, предоставляемых непосредственно, чтобы пропустить указанную ошибку.

Другой способ заключается в обеспечении параметров slave_skip_errors предоставляемые непосредственно, чтобы пропустить указанную ошибку. При выполнении переключения, существует два типа таких ошибок часто встречающиеся:

1062 является единственным ключом ошибкой конфликта при вставке данных;
1032 не найдена ошибка при удалении строк данных.

Таким образом, мы можем slave_skip_errors установить на «1032,1062», поэтому, когда вы пропускаете через середину этих двух ошибок.

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

На этом фоне, мы очень ясно в процессе переключения, пропустите 1032 и 1062 этих два типа ошибок являются неразрушающими, так что он может быть таким набором параметров slave_skip_errors. Подождите, пока не будет установлена ​​связь синхронизации между ведущим и ведомым устройствами, и

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

Три, GTID

Пропуская дела SQL_SLAVE_SKIP_COUNTER и проигнорировано slave_skip_errors неправильный путь, хотя и в конечном итоге создать резервные отношения и новая первичная база данных из библиотеки B A», но две операции очень сложны и склонны к
ошибке. Так, MySQL 5.6 версия представляет GTID, полностью решить эту проблему.

Так, GTID в конце концов, что это значит, и как решить сайты синхронизации, чтобы найти проблему? Теперь я с вами вкратце объяснить.

GTID означает глобальный идентификатор транзакции, является глобальной идентификатор транзакции, транзакция генерируются в момент подачи, является уникальным идентификатором для транзакции. Она состоит из двух частей, формат:

GTID = server_uuid: GNO

1, GTID в конце концов, что это значит?

Где:

server_uuid автоматически генерируется, когда первый пример запуска, глобально уникальное значение; GNO представляет собой целое число, начальное значение 1, каждый раз, чтобы зафиксировать транзакцию присваивается транзакции, и добавить 1.

Я нужен здесь и объяснить, в официальной документации MySQL, формат GTID определяется так:

GTID = source_id: TRANSACTION_ID

source_id здесь server_uuid, и за этим TRANSACTION_ID, я думаю, что вводит в заблуждение, поэтому я изменил его GNO. Почему использование TRANSACTION_ID может вызвать непонимание его?

Потому, что в MySQL, которые мы говорим, TRANSACTION_ID относится к идентификатору транзакции, идентификатор транзакции назначается во время выполнения транзакции, если транзакция откатывается, то идентификатор транзакции будет увеличиваться и GNO выделяется только тогда, когда сделка совершается.

В сущности, GTID имеют тенденцию быть непрерывным, поэтому мы представлены GNO легче понять.

Запустить режим GTID также очень просто, нам нужно только запустить экземпляр MySQL, мы добавим параметры gtid_mode = на и enforce_gtid_consistency = на нем.

2, как решить сайты синхронизации, чтобы найти проблему?

В режиме GTID, каждая операция будет сопровождаться GTID корреспонденции. Это GTID Есть два способа создания, и какой метод использовать, зависит от значения переменного сеанса gtid_next.

1. Если gtid_next = автоматическое, репрезентативное значение по умолчанию. В это время, MySQL поместит server_uuid: GNO назначен на эту сделку.

. Двоичный при записи первой строки записи @@ SESSION.GTID_NEXT = множество «server_uuid: GNO»;
В GTID добавлен GTID этот настоящий пример набора.

2. Если значение заданное gtid_next GTID, например, с помощью множества gtid_next = «current_gtid», обозначенный current_gtid, то есть две возможности:

. GTID Если current_gtid уже существует в случае сбора, следующего исполнения сделки будет игнорироваться системой непосредственно;
. Current_gtid , если B не существует в экземпляре GTID коллекции, будет назначен на эту current_gtid операции должны быть выполнены в следующем , то есть система не должна генерировать новые GTID транзакции, и поэтому не добавляйте Gno 1.

Обратите внимание , что сделка может дать только current_gtid использования. После того , как транзакции, если вы хотите выполнить следующую операцию, необходимо выполнить команду набора, установите gtid_next другой GTID или автоматический.

Таким образом, каждый экземпляр MySQL поддерживает GTID наборчтобы соответствовать «на примере всех выполненных операций.»

Это не выглядит легко понять, то я буду использовать простой пример, чтобы проиллюстрировать основное использование и вы GTID лет.

Мы создали таблицу в экземпляр X, т.

CREATE TABLE `T` ( 
  ` id` INT (11) NOT NULL, 
  `c` INT (11) По умолчанию NULL, 
  первичный ключ (` id`) 
) ДВИГАТЕЛЬ = InnoDB; 

вставить в значениях т (1,1);

 На фигуре данные инициализации 4 Двоичный

Мы можем видеть, есть команда SET @@ SESSION.GTID_NEXT перед тем начать транзакцию. В это время, если есть экземпляры X из библиотеки, а затем вставьте CREATE TABLE заявления Двоичных синхронизации выполняются в прошлом, то Исполнительной

До сделки будет выполнена первая строка команды SET два, и он добавил, что фигура из двух коллекций GTID из библиотеки GTID.

Предположим, теперь это еще один пример из примера X Y из библиотеки, и в это время выполняет следующие инструкции вставки в этом примере Y:

вставить в значениях т (1,1);

Кроме того, в этом заявлении GTID примеры Y "аааааааа-сссс-DDDD-ээээ-FFFFFFFFFFFF: 10".

Тогда примеры X в Y из библиотеки, эта сделка будет приходить, чтобы выполнить синхронизацию, очевидно, будет первичным ключом конфликт, что приводит к синхронизации потоков примеров X остановки. Тогда, как мы должны иметь дело с этим?

Подход, который вы можете выполнить следующую последовательность операторов:

установить gtid_next = 'AAAAAAAA-КЦИК-DDDD-ээээ-FFFFFFFFFFFF: 10'; 
начать; 
совершить; 
Набор gtid_next = автоматический; 
начать ведомый;

Среди них, роль первых трех утверждений, подав Affairs пробел, добавил этот GTID примеры коллекции X GTID. 5, показать мастер статус результат после того, как пустая транзакция была выполнена.

На фиг.5 показаны результаты мастер-статус

Вы можете увидеть примеры X Executed_Gtid_set внутри, я присоединился к этому GTID.

Таким образом, я буду делать команду запуска ведомого позволяет время выполнения одновременных потоков вверх, хотя примеры X или Y будут продолжать проходить по примеру дел, но из-за «аааааааа-КПКГ-DDDD-ээээ-FFFFFFFFFFFF: 10» уже существует

Эта коллекция GTID экземпляр X, поэтому X экземпляр будет пропускать эту транзакцию, ключ ошибка первичного конфликта не повторится.

В приведенной выше последовательности операторов перед командой запуска ведомого также имеет множество gtid_next = автоматический. Роль этого предложения « чтобы восстановить GTID поведение распределения по умолчанию» , что есть новая транзакция снова после выполнения , если он
находится в соответствии с первоначальным распределением, продолжает выделять Gno = 3

В-четвертых, резервный выключатель на основе основного GTID

Теперь мы должны понять концепцию GTID, а затем посмотрите на основе использования резервной копии мастер GTID. В режиме GTID, резервная база данных B, чтобы установить новые основную базу данных A «из грамматики библиотеки выглядит следующим образом:

CHANGE MASTER TO 
MASTER_HOST = $ host_name 
MASTER_PORT = $ порт 
MASTER_USER = $ user_name 
MASTER_PASSWORD = $ пароль 
master_auto_position = 1

Отличающееся тем, что master_auto_position = 1 будет означать, что отношения ведущий и ведомый используется протокол GTID. Мы можем видеть,

Перед нами головная боль параметры MASTER_LOG_FILE и MASTER_LOG_POS не обязательно указано.

Мы ставим этот момент, примеры А «называется как набор GTID SET_A, набор GTID упоминается как пример B set_b. Далее мы посмотрим на текущее ожидание логики переключения.

1, мы выполняем команду на примере запуска ведомого устройства B, принимая Двоичный логика такова:

Пример B 1. Основной библиотеки обозначается А», на основе протокола ожидания соединения.
2. Пример В set_b отправляется в базу данных мастер».
Пример 3. «вычисляется с той разницей , установлен SET_A set_b, который присутствует во всех SET_A, но не в наборе GITD set_b судьи А» Двоичный локальная транзакция содержит все необходимые разностные наборы.

. А Если нет, представляет A «Пример B имел необходимость удалить Двоичную непосредственно возвращает ошибку;
B подтвердить , если все включено, A.» из их внутри файла Двоичного, найти первую сделку не set_b выдан B;

4. После того, как вы начинаете с этой сделки, последующие документы для чтения, издали приказ принять Двоичный B для выполнения.

На самом деле, эта логика , которая содержит идею проекта: на основе GTID в режиме ожидания отношения, до тех пор , пока система ожидания строить отношения, мы должны гарантировать , что журнал отправлен в основной библиотеке библиотеки оборудования завершен. Таким образом, если требуется экземпляр уже войти B
отсутствовали, отказ A»выдавать журнал B.

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

2, на основании приведенного выше описание, давайте посмотрим на введение GTID, в случае передачи обслуживания от несколько мастера, резервное переключение, как достичь.

Не нужно, чтобы найти сайты, так из библиотеки B, C, D выполняются только изменить командные пункты мастера на экземпляр А «может.

На самом деле, строго говоря, переключение не нужно искать не на сайте, но найти работу сайта, в примере А «имеет внутри сделано автоматически. Но так как эта работа происходит автоматически, поэтому разработчики системы HA, это очень удобно.

После этого системы «написано, хозяин библиотека A» новые первичной базы данных Двоичных самогенерируемого в заданном формате GTID: server_uuid_of_A «: 1-М.

Если предварительно установить формат из хранилища B GTID server_uuid_of_A: 1-N, а затем по истечении установленного формата передачи обслуживания GTID становится server_uuid_of_A: 1-N, server_uuid_of_A «: 1-M.

Конечно, первичная база данных A «до библиотеки приготавливают, главная библиотека A» и B из множества библиотеки GTID одно и то же. Мы оправдали наши ожидания.

Пять, GTID и онлайн DDL

Далее я приведу вам пример, чтобы помочь вам понять GTID.

Методы вреда , чем пользы « чтобы улучшить производительность предыдущей» Что есть MySQL «В первые 22 статей? Когда «я и проблемы производительности запросов вы упоминали пиковые периоды медленных, анализировать , если индекс из - за отсутствие проблем с производительностью вызвана, мы можем пройти
через Кавказ привел к решению онлайн. Однако, принимая во внимание влияние нового индекса , чтобы избежать основной причины производительности базы данных, мы можем подготовить Ku Jiasuo привести в первом, а затем включите.

Я сказал, в двойной структуры М, заявления DDL, подготовленные библиотеки будут переданы на реализацию главной библиотеки, для того, чтобы избежать влияния на возвращение в главную библиотеку, через набор SQL_LOG_BIN = выкл, чтобы выключить Двоичный.

Комментарии Район Один студента поднимает вопрос: если эта операция, которая добавляется к индексу базы данных, но Двоичные не зафиксировала это обновление, не это приведет к несогласованности данных и журналов?

Я упоминаю этот вопрос очень хорошо. В то время я был процитирован в сообщении GTID ответа иллюстрировать. Сегодня я хотел бы, чтобы расширить и объяснить.

Предположим, что два взаимного резервирования примеров библиотечные режима и примеры X или Y, и X является текущей первичной базе данных, и режим разомкнутого GTID. В это время процесс переключения режима ожидания может стать настолько следующее:

  • Остановка ведомого выполняется на экземпляре X.
  • Выполнить операторы DDL на экземпляре Y. Обратите внимание, что это не нужно, чтобы закрыть Двоичный.
  • После выполнения нашли это DDL заявления, соответствующие GTID и записывается как server_uuid_of_Y: GNO.
  • Примеры X, чтобы выполнить следующую последовательность:
установить GTID_NEXT = "server_uuid_of_Y: GNO"; 
начать; 
совершить; 
Набор gtid_next = автоматический; 
начать ведомый;

Целью этого является либо пусть обновленный экземпляром Y являются Двоичными записями, но также гарантирует, что нет обновления на реализации этого экземпляра X.

Далее, переключение будет завершено, а затем следуйте описанным выше способом, а затем запустить его снова.

VI Резюме

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

Это можно увидеть в режиме GTID, переключение с мульти-мастер очень удобно.

Поэтому, если вы используете версию MySQL поддержки GTID тогда, я предлагаю вам попробовать сделать больше, чем режим использования GTID переключается с основной.

В следующей статье, мы можем увидеть приложение GTID отдельный чтения и режим записи в сцене.

Наконец, мы пошли к вопросам времени.

При настройке отношения ведущих-ведомом в режиме GTID, после выполнения команды запуска ведомой из библиотеки, главная библиотека необходимо, чтобы выяснить Двоичный была удалена, в результате чего в режиме создания неудачно. В этом случае, вы можете думать, как с этим бороться?

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

Семь, вопрос времени

Наконец, последняя статья, я буду держать эту проблему в том, что, если основная библиотека в режиме однопоточного давления, главная библиотека в процессе восстановления из библиотеки, Двоичные-транзакции отслеживания зависимостей, какие параметры должно быть выбрана?

Ответ на этот вопрос в том, что этот параметр должен быть установлен в WRITESET.

Поскольку основная библиотека режим однопоточного давления, так что каждая транзакция commit_id отличается, а затем установить режим COMMIT_ORDER, он может быть только однопоточное исполнением из библиотеки.

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

Таким образом, Двоичное-транзакции отслеживание зависимостей должно быть установлено в WRITESET.

Комментарии Гостевая книга превью доска:

@ Хуэй Синь пришествии задал хороший вопрос, на той же строке, обновляемых несколько сделок, если commit_id то же самое время подготовить библиотеку не в параллельном выполнении приведет к несогласованности данных? Q
ответ на вопрос, чтобы обновить ту же строку сделки не представляется возможным совершить то же самое время , чтобы войти в состояние.

@ Ян товарищей на этот вопрос дает более подробный ответ, вы можете взглянуть.

рекомендация

отwww.cnblogs.com/luoahong/p/11735318.html