Skip to content

RDSC-5610: Multi-source documentation - #3916

Open
stoyanr wants to merge 20 commits into
redis:mainfrom
stoyanr:RDSC-5610-multi-source-docs
Open

RDSC-5610: Multi-source documentation#3916
stoyanr wants to merge 20 commits into
redis:mainfrom
stoyanr:RDSC-5610-multi-source-docs

Conversation

@stoyanr

@stoyanr stoyanr commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

See https://redislabs.atlassian.net/browse/RDSC-5610

Enhances #3841 with numerous changes and additions. I couldn't update the original PR since I don't have write permissions to this repository.

Note that it now documents 2 PRs that are not yet merged, but should be before the release:


Note

Low Risk
Documentation-only changes describing RDI configuration and operations; no application code or runtime behavior is modified in this PR.

Overview
Documents multi-source RDI pipelines: one pipeline can ingest from several source databases (mixed types) into a single Redis target, with a per-source CDC collector, credentials, and change streams. Adds Multiple sources in one pipeline covering source naming, config.yaml, secrets, jobs (server_name), add/remove sources, --source for start/stop/reset, monitoring/DLQ keys, and legacy naming after upgrade.

Secrets and deploy are rewritten around database-scoped keys (USERNAME, PASSWORD, TLS keys) and redis-di set-secret … --db <source|target>, with env vars like ${MYSQL_DB_PASSWORD}; legacy SOURCE_DB_* / TARGET_DB_* remain only for pre-multi-source single sources. K8s examples use <source>-db secrets and per-source collector metrics paths.

Product positioning updates: “when to use” and architecture pages say one or more sources; the decision tree drops the “single source only” branch. API v2 is required for multi-source; migration guide notes v1 limits. Flink jobs can match multiple sources/tables via lists and regex:.

Prepare-database guides, pipeline config examples, observability, HA testing, and FAQ are aligned with the new model.

Reviewed by Cursor Bugbot for commit 5dc2f92. Bugbot is set up for automated code reviews on this repo. Configure here.

@andy-stark-redis andy-stark-redis left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Quite a few suggestions but they are easily applied, so I'll approve to avoid delays.

Comment thread content/integrate/redis-data-integration/architecture/classic-vs-flink.md Outdated
Comment thread content/integrate/redis-data-integration/data-pipelines/prepare-dbs/_index.md Outdated
Comment thread content/integrate/redis-data-integration/data-pipelines/prepare-dbs/snowflake.md Outdated
Comment thread content/integrate/redis-data-integration/data-pipelines/prepare-dbs/snowflake.md Outdated
Comment thread content/integrate/redis-data-integration/data-pipelines/prepare-dbs/spanner.md Outdated
Comment thread content/integrate/redis-data-integration/reference/cli/_index.md Outdated
Comment thread content/integrate/redis-data-integration/reference/cli/redis-di-describe.md Outdated
Comment thread content/integrate/redis-data-integration/reference/api-migration.md Outdated
Comment thread content/integrate/redis-data-integration/faq.md Outdated
Comment thread content/integrate/redis-data-integration/quick-start-guide.md Outdated
stoyanr and others added 15 commits September 8, 2026 14:16
…vs-flink.md

Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
…e-dbs/_index.md

Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
…e-dbs/snowflake.md

Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
…e-dbs/snowflake.md

Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
…e-dbs/spanner.md

Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
…e-dbs/spanner.md

Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com>
Comment thread content/integrate/redis-data-integration/data-pipelines/prepare-dbs/mongodb.md Outdated
source:
mongodb.ssl.enabled: true
mongodb.ssl.keystore: /debezium/certs/source_db_keystore
mongodb.ssl.keystore: /debezium/certs/mongodb_db_keystore

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@stoyanr As we discussed, lets remove this property altogether in the public docs after we have it.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed

| Credentials secret | `mysql-db` |
| TLS secret | `mysql-db-ssl` |
| Environment variable prefix | `MYSQL_DB_` |
| Certificate directory | `/etc/certificates/mysql_db/` |

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@stoyanr Similarly here, I think we should remove this from the docs?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This one should stay. These certificate directories, although internal, are referred to elsewhere (if setting secrets manually). Their naming is not affected by the keystore properties, they are valid on all databases even if they don't use a keystore. I would only remove them if we decide to stop documenting the manual K8s secret setup.

@zhivko-kirishev-redis zhivko-kirishev-redis left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Everything about the automatic population of the ssl properties as well as the default Flink processor looks good

@nicoweidner nicoweidner left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I left a few comments. We can tackle them in a followup so as not to block the release, none of them are critical


```text
dlq:data:{rdi}:public.users
dlq:data:{rdi}:<source>.<schema_or_database>.<table>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this form true for SQLServer and Snowflake? IIRC from some review those two were exceptions and had a three-part fully qualified table name even without the source component


{{< note >}}The scope-prefixed keys `SOURCE_DB_*` and `TARGET_DB_*` are also accepted, and can be
used without specifying `--db`. RDI accepts a `SOURCE_DB_*` key only for a pipeline with
exactly one source created before RDI supported multiple sources. See

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think the "created before RDI supported multiple sources" part is correct, we'll accept it as long as the pipeline has a single source. But maybe we can add a note that they are considered deprecated, to discourage their use?

| Environment variable prefix | `MYSQL_DB_` |
| Certificate directory | `/etc/certificates/mysql_db/` |
| Collector deployment | `collector-mysql` |
| Change data streams | `data:{rdi}:mysql.<schema_or_database>.<table>` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is incorrect for SQLServer which uses data:{rdi}:<source>.<database>.<schema>.<table>. Same for DLQ keys. We could make it more universal by writing dlq:data:{rdi}:<source>.<qualified_table_name>, wdyt?

the reset runs and starts it again afterwards, exactly as it does for a reset of the whole
pipeline.

Data that is not partitioned by source is never deleted by a per-source reset.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't understand this sentence. Does it refer to any metadata in the RDI DB that is not per-source data?

I'd suggest clarifying which data we mean here, or potentially dropping it entirely, as the previous paragraph already lists which data is deleted.

[Accessing the metrics]({{< relref "/integrate/redis-data-integration/observability#accessing-the-metrics" >}}).

Dead-letter queue streams have Redis keys containing a
`<source>.<schema_or_database>.<table>` section.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment regarding the key format for SQLServer applies here

schemas:
- public
tables:
public.customers: {}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

A review agent found that this example has a potential target key collision, since the default key generator will use e.g. customers:id:1 if the PK is id for both sources. While I think this misses the point of the example, we could still clear any potential confusion by renaming the second table to something else like public.clients

Comment on lines +171 to +172
When a pipeline has more than one source, every job must set `server_name`, and the value
must match one of the sources in `config.yaml`. RDI rejects the pipeline when a job has no

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

An aliased source retains server_name: rdi; we should probably point out this exception here. There is also Spanner, which is an exception to the exception and used its instance id before the upgrade. Given the limited number of Spanner customers and the fact that this additional exception only becomes relevant when adding a second source to a legacy pipeline, we could consider omitting this special case from the docs

- Its data streams are still named `data:{rdi}:<schema_or_database>.<table>`, and its offset
and schema history keys are still `metadata:debezium:offsets` and
`metadata:debezium:schema_history`.
- Its `server_name` is still `rdi`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

... except if it's Spanner, then it would be the instance id.

table: customers
```

When a pipeline has more than one source, every job must set `server_name`, and the value

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
When a pipeline has more than one source, every job must set `server_name`, and the value
When a pipeline has more than one source, every job (apart from the default job) must set `server_name`, and the value

pipeline status is not broken down per source. RDI reports the whole pipeline in an error state when a
single source fails, so you should use the `Components` section to find out which one has failed.

Each source's collector has its own metric collection, named after the collector, such as

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't have collections for Spanner and Snowflake right now.
Also, the incoming entries and latency metrics described here are for the classic processor. Since the Flink processor becomes the default now, we should probably link to its metrics instead of the classic processor

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants