title: Roles requests

summary: Roles requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-all-roles) | `/v1/roles` | Get all roles |
| [GET](#get-role) | `/v1/roles/{uid}` | Get a single role |
| [PUT](#put-role) | `/v1/roles/{uid}` | Update an existing role |
| [POST](#post-role) | `/v1/roles` | Create a new role |
| [DELETE](#delete-role) | `/v1/roles/{uid}` | Delete a role |

title: Get all roles {#get-all-roles}

text:
[code example]

Get all roles' details.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [view_all_roles_info]() | admin
cluster_member
cluster_viewer
db_member
db_viewer
user_manager |

title: Request {#get-all-request}

title: Response {#get-all-response}

text:
Returns a JSON array of [role objects]().

#### Example JSON body

[code example]

#### Status codes {#get-all-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | No error |
| [501 Not Implemented](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.2) | Cluster doesn't support roles yet. |

title: Get role

text:
[code example]

Get the details of a single role.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [view_role_info]() | admin
cluster_member
cluster_viewer
db_member
db_viewer
user_manager |

title: Request {#get-request}

text:
#### Example HTTP request

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The role's unique ID. |

title: Response {#get-response}

text:
Returns a [role object]().

#### Example JSON body

[code example]

#### Status codes {#get-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success. |
| [403 Forbidden](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4) | Operation is forbidden. |
| [404 Not Found](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5) | Role does not exist. |
| [501 Not Implemented](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.2) | Cluster doesn't support roles yet. |

title: Update role {#put-role}

text:
[code example]

Update an existing role's details.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [update_role]() | admin<br />user_manager |

title: Request {#put-request}

text:
#### Example HTTP request

[code example]

#### Example JSON body

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field   | Type | Description |
|---------|------|---------------|
| dry_run |  | Validate the updated [role object]() but don't apply the update. |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The role's unique ID. |

#### Body

Include a [role object]() with updated fields in the request body.

title: Response {#put-response}

text:
Returns a [role object]() with the updated fields.

#### Example JSON body

[code example]

title: Error codes {#put-error-codes}

text:
Possible `error_code` values:

| Code | Description |
|------|-------------|
| unsupported_resource | The cluster is not yet able to handle this resource type. This could happen in a partially upgraded cluster, where some of the nodes are still on a previous version.|
| name_already_exists | An object of the same type and name exists.|
| change_last_admin_role_not_allowed | At least one user with admin role should exist.|

#### Status codes {#put-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success, role is created. |
| [400 Bad Request](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1) | Bad or missing configuration parameters. |
| [404 Not Found](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5) | Attempting to change a non-existant role. |
| [501 Not Implemented](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.2) | Cluster doesn't support roles yet. |

title: Create role {#post-role}

text:
[code example]

Create a new role.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [create_role]() | admin<br />user_manager |

title: Request {#post-request}

text:
#### Example HTTP request

[code example]

#### Example JSON body

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field   | Type | Description |
|---------|------|---------------|
| dry_run |  | Validate the new [role object]() but don't apply the update. |

#### Body

Include a [role object]() in the request body.

title: Response {#post-response}

text:
Returns the newly created [role object]().

#### Example JSON body

[code example]

title: Error codes {#post-error-codes}

text:
Possible `error_code`values:

| Code | Description |
|------|-------------|
| unsupported_resource | The cluster is not yet able to handle this resource type. This could happen in a partially upgraded cluster, where some of the nodes are still on a previous version. |
| name_already_exists | An object of the same type and name exists |
| missing_field | A needed field is missing |

#### Status codes {#post-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success, role is created. |
| [400 Bad Request](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1) | Bad or missing configuration parameters. |
| [501 Not Implemented](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.2) | Cluster doesn't support roles yet. |

title: Examples

title: Delete role {#delete-role}

text:
[code example]

Delete a role object.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [delete_role]() | admin<br />user_manager |

title: Request {#delete-request}

text:
#### Example HTTP request

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The role unique ID. |

title: Response {#delete-response}

text:
Returns a status code to indicate role deletion success or failure.

#### Status codes {#delete-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success, the role is deleted. |
| [404 Not Found](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5) | Role does not exist. |
| [406 Not Acceptable](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7) | The request is not acceptable. |
| [501 Not Implemented](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.2) | Cluster doesn't support roles yet. |

code: GET /v1/roles

section_id: get-all-roles-get-all-roles

section_id: request-get-all-request

Admin

management: admin

code: GET /v1/roles/{int: uid}

section_id: get-role

code: GET /v1/roles/1

section_id: request-get-request

code: PUT /v1/roles/{int: uid}

section_id: update-role-put-role

code: PUT /v1/roles/17

section_id: request-put-request

code: POST /v1/roles

section_id: create-role-post-role

section_id: response-post-response

code:
curl -k -u "[username]:[password]" -X POST \
     -H 'Content-Type: application/json' \
     -d '{ "name": "DBA", "management": "admin" }' \
     https://[host][:port]/v1/roles

code:
import requests
import json

url = "https://[host][:port]/v1/roles"

headers = {
  'Content-Type': 'application/json'
}

payload = json.dumps({
    "name": "DBA",
    "management": "admin"
})
auth=("[username]", "[password]")

response = requests.request("POST", url,
           auth=auth, headers=headers, payload=payload, verify=False)

print(response.text)

code: DELETE /v1/roles/{int: uid}

section_id: delete-role-delete-role

code: DELETE /v1/roles/1


title: Services requests

summary: REST API requests to list or modify Redis Software services.

page_type: content

title: Overview

role: overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-local-services) | `/v1/local/services` | List Redis Software services on the local node |
| [POST](#post-local-services) | `/v1/local/services` | Modify or perform operations on local processes |
| [POST](#post-services) | `/v1/services` | Modify or perform operations on primary node processes |

This API is dangerous and should only be run with guidance from [Redis support](https://redis.io/support/).

Stop, start, or restart optional services only. Changing the status of required services can negatively affect cluster behavior and cause a complete loss of the cluster and its data.

For a list of optional services, see the [services configuration object reference]() or use a [`GET /v1/cluster/services_configuration`]() request.

title: Get local services {#get-local-services}

role: content

text:
[code example]

Lists all Redis Software services currently running on the local node and relevant metadata.

title: Request {#get-request}

title: Response {#get-response}

role: returns

text:
Returns a JSON object that describes all Redis Software services currently running on the local node and relevant metadata.

Possible `status` values:
- RESTARTING
- RUNNING
- STARTING
- STOPPED

#### Example JSON response body

[code example]

#### Status codes {#get-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error |

title: Modify local services {#post-local-services}

text:
[code example]

Modify Redis Software services or perform operations that directly interact with processes on the local node. To perform operations on the primary node, use [`POST /v1/services`](#post-services) instead.

Supported `operation_type` values:

- stop
- start
- restart

This API is dangerous and should only be run with guidance from [Redis support](https://redis.io/support/).

Stop, start, or restart optional services only. Changing the status of required services can negatively affect cluster behavior and cause a complete loss of the cluster and its data.

For a list of optional services, see the [services configuration object reference]() or use a [`GET /v1/cluster/services_configuration`]() request.

title: Request {#post-local-request}

text:
#### Example HTTP request

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Example JSON request body

[code example]

title: Response {#post-local-response}

text:
Returns a JSON object that shows whether the operation ran successfully or failed for each requested service.

#### Example JSON response body

[code example]

#### Status codes {#post-local-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |

title: Modify primary node services {#post-services}

text:
[code example]

Modify Redis Software services or perform operations that directly interact with processes on the primary node. For operations on secondary nodes, use [`POST /v1/local/services`](#post-local-services) instead.

Supported `operation_type` values:

- stop
- start
- restart

This API is dangerous and should only be run with guidance from [Redis support](https://redis.io/support/).

Stop, start, or restart optional services only. Changing the status of required services can negatively affect cluster behavior and cause a complete loss of the cluster and its data.

For a list of optional services, see the [services configuration object reference]() or use a [`GET /v1/cluster/services_configuration`]() request.

title: Request {#post-request}

title: Response {#post-response}

text:
Returns a JSON object that shows whether the operation ran successfully or failed for each requested service.

#### Example JSON response body

[code example]

#### Status codes {#post-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |

code: GET /v1/local/services

section_id: get-local-services-get-local-services

section_id: response-get-response

code: POST /v1/local/services

section_id: request-post-local-request

operation_type: restart

section_id: response-post-local-response

code: POST /v1/services

section_id: request-post-request


title: Shard failover requests

summary: REST API requests to fail over database shards

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [POST](#post-multi-shards) | `/v1/shards/actions/failover` | Fail over multiple shards |
| [POST](#post-shard) | `/v1/shards/{uid}/actions/failover` | Fail over a specific shard |

title: Fail over multiple shards {#post-multi-shards}

text:
POST /v1/shards/actions/failover

Performs failover on the primary shards specified by `shard_uids` in the request body, and promotes their replicas to primary shards. This request is asynchronous.

The cluster automatically manages failover to ensure high availability. Use this failover REST API request only for testing and planned maintenance.

#### Required permissions

| Permission name | Roles |
|-----------------|-------|
| [failover_shard]() | admin
cluster_member
db_member |

title: Request {#post-multi-request}

text:
#### Example HTTP request

	POST /v1/shards/actions/failover

#### Example JSON body

[code example]

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Request body {#post-multi-request-body}

The request body is a JSON object that can contain the following fields:

| Field | Type | Description |
|-------|------|-------------|
| shard_uids | array of strings | List of primary shard UIDs to fail over. The shards must belong to the same database. |
| dead_uids | array of strings | Primary shards to avoid stopping. Optional. |
| dead_nodes | array of strings | Nodes that should not be drained or used for promoted replica shards. Optional. |
| dry_run | boolean | Determines whether the failover is actually done. If true, will just do a dry run. If the dry run succeeds, the request returns a `200 OK` status code.  Otherwise, it returns a JSON object with an error code and description. Optional. |
| force_rebind | boolean | Rebind after promotion. Optional. |
| redis_version_upgrade | string | New version of the promoted primary shards. Optional. |

title: Response {#post-multi-response}

text:
Returns a JSON object with an `action_uid`. You can track the action's progress with a [`GET /v1/actions/<action_uid>`]() request.

#### Example JSON body

[code example]

title: Status codes {#post-multi-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Shard is a replica or the specified failover shards are not in the same database. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | A list of shard UIDs is required and not given, or a specified shard does not exist. |
| [409 Conflict](https://www.rfc-editor.org/rfc/rfc9110.html#name-409-conflict) | Database is currently busy. |

title: Error codes {#put-multi-error-codes}

role: errors

text:
When errors are reported, the server may return a JSON object with `error_code` and `message` field that provide additional information. The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| db_busy | Database is currently busy. |
| failover_shards_different_bdb | All failover shards should be in the same database. |
| shard_is_slave | Shard is a replica. |
| shard_not_exist | Shard does not exist. |
| shard_uids_required | List of shard UIDs is required and not given. |

title: Fail over shard {#post-shard}

text:
POST /v1/shards/{int: uid}/actions/failover

Performs failover on the primary shard with the specified `shard_uid`, and promotes its replica shard to a primary shard. This request is asynchronous.

The cluster automatically manages failover to ensure high availability. Use this failover REST API request only for testing and planned maintenance.

#### Required permissions

| Permission name | Roles |
|-----------------|-------|
| [failover_shard]() | admin
cluster_member
db_member |

title: Request {#post-request}

text:
#### Example HTTP request

	POST /v1/shards/1/actions/failover

#### Example JSON body

[code example]

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The unique ID of the shard to fail over. |

#### Request body {#post-request-body}

The request body is a JSON object that can contain the following fields:

| Field | Type | Description |
|-------|------|-------------|
| dead_uid | string | Primary shard to avoid stopping. Optional. |
| dead_nodes | array of strings | Nodes that should not be drained or used for promoted replica shards. Optional. |
| dry_run | boolean | Determines whether the failover is actually done. If true, will just do a dry run. If the dry run succeeds, the request returns a `200 OK` status code.  Otherwise, it returns a JSON object with an error code and description. Optional. |
| force_rebind | boolean | Rebind after promotion. Optional. |
| redis_version_upgrade | string | New version of the promoted primary shards. Optional. |

title: Response {#post-response}

title: Status codes {#post-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Shard is a replica. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | Specified shard does not exist. |
| [409 Conflict](https://www.rfc-editor.org/rfc/rfc9110.html#name-409-conflict) | Database is currently busy. |

title: Error codes {#put-error-codes}

text:
When errors are reported, the server may return a JSON object with `error_code` and `message` field that provide additional information. The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| db_busy | Database is currently busy. |
| shard_is_slave | Shard is a replica. |
| shard_not_exist | Shard does not exist. |

section_id: request-post-multi-request

description: Failover was triggered

section_id: response-post-multi-response

description: Failover was triggered


title: Shard actions requests

summary: REST API requests to perform shard actions

title: Shard failover requests

summary: REST API requests to migrate database shards

title: Migrate shards requests

title: Migrate

text:
| Method | Path | Description |
|--------|------|-------------|
| [POST]() | `/v1/shards/actions/migrate` | Migrate multiple shards |
| [POST]() | `/v1/shards/{uid}/actions/migrate` | Migrate a specific shard |


title: Migrate shards requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [POST](#post-multi-shards) | `/v1/shards/actions/migrate` | Migrate multiple shards |
| [POST](#post-shard) | `/v1/shards/{uid}/actions/migrate` | Migrate a specific shard |

title: Migrate multiple shards {#post-multi-shards}

text:
POST /v1/shards/actions/migrate

Migrates the list of given shard UIDs to the node specified by `target_node_uid`. The shards can be from multiple databases. This request is asynchronous.

For more information about shard migration use cases and considerations, see [Migrate database shards]().

#### Required permissions

| Permission name | Roles |
|-----------------|-------|
| [migrate_shard]() | admin
cluster_member
db_member |

title: Request {#post-multi-request}

text:
#### Example HTTP request

	POST /v1/shards/actions/migrate

#### Example JSON body

[code example]

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Request body {#post-multi-request-body}

The request body is a JSON object that can contain the following fields:

| Field | Type | Description |
|-------|------|-------------|
| shard_uids | array of strings | List of shard UIDs to migrate. |
| target_node_uid | integer | UID of the node to where the shards should migrate. |
| override_rack_policy | boolean | If true, overrides and ignores rack-aware policy violations. |
| dry_run | boolean | Determines whether the migration is actually done. If true, will just do a dry run. If the dry run succeeds, the request returns a `200 OK` status code.  Otherwise, it returns a JSON object with an error code and description. |
| preserve_roles | boolean | If true, preserves the migrated shards' roles after migration. |
| max_concurrent_bdb_migrations | integer | The number of concurrent databases that can migrate shards. |

title: Response {#post-multi-response}

title: Status codes {#post-multi-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Conflicting parameters. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | A list of shard UIDs is required and not given, a specified shard does not exist, or a node UID is required and not given. |
| [500 Internal Server Error](https://www.rfc-editor.org/rfc/rfc9110.html#name-500-internal-server-error) | Migration failed. |

title: Migrate shard {#post-shard}

text:
POST /v1/shards/{int: uid}/actions/migrate

Migrates the shard with the given `shard_uid` to the node specified by `target_node_uid`. If the shard is already on the target node, nothing happens. This request is asynchronous.

For more information about shard migration use cases and considerations, see [Migrate database shards]().

#### Required permissions

| Permission name | Roles |
|-----------------|-------|
| [migrate_shard]() | admin
cluster_member
db_member |

title: Request {#post-request}

text:
#### Example HTTP request

	POST /v1/shards/1/actions/migrate

#### Example JSON body

[code example]

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The unique ID of the shard to migrate. |

#### Request body {#post-request-body}

The request body is a JSON object that can contain the following fields:

| Field | Type | Description |
|-------|------|-------------|
| target_node_uid | integer | UID of the node to where the shard should migrate. |
| override_rack_policy | boolean | If true, overrides and ignores rack-aware policy violations. |
| dry_run | boolean | Determines whether the migration is actually done. If true, will just do a dry run. If the dry run succeeds, the request returns a `200 OK` status code.  Otherwise, it returns a JSON object with an error code and description. |
| preserve_roles | boolean | If true, preserves the migrated shards' roles after migration. |

title: Response {#post-response}

title: Status codes {#post-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | Shard does not exist, or node UID is required and not given. |
| [409 Conflict](https://www.rfc-editor.org/rfc/rfc9110.html#name-409-conflict) | Database is currently busy. |

description: Migrate was triggered

description: Migrate was triggered


title: Shard requests

summary: REST API requests for database shards

title: Shard actions requests

summary: Shard statistics requests

title: Shards stats requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-all-shards) | `/v1/shards` | Get all shards |
| [GET](#get-shard) | `/v1/shards/{uid}` | Get a specific shard |

title: Get all shards {#get-all-shards}

text:
GET /v1/shards

Get information about all shards in the cluster.

title: Request {#get-all-request}

text:
#### Example HTTP request

	GET /v1/shards?extra_info_keys=used_memory_rss&extra_info_keys=connected_clients

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field | Type | Description |
|-------|------|-------------|
| extra_info_keys | list of strings | An optional list of extra keys to be fetched from the Redis [`INFO`]() command. See [extra_info_keys](#extra_info_keys) for common keys to include. |

title: Response {#get-all-response}

text:
Returns a JSON array of [shard objects]().

#### Example JSON body

[code example]

title: Status codes {#get-all-status-codes}

title: Get shard {#get-shard}

text:
GET /v1/shards/{int: uid}

Gets information about a single shard.

title: Request {#get-request}

text:
#### Example HTTP request

	GET /v1/shards/1?extra_info_keys=used_memory_rss&extra_info_keys=connected_clients

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The unique ID of the requested shard. |

#### Query parameters

| Field | Type | Description |
|-------|------|-------------|
| extra_info_keys | list of strings | An optional list of extra keys to be fetched from the Redis [`INFO`]() command. See [extra_info_keys](#extra_info_keys) for common keys to include. |

title: Response {#get-response}

text:
Returns a [shard object]().

#### Example JSON body

[code example]

title: Status codes {#get-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | Shard UID does not exist. |

title: extra_info_keys

text:
You can include any Redis [`INFO`]() command key for shard requests using the `extra_info_keys` query parameter. The requested keys are returned in the `redis_info` object of the response.

See the following tables for common keys to include.

title: Client keys

text:
| Key | Type | Description |
|-----|------|-------------|
| blocked_clients | integer | Number of clients pending on a blocking call |
| client_recent_max_input_buffer | integer | Biggest input buffer among current client connections |
| client_recent_max_output_buffer | integer | Biggest output buffer among current client connections |
| connected_clients | integer | Number of client connections, excluding connections from replicas |

title: Memory keys

text:
| Key | Type | Description |
|-----|------|-------------|
| maxmemory | integer | Value of the maxmemory configuration directive |
| used_memory | integer | Total number of bytes allocated by Redis |
| used_memory_dataset | integer | Size in bytes of the dataset |
| used_memory_lua | integer | Number of bytes used by the Lua engine |
| used_memory_overhead | integer | Sum of all overheads that the server allocated for managing its internal data structures |
| used_memory_peak | integer | Peak memory in bytes consumed by Redis |
| used_memory_rss | integer | Number of bytes that Redis allocated as seen by the operating system |

title: Persistence keys

text:
| Key | Type | Description |
|-----|------|-------------|
| aof_enabled | integer | Flag indicating append-only file (AOF) logging is activated |
| aof_rewrite_in_progress | integer | Flag indicating an AOF rewrite operation is on-going |
| rdb_bgsave_in_progress | integer | Flag indicating an RDB save is on-going |
| rdb_changes_since_last_save | integer | Number of changes since the last dump |
| rdb_last_bgsave_status | string | Status of the last RDB save operation |
| rdb_last_save_time | integer | Epoch-based timestamp of last successful RDB save |

title: Replication keys

text:
| Key | Type | Description |
|-----|------|-------------|
| master_last_io_seconds_ago | integer | Number of seconds since the last interaction with the primary shard |
| master_repl_offset | integer | The server's current replication offset |
| slave_repl_offset | integer | Replication offset of the replica instance |

title: Server keys

text:
| Key | Type | Description |
|-----|------|-------------|
| configured_hz | integer | Server's configured frequency setting |
| hz | integer | Server's current frequency setting |
| redis_version | string | Version of the Redis server |
| uptime_in_days | integer | Number of days since Redis server start |
| uptime_in_seconds | integer | Number of seconds since Redis server start |

title: Statistics keys

text:
| Key | Type | Description |
|-----|------|-------------|
| instantaneous_ops_per_sec | integer | Number of commands processed per second |
| keyspace_hits | integer | Number of successful lookup of keys in the main dictionary |
| keyspace_misses | integer | Number of failed lookup of keys in the main dictionary |
| total_commands_processed | integer | Total number of commands processed by the server |
| total_connections_received | integer | Total number of connections accepted by the server |
| total_net_input_bytes | integer | Total number of bytes read from the network |
| total_net_output_bytes | integer | Total number of bytes written to the network |

code:
[
  {
    "uid": "1",
    "role": "master",
    "assigned_slots": "0-16383",
    "bdb_uid": 1,
    "detailed_status": "ok",
    "loading": {
      "status": "idle"
    },
    "node_uid": "1",
    "redis_info": {
			"connected_clients": 14,
			"used_memory_rss": 12263424
		},
    "report_timestamp": "2024-06-28T18:44:01Z",
    "status": "active"
  },
  {
    "uid": "2",
    "role": "slave",
    // additional fields...
  }
]

section_id: response-get-all-response

detailed_status: ok

status: idle

role: master

status: active


title: Shards stats requests

summary: Shard statistics requests

summary: Most recent shard statistics requests

title: Latest shards stats requests

title: Overview

text:
The v1 statistics REST API endpoints are deprecated as of Redis Software version 7.22. Use the [metrics stream engine for monitoring v2]() instead for real-time monitoring and metrics collection.

| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-all-shards-stats) | `/v1/shards/stats` | Get stats for all shards |
| [GET](#get-shard-stats) | `/v1/shards/stats/{uid}` | Get stats for a specific shard |

title: Get all shards stats {#get-all-shards-stats}

text:
GET /v1/shards/stats

Get statistics for all shards.

#### Required permissions

| Permission name |
|-----------------|
| [view_all_shard_stats]() |

title: Request {#get-all-request}

text:
#### Example HTTP request

	GET /v1/shards/stats?interval=1hour&stime=2014-08-28T10:00:00Z

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field | Type | Description |
|-------|------|-------------|
| parent_uid | integer | Only return shard from the given BDB ID (optional) |
| interval | string | Time interval for which we want stats: 1sec/10sec/5min/15min/1hour/12hour/1week (optional) |
| stime | ISO_8601 | Start time from which we want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |
| etime | ISO_8601 | End time after which we don't want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |
| metrics | list | Comma-separated list of [metric names]() for which we want statistics (default is all) (optional) |

title: Response {#get-all-response}

text:
Returns a JSON array of [statistics]() for all shards.

#### Example JSON body

[code example]

title: Status codes {#get-all-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | No shards exist |

title: Get shard stats {#get-shard-stats}

text:
GET /v1/shards/stats/{int: uid}

Get statistics for a specific shard.

#### Required permissions

| Permission name |
|-----------------|
| [view_shard_stats]() |

title: Request {#get-request}

text:
#### Example HTTP request

	GET /v1/shards/stats/1?interval=1hour&stime=2014-08-28T10:00:00Z

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The unique ID of the shard requested. |

#### Query parameters

| Field | Type | Description |
|-------|------|-------------|
| interval | string | Time interval for which we want stats: 1sec/10sec/5min/15min/1hour/12hour/1week (optional) |
| stime | ISO_8601 | Start time from which we want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |
| etime | ISO_8601 | End time after which we don't want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |

title: Response {#get-response}

text:
Returns [statistics]() for the specified shard.

#### Example JSON body

[code example]

title: Status codes {#get-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | Shard does not exist |
| [406 Not Acceptable](https://www.rfc-editor.org/rfc/rfc9110.html#name-406-not-acceptable) | Shard isn't currently active |


title: Latest shards stats requests

summary: Most recent shard statistics requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-all-shards-stats-last) | `/v1/shards/stats/last` | Get most recent stats for all shards |
| [GET](#get-shard-stats-last) | `/v1/shards/stats/last/{uid}` | Get most recent stats for a specific shard |

title: Get latest stats for all shards {#get-all-shards-stats-last}

text:
GET /v1/shards/stats/last

Get most recent statistics for all shards.

#### Required permissions

| Permission name |
|-----------------|
| [view_all_shard_stats]() |

title: Request {#get-all-request}

text:
#### Example HTTP request

	GET /v1/shards/stats/last?interval=1sec&stime=015-05-27T08:27:35Z

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field | Type | Description |
|-------|------|-------------|
| interval | string | Time interval for which we want stats: 1sec/10sec/5min/15min/1hour/12hour/1week. Default: 1sec (optional) |
| stime | ISO_8601 | Start time from which we want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |
| etime | ISO_8601 | End time after which we don't want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |

title: Response {#get-all-response}

text:
Returns most recent [statistics]() for all shards.

#### Example JSON body

[code example]

title: Status codes {#get-all-status-codes}

title: Get latest shard stats {#get-shard-stats-last}

text:
GET /v1/shards/stats/last/{int: uid}

Get most recent statistics for a specific shard.

#### Required permissions

| Permission name |
|-----------------|
| [view_shard_stats]() |

title: Request {#get-request}

text:
#### Example HTTP request

	GET /v1/shards/stats/last/1?interval=1sec&stime=2015-05-28T08:27:35Z

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The unique ID of the shard requested. |

#### Query parameters

| Field | Type | Description |
|-------|------|-------------|
| interval | string | Time interval for which we want stats: 1sec/10sec/5min/15min/1hour/12hour/1week. Default: 1sec. (optional) |
| stime | ISO_8601 | Start time from which we want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |
| etime | ISO_8601 | End time after which we don't want the stats. Should comply with the [ISO_8601](https://en.wikipedia.org/wiki/ISO_8601) format (optional) |

title: Response {#get-response}

text:
Returns the most recent [statistics]() for the specified shard.

#### Example JSON body

[code example]

title: Status codes {#get-status-codes}


title: Suffix requests

summary: DNS suffix requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-suffix) | `/v1/suffix/{name}` | Get a single DNS suffix |

title: Get suffix {#get-suffix}

text:
GET /v1/suffix/{string: name}

Get a single DNS suffix.

title: Request {#get-request}

text:
#### Example HTTP request

	GET /v1/suffix/cluster.fqdn

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| name | string | The unique name of the suffix requested. |

title: Response {#get-response}

text:
Returns a [suffix object]().

#### Example JSON body

[code example]

title: Status codes {#get-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | No error |
| [404 Not Found](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5) | Suffix name does not exist |

code:
{
    "name": "cluster.fqdn",
    "// additional fields..."
}


title: Suffixes requests

summary: DNS suffixes requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-all-suffixes) | `/v1/suffixes` | Get all DNS suffixes |

title: Get all suffixes {#get-all-suffixes}

text:
GET /v1/suffixes

Get all DNS suffixes in the cluster.

title: Request {#get-all-request}

text:
#### Example HTTP request

	GET /v1/suffixes

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

title: Response {#get-all-response}

text:
The response body contains a JSON array with all suffixes, represented as [suffix objects]().

#### Example JSON body

[code example]

title: Status codes {#get-all-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | No error |

code:
[
    {
        "name": "cluster.fqdn",
        "// additional fields..."
    },
    {
        "name": "internal.cluster.fqdn",
        "// additional fields..."
    }
]


title: Usage report requests

summary: REST API request to get the database usage report from the cluster.

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-usage-report) | `/v1/usage_report` | Get the cluster's database usage report |

title: Get usage report {#get-usage-report}

text:
[code example]

Gets the database usage report from the cluster as Newline Delimited JSON (NDJSON). The response is returned as a gzip file if the request includes the `Accept-Encoding: gzip` header; otherwise, it returns an NDJSON file directly. The final line in the file is the response's MD5 hash.

title: Request {#get-request}

text:
#### Example HTTP request

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |
| Accept-Encoding | gzip | (Optional) Request gzip compression for the response |

title: Response {#get-response}

text:
Returns Newline Delimited JSON (NDJSON), which represents the usage report for every database in the cluster. The response is returned as a gzip file if the request includes the `Accept-Encoding: gzip` header; otherwise, it returns an NDJSON file directly. The final line in the file is the response's MD5 hash.

| Field | Type/Value | Description |
|-------|------------|-------------|
| active_active | boolean | Indicates if Active-Active is enabled |
| api_version | string | API version |
| backup | boolean | Indicates if backup is enabled |
| bdb_uid | string | The database's unique ID |
| cluster_name | string | Cluster name |
| cluster_uuid | string | Cluster's unique ID |
| date | string | Date of the report, including time and time zone |
| dominant_shard_criteria | "mem"
"ops"
"rof" | Dominant criteria for shard selection |
| type | "core"
"premium"
"auto_tiering" | Database type |
| shard_type | "micro"
"normal"
"large"
"auto_tiering" | Shard type |
| no_eviction | boolean | Indicates if no eviction policy is applied |
| ops/sec | number | Consolidated ops/sec for the whole database |
| persistence | boolean | Indicates if persistence is enabled |
| provisioned_memory | number | Provisioned memory in bytes |
| replication | boolean | Indicates if replication is enabled |
| software_version | string | The Redis Software version |
| used_memory | number | Used memory in bytes |
| using_redis_search | boolean | Indicates if RediSearch is in use |
| master_shards_count | number | Amount of primary shards |
| license | object | License information for the cluster
 "license": {
    "activation_date": string,
    "expiration_date": string,
    "ram_shards_in_use": integer,
    "ram_shards_limit": integer,
    "flash_shards_in_use": integer,
    "flash_shards_limit": integer,
    "shards_limit": integer
}
**activation_date**: License activation date and time
**expiration_date**: License expiration date and time
**ram_shards_in_use**: Amount of RAM shards in use
**ram_shards_limit**: Amount of RAM shards allowed
**flash_shards_in_use**: Amount of flash shards in use
**flash_shards_limit**: Amount of flash shards allowed
**shards_limit**: Total shards limit |

#### Example response

[code example]

#### Status codes {#get-status-codes}

| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | No error |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Invalid date format |
| [503 Service Unavailable](https://www.rfc-editor.org/rfc/rfc9110.html#name-503-service-unavailable) | Unreachable node |

code: GET /v1/usage_report

section_id: get-usage-report-get-usage-report

code:
{
 "cluster_name": "mycluster.local",
 "cluster_uuid": "7e9f93c6-825e-4bbb-a067-7f6306b98609",
 "date": "2024-08-08T13:16:00.000000Z",
 "software_version": "7.0.0",
 "api_version" "1",
 "bdb_uid": "1",
 "type": "auto_tiering",
 "shard_type": "auto_tiering",
 "dominant_shard_criteria": "rof",
 "provisioned_memory": 1073741824,
 "used_memory": 5828776,
 "master_shards_count": 3,
 "no_eviction": false,
 "persistence": false,
 "backup": false,
 "using_redis_search": false,
 "ops_sec": 0,
 "replication": false,
 "active_active": false,
 "license": {
   "activation_date": "2018-12-31T00:00:00Z",
   "expiration_date": "2019-12-31T00:00:00Z",
   "ram_shards_in_use": 0,
   "ram_shards_limit": 300,
   "flash_shards_in_use": 0,
   "flash_shards_limit": 100,
   "shards_limit": 400
 }
}
{
 "cluster_name": "mycluster.local",
 "cluster_uuid": "7e9f93c6-825e-4bbb-a067-7f6306b98609",
 "date": "2024-08-08T13:17:00.000000Z",
 "software_version": "7.0.0",
 "api_version" "1",
 "bdb_uid": "1",
 "type": "auto_tiering",
 "shard_type": "auto_tiering",
 "dominant_shard_criteria": "rof",
 "provisioned_memory": 1073741824,
 "used_memory": 5828776,
 "master_shards_count": 3,
 "no_eviction": false,
 "persistence": false,
 "backup": false,
 "using_redis_search": false,
 "ops_sec": 0,
 "replication": false,
 "active_active": false,
 "license": {
   "activation_date": "2018-12-31T00:00:00Z",
   "expiration_date": "2019-12-31T00:00:00Z",
   "ram_shards_in_use": 0,
   "ram_shards_limit": 300,
   "flash_shards_in_use": 0,
   "flash_shards_limit": 100,
   "shards_limit": 400
 }
}
...
<MD5 hash of the entire response>


title: Authorize user requests

summary: Users authorization requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [POST](#post-authorize) | `/v1/users/authorize` | Generate a token to authorize an authenticated user |

title: Authorize user {#post-authorize}

role: security

text:
POST /v1/users/authorize

Generates a JSON Web Token (JWT) for a user to use as authorization to access the REST API. The request authentication header must include the relevant username and password.

title: Request {#post-request}

text:
#### Example HTTP request

    POST /v1/users/authorize

#### Example JSON body

The request body is optional unless you want to specify the token's time to live:

[code example]

#### Request headers
| Key    | Value            | Description         |
|--------|------------------|---------------------|
| Host   | cnm.cluster.fqdn | Domain name         |
| Accept | application/json | Accepted media type |

#### Request body

Optionally include a JSON object in the request body to specify the time to live (`ttl`), which determines the amount of time in seconds the token will be valid. The default `ttl` is `300` seconds. The minimum `ttl` is `1` second and the maximum `ttl` is `86400` seconds.

title: Response {#post-response}

text:
Returns a JSON object that contains the generated access token.

#### Example JSON body

[code example]

title: Error codes {#post-error-codes}

text:
When errors are reported, the server may return a JSON object with
`error_code` and `message` fields that provide additional information.
The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| password_expired | The password has expired and must be changed. |

title: Status codes {#post-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | The user is authorized. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | The request could not be understood by the server due to malformed syntax. |
| [401 Unauthorized](https://www.rfc-editor.org/rfc/rfc9110.html#name-401-unauthorized) | The user is unauthorized. |

code:
{
  "ttl": <time_in_seconds>
}


title: Users requests

summary: User requests

summary: Users authorization requests

title: Authorize user requests

summary: User password requests

title: User password requests

summary: Refresh JW token requests

title: Refresh JWT requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [GET](#get-all-users) | `/v1/users` | Get all users |
| [GET](#get-user) | `/v1/users/{uid}` | Get a single user |
| [PUT](#put-user) | `/v1/users/{uid}` | Update a user's configuration |
| [POST](#post-user) | `/v1/users` | Create a new user |
| [DELETE](#delete-user) | `/v1/users/{uid}` | Delete a user |

title: Get all users {#get-all-users}

text:
[code example]

Get a list of all users.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [view_all_users_info]() | admin<br />user_manager |

title: Request {#get-all-request}

title: Response {#get-all-response}

text:
Returns a JSON array of [user objects]().

#### Example JSON body

[code example]

title: Status codes {#get-all-status-codes}

title: Get user {#get-user}

text:
[code example]

Get a single user's details.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [view_user_info]() | admin<br />user_manager |

title: Request {#get-request}

text:
#### Example HTTP request

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The user's unique ID |

title: Response {#get-response}

text:
Returns a [user object]() that contains the details for the specified user ID.

#### Example JSON body

[code example]

title: Status codes {#get-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success. |
| [403 Forbidden](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.4) | Operation is forbidden. |
| [404 Not Found](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5) | User does not exist. |

title: Update user {#put-user}

text:
[code example]

Update an existing user's configuration.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [update_user]() | admin<br />user_manager |

Any user can change their own name, password, or alert preferences.

title: Request {#put-request}

text:
#### Example HTTP request

[code example]

#### Example JSON body

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field   | Type | Description |
|---------|------|---------------|
| dry_run |  | Validate the updated [user object]() but don't apply the update. |

#### URL parameters

| Field | Type | Description |
|-------|------|-------------|
| uid | integer | The user's unique ID |

#### Request body

Include a [user object]() with updated fields in the request body.

title: Response {#put-response}

text:
Returns the updated [user object]().

#### Example JSON body

[code example]

For [RBAC-enabled clusters](), the returned user details include `role_uids` instead of `role`.

title: Error codes {#put-error-codes}

text:
When errors are reported, the server may return a JSON object with    `error_code` and `message` field that provide additional information.    The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| password_not_complex | The given password is not complex enough (Only works when the password_complexity feature is enabled).|
| new_password_same_as_current | The given new password is identical to the old password.|
| email_already_exists | The given email is already taken.|
| change_last_admin_role_not_allowed | At least one user with admin role should exist.|

title: Status codes {#put-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success, the user is updated. |
| [400 Bad Request](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1) | Bad or missing configuration parameters. |
| [404 Not Found](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5) | Attempting to change a non-existing user. |
| [406 Not Acceptable](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7) | The requested configuration is invalid. |

title: Create user {#post-user}

text:
[code example]

Create a new user.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [create_new_user]() | admin<br />user_manager |

title: Request {#post-request}

text:
#### Example HTTP request

[code example]

#### Headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Accept | application/json | Accepted media type |

#### Query parameters

| Field   | Type | Description |
|---------|------|---------------|
| dry_run |  | Validate the new [user object]() but don't apply the update. |

#### Body

Include a single [user object]() in the request body. The user object must have an email, password, and role.

For [RBAC-enabled clusters](), use `role_uids` instead of `role` in the request body.

`email_alerts` can be configured either as:

- `true` - user will receive alerts for all databases configured in `bdbs_email_alerts`. The user will receive alerts for all databases by default if `bdbs_email_alerts` is not configured. `bdbs_email_alerts` can be a list of database UIDs or `[‘all’]` meaning all databases.

- `false` - user will not receive alerts for any databases

##### Example JSON body

[code example]

title: Response {#post-response}

text:
Returns the newly created [user object]().

#### Example JSON body

[code example]

title: Error codes {#post-error-codes}

text:
When errors are reported, the server may return a JSON object with `error_code` and `message` field that provide additional information.

The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| password_not_complex | The given password is not complex enough (Only works when the password_complexity feature is enabled).|
| email_already_exists | The given email is already taken.|
| name_already_exists | The given name is already taken.|

title: Status codes {#post-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success, user is created. |
| [400 Bad Request](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1) | Bad or missing configuration parameters. |
| [409 Conflict](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.10) | User with the same email already exists. |

title: Examples

role: example

text:
#### cURL

[code example]

#### Python

[code example]

title: Delete user {#delete-user}

text:
[code example]

Delete a user.

title: Permissions

text:
| Permission name | Roles |
|-----------------|-------|
| [delete_user]() | admin<br />user_manager |

title: Request {#delete-request}

title: Response {#delete-response}

text: Returns a status code to indicate the success or failure of the user deletion.

title: Status codes {#delete-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | Success, the user is deleted. |
| [406 Not Acceptable](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.7) | The request is not acceptable. |

code: GET /v1/users

section_id: get-all-users-get-all-users

section_id: request-get-all-request

John Doe

role: admin

auth_method: regular

code: GET /v1/users/{int: uid}

section_id: get-user-get-user

code: GET /v1/users/1

code: PUT /v1/users/{int: uid}

section_id: update-user-put-user

code: PUT /v1/users/1

section_id: response-put-response

code: POST /v1/users

section_id: create-user-post-user

Pat Doe

password: my-password

code:
$ curl -k -X POST -u '[username]:[password]' \
       -H 'Content-Type: application/json' \
       -d '{ "email": "newuser@example.com", \
           "password": "my-password", \
           "name": "Pat Doe", \
           "email_alerts": true, \
           "bdbs_email_alerts": ["1","2"], \
           "role_uids": [ 3, 4 ], \
           "auth_method": "regular" }' \
       'https://[host][:port]/v1/users'

section_id: examples

code:
import requests
import json

url = "https://[host][:port]/v1/users"
auth = ("[username]", "[password]")

payload = json.dumps({
  "email": "newuser@example.com",
  "password": "my-password",
  "name": "Pat Doe",
  "email_alerts": True,
  "bdbs_email_alerts": [
    "1",
    "2"
  ],
  "role_uids": [
    3,
    4
  ],
  "auth_method": "regular"
})

headers = {
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, auth=auth, headers=headers, data=payload, verify=False)

print(response.text)

code: DELETE /v1/users/{int: uid}

section_id: delete-user-delete-user

code: DELETE /v1/users/1

section_id: request-delete-request


title: User password requests

summary: User password requests

title: Overview

text:
| Method                     | Path                 | Description                 |
|----------------------------|----------------------|-----------------------------|
| [PUT](#update-password)    | `/v1/users/password` | Replace passwords |
| [POST](#add-password)      | `/v1/users/password` | Add a new password          |
| [DELETE](#delete-password) | `/v1/users/password` | Delete a password           |

title: Update password {#update-password}

text:
PUT /v1/users/password

Replaces the password list of the specified user with a single new password. If a `username` is not provided in the JSON request body, it replaces the password list of the authenticated user making this request instead.

title: Request {#put-request}

text:
#### Example HTTP request

    PUT /v1/users/password

#### Example JSON body

  [code example]

#### Request headers
| Key    | Value            | Description         |
|--------|------------------|---------------------|
| Host   | cnm.cluster.fqdn | Domain name         |
| Accept | application/json | Accepted media type |

#### Request body

The request must contain a JSON object with the following fields:

| Field | Type | Description |
|-------|------|-------------|
| username     | string | (Optional) The username of the affected user. If missing, defaults to the authenticated user. |
| new_password | string | The new password (required) |

title: Response {#put-response}

text: Returns a status code to indicate password update success or failure.

title: Error codes {#put-error-codes}

text:
When errors are reported, the server may return a JSON object with
`error_code` and `message` fields that provide additional information.
The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| password_not_complex | The given password is not complex enough (Only work when the password_complexity feature is enabled). |
| new_password_same_as_current | The given new password is identical to one of the already existing passwords. |
| user_not_exist | User does not exist. |
| unauthorized_action | Updating another user's password is acceptable by an admin user only. |

title: Status codes {#put-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | Success, password changed. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Bad or missing parameters. |
| [401 Unauthorized](https://www.rfc-editor.org/rfc/rfc9110.html#name-401-unauthorized) | The user is unauthorized. |
| [403 Forbidden](https://www.rfc-editor.org/rfc/rfc9110.html#name-403-forbidden) | Insufficient privileges. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | User not found. |

title: Add password {#add-password}

text:
POST /v1/users/password

Adds a new password to the specified user's password list. If a `username` is not provided in the JSON request body, it adds the password to the password list of the authenticated user making this request instead.

title: Request {#post-request}

text:
#### Example HTTP request

    POST /v1/users/password

#### Example JSON body

  [code example]

#### Request headers
| Key    | Value            | Description         |
|--------|------------------|---------------------|
| Host   | cnm.cluster.fqdn | Domain name         |
| Accept | application/json | Accepted media type |

#### Request body

The request must contain a JSON object with the following fields:

| Field | Type | Description |
|-------|------|-------------|
| username     | string | (Optional) The username of the affected user. If missing, defaults to the authenticated user. |
| new_password | string | New password to add (required) |

title: Response {#post-response}

text: Returns a status code to indicate password creation success or failure. If an error occurs, the response body may include a more specific error code and message.

title: Error codes {#post-error-codes}

title: Status codes {#post-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | Success, new password was added to the list of valid passwords. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Bad or missing parameters. |
| [401 Unauthorized](https://www.rfc-editor.org/rfc/rfc9110.html#name-401-unauthorized) | The user is unauthorized. |
| [403 Forbidden](https://www.rfc-editor.org/rfc/rfc9110.html#name-403-forbidden) | Insufficient privileges. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | User not found. |

title: Delete password {#delete-password}

text:
DELETE /v1/users/password

Deletes a password from the specified user's password list. If a `username` is not provided in the JSON request body, it deletes the password from the password list of the authenticated user making this request instead.

title: Request {#delete-request}

text:
#### Example HTTP request

    DELETE /v1/users/password

#### Example JSON body

  [code example]

#### Request headers
| Key    | Value            | Description         |
|--------|------------------|---------------------|
| Host   | cnm.cluster.fqdn | Domain name         |
| Accept | application/json | Accepted media type |

#### Request body

The request must contain a JSON object with the following fields:

| Field | Type | Description |
|-------|------|-------------|
| username | string | (Optional) The username of the affected user. If missing, defaults to the authenticated user. |
| old_password | string | Existing password to be deleted (required) |

title: Response {#delete-response}

title: Error codes {#delete-error-codes}

text:
When errors are reported, the server may return a JSON object with
`error_code` and `message` fields that provide additional information.
The following are possible `error_code` values:

| Code | Description |
|------|-------------|
| cannot_delete_last_password | Cannot delete the last password of a user. |
| user_not_exist | User does not exist. |
| unauthorized_action | Updating another user's password is acceptable by an admin user only. |

title: Status codes {#delete-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](https://www.rfc-editor.org/rfc/rfc9110.html#name-200-ok) | Success, new password was deleted from the list of valid passwords. |
| [400 Bad Request](https://www.rfc-editor.org/rfc/rfc9110.html#name-400-bad-request) | Bad or missing parameters. |
| [401 Unauthorized](https://www.rfc-editor.org/rfc/rfc9110.html#name-401-unauthorized) | The user is unauthorized. |
| [403 Forbidden](https://www.rfc-editor.org/rfc/rfc9110.html#name-403-forbidden) | Insufficient privileges. |
| [404 Not Found](https://www.rfc-editor.org/rfc/rfc9110.html#name-404-not-found) | User not found. |

username: The username of the affected user. If missing, default to the authenticated user.

new_password: the new (single) password

section_id: request-put-request

new_password: a password to add

old_password: an existing password to delete


title: Refresh JWT requests

summary: Refresh JW token requests

title: Overview

text:
| Method | Path | Description |
|--------|------|-------------|
| [POST](#post-refresh_jwt) | `/v1/users/refresh_jwt` | Get a new authentication token |

title: Get a new authentication token {#post-refresh_jwt}

text:
POST /v1/users/refresh_jwt

Generate a new JSON Web Token (JWT) for authentication.

Takes a valid token and returns the new token generated by the request.

title: Request {#post-request}

text:
#### Example HTTP request

	POST /v1/users/refresh_jwt

#### Request headers

| Key | Value | Description |
|-----|-------|-------------|
| Host | cnm.cluster.fqdn | Domain name |
| Authorization | JWT eyJ5bGciOiKIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJpYXViOjE0NjU0NzU0ODYsInVpZFI1IjEiLCJ

leHAiOjE0NjU0Nz30OTZ9.2xYXumd1rDoE0e

dFzcLElMOHsshaqQk2HUNgdsUKxMU | Valid JSON Web Token (JWT) |

#### Request body

| Field | Type | Description |
|-------|------|-------------|
| ttl | integer | Time to live - The amount of time in seconds the token will be valid (optional) |

title: Response {#post-response}

text:
Returns a JSON object that contains the generated access token.

#### Example JSON body

[code example]

title: Status codes {#post-status-codes}

text:
| Code | Description |
|------|-------------|
| [200 OK](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1) | A new token is given. |
| [401 Unauthorized](http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2) | The token is invalid or password has expired. |

section_id: response-post-response


title: Supported platforms

summary: Redis Software is supported on several operating systems, cloud environments, and virtual environments.

page_type: index


title: Terminology in Redis Software

summary: Explains terms used in Redis Software and its docs.

title: Overview

text: Here are explanations of some of the terms used in Redis Software.

title: Node

text:
A _node_ is a physical machine, virtual machine, container or cloud
instance on which the RS installation package was installed and the
[setup process]() was run in order to make the machine part of the cluster.

Each node is a container for running multiple Redis
instances, referred to as "shards".

The recommended configuration for a production cluster is an uneven
number of nodes, with a minimum of three. Note that in some
configurations, certain functionalities might be blocked. For example,
if a cluster has only one node you cannot enable database replication,
which helps to achieve high availability.

A node is made up of several components, as detailed below, and works
together with the other cluster nodes. You can [add nodes](), [remove nodes](), or [replace nodes]() as needed.

title: Redis instance (shard)

text:
As indicated above, each node serves as a container for hosting multiple
database instances, referred to as "shards".

Redis Software supports various database configurations:

- **Standard Redis database** - A single Redis shard with no
    replication or clustering.
- [**Highly available Redis database**]() - Every database master shard
    has a replica shard, so that if the master shard fails the
    cluster can automatically fail over to the replica with minimal impact. Master and replica shards are always placed on separate
    nodes to ensure high availability.
- [**Clustered Redis database**]() - The data stored in the database is
    split across several shards. The number of shards can be defined by
    the user. Various performance optimization algorithms define where
    shards are placed within the cluster. During the lifetime of the
    cluster, these algorithms might [migrate a shard]() between nodes.
- **Clustered and highly available Redis database** - Each master shard
    in the clustered database has a replica shard, enabling failover if
    the master shard fails.

You can configure [shard placement]() to optimize performance and availability.

title: Proxy

text:
Each node includes one zero-latency, multi-threaded proxy
(written in low-level C) that masks the underlying system complexity. The
proxy oversees forwarding Redis operations to the database shards on
behalf of a Redis client.

The proxy simplifies the cluster operation, from the application or
Redis client point of view, by enabling the use of a standard Redis
client. The zero-latency proxy is built over a cut-through architecture
and employs various optimization methods. For example, to help ensure
high-throughput and low-latency performance, the proxy might use
instruction pipelining even if not instructed to do so by the client.

You can configure [proxy policies]() to determine which nodes' proxies are active and bound to databases.

title: Database endpoint

text:
Each database is served by a [database endpoint]() that is part of and
managed by the proxies. The endpoint oversees forwarding Redis
operations to specific database shards.

If the master shard fails and the replica shard is promoted to master, the
master endpoint is updated to point to the new master shard.

If the master endpoint fails, the replica endpoint is promoted to be the
new master endpoint and is updated to point to the master shard.

Similarly, if both the master shard and the master endpoint fail, then
both the replica shard and the replica endpoint are promoted to be the new
master shard and master endpoint.

Shards and their endpoints do not
have to reside within the same node in the cluster.

In the case of a clustered database with multiple database shards, only
one master endpoint acts as the master endpoint for all master shards,
forwarding Redis operations to all shards as needed.

For high availability, you can configure [private and public endpoints]() for your databases.

title: Cluster manager

text:
The cluster manager oversees all node management-related tasks, and the
cluster manager in the master node looks after all the cluster related
tasks.

The cluster manager is designed in a way that is totally decoupled from
the Redis operation. This enables RS to react in a much faster and
accurate manner to failure events, so that, for example, a node failure
event triggers mass failover operations of all the master endpoints
and master shards that are hosted on the failed node.

In addition, this architecture guarantees that each Redis shard is only
dealing with processing Redis commands in a shared-nothing architecture,
thus maintaining the inherent high-throughput and low-latency of each
Redis process. Lastly, this architecture guarantees that any change in
the cluster manager itself does not affect the Redis operation.

Some of the primary functionalities of the cluster manager include:

- Deciding where shards are created
- Deciding when shards are migrated and to where
- Monitoring database size
- Monitoring databases and endpoints across all nodes
- Running the database resharding process
- Running the database provisioning and de-provisioning processes
- Gathering [operational statistics]()
- Enforcing [license and subscription limitations]()

You can manage your Redis Software clusters using the [Cluster Manager UI](), [command-line tools](), or the [REST API]().


title: Supported upgrade paths for Redis Software

summary: Supported paths to upgrade a Redis Software cluster.

title: Content

text:
For detailed upgrade instructions, see [Upgrade a Redis Software cluster]().

See the [Redis Software product lifecycle]() for more information about release numbers and the end-of-life schedule.

Redis Enterprise for Kubernetes has its own support lifecycle, which accounts for the Kubernetes distribution lifecycle. For details, see [Supported Kubernetes distributions]().


title: Release notes

summary: Redis Software 8! The most performant, most secure, and richest version so far. Built for performance, scale, and reliability to power modern ML and AI applications.

title: Redis Software release notes 8.0.x

summary: Diagnostic logging service. Call home client to send daily usage statistics to Redis. Usage reports in support packages. Revamp database API. Migration status API. Two-dimensional rack awareness. New version for actions API. Additional REST API enhancements.

title: Redis Software release notes 7.22.x

summary: Redis Community Edition 7.4 features. Hash field expiration. Client-side caching support. Metrics stream engine preview. New APIs to check database availability, rebalance shards, fail over shards, and control database traffic. Cluster Manager UI enhancements for node actions, database tags, and database configuration. User manager role. Log rotation based on both size and time. Module management enhancements. Configurable minimum password length. Configurable license expiration alert threshold.

title: Redis Software release notes 7.8.x

summary: New Cluster Manager UI enhancements, including Active-Active database management. Full TLS 1.3 support. Automatic recovery configuration. Full IPv6 support, including for internal traffic. Maintenance mode enhancements. Module management enhancements. RHEL 9 support.

title: Redis Enterprise Software release notes 7.4.x

summary: Redis 7.0 and 7.2 features. Auto Tiering (enhanced successor to Redis on Flash). RESP3 support. Sharded pub/sub. Preview of the new Cluster Manager UI. Redis Stack 7.2 features. Three Redis database versions. License file structure updates. Redis ACL selectors and enhanced key-based permissions. New INFO fields. Log rotation enhancements. Multi-OS upgrade support for clusters with modules.

title: Redis Enterprise Software release notes 7.2.4

summary: Pub/sub ACLs & default permissions. Validate client certificates by subject attributes. Ubuntu 20.04 support.

title: Redis Enterprise Software release notes 6.4.2

summary: Database auditing. Private key encryption. Active-Active database support for MEMORY USAGE command.

title: Redis Enterprise Software release notes 6.2.18

summary: OCSP Support. Password & session configuration changes. RHEL 8.6 support.

title: Redis Enterprise Software release notes 6.2.12 (August 2022)

summary: Python 3 support. RHEL 8.5 support.

title: Redis Enterprise Software Release Notes 6.2.10 (February 2022)

summary: RHEL 8 support. Set backup start time.

title: Redis Enterprise Software Release Notes 6.2.8 (October 2021)

summary: Internode encryption. Nginx replaced by envoy. New upgrade policies/behavior.

title: Redis Enterprise Software Release Notes 6.2.4 (August 2021)

summary: Role-based LDAP integration. Enhanced client mutual authentication. Active-Active improvements for eviction policies, migration, and the BITFIELD data type.

title: Redis Enterprise Software Release Notes 6.0.20 (April 2021)

summary: Distribute synchronization across nodes for Active-Active and Active-Passive databases. Disable internal services to free memory. User accounts support password rotation. Module depdencies automatically installed. Syncer process recovery.

title: Redis Enterprise Software Release Notes 6.0.12 (January 2021)

summary: RediSearch 2.0 support. Improved rladmin support for module upgrades.

title: Redis Enterprise Software Release Notes 6.0.8 (September 2020)

summary: ACL and RBAC improvements for database access. Active-Active databases support Redis Streams.

title: Redis Enterprise Software Release Notes 6.0 (May 2020)

summary: Release notes for Redis Enterprise Software 5.6.0 (April 2020) and earlier versions.

title: Previous releases

title: Content

text: Here's what changed recently in Redis Software:


title: Previous releases

summary: Install improvements for RHEL 6 and 7. Active-Active support for HyperLogLog. Auto Tiering now supports RedisJSON. Active-Active default changes for high availability and OSS Cluster API support. Backup support for Google Cloud Storage and Azure Blob storage.

title: Redis Enterprise Software Release Notes 5.6.0 (April 2020)

summary: Preview release. Databases support multiple modules.

title: Redis Enterprise Software Release Notes 5.5 Preview (April 2019)

title: Redis Enterprise Software Release Notes 5.4.14 (February 2020)

title: Redis Enterprise Software Release Notes 5.4.10 (December 2019)

title: Redis Enterprise Software Release Notes 5.4.6 (July 2019)

title: Redis Enterprise Software Release Notes 5.4.4 (June 2019)

title: Redis Enterprise Software Release Notes 5.4.2 (April 2019)

title: Redis Enterprise Software Release Notes 5.4 (December 2018)

title: Redis Enterprise Software 5.2.2 (August 2018)

title: Redis Enterprise Software Release Notes 5.3 BETA (July 2018)

title: Redis Enterprise Software Release Notes 5.2 (June 2018)

title: Redis Enterprise Software 5.0.2 (2018 March)

title: Redis Enterprise Pack 5.0 Release Notes (November 2017)

title: Redis Enterprise Pack 4.5 Release Notes (May 2017)

title: RLEC 4.4 Release Notes (December 2016)

title: RLEC 4.3.0-230 Release Notes (August 2, 2016)

title: RLEC 4.2.1-30 Release Notes (October 18, 2015)

title: RLEC 4.0.0-49 Release Notes (June 18, 2015)

title: RLEC 0.99.5-24 Release Notes (February 15, 2015)

title: RLEC 0.99.5-11 Release Notes (January 5, 2015)


title: Overview

text:
Redis Enterprise Software 5.0 is now available. Key features include
Geo-Distributed Active-Active Conflict-free Replicated Databases (CRDB),
LDAP integration, Redis Module integration, and support for the Redis
Cluster API.

title: Overview

text:
If you are upgrading from a previous version, make sure to review the
upgrade instructions before beginning the upgrade process.

You can upgrade to RS 5.0 from RS 4.4.2 and above. If you have a version
older than this, you must first upgrade to at least 4.4.2.

title: New features

title: Support for Redis Cluster API

role: compatibility

text:
The Redis Cluster API support in Redis Enterprise Software (RS) provides
a simple mechanism for Cluster enabled Redis clients to learn and know
the cluster topology. This enables clients to connect directly to an RS
proxy on the node hosting the master shard for the data being operated
on. The result is that for all but the initial call to get the cluster
topology or reacquire the location of the master shard, the client will
connect to the RS endpoint proxy where the master shard is located.
[Learn more about the Cluster API
implementation]().

title: Geo-distributed Active-Active conflict-free replicated databases (CRDB) {#geodistributed-activeactive-conflictfree-replicated-databases-crdb}

text:
Developing globally distributed applications can be challenging, as
developers have to think about race conditions and complex combinations
of events under geo-failovers and cross-region write conflicts. CRDBs
simplify developing such applications by directly using built-in smarts
for handling conflicting writes based on the data type in use. Instead
of depending on just simplistic "last-writer-wins" type conflict
resolution, geo-distributed CRDBs combines techniques defined in CRDT
(conflict-free replicated data types) research with Redis types to
provide smart and automatic conflict resolution based on the data type's
intent.

For more information, go here. For information, go to [Developing with
CRDBs](develop/develop-for-aa/).

title: Redis modules

text:
Redis Modules enable you to extend the functionality of Redis Enterprise
Pack. One can add new data types, capabilities, etc. to tailor the
cluster to a specific use case or need. Once installed, modules benefit
from the high performance, scalability, and high availability that Redis
Enterprise is known for.

#### Redis modules

Redis has developed and certified the following modules for use with
Redis Enterprise Pack:

- [RediSearch]()
    - This module turns RS into a supercharged distributed in-memory
      full-text indexing and search beast.
- [ReJSON]()
    - Now you have the convenience JSON as a built-in data type and
      easily able to address nested data via a path.
- [RedisBloom]()
    - Enables RS to have a scalable bloom filter as a data type. Bloom
      filters are probabilistic data structures that
      quickly determine if values are in a set.

#### Custom modules

In addition, Redis Enterprise Pack provides the ability to load and use
custom [Redis modules](https://redislabs.com/community/redis-modules-hub/) or of
your own creation.

title: Support for Docker

text:
Deploying and running your Redis Enterprise Software cluster on Docker
containers is supported in development systems and
available to pull from Docker hub. With the official image, you can
easily and quickly test several containers to build the scalable
and highly available cluster Redis Enterprise Software is famous for.

For more information, go to [quick start with Redis Enterprise on
Docker]().

title: LDAP Integration

text:
As part of our continued emphasis on security, administrative user
accounts in Redis Enterprise Pack can now use either built-in
authentication or authenticate externally via LDAP with saslauthd. The
accounts can be used for administering resources on the cluster via
command line, Rest API, or admin console.

For more information see [LDAP
Integration]().

title: Additional capabilities

text:
Support for additional Redis commands and features:

- Support for Redis version 4.0.2
- Support added for RHEL/CentOS 6.9 and 7.4

title: Information

text:
- In the node bootstrap API, the structure of the JSON has changed for
    adding an external IP during the bootstrap process.
- End-of-Life for RHEL/CentOS 6.5 and 6.6 have been reached, so those
    versions are no longer supported.
- Modules are not supported in Redis Enterprise Pack 5.0 for
    RHEL/CentOS 6.x

title: Important fixes

title: 5.0.0-31 {#5-0-031}

text:
- RP9299 - Issue with reliability of metric ingress
- RP9680 - Redis Enterprise Pack starting before /etc/rc.local script
    executed
- RP12363 - In some cases, flash drives do not mount following a
    stop/start of the node
- RP12493 - Allow change to debug package creation location
- RP13079 - DNS doesn't change after having removed the external IP
    address in some cases
- RP13933 - rladmin balance sometimes shows incorrect information
- RP14060 - pubsub stats aren't reflected correctly by the stats
    archiver
- RP14939 - Add license checks to all needed entry points in the
    cluster
- RP15090 - Problem in log rotate script causes other logs to not
    rotate
- RP15104 - rlutil check fix doesn't work sometimes
- RP15130 - Fixed permission on two logs with incorrect ownership
- RP15160 - Allow option to change ports for API and CM in NGINX
- RP15164 - Allow unix socket folder to be configurable at build time
- RP15499 - rladmin command not responding on a cluster with large
    number of shards
- RP15853 - When trying to add a new db the 'activate' button was
    changed to 'update' and was grayed out.
- RP15861 - Allow unix socket folder to be configurable at install
    time
- RP16115 - TTL bug with Replica Of and import
- RP16447 - DMC client connection reports incorrect number of
    connections to monitoring applications.
- RP16481 - In some cases, resource_mgr uses incorrect directories
    to compute persistent and ephemeral storage


title: Overview

text:
If you are upgrading from a previous version, make sure to review the
upgrade instructions before beginning the upgrade process.

You can upgrade to this version from any 4.4 version. If you have a
version older than 4.4 you must first upgrade to 4.4 or higher, and only
then upgrade to this version.

title: New features

title: The new discovery service with supportfor Redis Sentinel API

text:
The Discovery Service provides an IP-based connection management service
used when connecting to Redis Enterprise Pack databases. When used in
conjunction with Redis Enterprise Pack's other high availability
features, the Discovery Service assists an application cope with
topology changes such as adding, removing of nodes, node failovers and
so on. It does this by providing your application with the ability to
easily discover which node hosts the database endpoint. The API used for
discovery service is compliant with the Redis Sentinel API.

Discovery Service is an alternative for applications that do not want to
depend on DNS name resolution for their connectivity. Discovery Service
and DNS based connectivity are not mutually exclusive. They can be used
side by side in a given cluster where some clients can use Discovery
Service based connection while others can use DNS name resolution when
connecting to databases.

title: Building large databases with RAM and Flash memory in Auto Tiering v2.0

text:
With Redis Enterprise Pack 4.5, Auto Tiering v2 is production
ready. RFv2 brings performance, reliability, and stability enhancements
as well as many features customers have been waiting for.

Auto Tiering offers users of Redis Enterprise Pack and
Redis Cloud Private the unique ability to operate a Redis
database that spans both RAM and flash memory (SSD), but remains
separate from Redis Enterprise Pack's persistence mechanisms. Whilst
keys are always stored in RAM, RoF intelligently manages the location of
their values (RAM vs Flash) in the database via a LRU-based
(least-recently-used) mechanism. Hot values will be in RAM and
infrequently used, while warm values will be ejected to flash memory.
This enables you to have much larger datasets with RAM-like latency and
performance, but at dramatically lower cost than an all-RAM database.

title: Additional capabilities

text:
Support for additional Redis commands and features:

- The Redis TOUCH command is now supported
- Redis version upgraded to 3.2.8
- Support for OBJECT in Lua scripts

Support has been added RHEL 7.3 with this version.

title: Important fixes

text:
- RP10106 - SSL Certificate should not need to be signed with a
    stronger hashing algorithm to be accepted
- RP10465 - failover times can be higher under certain scenarios in
    local watchdog profile
- RP10633 - Improve install.sh and answers file
- RP11880 - Improved replica sync and add node robustness
- RP8689 - Minimized impact when changing RAM-Flash limit on Redis
    Enterprise Flash
- RP12063 - Improved Redis Flash data import/population performance
- RP11608 - Improvements to databases.txt creation in support package
- RP11941 - Eliminated warning and errors during upgrade on RHEL6
    with leash and python2.6 is installed
- RP11994 - Databases under certain cases may not display in UI even
    though they are in the cluster metadata and safely operating.
- RP12438 - Email alerts with Amazon SES may fail under certain
    conditions.
- RP12538 - Redis failover was initiated by node_wd during sync to
    new replica
- RP10264 - Improved debuginfo package for better supportability

Important fixes in RP 4.5.0-22

- RP12667 - NGINX security improvements, improved TLS and SSL related
    warnings on security scans.
- RP12690 - Added simpler ability to recover cluster from AWS S3
- RP13359 - Advanced memory allocation and booking enhancements

Important fixes in RP 4.5.0-31

- RP13060 - Client may experience reconnect issues after failover of
    the endpoint.
- RP13711 - Disabling IPv6 may cause startup of node services to fail
    (NGINX) on RHEL 7
- RP12747 - Calculation can be incorrect for memory quota for
    databases

Important fixes in RP 4.5.0-35

- RP12844 - cnm_exec crashes on "not enough arguments for format
    string"

Important fixes in RP 4.5.0-43

- RP9846 - In UI, Used Memory may show incorrect values
- RP12211 - UI fails import from a Redis OSS DB with password
- RP13356 - Enable failover when license expires
- RP14692 - rladmin status command may crash during backup
- RP14541 - In rare cases, DMC log grew quickly and caused stability
    issues
- RP15107 - When using Auto Tiering, it may cause DMC proxy
    crashes

Important fixes in RP 4.5.0-47

- Multiple important Auto Tiering updates.

Important fixes in RP 4.5.0-51

- 15161 - Make Unix socket folder configurable at install time
- 15164 - Make Unix socket folder configurable at build time
- 16082 - Make Unix socket folder configurable at runtime
- Fixed an issue where on import of data, TTL information was set
    incorrectly


title: Overview

text:
Redis Enterprise Software 5.0.2 is now available. Key features include
functional and performance updates for CRDB, changes to module
deployment, and general fixes.

title: Overview

text:
If you are upgrading from a previous version, make sure to review the
upgrade instructions before beginning the upgrade process.

You can upgrade to RS 5.0.2 from RS 4.4.2 and above. If you have a
version older than 4.4.2, you must first upgrade to at least 5.0.

Starting from RS 5.0.2, ports 3338 and 3339 should also be opened
on each node for the purpose of internal cluster communication.
For more information, check the ['network port
configurations']()
page

title: New features

title: CRDBs

text:
- The ability to add and remove participating clusters from a CRDB
- Communications between participating clusters can be encrypted using
    SSL/TLS
- Imports can be done to an existing database without flushing the
    existing data beforehand.

title: Modules

text:
- Redis Enterprise Modules are installed with Redis Enterprise
    Software by default
- RedisBloom and RediSearch Enterprise have been updated to newer
    versions

title: Other

text:
- Discovery Service supports encryption using SSL/TLS
- Starting from version 5.0.2 build #30, Redis Enterprise Software is
    supported on RHEL 7.5

title: Important fixes

text:
- RS16153 -- Supervisord version update
- RS16667 - Fixed issue with 'rladmin status' timeout
- RS17746 - Fixed upgrade issue when -s option used
- RS17997, RS18088 - Upgrade issues when using non-default socket
    file path
- RS8584 -- Endpoint migration provided misleading plan message
- RS17696 - Fixed issues with Multi-proxy and intermittent network
    issues
- RS17362 - Upgrade fails under some circumstances
- RS18351 - Listener active after node has been declared dead
- RS18874 - Fixed OOM issue due to redis_mgr high memory consumption
- RS19002 - Fixed wrong message when an upgrade of a quorum node with
    all-nodes policy takes place

**Important Fixes in Build #30:**

- RS19701 - Fixed high CPU usage on large scale clusters
- RS19869- Added support for Redis
    version 4.0.9
- RS20153- Fixed Redis important security issues related to the Lua
    scripting engine
- RS19852- Fixed proxy crash which might happen for SSL-enabled
    DBs

title: Known limitations

text:
- Since Redis Enterprise CRDBs have counters, unlike traditional Redis
    databases, they must be handled differently when importing. There is
    a special type of import because of importing counter data types.
    When performing the import through the admin console, you will be prompted
    to confirm you want to add the data to the CRDB or stop and go flush
    the database.
- This version of RS comes with a pre-bundled python which might
    over-ride your default installed python version, this can be solved
    by changing your PATH environment variable.
- Uploading a Redis Module through the admin console, can be performed only
    when the admin console is connected to the master node.
- Write operations are not allowed for database which was created with
    password of exactly 50-characters.


title: New features

text: Initial release, everything is new!

title: Changes

text: Initial release, no changes!

title: Fixed issues

text: None.

title: Known issues

text:
- **Issue:** When taking a node offline or removing a node, if the
    node being taken offline or removed is currently serving as the web
    server for the web browser being used to view the management UI, the
    management UI appears down while the node is down.
    **Workaround:** If you are using the cluster name in order to
    connect to the management UI in the browser, and the cluster name is
    registered in your external DNS or you are using the mDNS option,
    then the DNS entries will be updated to point to another node in the
    cluster after a few seconds and the UI will open properly. If you
    are not using the cluster name but rather the node IP in order to
    connect to the management UI in the web browser, you have to use the
    IP of another node in the cluster to access the management UI.


title: Overview

text:
If you are upgrading from a previous version, make sure to review the
[upgrade
instructions]()
before running through the upgrade process.

If you are upgrading from version 0.99.5-11:

1. You must restart the services after the upgrade by running the
    following command with user root (sudo su). From the operating
    system's CLI, run the following command:
    cnm_ctl restart
1. After the upgrade, rladmin status command will report that the
    databases are from an old version. It is recommended that you
    upgrade the databases as soon as possible, as described in the
    [upgrade
    instructions]().

title: New features

text: None.

title: Changes

text:
- Enhancements to memtier_benchmark tool that is included in the
    installation package. You can find more details in the [GitHub
    project.](https://github.com/RedisLabs/memtier_benchmark)

title: Fixed issues

text:
- Improvements and fixes related to node failover, remove node and
    take node offline functionality.

title: Known issues


title: Overview

text:
If you are upgrading from a previous version, make sure to review the
[upgrade
instructions]()
before running through the upgrade process.

In addition, when running the install.sh script to upgrade the software,
you might be prompted to approve changes to a configuration file named
ccs-redis.conf. It is crucial that you choose Yes when asked whether to
update this file.

title: New features

text:
- Support for Red Hat Enterprise Linux (RHEL) and CentOS 6.5 and 7
    operating systems.
- Support for additional AWS AMIs for Ubuntu and Amazon Linux, on
    multiple AWS regions.
- Support for additional browsers and operating systems for the
    management UI.
- Replica Of feature which enables creating a Redis database that
    keeps synchronizing data from another Redis database.
- Rack-zone awareness feature which enables mapping nodes to
    racks/zones to ensure a more sophisticated high-availability
    mechanism.
- Database-related alerts and email alerts.
- Auto-configuration of synchronization of cluster server clocks with
    NTP as part of installation script.
- Database Export functionality.
- Email alerts on database Export and Import.

title: Changes

text:
- Database Backup Now functionality replaced with Export
    functionality.
- Database performance improvements to increase throughput and reduce
    latency.
- Improvement to AOF rewrite mechanism to deal with extreme-write
    scenarios and limited disk space configurations.
- Enhancements to rladmin CLI to support additional commands.

title: Fixed issues

text:
- Cluster stability improvements related to removing nodes and taking
    nodes offline.
- rladmin CLI bug fixes.

title: Known issues

text:
- **Issue**: RLEC-6819 - Uninstall on Red Hat Enterprise Linux does
    not stop all services and if you try to install the software again
    on the same machine the new installation might use prior
    installation data.

    **Workaround**: Before installing the software
    again restart the machine or verify that all services are down.

- **Issue**: In the replica of process, if the source database is
    resharded while the replica of process is active, the
    synchronization process will fail.

    **Workaround**: You need to
    manually stop and restart the synchronization process after
    resharding of the source database is done.

- **Issue**: In the replica of process, high database traffic might cause the replica of process to restart frequently
    as result of the "replica buffer" being exceeded. In this case you see
    the status of the replica of process as "Syncing"
    frequently.

    **Workaround**: You need to manually reconfigure the
    "replica buffer" through rladmin and set the buffer size to a new
    size. In order to find the appropriate buffer size please contact
    support at: <support@redislabs.com>.

- **Issue**: In a cluster that is configured to support rack-zone
    awareness, if the user forces migration of a master or replica shard,
    through rladmin, to a node on the same rack-zone as its
    corresponding master or replica shard, and later runs the rebalance
    process, the rebalance process will not migrate the shards to ensure
    rack-zone awareness compliance.

    **Workaround**: In the scenario
    described above, you need to manually migrate the shard, through
    rladmin, to a node on a valid rack-zone in order to ensure rack-zone
    awareness compliance.

- **Issue**: In case you deploy a cluster and use the DNS option for
    the cluster name (see details in [How to set the Cluster Name
    (FQDN)](),
    do not configure the DNS entries for the cluster nodes, and try to
    configure a database that is a replica of another database within
    the cluster, then the UI allows you to configure the source database
    but the replica of process fails in runtime.

    **Workaround**: The
    configuration indicated in this issue is not a valid cluster
    configuration. If you choose to use the DNS option for the cluster
    name then you must configure DNS entries for the nodes, otherwise
    the cluster does not operate correctly. You have to either update
    the DNS accordingly, or recreate the cluster and use the mDNS option
    for the cluster name as described in [How to set the Cluster Name
    (FQDN)]().

- **Issue**: When taking a node offline or removing a node, if the
    node being taken offline or removed is currently serving as the web
    server for the web browser being used to view the management UI,
    then the management UI appears down while the node is
    down.

    **Workaround**: If you are using the cluster name in order to
    connect to the management UI in the browser, and the cluster name is
    registered in your external DNS or you are using the mDNS option,
    then the DNS entries will be updated to point to another node in the
    cluster after a few seconds and the UI will open properly. If you
    are not using the cluster name but rather the node IP in order to
    connect to the management UI in the web browser, you have to use the
    IP of another node in the cluster to access the management UI.