Что такое распределенная блокировка? Как добиться?

Большие данные

Это 13-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления

Распределенная блокировка

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

Метод реализации:

  1. уникальный индекс базы данных
  2. Инструкция SETNX для Redis
  3. Алгоритм RedLock Redis
  4. Временные последовательные узлы для ZooKeeper

在这里插入图片描述

блокирующий замок

Блокирующие блокировки обычно реализуются с помощью мьютексов:

Мьютекс 0 указывает, что другие процессы используют блокировку, а мьютекс 1 в заблокированном состоянии указывает на разблокированное состояние. 1 и 0 могут быть представлены целочисленным значением или наличием или отсутствием определенных данных.

уникальный индекс базы данных

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

Есть следующие проблемы

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

Инструкция SETNX для Redis

  1. Используйте команду SETNX (установите, если не существует) для вставки пары ключ-значение.Если ключ уже существует, он вернет False, в противном случае вставка завершится успешно и вернет True.
  2. Инструкция SETNX аналогична уникальному индексу базы данных, который гарантирует, что существует только одна пара ключ-значение ключа, поэтому, существует ли пара ключ-значение ключа, чтобы судить о том, существует ли она в заблокированном государство.
  3. Инструкция EXPIRE может установить время истечения срока действия для пары ключ-значение, что позволяет избежать проблемы невозможности снять блокировки при реализации уникальных индексов базы данных.

Алгоритм RedLock Redis

  1. Несколько экземпляров Redis используются для реализации распределенных блокировок, что гарантирует их доступность в случае единственной точки отказа.Попробуйте получить блокировки от N взаимно независимых экземпляров Redis;
  2. Вычислить время, затраченное на получение блокировки, только если это время меньше времени истечения срока действия блокировки и блокировка получена из большинства (N/2+1) экземпляров, получение блокировки считается успешным.
  3. Если получить блокировку не удается, снимите блокировку на каждом экземпляре.

Временные последовательные узлы для ZooKeeper

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