MyFlash — инструмент воспоминаний MySQL с открытым исходным кодом от Meituan Dianping.

MySQL открытый источник Информация

В связи с эксплуатацией и обслуживанием, неправильной работой DBA или бизнес-ошибками мы иногда удаляем данные по ошибке во время работы. Чтобы восстановить данные в первые дни, только бизнес-персонал мог создавать данные, которые были удалены по ошибке, на основе онлайн-журналов операций, или администраторы баз данных использовали методы binlog и резервного копирования для восстановления данных. и подвержен ошибкам. До тех пор, пока Пэн Лисюнь впервые не расширил функцию воспоминаний для mysqlbinlog в сообществе MySQL.

В Meituan Dianping мы также столкнулись с ситуацией, когда сотрудники отдела исследований и разработок по ошибке удалили информацию о конфигурации основной станции, в результате чего основная станция была недоступна до 2 часов. Студенты DBA использовали binlog2sql, разработанный технической командой, для завершения восстановления данных и предотвратили множество серьезных ошибок, вызванных ошибочным удалением данных в Интернете. Однако скорость восстановления binlog2sql неудовлетворительна, поэтому мы разработали новый инструмент - MyFlash, который хорошо решает вышеуказанные болевые точки и может выполнять восстановление данных удобно и эффективно.

Теперь инструмент официально с открытым исходным кодом, и адрес с открытым исходным кодом:GitHub.com/Mehtuan-DI Ах….

Статус инструмента Flashback

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

① Инструмент mysqlbinlog взаимодействует с sed и awk. Этот метод сначала преобразует binlog в текст, подобный SQL, а затем использует sed и awk для преобразования текста, подобного SQL, в настоящий SQL.

  • Преимущества: Когда тип поля в SQL относительно прост, требуемый SQL может быть сгенерирован быстро, а порог программирования относительно низок.
  • Недостатки: Когда тип поля в SQL относительно сложен, особенно когда текст в поле содержит HTML-код, при использовании таких инструментов, как awk и sed, необходимо учитывать чрезвычайно сложные escape-последовательности и другие ситуации, а вероятность ошибки высоко.

② Исправьте исходный код базы данных. Этот метод расширяет функции mysqlbinlog и добавляет опцию Flashback.

  • Преимущества: повторно используется код, такой как анализ бинарного журнала на уровне сервера MySQL.После стабилизации нет необходимости заботиться о сложных типах полей, а эффективность высока.
  • Недостатки: Перед модификацией вам необходимо иметь глубокое представление о структуре и деталях кода репликации MySQL. Версия более чувствительна.Патч, сделанный на MySQL 5.6, нельзя использовать для операции отката MySQL 5.7. Обновить сложно, потому что код патча распространяется в различных файлах и функциях MySQL.После изменения кода MySQL, особенно реконструкции уровня репликации, обновление так же сложно, как и полностью переписать его.

③ Используйте библиотеку разбора binlog, предоставленную промышленностью, а затем выполните построение SQL.Его отличным представителем является binlog2sql.

  • Преимущества: он использует зрелые библиотеки в отрасли, поэтому он имеет лучшую стабильность и его легче начать.
  • Недостатки: Эффективность часто низкая, а реализация зависит от функций, предоставляемых библиотекой binlog.

Вышеупомянутые методы реализации в основном предоставляют меньше возможностей фильтрации.Например, фильтрация на основе SQL не может быть предоставлена, и оператор удаления должен быть откатан.В результате, awk, sed и другие инструменты должны быть объединены для фильтрации при откате .

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

А. Нет необходимости разбирать binlog в текст, а затем преобразовывать его.
б) Предоставлять собственные методы фильтрации на основе библиотеки, таблицы, типа SQL, местоположения, времени и т. д.
C. Поддерживает несколько версий MySQL.
г. Он не чувствителен к рефакторингу кода базы данных, что способствует обновлению.
е. Независимо контролировать анализ binlog и предоставлять максимально гибкий способ.

Среди этих функций синтаксический анализ binlog является основой всего. Далее я представлю базовую структуру binlog.

Предварительное исследование формата Binlog

Обзор формата binlog

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

Пример файла binlog:

Каждое событие состоит из заголовка события и данных события. Далее кратко представлены несколько распространенных событий binlog.

① событие описания формата

Выраженный смысл:

170905  01:59:33 server id 10  end_log_pos 123 CRC32 0xed1ec563 
Start: binlog v 4, server v 5.7.18-log created 170905  01:59:33

② событие карты стола

Выраженный смысл:

    170905  01:59:33 server id 10  end_log_pos 339 CRC32 0x3de40c0d     
    Table_map: `test`.`test4` mapped to number 238

③ событие обновления строки

Выраженный смысл:

    170905  01:59:33 server id 10  end_log_pos 385 CRC32 0x179ef6dd     
    Update_rows: table id 238 flags: STMT_END_F 
    UPDATE `test`.`test4` WHERE @1=3 SET @1=13;

откат события binlog

Согласно BINLOG, вы можете видеть, что заголовок Event в каждом событии binlog имеет type_code, где INSERT — 30, Update — 31, а delete — 32. Как для INSERT, так и для DELETE просто переключите Type_code, завершите откат на уровне Binlog Event.

Формат операции UPDATE следующий.

Среди них BI относится к изображению до, а AI относится к изображению после.

Нам просто нужно пройти данные до модификации и данные после модификации по очереди и обменять их одну за другой. Таким образом, сложность всей операции отката заключается в откате оператора обновления, а ядром отката оператора обновления является вычисление длины каждого AI и BI. Далее описывается метод расчета длины и некоторые поля.

Расчет длины зеркала

Изображение состоит из полей одно за другим, и метод вычисления длины различается в зависимости от типа поля.

  • Актуально только для типов полей. Например, int занимает 4 байта, а bingint — 8 байт. Информацию о типе можно получить из события table map.

  • Относится к типу поля и его параметрам. Например, decimal(18, 9) занимает 9 байт, а информация о параметре находится в событии карты таблицы.

  • Относится к типам полей, параметрам и фактическому сохраненному значению. Например, varchar(10) содержит 1 байт для представления длины, а следующие байты представляют реальные данные. Например, varchar (280), есть 2 байта для указания длины. Фактическая длина идет с данными.

Разобрать несколько ключевых моментов в binlog

① длина закодированного целого числа

Одна или несколько комбинаций байтов в binlog соответственно имеют разные значения. Например, метка времени состоит из фиксированных 4 байтов, а тип события представлен одним байтом; максимальная длина имени базы данных и имени таблицы составляет 64 символа, даже если каждый символ занимает 3 байта, количество занятых байтов составляет 192

Однако для представления фактического количества столбцов может потребоваться более 1 байта, 2 байтов, 3 байтов или даже 8 байтов. Если мы используем максимум 8 байтов для представления, то в большинстве случаев это пустая трата места для хранения. В ответ на эту ситуацию появилось целое число с кодировкой длины.

Например, при получении длины типа varchar сначала прочитайте первый байт, если значение меньше 251, то длина varchar равна длине, представленной первым байтом. Если значение первого байта равно 0xFC, то длина varchar состоит из следующих двух байтов после этого байта и так далее.

② десятичный тип

Десятичное число состоит из целой части и дробной части. Будь то целое или десятичное число, для каждых 9 цифр требуется 4 байта. Если оно не кратно 9, количество байтов, необходимых для остальных десятичных разрядов, будет следующим: для удобства описания это соотношение определяется как функция Fnum.

Например, для десятичного числа (18,10):

  1. Целую часть можно отобразить как 8, используя int, то есть 4 байта.
  2. Для дробной части требуется количество байтов (10/9)*4+Fnum(10%9)=5.
  3. Тогда всего требуется 4+5=9 байт.

Архитектура инструмента Flashback

В приведенном выше разделе был представлен метод инверсии для одного события binlog. На практике нам часто приходится отфильтровывать определенный бинлог по заданным условиям и реверсировать его. Так как же MyFlash достигает этих целей?

Разобрать бинлог

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

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

Реорганизовать события

Формируйте события binlog в наименьшую исполнительную единицу. В общем событии binlog событие table_map содержит необходимую информацию метаданных, такую ​​как имя таблицы и имя библиотеки, а row_event (включая write_event, delete_event, update_event) содержит реальные данные. Поэтому в конструкции используется концепция минимального исполнительного блока. Так называемый наименьший исполнительный блок, наименьший исполнительный блок событий, обычно содержит событие table_map и несколько row_events.

Например, в разделе обзора формата binlog представлены table_map_event и update_row_event. Если есть только update_row_event, то мы не можем знать таблицу, соответствующую изменению записи строки, соответствующей этому событию. Следовательно, полная минимальная исполнительная единица содержит по крайней мере одно table_map_event и одно из write_row_event, update_row_even, delete_row_event.

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

С наименьшим исполнительным устройством реверсирование можно выполнить всего за два шага.

А. Отменить событие строки в наименьшем исполнительном блоке.
б) Достаточно наименьшей очереди исполняемых модулей в обратном порядке.

Конечно, перед реверсированием вы также можете добавить операции фильтрации. Например, имя библиотеки фильтров, имя таблицы и тип SQL.

Сгенерировать бинлог-файл

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

Сравнение производительности

сценарии тестирования

Используя testFlashback2, вставьте 1 миллион фрагментов данных:

CREATE TABLE `testFlashback2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nameShort` varchar(20) DEFAULT NULL,
  `nameLong` varchar(260) DEFAULT NULL,
  `amount` decimal(19,9) DEFAULT NULL,
  `amountFloat` float DEFAULT NULL,
  `amountDouble` double DEFAULT NULL,
  `createDatetime6` datetime(6) DEFAULT NULL,
  `createDatetime` datetime DEFAULT NULL,
  `createTimestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `nameText` text,
  `nameBlob` blob,
  `nameMedium` mediumtext,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB

mysql> select count(*) from testFlashback2;
+----------+
| count(*) |
+----------+
|  1048576 |
+----------+
1 row in set (0.16 sec)

delete from testFlashback2;

Результаты теста

Как видно из приведенной выше диаграммы, MyFlash является самым быстрым.

Справочная документация

  1. Официальная документация MySQL1,2,3.
  2. binlog2sql.
  3. mysqlbinlog Flashback for 5.6.
  4. Принцип воспоминаний MySQL и реальный бой.

Набор персонала

Команда администраторов баз данных Meituan-Dianping набирает все виды талантов администраторов баз данных как в Пекине, так и в Шанхае. Мы стремимся предоставлять компаниям стабильные, надежные и эффективные услуги онлайн-хранилища и создавать ведущую в отрасли команду по работе с базами данных. Есть Squirrel, крупномасштабная распределенная система кэширования на базе Redis Cluster, распределенная система хранения KV Cellar на базе Tair и тысячи экземпляров MySQL различной архитектуры, каждый день обеспечивающие триллионы OLTP-запросов на доступ. По-настоящему массивная распределенная среда с высокой степенью параллелизма. Добро пожаловать, друзья, чтобы порекомендовать или самостоятельно порекомендовать jinlong.cai#dianping.com.

Ответить на «мыслительные вопросы», найти ошибки в статье и задать вопросы по содержанию, вы можете оставить сообщение в фоновом режиме общедоступной учетной записи WeChat (техническая команда Meituan Dianping). Каждую неделю мы будем выбирать одного «отлично отвечающего» и дарить приятный маленький подарок. Приходите отсканировать код, чтобы следовать за нами!

QR-код официального аккаунта