Revised multi-database client documentation · redis/redis-py@78df745 (original) (raw)

1

1

`Multi-database client (Active-Active)

`

2

2

`=====================================

`

3

3

``

4

``

`-

The multi-database client lets you connect your application to multiple logical Redis databases at once

`

5

``

`-

and operate them as a single, resilient endpoint. It continuously monitors health, detects failures,

`

6

``

`-

and fails over to the next healthy database using a configurable strategy. When the previous primary

`

7

``

`-

becomes healthy again, the client can automatically fall back to it.

`

``

4

`+

The multi-database client allows your application to connect to multiple Redis databases, which are typically replicas of each other.

`

``

5

`+

It is designed to work with Redis Software and Redis Cloud Active-Active setups.

`

``

6

`+

The client continuously monitors database health, detects failures, and automatically fails over to the next healthy database using a configurable strategy.

`

``

7

`+

When the original database becomes healthy again, the client can automatically switch back to it.

`

8

8

``

9

9

`Key concepts

`

10

10

`------------

`

`@@ -19,7 +19,7 @@ Key concepts

`

19

19

``

20

20

`- Health checks:

`

21

21

` A set of checks determines whether a database is healthy in proactive manner.

`

22

``

`-

By default, an "ECHO" check runs against the database (all cluster nodes must

`

``

22

`+

By default, an "PING" check runs against the database (all cluster nodes must

`

23

23

` pass for a cluster). You can add custom checks. A Redis Enterprise specific

`

24

24

` "lag-aware" health check is also available.

`

25

25

``

`@@ -29,19 +29,18 @@ Key concepts

`

29

29

` fine-grain tuned configuration of triggering fail over based on organic traffic.

`

30

30

``

31

31

`- Failover strategy:

`

32

``

`-

The default strategy is weight-based. It prefers the highest-weight healthy database.

`

``

32

`+

The default strategy is based on staticly configured weights. It prefers the highest weighted healthy database.

`

33

33

``

34

34

`- Command retry:

`

35

35

` Command execution supports retry with backoff. Low-level client retries are disabled and a global retry

`

36

36

` setting is applied at the multi-database layer.

`

37

37

``

38

38

`- Auto fallback:

`

39

``

`-

If configured with a positive interval, the client periodically attempts to fall back to a higher-priority

`

``

39

`+

If configured with a positive interval, the client periodically attempts to fall back to a higher-weighted

`

40

40

` healthy database.

`

41

41

``

42

42

`- Events:

`

43

``

`-

The client emits events like "active database changed" and "commands failed". Pub/Sub re-subscription

`

44

``

`-

on database switch is handled automatically.

`

``

43

`+

The client emits events like "active database changed" and "commands failed". In addition it resubscribes to Pub/Sub channels automatically.

`

45

44

``

46

45

`Synchronous usage

`

47

46

`-----------------

`

`@@ -147,7 +146,7 @@ The asyncio API mirrors the synchronous one and provides async/await semantics.

`

147

146

`MultiDBClient

`

148

147

`^^^^^^^^^^^^^

`

149

148

``

150

``

`` -

The client exposes the same API as the Redis or RedisCluster client, making it fully interchangeable and ensuring a seamless upgrade for your application. Additionally, it supports runtime reconfiguration, allowing you to add features such as health checks, failure detectors, or even new databases without restarting.

``

``

149

`` +

The client exposes the same API as the Redis or RedisCluster client, making it fully interchangeable and ensuring a simple migration of your application code. Additionally, it supports runtime reconfiguration, allowing you to add features such as health checks, failure detectors, or even new databases without restarting.

``

151

150

``

152

151

`Configuration

`

153

152

`-------------

`

`@@ -274,16 +273,16 @@ define one of the health check policies to evaluate probes result.

`

274

273

`HealthCheckPolicies.HEALTHY_MAJORITY - Majority of probes should be successful.

`

275

274

`HealthCheckPolicies.HEALTHY_ANY - Any of probes should be successful.

`

276

275

``

277

``

`-

EchoHealthCheck (default)

`

``

276

`+

PingHealthCheck (default)

`

278

277

`^^^^^^^^^^^^^^^^^^^^^^^^^

`

279

278

``

280

``

`-

The default health check sends the ECHO command

`

``

279

`+

The default health check sends the PING command

`

281

280

`to the database (and to all nodes for clusters).

`

282

281

``

283

282

`Lag-Aware Healthcheck (Redis Enterprise Only)

`

284

283

`^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

`

285

284

``

286

``

`-

This is a special type of healthcheck available for Redis Software and Redis Cloud

`

``

285

`+

This is a special type of healthcheck available for Redis (Enterprise) Software

`

287

286

`that utilizes a REST API endpoint to obtain information about the synchronization

`

288

287

`lag between a given database and all other databases in an Active-Active setup.

`

289

288

``

`@@ -296,7 +295,7 @@ reverse proxy behind an actual REST API endpoint.

`

296

295

``

297

296

`from redis.multidb.client import MultiDBClient

`

298

297

`from redis.multidb.config import MultiDbConfig, DatabaseConfig

`

299

``

`-

from redis.multidb.healthcheck import EchoHealthCheck, LagAwareHealthCheck

`

``

298

`+

from redis.multidb.healthcheck import PingHealthCheck, LagAwareHealthCheck

`

300

299

`from redis.retry import Retry

`

301

300

`from redis.backoff import ExponentialWithJitterBackoff

`

302

301

``

`@@ -313,7 +312,7 @@ reverse proxy behind an actual REST API endpoint.

`

313

312

`health_check_url="https://cluster.example.com",

`

314

313

` ),

`

315

314

` ],

`

316

``

`-

Add custom checks (in addition to default EchoHealthCheck)

`

``

315

`+

Add custom checks (in addition to default PingHealthCheck)

`

317

316

`health_checks=[

`

318

317

`# Redis Enterprise REST-based lag-aware check

`

319

318

` LagAwareHealthCheck(

`

`@@ -358,15 +357,13 @@ You can add custom health checks for specific requirements:

`

358

357

`Failure Detection (Reactive Monitoring)

`

359

358

`-----------------

`

360

359

``

361

``

`-

The failure detector monitor actual command failures and marks databases as unhealthy

`

362

``

`-

when failures count and failure rate exceed thresholds within a sliding time window

`

363

``

`-

of a few seconds. This catches issues that proactive health checks might miss during

`

364

``

`-

real traffic. You can extend the list of failure detectors by providing your own

`

365

``

`` -

implementation, configuration defined in the MultiDBConfig class.

``

``

360

`+

The failure detector monitors command failures and marks a database as unhealthy when its failure rate exceeds a defined threshold within a sliding time window.

`

``

361

`+

Under real traffic conditions, this reactive detection mechanism likely triggers earlier than proactive health checks.

`

``

362

`` +

You can extend the set of failure detectors by implementing your own and configuring it through the MultiDBConfig class.

``

366

363

``

367

``

`-

By default failure detector is configured for 1000 failures and 10% failure rate

`

368

``

`-

threshold within a 2 seconds sliding window, this could be adjusted regarding

`

369

``

`-

your application specifics and traffic.

`

``

364

`+

By default the failure detector is configured for 1000 failures and a 10% failure rate

`

``

365

`+

threshold within a 2 seconds sliding window. This could be adjusted regarding

`

``

366

`+

your application specifics and traffic pattern.

`

370

367

``

371

368

`.. code-block:: python

`

372

369

``

`@@ -388,13 +385,13 @@ your application specifics and traffic.

`

388

385

` CustomFailureDetector()

`

389

386

` )

`

390

387

``

391

``

`-

Failover and auto fallback

`

``

388

`+

Failover and automatic fallback

`

392

389

`--------------------------

`

393

390

``

394

``

`-

Weight-based failover chooses the highest-weight database whose circuit is CLOSED. If no database is

`

395

``

`` -

healthy it returns TemporaryUnavailableException. This exception indicates that application can

``

396

``

`` -

still send requests for some time (depends on configuration (failover_attempts * failover_delay)

``

397

``

`` -

120 seconds by default) until NoValidDatabaseException will be thrown.

``

``

391

`+

Weight-based failover chooses the highest-weighted database with a CLOSED circuit. If no database is

`

``

392

`` +

healthy it returns TemporaryUnavailableException. This exception indicates that the application should

``

``

393

`` +

retry sending requests for a configurable period of time (the configuration (failover_attempts * failover_delay)

``

``

394

`` +

defaults to 120 seconds). If none of the databases became available, then a NoValidDatabaseException is thrown.

``

398

395

``

399

396

`` To enable periodic fallback to a higher-priority healthy database, set auto_fallback_interval (seconds):

``

400

397

``

`@@ -518,4 +515,4 @@ Troubleshooting

`

518

515

` are configured properly.

`

519

516

``

520

517

`- Pub/Sub not receiving messages after failover:

`

521

``

`-

Ensure you are using the client’s Pub/Sub helper. The client re-subscribes automatically on switch.

`

``

518

`+

Ensure you are using the client’s Pub/Sub helper. The client re-subscribes automatically on switch.

`