ReQL command: reconfigure
Command syntax
table.reconfigure(shards=<s>, replicas=<r>[, primary_replica_tag=<t>, dry_run=False, nonvoting_replica_tags=None]) → object database.reconfigure(shards=<s>, replicas=<r>[, primary_replica_tag=<t>, dry_run=False, nonvoting_replica_tags=None]) → object table.reconfigure(emergency_repair=<option>, dry_run=False) → object
Description
Reconfigure a table’s sharding and replication.
-
shards
: the number of shards, an integer from 1-64. Required. -
replicas
: either an integer or a mapping object. Required.- If
replicas
is an integer, it specifies the number of replicas per shard. Specifying more replicas than there are servers will return an error. - If
replicas
is an object, it specifies key-value pairs of server tags and the number of replicas to assign to those servers:{"tag1": 2, "tag2": 4, "tag3": 2, ...}
. For more information about server tags, read Administration tools.
- If
-
primary_replica_tag
: the primary server specified by its server tag. Required ifreplicas
is an object; the tag must be in the object. This must not be specified ifreplicas
is an integer. -
dry_run
: ifTrue
the generated configuration will not be applied to the table, only returned. -
nonvoting_replica_tags
: replicas with these server tags will be added to thenonvoting_replicas
list of the resulting configuration. (See failover for details about non-voting replicas.) -
emergency_repair
: Used for the Emergency Repair mode. See the separate section below.
The return value of reconfigure
is an object with three fields:
-
reconfigured
: the number of tables reconfigured. This will be0
ifdry_run
isTrue
. -
config_changes
: a list of new and old table configuration values. Each element of the list will be an object with two fields:-
old_val
: The table’s config value beforereconfigure
was executed. -
new_val
: The table’sconfig
value afterreconfigure
was executed.
-
-
status_changes
: a list of new and old table status values. Each element of the list will be an object with two fields:-
old_val
: The table’s status value beforereconfigure
was executed. -
new_val
: The table’sstatus
value afterreconfigure
was executed.
-
For config_changes
and status_changes
, see the config and status commands for an explanation of the objects returned in the old_val
and new_val
fields.
A table will lose availability temporarily after reconfigure
is called; use the wait command to wait for the table to become available again, or status to check if the table is available for writing.
Note: Whenever you call reconfigure
, the write durability will be set to hard
and the write acknowledgments will be set to majority
; these can be changed by using the config
command on the table.
If reconfigure
is called on a database, all the tables in the database will have their configurations affected. The return value will be an array of the objects described above, one per table.
Read Sharding and replication for a complete discussion of the subject, including advanced topics.
Example: Reconfigure a table.
r.table('superheroes').reconfigure(shards=2, replicas=1).run(conn)
Example return:
{
"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)
}
]
}
Example: Reconfigure a table, specifying replicas by server tags.
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", "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)
}
]
}
Emergency Repair mode
RethinkDB supports automatic failover when more than half of the voting replicas for each shard of a table are still available (see the Failover documentation for more details). However, if half or more of the voting replicas for a shard are lost, failover will not happen automatically, leaving two options:
- Bring enough of the missing servers back online to allow automatic failover
- Use emergency repair mode to reconfigure the table
The emergency_repair
argument is effectively a different command; when it is specified, no other arguments to reconfigure
are allowed except for dry_run
. When it’s executed, each shard of the table is examined and classified into one of three categories:
- Healthy: more than half of the shard’s voting replicas are still available.
- Repairable: the shard is not healthy, but has at least one replica, whether voting or non-voting, available.
- Beyond repair: the shard has no replicas available.
For each repairable shard, emergency_repair
will convert all unavailable voting replicas into non-voting replicas. If all the voting replicas were removed, an arbitrarily-chosen available non-voting replica will be converted into a voting replica. After this operation, all of the shard’s available replicas will be voting replicas.
Specify emergency_repair
with one of two string options:
-
unsafe_rollback
: shards that are beyond repair will be left alone. -
unsafe_rollback_or_erase
: a shard that is beyond repair will be destroyed and recreated on an available server that holds another shard for that table.
The return value of reconfigure
in emergency repair mode is the same as before. Examine the config_changes
field to see the old and new configuration settings for the table. As in the normal mode, if you specify emergency_repair
with dry_run: True
, the table will not actually be reconfigured.
Note: emergency_repair
may only be used on individual tables, not on databases. It cannot be used after the db
command.
The emergency repair mode is extremely dangerous. It bypasses normal safeguards that prevent data loss and invalidates the consistency guarantees that RethinkDB normally provides, and can easily lose data in either mode—in
unsafe_rollback_or_erase
mode it could lose all of a shard’s data.
Example: Perform an emergency repair on a table.
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/python/reconfigure/