Spec-Zone.ru › RethinkDB ruby

Команда ReQL: reconfigure

Синтаксис команды

table.reconfigure({:shards => <s>, :replicas => <r>[, :primary_replica_tag => <t>, :dry_run => false, :nonvoting_replica_tags => nil]}) → object
database.reconfigure({:shards => <s>, :replicas => <r>[, :primary_replica_tag => <t>, :dry_run => false, :nonvoting_replica_tags => nil]}) → object
table.reconfigure(:emergency_repair => <option>, :dry_run => false) → object

Описание

Переконфигурировать фрагментацию и репликацию таблицы.

  • shards: количество фрагментов, целое число от 1 до 64. Обязательно.
  • replicas: целое число или объект-отображение. Обязательно.
    • Если replicas является целым числом, оно указывает количество реплик на фрагмент. Указание большего количества реплик, чем серверов, приведет к ошибке.
    • Если replicas является объектом, он указывает пары ключ-значение тегов сервера и количество реплик, назначенных этим серверам: {:tag1 => 2, :tag2 => 4, :tag3 => 2, ...}. Для получения дополнительной информации о тегах сервера, обратитесь к Инструментам администрирования.
  • primary_replica_tag: первичный сервер, указанный по его тегу сервера. Обязательно, если replicas является объектом; тег должен быть в объекте. Это не должно быть указано, если replicas является целым числом.
  • dry_run: если true сгенерированная конфигурация не будет применена к таблице, а только возвращена.
  • nonvoting_replica_tags: реплики с указанными тегами сервера будут добавлены в nonvoting_replicas список результирующей конфигурации. (См. failover для получения подробной информации о не-голосовых репликах.)
  • emergency_repair: используется для режима экстренного ремонта. См. отдельный раздел ниже.

Возвращаемое значение reconfigure — это объект с тремя полями:

  • reconfigured: количество переконфигурированных таблиц. Будет 0 если dry_run равно true.
  • config_changes: список новых и старых значений конфигурации таблицы. Каждый элемент списка будет объектом с двумя полями:
    • old_val: Значение config таблицы до выполнения reconfigure.
    • new_val: Значение config таблицы после выполнения reconfigure.
  • status_changes: список новых и старых значений состояния таблицы. Каждый элемент списка будет объектом с двумя полями:
    • old_val: Значение состояния таблицы до выполнения reconfigure.
    • new_val: Значение status таблицы после выполнения reconfigure.

Для config_changes и status_changes, см. команды config и status для объяснения объектов, возвращаемых в полях old_val и new_val.

Таблица временно потеряет доступность после вызова reconfigure; используйте команду wait для ожидания повторного предоставления доступа к таблице или команду status для проверки доступности таблицы для записи.

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

Если reconfigure вызывается для базы данных, конфигурации всех таблиц в базе данных будут затронуты. Возвращаемое значение будет массивом объектов, описанных выше, по одной таблице.

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

Пример: Переконфигурировать таблицу.

r.table('superheroes').reconfigure({:shards => 2, :replicas => 1}).run(conn)

Пример возвращаемого значения:

{
  :reconfigured => 1,
  :config_changes => [
    {
      :new_val => {
        :id => "31c92680-f70c-4a4b-a49e-b238eb12c023",
        :name => "superheroes",
        :db => "superstuff",
        :primary_key => "id",
        :shards => [
          {
            :primary_replica => "jeeves",
            :replicas => ["jeeves"],
            :nonvoting_replicas => []
          },
          {
            :primary_replica => "alfred",
            :replicas => ["alfred"],
            :nonvoting_replicas => []
          }
        ],
        :indexes => [],
        :write_acks => "majority",
        :durability => "hard"
      },
      :old_val => {
        :id => "31c92680-f70c-4a4b-a49e-b238eb12c023",
        :name => "superheroes",
        :db => "superstuff",
        :primary_key => "id",
        :shards => [
          {
            :primary_replica => "alfred",
            :replicas => ["alfred"],
            :nonvoting_replicas => []
          }
        ],
        :indexes => [],
        :write_acks => "majority",
        :durability => "hard"
      }
    }
  ],
  :status_changes => [
    {
      :new_val => (status object),
      :old_val => (status object)
    }
  ]
}

Пример: Переконфигурировать таблицу, указав реплики по тегам сервера.

r.table('superheroes').reconfigure({:shards => 2, :replicas => {:wooster => 1, :wayne => 1}, :primary_replica_tag => 'wooster'}).run(conn)

{
  :reconfigured => 1,
  :config_changes => [
    {
      :new_val => {
        :id => "31c92680-f70c-4a4b-a49e-b238eb12c023",
        :name => "superheroes",
        :db => "superstuff",
        :primary_key => "id",
        :shards => [
          {
            :primary_replica => "jeeves",
            :replicas => ["jeeves"],
            :nonvoting_replicas => []
          },
          {
            :primary_replica => "alfred",
            :replicas => ["alfred"],
            :nonvoting_replicas => []
          }
        ],
        :indexes => [],
        :write_acks => "majority",
        :durability => "hard"
      },
      :old_val => {
        :id => "31c92680-f70c-4a4b-a49e-b238eb12c023",
        :name => "superheroes",
        :db => "superstuff",
        :primary_key => "id",
        :shards => [
          {
            :primary_replica => "alfred",
            :replicas => ["alfred"],
            :nonvoting_replicas => []
          }
        ],
        :indexes => [],
        :write_acks => "majority",
        :durability => "hard"
      }
    }
  ],
  :status_changes => [
    {
      :new_val => (status object),
      :old_val => (status object)
    }
  ]
}

Режим экстренного ремонта

RethinkDB поддерживает автоматический сбой при наличии более половины голосующих реплик для каждого фрагмента таблицы (подробнее см. документацию по сбою). Однако если потеряно более половины голосующих реплик для фрагмента, автоматический сбой не произойдет, и останутся два варианта:

  • Возвращение достаточно серверов в онлайн-режим, чтобы обеспечить автоматический сбой
  • Использование режима экстренного ремонта для переконфигурации таблицы

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

  • Здоровый: более половины голосующих реплик фрагмента по-прежнему доступны.
  • Подлежащий ремонту: фрагмент не является здоровым, но есть хотя бы одна доступная реплика, голосовая или не-голосовая.
  • Не подлежит ремонту: фрагмент не имеет доступных реплик.

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

Укажите emergency_repair с одним из двух вариантов строк:

  • unsafe_rollback: фрагменты, не подлежащие ремонту, будут оставлены в покое.
  • unsafe_rollback_or_erase: фрагмент, не подлежащий ремонту, будет уничтожен и воссоздан на доступном сервере, который содержит другой фрагмент для этой таблицы.

Возвращаемое значение reconfigure в режиме экстренного ремонта такое же, как и раньше. Проверьте поле config_changes, чтобы увидеть старые и новые параметры конфигурации для таблицы. Как и в обычном режиме, если вы укажете emergency_repair с dry_run: true, таблица фактически не будет переконфигурирована.

Примечание: emergency_repair может быть использован только для отдельных таблиц, а не для баз данных. Он не может быть использован после команды db.

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

Пример: Выполнение экстренного ремонта таблицы.

r.table('superheroes').reconfigure(
    {:emergency_repair => 'unsafe_rollback'}
).run(conn)

© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/ruby/reconfigure/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API