Команда ReQL: reconfigure
Синтаксис команды
table.reconfigure() → object database.reconfigure() → object
Описание
Переконфигурировать фрагментацию и репликацию таблицы. Используйте следующие опции с помощью optArg:
-
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: значение состояния таблицы status до выполнения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().optArg("shards", 2).optArg("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", "alfred"],
"nonvoting_replicas": []
},
{
"primary_replica": "alfred",
"replicas": ["jeeves", "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": ["jeeves", "alfred"],
"nonvoting_replicas": []
],
"indexes": [],
"write_acks": "majority",
"durability": "hard"
}
}
],
"status_changes": [
{
"new_val": (status object),
"old_val": (status object)
}
]
}
Пример: Переконфигурировать таблицу, указав реплики по тегам серверов.
r.table("superheroes").reconfigure().optArg("shards", 2).optArg("replicas", r.hashMap("wooster", 1).with("wayne", 1)).optArg("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", "alfred"],
"nonvoting_replicas": []
},
{
"primary_replica": "alfred",
"replicas": ["jeeves", "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": ["jeeves", "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().optArg("emergency_repair", "unsafe_rollback").run(conn);
© RethinkDB contributors
Licensed under the Creative Commons Attribution-ShareAlike 3.0 Unported License.
https://rethinkdb.com/api/java/reconfigure/