Понимание согласованности репликации баз данных и Split-Brain в кластерах MySQL

Я показываю, как я Согласованность репликации в установках MySQL и почему даже незначительные неполадки в сети могут привести к раздвоению мозга. Я объясняю на практике, как репликация, модели согласованности и механизмы кворума работают вместе и как я могу быстро локализовать сценарии ошибок.

Центральные пункты

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

  • Цели последовательности четко определить (RPO/RTO, чтение после записи)
  • Топология выберите подходящий вариант (первичная реплика, мультимастер, кластер)
  • Кворум безопасно (большинство, третье местоположение, устройство)
  • Отказоустойчивость Строгий контроль (только для чтения, VIP/DNS, оркестровка)
  • Мониторинг Расширение (задержка, латентность, здоровье, сигналы тревоги)

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

Как работает репликация в MySQL

Я реплицирую операции записи из Главная на одну или несколько реплик, чтобы смягчить последствия сбоев и распределить доступ к чтению. В топологиях primary-replica запись осуществляется централизованно, а реплики отвечают за чтение, резервное копирование и анализ. Мультимастер распределяет записи между несколькими узлами, но требует соблюдения строгих правил конфликтов. Кластеры с уровнем координации связывают уровень данных и кворум, что означает, что узел остается активным только при наличии большинства. Если вы хотите подробно ознакомиться с вариантами, то можете найти дополнительную информацию на сайте Типы репликации в MySQL хороший обзор, который я использую в качестве отправной точки. В конечном счете важно, что записи четко ориентированы и что я сознательно контролирую пути чтения, чтобы не нарушить последовательность. Масштабирование страдает.

Уровни изоляции и разработка транзакций

Я всегда планирую репликацию вместе с Проект сделки. По умолчанию MySQL использует REPEATABLE READ: это надежно для OLTP, но для длинных транзакций скорость чтения будет выше. Лаг, потому что сохраняется много старых версий. Для рабочих нагрузок с большим количеством выборочных обновлений я иногда использую READ COMMITTED, чтобы уменьшить количество блокировок и побочных эффектов. Я слежу за тем, чтобы пакетные изменения были небольшими, ограниченный во времени транзакций вместо выполнения минутных „мегакоммитов“. Благодаря этому двоичные журналы становятся компактными, потоки SQL-реплики не застревают, а Задержка репликации накапливается медленнее. Я также избегаю недетерминированных функций в форме оператора (например, NOW() без фиксации), если не хочу использовать Основанные на рядах повторить - в противном случае я рискую получить дивергенцию.

Модели согласованности четко объяснены

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

Типы репликации и время ожидания

Я использую асинхронную репликацию, когда мне нужна максимальная задержка записи и определенный RPO согласитесь. Полусинхронный метод снижает риск потери данных, но требует затрат времени на фиксацию. Синхронные методы обеспечивают высокую степень согласованности, но чувствительны к задержкам в сети и потере пакетов. С увеличением расстояния между узлами увеличивается время в пути, что заметно замедляет синхронные фиксации. Если возникает задержка, я активно проверяю Задержка репликации в MySQL, оптимизировать структуру письма и целенаправленно распределять запросы на чтение. Так я поддерживаю баланс между темпом и Безопасность.

Режим Обязательное поведение Латентность RPO Типичное использование Риск раздвоения мозга
Асинхронный Первичное подтверждение немедленно Низкий Выше Высокая пропускная способность, отчетные чтения Средний (для обхода отказа без руководства)
Полусинхронный По крайней мере, одна копия подтверждена Средний Нижний Критические транзакции с буфером задержки Ниже (возможно лучшее руководство)
Синхронный/кластерный Большинство сохраняет навсегда Выше Очень низкий Кластеры с требованиями к кворуму Низкий (при наличии чистого кворума)

Формат бинлога, GTID и безопасность при авариях

Я постоянно полагаюсь на GTIDs (gtid_mode=ON, enforce_gtid_consistency=ON), чтобы обход отказа работал без позиционных загадок. Я использую каналы репликации с автопозиция=1, чтобы реплики сами сортировались после переключения. Для бинлога я предпочитаю Основанные на рядах (binlog_format=ROW), потому что он детерминирован и позволяет избежать конфликтов с функциями или недетерминизма. Я использую mixed/statement только выборочно.

Я обеспечиваю безопасность при столкновении с помощью sync_binlog=1 и innodb_flush_log_at_trx_commit=1 если RPO должен быть практически нулевым. Для более высокой чувствительности к задержкам я выбираю компромиссы, но четко документирую их. Чтобы обеспечить очистку реплик в случае сбоя, я активирую relay_log_recovery и уехать log_replica_updates (ранее log_slave_updates), чтобы каскады оставались стабильными. Для пропускной способности Параллельная репликация: реплика_параллельных_рабочих (например, 8-32) плюс binlog_transaction_dependency_tracking=WRITESET оптимизирует расположение без нарушений рядов.

Расщепленный мозг: причины и симптомы

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

Сценарии рисков, характерные для MySQL

Наибольшую опасность я вижу в асинхронных установках мастер-мастер без строгих Руководство. Если обе стороны доступны для записи и сеть мерцает, инструменты легко переводят оба ключа в первичные. Без автоинкрементных смещений первичные ключи немедленно сталкиваются. Если нет логики переключения VIP или DNS, клиенты пишут на два узла параллельно. Даже кластеры с неисправным кворумом позволяют обеим сторонам продолжать запись. Подобные созвездия разрушают согласованность быстрее, чем команда успевает сориентироваться, поэтому я рекомендую четкое Рунные книги готово.

Стратегии обеспечения согласованности

Я определяю четкое правило написания: один основной, все остальные - строго только для чтения. При переключении я использую VIP или короткий DNS TTL, чтобы записи шли только на активный узел. В многомастерных системах я разделяю комнаты данных по клиентам, регионам или пространствам ключей. Я также использую автоинкрементные смещения, идемпотентность и поля версий. На стороне приложений я поддерживаю чтение после записи с помощью "липкости" сессий или целевых первичных чтений. Мониторинг проверяет задержку, латентность и состояние, а сигналы тревоги обеспечивают раннее предупреждение. Вот как я поддерживаю согласованность на нескольких Уровни одновременно.

Чтение после записи на практике

Я защищаю чтение после записи, передавая сеансы записи в Главная pin. В качестве альтернативы, я оставляю чтение на репликах только тогда, когда их gtid_executed содержит запись пользователя. На практике я использую токены (например, GTID транзакции), которые проверяет путь чтения. Если подтверждение отсутствует, чтение идет напрямую к первичной копии или ждет некоторое время, пока реплика не догонит ее. Для API я использую заголовки ответов с „требуется чтение после записи“ подсказки, чтобы фронтенды могли осознанно решать, будут ли они свежий Принудительное получение данных или жизнь с возможным последовательным чтением.

Управление лагами и разработка запросов

Я создаю отставание в основном с помощью Дисциплина "Запрос от: Длинные SELECT'ы имеют ограничения по времени и подходящие индексы, горячие точки разбиваются с помощью шардинга или альтернативных ключей. Я выполняю большие обновления/удаления партиями с паузами, чтобы не переполнять бинлог. Я планирую перестройку (например, ALTER TABLE) на основе окна и, если возможно, в режиме онлайн, чтобы не блокировать потоки репликации. На уровне приложений я ограничиваю параллельные всплески записи с помощью ограничения скорости и сглаживаю пики трафика с помощью очередей. Небольшая таблица сердцебиения помогает мне измерять задержку с точностью до секунды и Пределы оповещения реалистично.

Кворум, взаимосвязь и обход отказа

Я создал Quorum таким образом, что только часть с Большинство могут писать. Третье местоположение или устройство кворума аккуратно решает проблему двустороннего разделения. Избыточные межсоединения снижают риск возникновения изолированных островов. Перед каждым обходом отказа я проверяю, действительно ли предыдущий основной сервер исчез или явно отрезан. Инструменты оркестровки могут продвигаться только при наличии четких блокировок и проверок. Реплики остаются защищенными от случайных записей с read_only=ON и super_read_only=ON до тех пор, пока я явно не разрешу выпуск.

Оркестровка, ограждение и безопасное продвижение

Я использую оркестровку исключительно в качестве ПривратникПродвижение разрешено только в том случае, если старый праймериз активно ограждается (например, снимается VIP), super_read_only=ON, статус реплики соответствует). Мои правила включают:

  • Явные выборы лидера с проверкой большинства и „no-dual-primary“замок
  • Продвижение только в том случае, если server_uuid недвусмысленно, только для чтения набор и каналы репликации чисты
  • Переключение DNS/VIP только после проверки работоспособности и задержки, но не раньше.
  • Путь отката: Когда есть сомнения, система предпочитает оставаться только для чтения, вместо того, чтобы писать рискованные

Важно: только для чтения не защищает от записей от пользователей SUPER - поэтому я всегда использую super_read_only. Я также изолирую учетные записи администраторов, чтобы в случае стресса никакая „случайная“ запись не попала на реплику.

Рунные книги для чрезвычайных ситуаций

Если раздвоение мозга все же происходит, я действую немедленно и блокирую оба активных узла записи для новых узлов записи. Транзакции. Я создаю свежие резервные копии или моментальные снимки обоих сайтов, прежде чем подключать что-либо. Затем я останавливаю все репликации, чтобы статусы данных больше не смешивались. Затем следует анализ: какие таблицы затронуты, какие периоды времени, какие действия пользователей? Журналы аудита, временные метки и версии показывают мне историю. Я определяю „источник истины“, выборочно применяю изменения и снова настраиваю репликацию. Наконец, я проверяю целостность с помощью проверок целостности и близкого смешивания. Мониторинг.

Сравнивайте и восстанавливайте таблицы данных

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

Резервные копии, ПИТР и повторный посев

Я совмещаю полный физическая Резервные копии с бинлогами для восстановления в заданное время (PITR). Резервные копии выполняются на реплике для защиты основной и регулярно считываются на тестовой основе. Для быстрого повторного посева я использую клон/физическую доставку, где это возможно, а затем запускаю репликацию с автоматическим размещением GTID. Я основываю свои политики хранения на требованиях соответствия и целях RPO; я храню бинлоги столько, сколько требует мой максимальный горизонт PITR. Очень важно, чтобы резервные копии Последовательность (InnoDB flush, правильное окно запуска binlog), иначе восстановление и репликация не будут работать.

Тесты, тренировки и SLO

Я определяю четкие SLOs (например, RPO ≤ 30 секунд, RTO ≤ 5 минут для критически важных сервисов) и регулярно проверяйте их в ходе учений. Сценарии включают разделы сети, отказы дисков, неисправные межсоединения и отстающие реплики. Я практикую шаги „Ограждение - Продвижение - Переключение трафика - Проверка“ и измеряю, как быстро вступают в силу предупреждения и учебники. Я также специально ввожу задержки (пики трафика, искусственные задержки), чтобы посмотреть, как реагируют механизмы маршрутизации, обратного давления и чтения после записи. Только то, что мы отрепетировали, будет работать в чрезвычайной ситуации. Надежный.

Масштабирование: шардинг, регионы и владение

Я разделяю обязанности по написанию текстов между клиентами, регионами или Домены, чтобы сохранить небольшие области конфликтов. Региональное чередование уменьшает задержки и позволяет использовать локальные праймериз с четким руководством. Я обслуживаю глобальные рабочие нагрузки чтения из реплик, в то время как пути записи остаются строго локальными. Если вы хотите объединить шардинг, вы можете найти Разделение и репликация хорошее начало. Это по-прежнему важно: Правила владения должны быть в коде, DDL и runbooks, а не только в головах людей. Таким образом, масштабирование остается планируемым, но без согласованности с Скорость чтобы поменяться.

Облачные и мультирегиональные функции

Я заблаговременно планирую риски, связанные с задержками и разделениями между регионами. Пишет Остается локальной, межрегиональная репликация выполняется асинхронно с четко определенным RPO. DNS- или VIP-коммутаторы получают короткие TTL, но только если пройдены проверки здоровья и кворума. Я избегаю „прозрачных“ глобально распределенных записей без жесткого руководства - они выглядят удобно, но создают конфликты, которые трудно разрешить в случае сбоев. Для сценариев DR я держу наготове холодный или теплый регион, регулярно выполняю повторную загрузку и тестирую обход отказа региона как полный обход отказа. Деловые упражнения, не только в качестве демонстрации технологий.

Соответствие нормативным требованиям, безопасность и возможность аудита

Я защищаю каналы репликации с помощью TLS и устанавливаю наименьшая привилегия для пользователей реплик. Сохранение бинлогов и контрольные суммы являются частью возможностей аудита, как и отслеживаемые журналы изменений в конвейерах DDL. Шифрование в состоянии покоя (табличное пространство, резервные копии) является стандартным; ротация ключей и контроль доступа документированы и протестированы. Серверные идентификаторы (server_uuid, идентификатор сервера) остаются стабильными и однозначными, чтобы оркестровка и GTID функционировали надежно. Все это не является самоцелью: чистые журналы аудита ускоряют Анализ корневых причин и сократить время простоя в чрезвычайных ситуациях.

Резюме: Согласованность перед скоростью

Я никогда не планирую репликацию в одиночку, но при четком Цели последовательности и бизнес-кейсы. Строгие правила лидерства, кворума и отказоустойчивости не позволяют кластеру развалиться при первом же сбое. Мониторинг, тесты и тренировки помогают моей команде действовать, когда это важно. Если происходит раздвоение мозга, я останавливаю запись, сохраняю состояния, выбираю истину и последовательно перезапускаю. Таким образом, репликация MySQL остается надежно работающей, а согласованность данных не уступает место стремлению к Производительность становится жертвой.

Текущие статьи

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

Раздувание памяти сервера в средах виртуализации - наглядное объяснение

Узнайте, как работает раздувание памяти сервера, какие преимущества оно дает и как можно создать стабильную и высокопроизводительную среду виртуализации с ключевым словом memory ballooning vm.