2013-03-12 4 views
6

У нас есть кластер Cassandra с одним токеном на узел, всего 22 узла, средняя нагрузка на узел - 500 Гб. Он имеет SimpleStrategy для основного пространства ключей и SimpleSnitch.Как перенести кластер с одним токеном в новый кластер vnodes без простоя?

Нам нужно перенести все данные в новый центр обработки данных и выключить старый без простоя. Новый кластер имеет 28 узлов. Я хочу иметь vnodes на нем.

Я имею в виду следующий процесс:

  1. Migrate старый кластер vnodes
  2. Setup новый кластер с vnodes
  3. Добавить узлы из нового кластера к старому и ждать, пока она уравновешивает все,
  4. Коммутационные клиентов в новый кластер
  5. узлов из вывода из эксплуатации старого кластера один от одного

Но есть много технических деталей. Прежде всего, следует ли перетасовать старый кластер после миграции vnodes? Затем, как лучше всего перейти на NetworkTopologyStrategy и GossipingPropertyFileSnitch? Я хочу переключиться на NetworkTopologyStrategy, потому что новый кластер имеет 2 разных стойки с отдельными сетевыми/сетевыми коммутаторами.

+1

pro tip: попробуйте это в испытательной/непроизводственной среде. – Schildmeijer

+0

Да, это то, что я делаю сейчас – relgames

ответ

5

Следует ли перетасовать старый кластер после миграции vnodes?

Вам не нужно. Если вы перейдете от одного токена к узлу до 256 (по умолчанию), каждый узел разделит его диапазон на 256 смежных диапазонов одинакового размера. Это не влияет на то, где живут данные. Но это означает, что когда вы загружаете новый узел в новом DC, он будет оставаться сбалансированным на протяжении всего процесса.

Что такое лучший способ переключиться на NetworkTopologyStrategy и GossipingPropertyFileSnitch?

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

Вот способ сделать это, после того, как вы обновили старый кластер к vnodes (ваш шаг 1 выше):

1a. Перечислите все существующие узлы как находящиеся в DC0 в файле свойств. Перечислите новые узлы как находящиеся в DC1 и их правильные стойки.

1b. Измените стратегию репликации на NTS с параметрами DC0: 3 (или независимо от вашего текущего коэффициента репликации) и DC1: 0.

Затем, чтобы добавить новые узлы, выполните следующие действия: http://www.datastax.com/docs/1.2/operations/add_replace_nodes#adding-a-data-center-to-a-cluster. Не забудьте установить число токенов на 256, так как по умолчанию будет 1.

На шаге 5 вы должны установить коэффициент репликации для DC0 равным 0, т. Е. Изменить параметры репликации на DC0: 0, DC1: 3. Теперь эти узлы не используются, поэтому декомпозиция не будет передавать какие-либо данные, но вы все равно должны это делать, а не отключать их, чтобы они были удалены с кольца.

Обратите внимание, что риск состоит в том, что записи, выполненные с низким уровнем согласованности, до старых узлов могут потеряться. Чтобы избежать этого, вы можете написать в CL.LOCAL_QUORUM после перехода на новый DC. Существует еще небольшое окно, где записи могут потеряться (между шагами 3 и 4). Если это важно, вы можете запустить ремонт до вывода из эксплуатации старых узлов, чтобы гарантировать отсутствие потерь или запись на высоком уровне согласованности.

+0

_writes, сделанные с низким уровнем согласованности с старыми узлами, могут потеряться Можете ли вы объяснить, почему? Не знаю, важно ли это, но мы не перезаписываем старые значения, мы всегда добавляем новые данные. Это то, что я вижу: 1. DC0 и DC1 работают, клиенты используют DC0, поток данных DC0 -> DC1 2. Коммутатор: клиенты используют DC1, поток данных DC0-> DC1 и DC1- > DC0 3. Старые данные передаются в DC1, поток только DC1-> DC0 4. Установите DC0: 0, передача данных между DC0 и DC1 Действительно, я вижу, что некоторые чтения из DC1 на шаге 2 могут не отображаться данные, которые все еще находятся в DC0, но мы можем жить с этим. Но это не потеряно. – relgames

+0

Во время шага 3, хотя ваш клиент подключен к узлу в DC1, не гарантируется запись значения в узел в DC1 на низких уровнях согласованности. Например. если вы пишете на CL.ONE, все реплики в DC1 могут потерпеть неудачу (например, из-за того, что они слишком заняты, поэтому они отбрасывают запись), а запись только заканчивается на узле в DC0. Когда вы устанавливаете DC0: 0, эта запись теряется, даже если она была подтверждена клиенту. – Richard

+0

Любая идея, почему datastax говорит, больше не делает этого? http://datastax.com/documentation/cassandra/2.0/cassandra/configuration/configVnodesProduction_t.html - также здесь http://www.datastax.com/dev/blog/upgrading-an-existing-cluster-to-vnodes- 2 – chrislovecnm

-1

Если вы пытаетесь перейти на новый кластер с помощью vnodes, вам не нужно будет менять Partitioner. В документах говорится, что не рекомендуется переносить данные между разными Partitioners.

+0

Нет, выбор разделителя не зависит от vnodes. – Richard

Смежные вопросы