БД Sharding: перенос данных на другую машину - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть некоторые данные, которые хранятся в DB1, DB2 и DB3, размещенных на Machine1.Теперь, чтобы масштабировать систему, мне нужно переместить осколок DB1 с Machine1 на Machine2.После завершения перемещения все запросы к шарду DB1 будут перенаправлены на Machine2.

Предположим, что у нас все чтения, записи и обновления поступают на DB1 все время.Как я могу выполнить миграцию без простоев для чтения / записи / обновления?

Мы можем сделать DB1 только для чтения во время окна миграции и скопировать данные в Machine2.Как только копирование завершено, мы можем направить трафик на Machine2 и разрешить запись.

Но что, если мы хотим сделать то же самое, в то время как запись также происходит?

1 Ответ

0 голосов
/ 27 декабря 2018

После некоторых исследований я нашел несколько способов сделать это.

Решение 1

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

  1. Все новые записанные строки будут также записаны в новую копию
  2. Любые обновления существующих сегментов, которые не являютсявсе же скопированное будет заботиться, когда этот сегмент будет скопирован в M2 в будущем
  3. Обновления уже скопированных сегментов будут применены и к M2, потому что M2 также имеет этот сегмент
  4. Записывает в определенныйСегмент блокируется во время копирования сегмента.Когда копирование завершено, запись завершена, и она аналогична приведенной выше # 3.
  5. Как только все сегменты будут успешно скопированы, остановите запись в M1.На этом этапе DB1 в M1 устарел и может быть безопасно удален.

Решение 2

Как и прежде, разбейте осколок на несколько более мелких сегментов.

  1. Запланируйте сценарий для сегментирования по сегментам в M2
  2. Все обновления существующих сегментов, которые еще не скопированы, будут учтены, когда этот сегмент будет скопирован в M2 в будущем
  3. Если имеется обновление уже скопированного сегмента, пометьте этот сегмент как «грязный» для повторного копирования.
  4. Вновь созданные сегменты по умолчанию помечаются как «грязные»
  5. После завершения копирования, начните еще один проход, чтобы снова скопировать все грязные блоки
  6. Повторяйте проходы, пока количество грязных блоков не станет ниже определенного порога.В этот момент очередь входящих записей (увеличивает задержку записи), копирует оставшиеся грязные блоки, фиксирует записи в очереди на новую машину, изменяет конфигурацию записи на M2 и начинает принимать записи.

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

...