From c4d39e60f9d8856fd8f70e29924a56afb36e674e Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Mon, 19 Aug 2024 16:00:30 -0500 Subject: [PATCH 01/68] begin index and setup drafts --- content/operate/rc/databases/rdi/_index.md | 19 +++++++++++++ content/operate/rc/databases/rdi/setup.md | 32 ++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 content/operate/rc/databases/rdi/_index.md create mode 100644 content/operate/rc/databases/rdi/setup.md diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md new file mode 100644 index 0000000000..9094c622d0 --- /dev/null +++ b/content/operate/rc/databases/rdi/_index.md @@ -0,0 +1,19 @@ +--- +Title: Data Integration +alwaysopen: false +categories: +- docs +- operate +- rc +description: Use Redis Data Integration in Redis Cloud. +hideListLinks: true +weight: 99 +--- + +Redis Cloud now supports (Redis Data Integration (RDI)){{}}. RDI's purpose is to help Redis customers sync Redis Enterprise with live data from their disk-based databases to: + - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. + - Save resources and time when building pipelines and coding data transformations. + - Reduce the total cost of ownership by saving money on expensive database read replicas. + +Redis Cloud currently only supports the (ingest scenario){{}}. This scenario helps you offload all read queries from the application database to Redis. + diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md new file mode 100644 index 0000000000..f7b32fbf81 --- /dev/null +++ b/content/operate/rc/databases/rdi/setup.md @@ -0,0 +1,32 @@ +--- +Title: Prepare source database +alwaysopen: false +categories: +- docs +- operate +- rc +description: null +hideListLinks: true +weight: 1 +--- + +## Create new data pipeline + +1. Log in to Redis Cloud. +1. (Create a new database){{}}. +1. Once your database is created and running, navigate to the **Data pipeline** tab. +1. Select **Create data pipeline**. +1. Select your database type (currently, only **TBD** is supported). +1. If you know the size of your source database, enter it into the **Source dataset size** field. + +## Prepare source database + +Before using the pipeline you must first prepare your source database to use +the Debezium connector for change data capture (CDC). See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/ingest/architecture#overview" >}}) for more information about CDC. + +https://redis.io/docs/latest/integrate/redis-data-integration/ingest/data-pipelines/prepare-dbs/oracle/ + +## Set up AWS secret + +## Connect to Private Link + From d5869711d28af06895b1d534290833b4cbfc4cbb Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:01:17 -0500 Subject: [PATCH 02/68] overview draft --- content/operate/rc/databases/rdi/_index.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 9094c622d0..b5118bc8b4 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -10,10 +10,13 @@ hideListLinks: true weight: 99 --- -Redis Cloud now supports (Redis Data Integration (RDI)){{}}. RDI's purpose is to help Redis customers sync Redis Enterprise with live data from their disk-based databases to: +Redis Cloud now supports [Redis Data Integration (RDI)]({{}}), a fast and simple way to bring your data into Redis. + +The applications that write data to your primary database are not always the same application that need faster access to the data. Redis Cloud uses (ingest){{}} to help you offload all read queries from the application database to Redis. + +RDI's helps Redis customers sync Redis Cloud with live data from their primary databases to: - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. - Save resources and time when building pipelines and coding data transformations. - Reduce the total cost of ownership by saving money on expensive database read replicas. -Redis Cloud currently only supports the (ingest scenario){{}}. This scenario helps you offload all read queries from the application database to Redis. - +Using RDI with Redis Cloud simplifies managing your data integration pipeline. No need to worry about hardware or underlying infrastructure, as Redis Cloud manages that for you. Creating the data flow from source to target is much easier, and there are validations in place to reduce errors. From b5beb6a1c0f036375500ebeb2b60bbb712b53d48 Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:02:34 -0500 Subject: [PATCH 03/68] edit desc --- content/operate/rc/databases/rdi/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index b5118bc8b4..78d2937143 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -5,7 +5,7 @@ categories: - docs - operate - rc -description: Use Redis Data Integration in Redis Cloud. +description: Use Redis Data Integration with Redis Cloud. hideListLinks: true weight: 99 --- From 10d5de891817ede75c05e9191608c1033f86d9cb Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:04:29 -0500 Subject: [PATCH 04/68] fix relref --- content/operate/rc/databases/rdi/_index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 78d2937143..4b87696ab5 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -12,7 +12,7 @@ weight: 99 Redis Cloud now supports [Redis Data Integration (RDI)]({{}}), a fast and simple way to bring your data into Redis. -The applications that write data to your primary database are not always the same application that need faster access to the data. Redis Cloud uses (ingest){{}} to help you offload all read queries from the application database to Redis. +The applications that write data to your primary database are not always the same application that need faster access to the data. Redis Cloud uses [ingest]({{}}) to help you offload all read queries from the application database to Redis. RDI's helps Redis customers sync Redis Cloud with live data from their primary databases to: - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. From c9e5161b4d6b82c9d7c9abdd4bf556cc4200c5bb Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:06:46 -0500 Subject: [PATCH 05/68] get started, doc link --- content/operate/rc/databases/rdi/_index.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 4b87696ab5..bd66977aa6 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -20,3 +20,7 @@ RDI's helps Redis customers sync Redis Cloud with live data from their primary d - Reduce the total cost of ownership by saving money on expensive database read replicas. Using RDI with Redis Cloud simplifies managing your data integration pipeline. No need to worry about hardware or underlying infrastructure, as Redis Cloud manages that for you. Creating the data flow from source to target is much easier, and there are validations in place to reduce errors. + +## Get started + +To start creating your new data pipeline, see [Prepare source database]({{}}). From 42fcff9b1a4b4313af165297542f4e8de4c37d47 Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:13:48 -0500 Subject: [PATCH 06/68] prepare source database with link --- content/operate/rc/databases/rdi/setup.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index f7b32fbf81..b7b7c2faa9 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -22,9 +22,11 @@ weight: 1 ## Prepare source database Before using the pipeline you must first prepare your source database to use -the Debezium connector for change data capture (CDC). See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/ingest/architecture#overview" >}}) for more information about CDC. +the Debezium connector for change data capture (CDC). -https://redis.io/docs/latest/integrate/redis-data-integration/ingest/data-pipelines/prepare-dbs/oracle/ +See [Prepare source databases]({{}}) to find steps for your database type. + +See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/ingest/architecture#overview" >}}) for more information about CDC. ## Set up AWS secret From 17270d842fdaa2ebf232880a5717d625462345f5 Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:36:02 -0500 Subject: [PATCH 07/68] setup connectivity --- content/operate/rc/databases/rdi/setup.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index b7b7c2faa9..e13e6b97a8 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -28,7 +28,13 @@ See [Prepare source databases]({{}}) for more information about CDC. -## Set up AWS secret +## Source database credentials -## Connect to Private Link +## Setup connectivity +To expose your source database to Redis, you need to [edit your Private Link VPC permissions](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#add-remove-permissions). + +1. Open your [Amazon VPC console]() and navigate to **Endpoint services**. +1. Copy the Amazon Resource Name (ARN) provided in **Setup connectivity** box. +1. Navigate to **Allow principals** tab. +1. Add the Redis Cloud ARN and choose **Allow principals**. From 9e0de8e21d149152b602e537a336da11a708294b Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:39:04 -0500 Subject: [PATCH 08/68] connectivity steps --- content/operate/rc/databases/rdi/setup.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index e13e6b97a8..e5affed89b 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -32,9 +32,11 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio ## Setup connectivity -To expose your source database to Redis, you need to [edit your Private Link VPC permissions](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#add-remove-permissions). +To expose your source database to Redis, you need to [edit your AWS PrivateLink VPC permissions](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#add-remove-permissions). 1. Open your [Amazon VPC console]() and navigate to **Endpoint services**. 1. Copy the Amazon Resource Name (ARN) provided in **Setup connectivity** box. 1. Navigate to **Allow principals** tab. 1. Add the Redis Cloud ARN and choose **Allow principals**. + +For more details on AWS PrivateLink, see [Share your services through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html). From efc8b0b80f86d47a74d83dfd7cb644df1db5c429 Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Thu, 22 Aug 2024 12:57:21 -0500 Subject: [PATCH 09/68] pane > box --- content/operate/rc/databases/rdi/setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index e5affed89b..d6ceabfc14 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -35,7 +35,7 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio To expose your source database to Redis, you need to [edit your AWS PrivateLink VPC permissions](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#add-remove-permissions). 1. Open your [Amazon VPC console]() and navigate to **Endpoint services**. -1. Copy the Amazon Resource Name (ARN) provided in **Setup connectivity** box. +1. Copy the Amazon Resource Name (ARN) provided in **Setup connectivity** pane. 1. Navigate to **Allow principals** tab. 1. Add the Redis Cloud ARN and choose **Allow principals**. From 20c30508152cb8b257f5da72645dd317c22a3e25 Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Fri, 23 Aug 2024 15:24:22 -0500 Subject: [PATCH 10/68] Limitations draft --- content/operate/rc/databases/rdi/_index.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index bd66977aa6..2b3d50b027 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -24,3 +24,11 @@ Using RDI with Redis Cloud simplifies managing your data integration pipeline. N ## Get started To start creating your new data pipeline, see [Prepare source database]({{}}). + +## Limitations + +Only the following are supported at this time: + +- One source database connected to one target database +- AWS source databases +- Ingest use case \ No newline at end of file From c3b7bcac7c0744e17f935b0f7dbf193dfd9c17d0 Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Fri, 30 Aug 2024 14:51:54 -0400 Subject: [PATCH 11/68] Apply suggestions from code review Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com> --- content/operate/rc/databases/rdi/_index.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 2b3d50b027..d7081ffeeb 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -12,18 +12,18 @@ weight: 99 Redis Cloud now supports [Redis Data Integration (RDI)]({{}}), a fast and simple way to bring your data into Redis. -The applications that write data to your primary database are not always the same application that need faster access to the data. Redis Cloud uses [ingest]({{}}) to help you offload all read queries from the application database to Redis. +A relational database usually handles queries much more slowly than a Redis database. If your application uses a relational database and makes many more reads than writes (which is the typical case) then you can improve performance by using Redis as a cache to handle the read queries quickly. Redis Cloud uses [ingest]({{}}) to help you offload all read queries from the application database to Redis automatically. RDI's helps Redis customers sync Redis Cloud with live data from their primary databases to: - - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. - - Save resources and time when building pipelines and coding data transformations. - - Reduce the total cost of ownership by saving money on expensive database read replicas. +- Meet the required speed and scale of read queries and provide an excellent and predictable user experience. +- Save resources and time when building pipelines and coding data transformations. +- Reduce the total cost of ownership by saving money on expensive database read replicas. Using RDI with Redis Cloud simplifies managing your data integration pipeline. No need to worry about hardware or underlying infrastructure, as Redis Cloud manages that for you. Creating the data flow from source to target is much easier, and there are validations in place to reduce errors. ## Get started -To start creating your new data pipeline, see [Prepare source database]({{}}). +To start creating your new data pipeline, see [Prepare source database]({{}}). ## Limitations From e938762080726bf7ddf9d99d1db7abd205350926 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 3 Sep 2024 16:55:36 -0400 Subject: [PATCH 12/68] Edits and DB credentials changes --- content/operate/rc/databases/rdi/_index.md | 31 ++++++++++++++------ content/operate/rc/databases/rdi/setup.md | 33 +++++++++++++++++----- 2 files changed, 49 insertions(+), 15 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index d7081ffeeb..96fd45960b 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -14,21 +14,36 @@ Redis Cloud now supports [Redis Data Integration (RDI)]({{}}) to help you offload all read queries from the application database to Redis automatically. -RDI's helps Redis customers sync Redis Cloud with live data from their primary databases to: +RDI helps Redis customers sync Redis Cloud with live data from their primary databases to: - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. - Save resources and time when building pipelines and coding data transformations. - Reduce the total cost of ownership by saving money on expensive database read replicas. Using RDI with Redis Cloud simplifies managing your data integration pipeline. No need to worry about hardware or underlying infrastructure, as Redis Cloud manages that for you. Creating the data flow from source to target is much easier, and there are validations in place to reduce errors. -## Get started +## Prerequisites + +Before you can create a data pipeline, you must have: + +- A [Redis Cloud Pro database]() hosted on Amazon Web Services (AWS) +- One supported source database, also hosted on AWS: + - Insert supported source DBs here. -To start creating your new data pipeline, see [Prepare source database]({{}}). +{{< note >}} +Please be aware of the following limitations: + +- The target database must be a Redis Cloud Pro database hosted on Amazon Web Services (AWS). Redis Cloud Essentials databases and databases hosted on Google Cloud do not support Data Integration. +- Only the Ingest use case is supported at this time. +- Source databases must also be hosted on AWS. +- One source database can only be connected to one target database. +{{< /note >}} + +## Get started -## Limitations +To create a new data pipeline, you need to: -Only the following are supported at this time: +1. [Prepare your source database]({{}}) and any associated credentials. +2. [Provision data pipeline] +3. [Define data pipeline] -- One source database connected to one target database -- AWS source databases -- Ingest use case \ No newline at end of file +Once your data pipeline is defined, you can [manage]() and [observe]() it. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index d6ceabfc14..ff3984a388 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -10,25 +10,44 @@ hideListLinks: true weight: 1 --- + ## Create new data pipeline -1. Log in to Redis Cloud. -1. (Create a new database){{}}. -1. Once your database is created and running, navigate to the **Data pipeline** tab. +1. In the Redis Cloud console, go to your target database and select the **Data Pipeline** tab. 1. Select **Create data pipeline**. -1. Select your database type (currently, only **TBD** is supported). +1. Select your source database type. The following database types are supported: + - Insert here 1. If you know the size of your source database, enter it into the **Source dataset size** field. ## Prepare source database -Before using the pipeline you must first prepare your source database to use -the Debezium connector for change data capture (CDC). +Before using the pipeline, you must first prepare your source database to use the Debezium connector for change data capture (CDC). See [Prepare source databases]({{}}) to find steps for your database type. See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/ingest/architecture#overview" >}}) for more information about CDC. -## Source database credentials +## Share source database credentials + +You need to share your source database credentials in an Amazon secret with Redis Cloud so that the pipeline can connect to your database. + +In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Security, Identity, and Compliance** > **Secrets Manager**. [Create a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) of type **Other type of secret** with the following key/value fields: + +- `port`: Database port +- `schema_name`: Database name or schema name +- `pdb_name`: Database name *(Oracle only)* +- `username`: Database username +- `password`: Database password +- `server_certificate`: Server certificate in PEM format *(TLS only)* +- `client_certificate`: [X.509 client certificate](https://en.wikipedia.org/wiki/X.509) or chain in PEM format *(mTLS only)* +- `client_certificate_key`: Key for the client certificate or chain in PEM format *(mTLS only)* +- `client_certificate_passphrase`: Passphrase or password for the client certificate or chain in PEM format *(mTLS only)* + +{{}} +If your source database has TLS or mTLS enabled, we recommend that you enter the `server_certificate`, `client_certificate`, and `client_certificate_key` into the secret editor using the **Key/Value** input method instead of the **JSON** input method. Pasting directly into the JSON editor may cause an error. +{{}} + +After you store this secret, you can view and copy the [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_iam-permissions.html#iam-resources) of your secret on the secret details page. ## Setup connectivity From a5977a24ebe9d86880d5724a5f435e12cd6141a7 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 6 Sep 2024 16:29:42 -0400 Subject: [PATCH 13/68] Add setup step and more edits --- content/operate/rc/databases/rdi/_index.md | 7 +++-- content/operate/rc/databases/rdi/setup.md | 36 +++++++++++++++++----- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 96fd45960b..887a94fdd0 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -26,8 +26,11 @@ Using RDI with Redis Cloud simplifies managing your data integration pipeline. N Before you can create a data pipeline, you must have: - A [Redis Cloud Pro database]() hosted on Amazon Web Services (AWS) -- One supported source database, also hosted on AWS: - - Insert supported source DBs here. +- One supported source database, also hosted on AWS and connected to [AWS PrivateLink](https://aws.amazon.com/privatelink/): + - MySQL + - Oracle + - SQL Server + - PostgreSQL {{< note >}} Please be aware of the following limitations: diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index ff3984a388..9c7b7ce9a1 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -10,13 +10,15 @@ hideListLinks: true weight: 1 --- - ## Create new data pipeline -1. In the Redis Cloud console, go to your target database and select the **Data Pipeline** tab. +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. 1. Select **Create data pipeline**. 1. Select your source database type. The following database types are supported: - - Insert here + - MySQL + - Oracle + - SQL Server + - PostgreSQL 1. If you know the size of your source database, enter it into the **Source dataset size** field. ## Prepare source database @@ -49,13 +51,33 @@ If your source database has TLS or mTLS enabled, we recommend that you enter the After you store this secret, you can view and copy the [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_iam-permissions.html#iam-resources) of your secret on the secret details page. -## Setup connectivity +## Set up connectivity -To expose your source database to Redis, you need to [edit your AWS PrivateLink VPC permissions](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#add-remove-permissions). +To expose your source database to Redis, you need to add Redis Cloud as an Allowed Principal on the [AWS PrivateLink VPC permissions](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#add-remove-permissions) for the PrivateLink connected to your source database. -1. Open your [Amazon VPC console]() and navigate to **Endpoint services**. -1. Copy the Amazon Resource Name (ARN) provided in **Setup connectivity** pane. +1. Copy the Amazon Resource Name (ARN) provided in the **Setup connectivity** section. +1. Open the [Amazon VPC console](https://console.aws.amazon.com/vpc/) and select **Endpoint services**. 1. Navigate to **Allow principals** tab. 1. Add the Redis Cloud ARN and choose **Allow principals**. +1. Copy your PrivateLink service name for later. For more details on AWS PrivateLink, see [Share your services through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html). + +## Set up pipeline + +After you have prepared your source database and connection information, you can set up your new pipeline. + +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. +1. Select **Start pipeline setup**. +1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. +1. In the **Connectivity** section, enter your **PrivateLink service name**. +1. Enter the ARN of your [database credentials secret](#share-source-database-credentials) in the **Source database secrets ARN** field. +1. Select **Start pipeline setup**. + +At this point, Redis Cloud will attempt to create your new pipeline. + +Pipelines are created in the background. While they're creating, you aren't allowed to make changes. This process will take some time. + +See [Troubleshoot pipeline]() to view a list of errors that can occur at this point. + +When your pipeline is created, select **Complete setup**. From 289f0e42de539e81bdfd98e9c33fa3faf737cc62 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Wed, 11 Sep 2024 16:44:27 -0400 Subject: [PATCH 14/68] Move last step to provision --- content/operate/rc/databases/rdi/provision.md | 31 +++++++++++++++++++ content/operate/rc/databases/rdi/setup.md | 18 ++--------- 2 files changed, 33 insertions(+), 16 deletions(-) create mode 100644 content/operate/rc/databases/rdi/provision.md diff --git a/content/operate/rc/databases/rdi/provision.md b/content/operate/rc/databases/rdi/provision.md new file mode 100644 index 0000000000..26a9b5d662 --- /dev/null +++ b/content/operate/rc/databases/rdi/provision.md @@ -0,0 +1,31 @@ +--- +Title: Create data pipeline +alwaysopen: false +categories: +- docs +- operate +- rc +description: null +hideListLinks: true +weight: 2 +--- + + + +After you have prepared your source database and connection information, you can set up your new pipeline. + +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. +1. Select **Start pipeline setup**. +1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. +1. Enter the **Deployment CIDR** for your pipeline, or use the one that is generated for you. This CIDR should not conflict with your apps or other databases. +1. In the **Connectivity** section, enter your **PrivateLink service name**. +1. Enter the ARN of your [database credentials secret](#share-source-database-credentials) in the **Source database secrets ARN** field. +1. Select **Start pipeline setup**. + +At this point, Redis Cloud will attempt to create your new pipeline. + +Pipelines are created in the background. While they're creating, you aren't allowed to make changes. This process will take some time. + +See [Troubleshoot pipeline]() to view a list of errors that can occur at this point. + +When your pipeline is created, select **Complete setup**. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 9c7b7ce9a1..e0173b1290 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -63,21 +63,7 @@ To expose your source database to Redis, you need to add Redis Cloud as an Allow For more details on AWS PrivateLink, see [Share your services through AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/privatelink-share-your-services.html). -## Set up pipeline -After you have prepared your source database and connection information, you can set up your new pipeline. +## Next steps -1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. -1. Select **Start pipeline setup**. -1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. -1. In the **Connectivity** section, enter your **PrivateLink service name**. -1. Enter the ARN of your [database credentials secret](#share-source-database-credentials) in the **Source database secrets ARN** field. -1. Select **Start pipeline setup**. - -At this point, Redis Cloud will attempt to create your new pipeline. - -Pipelines are created in the background. While they're creating, you aren't allowed to make changes. This process will take some time. - -See [Troubleshoot pipeline]() to view a list of errors that can occur at this point. - -When your pipeline is created, select **Complete setup**. +After you have prepared your source database and provide \ No newline at end of file From 272e518303872b72cec508a1555365669537270d Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 13 Sep 2024 16:46:06 -0400 Subject: [PATCH 15/68] Add some of Yaron's suggestions to intro --- content/operate/rc/databases/rdi/_index.md | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 887a94fdd0..cf6f597e2f 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -10,9 +10,11 @@ hideListLinks: true weight: 99 --- -Redis Cloud now supports [Redis Data Integration (RDI)]({{}}), a fast and simple way to bring your data into Redis. +Redis Cloud now supports [Redis Data Integration (RDI)]({{}}), a fast and simple way to bring your data into Redis from other types of primary databases. -A relational database usually handles queries much more slowly than a Redis database. If your application uses a relational database and makes many more reads than writes (which is the typical case) then you can improve performance by using Redis as a cache to handle the read queries quickly. Redis Cloud uses [ingest]({{}}) to help you offload all read queries from the application database to Redis automatically. +A relational database usually handles queries much more slowly than a Redis database. If your application uses a relational database and makes many more reads than writes (which is the typical case) then you can improve performance by using Redis as a cache to handle the read queries quickly. Redis Cloud uses [ingest]({{}}) to help you offload all read queries from the application database to Redis automatically. + +Having a data pipeline lets you have a cache that is always ready for queries. RDI Data pipelines ensure that any changes made to your primary database are captured in your Redis cache within a few seconds, preventing cache misses and stale data within the cache. RDI helps Redis customers sync Redis Cloud with live data from their primary databases to: - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. @@ -21,6 +23,14 @@ RDI helps Redis customers sync Redis Cloud with live data from their primary dat Using RDI with Redis Cloud simplifies managing your data integration pipeline. No need to worry about hardware or underlying infrastructure, as Redis Cloud manages that for you. Creating the data flow from source to target is much easier, and there are validations in place to reduce errors. +## Data pipeline architecture + +A RDI data pipeline sits between your source database and your target Redis database. Initially, the pipeline reads all of the data and imports it into the target database during the *initial cache loading* phase. After this initial sync is complete, the data pipeline enters the *change streaming* phase, where changes are captured as they happen. Changes in the source database are added to the target within a few seconds of capture. + +RDI encrypts all network connections with TLS or mTLS and stores all state and configuration data inside the Redis cluster. + +For more info on how RDI works, see [RDI Architecture]({{}}). + ## Prerequisites Before you can create a data pipeline, you must have: From 9d12553fbc7c4c3a3245a5d0dedaa055aa78757f Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:03:47 -0400 Subject: [PATCH 16/68] Apply suggestions from code review Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com> --- content/operate/rc/databases/rdi/_index.md | 2 +- content/operate/rc/databases/rdi/provision.md | 2 +- content/operate/rc/databases/rdi/setup.md | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index cf6f597e2f..001da5fb10 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -14,7 +14,7 @@ Redis Cloud now supports [Redis Data Integration (RDI)]({{}}) to help you offload all read queries from the application database to Redis automatically. -Having a data pipeline lets you have a cache that is always ready for queries. RDI Data pipelines ensure that any changes made to your primary database are captured in your Redis cache within a few seconds, preventing cache misses and stale data within the cache. +Using a data pipeline lets you have a cache that is always ready for queries. RDI Data pipelines ensure that any changes made to your primary database are captured in your Redis cache within a few seconds, preventing cache misses and stale data within the cache. RDI helps Redis customers sync Redis Cloud with live data from their primary databases to: - Meet the required speed and scale of read queries and provide an excellent and predictable user experience. diff --git a/content/operate/rc/databases/rdi/provision.md b/content/operate/rc/databases/rdi/provision.md index 26a9b5d662..846c9f87a6 100644 --- a/content/operate/rc/databases/rdi/provision.md +++ b/content/operate/rc/databases/rdi/provision.md @@ -24,7 +24,7 @@ After you have prepared your source database and connection information, you can At this point, Redis Cloud will attempt to create your new pipeline. -Pipelines are created in the background. While they're creating, you aren't allowed to make changes. This process will take some time. +Pipelines are created in the background. While they're being created, you aren't allowed to make changes. This process will take some time. See [Troubleshoot pipeline]() to view a list of errors that can occur at this point. diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index e0173b1290..0ad4826f9c 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -25,9 +25,9 @@ weight: 1 Before using the pipeline, you must first prepare your source database to use the Debezium connector for change data capture (CDC). -See [Prepare source databases]({{}}) to find steps for your database type. +See [Prepare source databases]({{}}) to find steps for your database type. -See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/ingest/architecture#overview" >}}) for more information about CDC. +See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/architecture#overview" >}}) for more information about CDC. ## Share source database credentials From a32204e4c3eda7fc8c4530ed27c3b3d3a1a765c1 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 20 Sep 2024 17:04:20 -0400 Subject: [PATCH 17/68] Add define steps --- content/operate/rc/databases/rdi/_index.md | 6 +-- content/operate/rc/databases/rdi/create.md | 38 +++++++++++++++++++ content/operate/rc/databases/rdi/define.md | 31 +++++++++++++++ content/operate/rc/databases/rdi/provision.md | 31 --------------- content/operate/rc/databases/rdi/setup.md | 7 +--- 5 files changed, 74 insertions(+), 39 deletions(-) create mode 100644 content/operate/rc/databases/rdi/create.md create mode 100644 content/operate/rc/databases/rdi/define.md delete mode 100644 content/operate/rc/databases/rdi/provision.md diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 001da5fb10..a8fecf2c99 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -35,7 +35,7 @@ For more info on how RDI works, see [RDI Architecture]({{}}) hosted on Amazon Web Services (AWS) - One supported source database, also hosted on AWS and connected to [AWS PrivateLink](https://aws.amazon.com/privatelink/): - MySQL - Oracle @@ -56,7 +56,7 @@ Please be aware of the following limitations: To create a new data pipeline, you need to: 1. [Prepare your source database]({{}}) and any associated credentials. -2. [Provision data pipeline] -3. [Define data pipeline] +2. [Create data pipeline]({{}}) and troubleshoot errors. +3. [Define the data pipeline]({{}}) by selecting which tables to sync. Once your data pipeline is defined, you can [manage]() and [observe]() it. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/create.md b/content/operate/rc/databases/rdi/create.md new file mode 100644 index 0000000000..97c80df7bb --- /dev/null +++ b/content/operate/rc/databases/rdi/create.md @@ -0,0 +1,38 @@ +--- +Title: Create data pipeline +alwaysopen: false +categories: +- docs +- operate +- rc +description: Create and troubleshoot your data pipeline. +hideListLinks: true +weight: 2 +--- + +After you have [prepared your source database]({{}}) and connection information, you can set up your new pipeline. + +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. +1. Select **Start pipeline setup**. +1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. +1. Enter the **Deployment CIDR** for your pipeline, or use the one generated for you. This CIDR should not conflict with your apps or other databases. +1. In the **Connectivity** section, enter the **PrivateLink service name** of the [PrivateLink connected to your source database]({{< relref "/operate/rc/databases/rdi/setup#set-up-connectivity" >}}). +1. Enter your database details. This depends on your database type, and includes: + - **Port**: The database's port + - **Database**: Your database's name, or the root database + - **Database Server ID**: Unique ID for the replication client. Leave as default if you don't use replication *(mySQL and mariaDB only)* + - **PDB**: Name of the Oracle pluggable database *(Oracle only)* +1. Enter the ARN of your [database credentials secret]({{< relref "/operate/rc/databases/rdi/setup#share-source-database-credentials" >}}) in the **Source database secrets ARN** field. +1. Select **Start pipeline setup**. + +At this point, Redis Cloud will attempt to create your new pipeline. + +Pipelines are created in the background. While they're being created, you aren't allowed to make changes. This process will take some time. + +See [Pipeline creation errors](#pipeline-creation-errors) to view a list of errors that can occur at this point. + +When your pipeline is created, select **Complete setup**. You will then [define your data pipeline]({{}}). + +## Pipeline creation errors + +Add errors here. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md new file mode 100644 index 0000000000..6378e8488a --- /dev/null +++ b/content/operate/rc/databases/rdi/define.md @@ -0,0 +1,31 @@ +--- +Title: Define data pipeline +alwaysopen: false +categories: +- docs +- operate +- rc +description: Define your data pipeline by selecting which tables to sync. +hideListLinks: true +weight: 3 +--- + +After you have [created your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. + +## Configure a new pipeline + +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. If your pipeline is already created, select **Complete setup** to go to the **Pipeline definition** section. +1. For the **Configure a new pipeline** option, select the Redis data type to write keys to the target. You can choose **Hash** or **JSON**. + + Select **Continue**. +1. Select the Schema and Tables you want to migrate to the target database from the **Source data selection** list. + + If any tables are missing a unique constraint, the **Missing unique constraint** list will appear. Select the columns that define a unique constraint for those tables from the list. + + After you've selected the tables you want to sync, select **Continue**. + +1. Review the tables you selected in the **Summary**. If everything looks correct, select **Start ingest** to start ingesting data from your source database. + +At this point, the data pipeline will ingest data from the source database to your target Redis database. This process will take time, especially if you have a lot of records in your source database. + +After this initial sync is complete, the data pipeline enters the *change streaming* phase, where changes are captured as they happen. Changes in the source database are added to the target within a few seconds of capture. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/provision.md b/content/operate/rc/databases/rdi/provision.md deleted file mode 100644 index 846c9f87a6..0000000000 --- a/content/operate/rc/databases/rdi/provision.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -Title: Create data pipeline -alwaysopen: false -categories: -- docs -- operate -- rc -description: null -hideListLinks: true -weight: 2 ---- - - - -After you have prepared your source database and connection information, you can set up your new pipeline. - -1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. -1. Select **Start pipeline setup**. -1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. -1. Enter the **Deployment CIDR** for your pipeline, or use the one that is generated for you. This CIDR should not conflict with your apps or other databases. -1. In the **Connectivity** section, enter your **PrivateLink service name**. -1. Enter the ARN of your [database credentials secret](#share-source-database-credentials) in the **Source database secrets ARN** field. -1. Select **Start pipeline setup**. - -At this point, Redis Cloud will attempt to create your new pipeline. - -Pipelines are created in the background. While they're being created, you aren't allowed to make changes. This process will take some time. - -See [Troubleshoot pipeline]() to view a list of errors that can occur at this point. - -When your pipeline is created, select **Complete setup**. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 0ad4826f9c..171d2dea89 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -5,7 +5,7 @@ categories: - docs - operate - rc -description: null +description: Prepare your source database and database credentials for Data integration. hideListLinks: true weight: 1 --- @@ -35,9 +35,6 @@ You need to share your source database credentials in an Amazon secret with Redi In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Security, Identity, and Compliance** > **Secrets Manager**. [Create a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) of type **Other type of secret** with the following key/value fields: -- `port`: Database port -- `schema_name`: Database name or schema name -- `pdb_name`: Database name *(Oracle only)* - `username`: Database username - `password`: Database password - `server_certificate`: Server certificate in PEM format *(TLS only)* @@ -66,4 +63,4 @@ For more details on AWS PrivateLink, see [Share your services through AWS Privat ## Next steps -After you have prepared your source database and provide \ No newline at end of file +After you have set up your source database and prepared connectivity and credentials, select **Start pipeline setup** to [create your data pipeline.]({{}}) \ No newline at end of file From 71f431c5bab7d5dc02cad53542b1e4bfdb87f635 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 20 Sep 2024 17:09:12 -0400 Subject: [PATCH 18/68] Fix relrefs --- content/operate/rc/databases/rdi/_index.md | 6 +++--- content/operate/rc/databases/rdi/create.md | 4 ++-- content/operate/rc/databases/rdi/define.md | 2 +- content/operate/rc/databases/rdi/setup.md | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index a8fecf2c99..6aeb394d0d 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -55,8 +55,8 @@ Please be aware of the following limitations: To create a new data pipeline, you need to: -1. [Prepare your source database]({{}}) and any associated credentials. -2. [Create data pipeline]({{}}) and troubleshoot errors. -3. [Define the data pipeline]({{}}) by selecting which tables to sync. +1. [Prepare your source database]({{}}) and any associated credentials. +2. [Create data pipeline]({{}}) and troubleshoot errors. +3. [Define the data pipeline]({{}}) by selecting which tables to sync. Once your data pipeline is defined, you can [manage]() and [observe]() it. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/create.md b/content/operate/rc/databases/rdi/create.md index 97c80df7bb..11894fb263 100644 --- a/content/operate/rc/databases/rdi/create.md +++ b/content/operate/rc/databases/rdi/create.md @@ -10,7 +10,7 @@ hideListLinks: true weight: 2 --- -After you have [prepared your source database]({{}}) and connection information, you can set up your new pipeline. +After you have [prepared your source database]({{}}) and connection information, you can set up your new pipeline. 1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. 1. Select **Start pipeline setup**. @@ -31,7 +31,7 @@ Pipelines are created in the background. While they're being created, you aren't See [Pipeline creation errors](#pipeline-creation-errors) to view a list of errors that can occur at this point. -When your pipeline is created, select **Complete setup**. You will then [define your data pipeline]({{}}). +When your pipeline is created, select **Complete setup**. You will then [define your data pipeline]({{}}). ## Pipeline creation errors diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 6378e8488a..997b5324b0 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -10,7 +10,7 @@ hideListLinks: true weight: 3 --- -After you have [created your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. +After you have [created your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. ## Configure a new pipeline diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 171d2dea89..ae10715f9f 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -63,4 +63,4 @@ For more details on AWS PrivateLink, see [Share your services through AWS Privat ## Next steps -After you have set up your source database and prepared connectivity and credentials, select **Start pipeline setup** to [create your data pipeline.]({{}}) \ No newline at end of file +After you have set up your source database and prepared connectivity and credentials, select **Start pipeline setup** to [create your data pipeline]({{}}). \ No newline at end of file From e8ea310a61567ba556f3b02ff0ac92e71ef68002 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Mon, 23 Sep 2024 15:53:06 -0400 Subject: [PATCH 19/68] stash commit --- content/operate/rc/databases/rdi/_index.md | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 6aeb394d0d..8d9751f108 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -27,10 +27,19 @@ Using RDI with Redis Cloud simplifies managing your data integration pipeline. N A RDI data pipeline sits between your source database and your target Redis database. Initially, the pipeline reads all of the data and imports it into the target database during the *initial cache loading* phase. After this initial sync is complete, the data pipeline enters the *change streaming* phase, where changes are captured as they happen. Changes in the source database are added to the target within a few seconds of capture. -RDI encrypts all network connections with TLS or mTLS and stores all state and configuration data inside the Redis cluster. - For more info on how RDI works, see [RDI Architecture]({{}}). +### Pipeline security + +Regarding pipeline security: +Source credentials and TLS secrets are all coming from AWS secret manager to RDI using AWS Secret Manager CSI driver for secrets which is the best practice +The connectivity to the source database is via AWS private link so that RDI is only exposed to the specific end point and not to the entire customer VPC +The connectivity to source database is JDBC secured connection with TLS +The data is written from the source to Redis streams over secured RESP + TLS +The data is then processed in memory by RDI - reading it over TLS secured RESP connection and writing it to the target Redis using TLS secured connection +RDI resides within Redis Cloud VPC +There is no Ingress connections to RDI except from Redis Cloud management services + ## Prerequisites Before you can create a data pipeline, you must have: From 860944a3774fe07fcaadadd611c1c87ac2151965 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 24 Sep 2024 15:10:59 -0400 Subject: [PATCH 20/68] Add security information --- content/operate/rc/databases/rdi/_index.md | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 8d9751f108..e072a4243b 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -31,14 +31,11 @@ For more info on how RDI works, see [RDI Architecture]({{}}) to learn how to share your source database credentials with Redis Cloud. + +Connections to the source database are through [AWS PrivateLink](https://aws.amazon.com/privatelink/), ensuring that the data pipeline is only exposed to the specific database endpoint. See [Set up connectivity]({{}}) to learn how to connect your PrivateLink to the Redis Cloud VPC. + +RDI encrypts all network connections with TLS. The pipeline will process data from the source database in-memory and write it to the target database using a TLS connection. There are no external connections to your data pipeline except from Redis Cloud management services. ## Prerequisites From fa87f8653f561ce3606bf8f954eb7874a740dfd9 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Mon, 7 Oct 2024 15:40:21 -0400 Subject: [PATCH 21/68] Add View/Edit --- content/operate/rc/databases/rdi/_index.md | 2 +- content/operate/rc/databases/rdi/define.md | 12 ++- content/operate/rc/databases/rdi/view-edit.md | 79 +++++++++++++++++++ 3 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 content/operate/rc/databases/rdi/view-edit.md diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index e072a4243b..3c8b7c2bc2 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -65,4 +65,4 @@ To create a new data pipeline, you need to: 2. [Create data pipeline]({{}}) and troubleshoot errors. 3. [Define the data pipeline]({{}}) by selecting which tables to sync. -Once your data pipeline is defined, you can [manage]() and [observe]() it. \ No newline at end of file +Once your data pipeline is defined, you can [view and edit]({{}}) it. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 997b5324b0..23a1ea29c4 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -18,14 +18,20 @@ After you have [created your data pipeline]({{}}) to learn more. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md new file mode 100644 index 0000000000..7790f83101 --- /dev/null +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -0,0 +1,79 @@ +--- +Title: View and edit data pipeline +alwaysopen: false +categories: +- docs +- operate +- rc +description: Edit and observe your data pipeline. +hideListLinks: true +weight: 4 +--- + +You can use the **Data pipeline** tab in your database to view and edit it. + +The **Data pipeline** tab gives an overview of your data pipeline and lets you view your data stream metrics. + +## Edit data pipeline + +To change the data you want to ingest from the data pipeline: + +1. From the **Data pipeline** tab, select **Edit**. + +1. For the **Configure a new pipeline** option, select the Redis data type to write keys to the target. You can choose **Hash** or **JSON**. + + Select **Continue**. + +1. Select the schema and tables you want to migrate to the target database from the **Source data selection** list. You can select any number of columns from a table. + + If any tables are missing a unique constraint, the **Missing unique constraint** list will appear. Select the columns that define a unique constraint for those tables from the list. + + Select **Add schema** to add additional database schema. + + Select **Delete** to delete a schema. You must have at least one schema to continue. + + After you've selected the schemas and tables you want to sync, select **Continue**. + +1. Review the tables you selected in the **Summary** and select how you want to update the data pipeline: + + - **Apply to new data changes only**: The data pipeline will only synchronize new updates to the schema and tables selected. The data pipeline will not ingest any data from new schemas or tables that are selected. + - **Reset pipeline (re-process all data)**: The data pipeline will re-ingest all of the selected data. + - **Flush cached data and reset pipeline**: The data pipeline will flush the target Redis database, and then re-ingest all of the selected data from the source database. + +1. Select **Apply changes**. + +At this point, the data pipeline will apply the changes. If you selected **Reset pipeline** or **Flush cached data and reset pipeline**, the data pipeline will ingest data from the source database to the target database. After this initial sync is complete, the data pipeline enters the *change streaming* phase, where changes are captured as they happen. + +If you selected **Apply to new data changes only**, the data pipeline will enter the *change streaming* phase without ingesting the data. + +## Reset data pipeline + +To reset the data pipeline and restart the ingest process: + +1. From the **Data pipeline** tab, select **More actions**, and then **Reset pipeline**. + +1. If you want to flush the database, check **Flush target database**. + +1. Select **Reset data pipeline**. + +At this point, the data pipeline will re-ingest data from the source database to your target Redis database. + +## Stop and restart data pipeline + +To stop the data pipeline from synchronizing new data: + +1. From the **Data pipeline** tab, select **More actions**, and then **Stop pipeline**. + +1. Select **Stop data pipeline** to confirm. + +Stopping the data pipeline will suspend data processing. To restart the pipeline from the **Data pipeline** tab, select **More actions**, and then **Start pipeline**. + +## Delete pipeline + +To delete the data pipeline: + +1. From the **Data pipeline** tab, select **More actions**, and then **Delete pipeline**. + +1. Select **Delete data pipeline** to confirm. + +Deleted data pipelines cannot be recovered. \ No newline at end of file From 49d1f5491cf3794483ec822059fc2994f1594c04 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 11 Oct 2024 12:46:54 -0400 Subject: [PATCH 22/68] Incorporate Yaron's feedback, part 1 --- content/operate/rc/databases/rdi/_index.md | 7 ++++--- content/operate/rc/databases/rdi/define.md | 4 ++-- .../rc/databases/rdi/{create.md => provision.md} | 14 +++++++------- content/operate/rc/databases/rdi/setup.md | 4 ++-- 4 files changed, 15 insertions(+), 14 deletions(-) rename content/operate/rc/databases/rdi/{create.md => provision.md} (65%) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 3c8b7c2bc2..83328ff1ed 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -47,14 +47,15 @@ Before you can create a data pipeline, you must have: - Oracle - SQL Server - PostgreSQL + - mariaDB + - Aurora {{< note >}} Please be aware of the following limitations: - The target database must be a Redis Cloud Pro database hosted on Amazon Web Services (AWS). Redis Cloud Essentials databases and databases hosted on Google Cloud do not support Data Integration. -- Only the Ingest use case is supported at this time. - Source databases must also be hosted on AWS. -- One source database can only be connected to one target database. +- One source database can only be synced to one target database. {{< /note >}} ## Get started @@ -62,7 +63,7 @@ Please be aware of the following limitations: To create a new data pipeline, you need to: 1. [Prepare your source database]({{}}) and any associated credentials. -2. [Create data pipeline]({{}}) and troubleshoot errors. +2. [Provision data pipeline infrastructure]({{}}) and troubleshoot errors. 3. [Define the data pipeline]({{}}) by selecting which tables to sync. Once your data pipeline is defined, you can [view and edit]({{}}) it. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 23a1ea29c4..e81c0e0008 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -10,11 +10,11 @@ hideListLinks: true weight: 3 --- -After you have [created your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. +After you have [provisioned your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. ## Configure a new pipeline -1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. If your pipeline is already created, select **Complete setup** to go to the **Pipeline definition** section. +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. If your pipeline is already provisioned, select **Complete setup** to go to the **Pipeline definition** section. 1. For the **Configure a new pipeline** option, select the Redis data type to write keys to the target. You can choose **Hash** or **JSON**. Select **Continue**. diff --git a/content/operate/rc/databases/rdi/create.md b/content/operate/rc/databases/rdi/provision.md similarity index 65% rename from content/operate/rc/databases/rdi/create.md rename to content/operate/rc/databases/rdi/provision.md index 11894fb263..640e659267 100644 --- a/content/operate/rc/databases/rdi/create.md +++ b/content/operate/rc/databases/rdi/provision.md @@ -1,11 +1,11 @@ --- -Title: Create data pipeline +Title: Provision data pipeline alwaysopen: false categories: - docs - operate - rc -description: Create and troubleshoot your data pipeline. +description: Provision and troubleshoot your data pipeline infrastructure. hideListLinks: true weight: 2 --- @@ -19,20 +19,20 @@ After you have [prepared your source database]({{}}). 1. Enter your database details. This depends on your database type, and includes: - **Port**: The database's port - - **Database**: Your database's name, or the root database + - **Database**: Your database's name, or the root database *(PostgresSQL, Oracle only)*; or a comma-separated list of one or more databases you want to connect to *(SQL Server only)* - **Database Server ID**: Unique ID for the replication client. Leave as default if you don't use replication *(mySQL and mariaDB only)* - **PDB**: Name of the Oracle pluggable database *(Oracle only)* 1. Enter the ARN of your [database credentials secret]({{< relref "/operate/rc/databases/rdi/setup#share-source-database-credentials" >}}) in the **Source database secrets ARN** field. 1. Select **Start pipeline setup**. -At this point, Redis Cloud will attempt to create your new pipeline. +At this point, Redis Cloud will provision the pipeline infrastructure that will allow you to define your data pipeline. -Pipelines are created in the background. While they're being created, you aren't allowed to make changes. This process will take some time. +Pipelines are provisioned in the background. You aren't allowed to make changes to your data pipeline or to your database during provisioning. This process will take a long time, so you can close the window and come back later. See [Pipeline creation errors](#pipeline-creation-errors) to view a list of errors that can occur at this point. -When your pipeline is created, select **Complete setup**. You will then [define your data pipeline]({{}}). +When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline]({{}}). -## Pipeline creation errors +## Pipeline provisioning errors Add errors here. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index ae10715f9f..d0eaeb5bae 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -31,7 +31,7 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio ## Share source database credentials -You need to share your source database credentials in an Amazon secret with Redis Cloud so that the pipeline can connect to your database. +You need to share your source database credentials and certificates in an Amazon secret with Redis Cloud so that the pipeline can connect to your database. In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Security, Identity, and Compliance** > **Secrets Manager**. [Create a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) of type **Other type of secret** with the following key/value fields: @@ -63,4 +63,4 @@ For more details on AWS PrivateLink, see [Share your services through AWS Privat ## Next steps -After you have set up your source database and prepared connectivity and credentials, select **Start pipeline setup** to [create your data pipeline]({{}}). \ No newline at end of file +After you have set up your source database and prepared connectivity and credentials, select **Start pipeline setup** to [provision data pipeline infrastructure]({{}}). \ No newline at end of file From 4d69274cbefc550b014f5baceb7771a35980c548 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 15 Oct 2024 08:17:12 -0400 Subject: [PATCH 23/68] stash commit --- content/operate/rc/databases/rdi/provision.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/provision.md b/content/operate/rc/databases/rdi/provision.md index 640e659267..5c990f740d 100644 --- a/content/operate/rc/databases/rdi/provision.md +++ b/content/operate/rc/databases/rdi/provision.md @@ -29,10 +29,10 @@ At this point, Redis Cloud will provision the pipeline infrastructure that will Pipelines are provisioned in the background. You aren't allowed to make changes to your data pipeline or to your database during provisioning. This process will take a long time, so you can close the window and come back later. -See [Pipeline creation errors](#pipeline-creation-errors) to view a list of errors that can occur at this point. +See [Pipeline provisioning errors](#errors) to view a list of errors that can occur at this point. When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline]({{}}). -## Pipeline provisioning errors +## Pipeline provisioning errors {#errors} Add errors here. \ No newline at end of file From 129d6afed8282bc9f2008e378742f69781751d5b Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Mon, 21 Oct 2024 15:06:20 -0400 Subject: [PATCH 24/68] More suggestions from Yaron --- content/operate/rc/databases/rdi/_index.md | 6 +++--- content/operate/rc/databases/rdi/view-edit.md | 2 ++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 83328ff1ed..8e7ca7be80 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -25,15 +25,15 @@ Using RDI with Redis Cloud simplifies managing your data integration pipeline. N ## Data pipeline architecture -A RDI data pipeline sits between your source database and your target Redis database. Initially, the pipeline reads all of the data and imports it into the target database during the *initial cache loading* phase. After this initial sync is complete, the data pipeline enters the *change streaming* phase, where changes are captured as they happen. Changes in the source database are added to the target within a few seconds of capture. +A RDI data pipeline sits between your source database and your target Redis database. Initially, the pipeline reads all of the data and imports it into the target database during the *initial cache loading* phase. After this initial sync is complete, the data pipeline enters the *change streaming* phase, where changes are captured as they happen. Changes in the source database are added to the target within a few seconds of capture. The data pipeline translates relational database rows to Redis hashes or JSON documents. For more info on how RDI works, see [RDI Architecture]({{}}). ### Pipeline security -Data pipelines are set up to ensure a high level of data security. Source database credentials and TLS secrets are stored in AWS secret manager and shared using the AWS Secret Manager CSI driver for secrets. See [Share source database credentials]({{}}) to learn how to share your source database credentials with Redis Cloud. +Data pipelines are set up to ensure a high level of data security. Source database credentials and TLS secrets are stored in AWS secret manager and shared using the AWS Secret Manager CSI driver for secrets. See [Share source database credentials]({{}}) to learn how to share your source database credentials and TLS certificates with Redis Cloud. -Connections to the source database are through [AWS PrivateLink](https://aws.amazon.com/privatelink/), ensuring that the data pipeline is only exposed to the specific database endpoint. See [Set up connectivity]({{}}) to learn how to connect your PrivateLink to the Redis Cloud VPC. +Connections to the source database use Java Database Connectivity (JDBC) through [AWS PrivateLink](https://aws.amazon.com/privatelink/), ensuring that the data pipeline is only exposed to the specific database endpoint. See [Set up connectivity]({{}}) to learn how to connect your PrivateLink to the Redis Cloud VPC. RDI encrypts all network connections with TLS. The pipeline will process data from the source database in-memory and write it to the target database using a TLS connection. There are no external connections to your data pipeline except from Redis Cloud management services. diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index 7790f83101..aee59a8498 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -48,6 +48,8 @@ If you selected **Apply to new data changes only**, the data pipeline will enter ## Reset data pipeline +Resetting the data pipeline creates a new baseline snapshot from the current state of your source database, and re-processes the data from the source database to the target Redis database. You may want to reset the pipeline if the source and target databases were disconnected or you made large changes to the data pipeline. + To reset the data pipeline and restart the ingest process: 1. From the **Data pipeline** tab, select **More actions**, and then **Reset pipeline**. From c3e501e07a0ae6f7884d2e793b5644a7e512bf26 Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:54:26 -0400 Subject: [PATCH 25/68] Apply suggestions from code review Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com> --- content/operate/rc/databases/rdi/define.md | 2 +- content/operate/rc/databases/rdi/provision.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index e81c0e0008..36b6f0aab7 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -10,7 +10,7 @@ hideListLinks: true weight: 3 --- -After you have [provisioned your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. +After you have [provisioned your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. ## Configure a new pipeline diff --git a/content/operate/rc/databases/rdi/provision.md b/content/operate/rc/databases/rdi/provision.md index 5c990f740d..92192512c8 100644 --- a/content/operate/rc/databases/rdi/provision.md +++ b/content/operate/rc/databases/rdi/provision.md @@ -19,7 +19,7 @@ After you have [prepared your source database]({{}}). 1. Enter your database details. This depends on your database type, and includes: - **Port**: The database's port - - **Database**: Your database's name, or the root database *(PostgresSQL, Oracle only)*; or a comma-separated list of one or more databases you want to connect to *(SQL Server only)* + - **Database**: Your database's name, or the root database *(PostgreSQL, Oracle only)*, or a comma-separated list of one or more databases you want to connect to *(SQL Server only)* - **Database Server ID**: Unique ID for the replication client. Leave as default if you don't use replication *(mySQL and mariaDB only)* - **PDB**: Name of the Oracle pluggable database *(Oracle only)* 1. Enter the ARN of your [database credentials secret]({{< relref "/operate/rc/databases/rdi/setup#share-source-database-credentials" >}}) in the **Source database secrets ARN** field. From c9469e01dd56be7a2b0c36a21229e813cdf3dc93 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Fri, 25 Oct 2024 15:50:05 -0400 Subject: [PATCH 26/68] Combine define and provision and remove errors section --- content/operate/rc/databases/rdi/_index.md | 3 +- content/operate/rc/databases/rdi/define.md | 39 +++++++++++++++++-- content/operate/rc/databases/rdi/provision.md | 38 ------------------ content/operate/rc/databases/rdi/view-edit.md | 2 +- 4 files changed, 37 insertions(+), 45 deletions(-) delete mode 100644 content/operate/rc/databases/rdi/provision.md diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 8e7ca7be80..3ac97c0c35 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -63,7 +63,6 @@ Please be aware of the following limitations: To create a new data pipeline, you need to: 1. [Prepare your source database]({{}}) and any associated credentials. -2. [Provision data pipeline infrastructure]({{}}) and troubleshoot errors. -3. [Define the data pipeline]({{}}) by selecting which tables to sync. +2. [Define the source connection and data pipeline]({{}}) by selecting which tables to sync. Once your data pipeline is defined, you can [view and edit]({{}}) it. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 36b6f0aab7..247a014926 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -5,14 +5,45 @@ categories: - docs - operate - rc -description: Define your data pipeline by selecting which tables to sync. +description: Define your data pipeline hideListLinks: true -weight: 3 +weight: 2 --- -After you have [provisioned your data pipeline]({{}}), you need to define it. You will select the database schemas and columns that you want to import and synchronize with your primary database. +After you have [prepared your source database]({{}}) and connection information, you can set up your new pipeline. To do this: -## Configure a new pipeline +1. [Define the source connection](#define-source-connection) by entering all required source database information. +2. [Define the data pipeline](#define-data-pipeline) by selecting the data that you want to sync from your source database to the target database. + +## Define source connection + +1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. +1. Select **Start pipeline setup**. +1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. +1. Enter the **Deployment CIDR** for your pipeline, or use the one generated for you. This CIDR should not conflict with your apps or other databases. +1. In the **Connectivity** section, enter the **PrivateLink service name** of the [PrivateLink connected to your source database]({{< relref "/operate/rc/databases/rdi/setup#set-up-connectivity" >}}). +1. Enter your database details. This depends on your database type, and includes: + - **Port**: The database's port + - **Database**: Your database's name, or the root database *(PostgreSQL, Oracle only)*, or a comma-separated list of one or more databases you want to connect to *(SQL Server only)* + - **Database Server ID**: Unique ID for the replication client. Leave as default if you don't use replication *(mySQL and mariaDB only)* + - **PDB**: Name of the Oracle pluggable database *(Oracle only)* +1. Enter the ARN of your [database credentials secret]({{< relref "/operate/rc/databases/rdi/setup#share-source-database-credentials" >}}) in the **Source database secrets ARN** field. +1. Select **Start pipeline setup**. +1. Redis Cloud will attempt to connect to PrivateLink. Accept the incoming connection on AWS PrivateLink to proceed. See [Accept or Reject PrivateLink connection requests](https://docs.aws.amazon.com/vpc/latest/privatelink/configure-endpoint-service.html#accept-reject-connection-requests). + + If Redis Cloud can't find your PrivateLink connection, make sure that the PrivateLink service name is correct and that Redis Cloud is listed as an Allowed Principal for your VPC. See [Set up connectivity]({{}}) for more info. + +At this point, Redis Cloud will provision the pipeline infrastructure that will allow you to define your data pipeline. + +Pipelines are provisioned in the background. You aren't allowed to make changes to your data pipeline or to your database during provisioning. This process will take a long time, so you can close the window and come back later. + +When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline]({{}}). + +## Define data pipeline + +After your pipeline is provisioned, you will be able to define your pipeline. You will select the database schemas and columns that you want to import and synchronize with your primary database. + +### Configure a new pipeline 1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. If your pipeline is already provisioned, select **Complete setup** to go to the **Pipeline definition** section. 1. For the **Configure a new pipeline** option, select the Redis data type to write keys to the target. You can choose **Hash** or **JSON**. diff --git a/content/operate/rc/databases/rdi/provision.md b/content/operate/rc/databases/rdi/provision.md deleted file mode 100644 index 92192512c8..0000000000 --- a/content/operate/rc/databases/rdi/provision.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -Title: Provision data pipeline -alwaysopen: false -categories: -- docs -- operate -- rc -description: Provision and troubleshoot your data pipeline infrastructure. -hideListLinks: true -weight: 2 ---- - -After you have [prepared your source database]({{}}) and connection information, you can set up your new pipeline. - -1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. -1. Select **Start pipeline setup**. -1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. -1. Enter the **Deployment CIDR** for your pipeline, or use the one generated for you. This CIDR should not conflict with your apps or other databases. -1. In the **Connectivity** section, enter the **PrivateLink service name** of the [PrivateLink connected to your source database]({{< relref "/operate/rc/databases/rdi/setup#set-up-connectivity" >}}). -1. Enter your database details. This depends on your database type, and includes: - - **Port**: The database's port - - **Database**: Your database's name, or the root database *(PostgreSQL, Oracle only)*, or a comma-separated list of one or more databases you want to connect to *(SQL Server only)* - - **Database Server ID**: Unique ID for the replication client. Leave as default if you don't use replication *(mySQL and mariaDB only)* - - **PDB**: Name of the Oracle pluggable database *(Oracle only)* -1. Enter the ARN of your [database credentials secret]({{< relref "/operate/rc/databases/rdi/setup#share-source-database-credentials" >}}) in the **Source database secrets ARN** field. -1. Select **Start pipeline setup**. - -At this point, Redis Cloud will provision the pipeline infrastructure that will allow you to define your data pipeline. - -Pipelines are provisioned in the background. You aren't allowed to make changes to your data pipeline or to your database during provisioning. This process will take a long time, so you can close the window and come back later. - -See [Pipeline provisioning errors](#errors) to view a list of errors that can occur at this point. - -When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline]({{}}). - -## Pipeline provisioning errors {#errors} - -Add errors here. \ No newline at end of file diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index aee59a8498..6e1a18f658 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -7,7 +7,7 @@ categories: - rc description: Edit and observe your data pipeline. hideListLinks: true -weight: 4 +weight: 3 --- You can use the **Data pipeline** tab in your database to view and edit it. From f817848bea226d3bf9240d2c3da690a1b10b2291 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 5 Nov 2024 12:26:59 -0500 Subject: [PATCH 27/68] Add secret permissions and keys --- content/operate/rc/databases/rdi/setup.md | 48 +++++++++++++++++------ 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index d0eaeb5bae..746c154fa1 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -33,18 +33,42 @@ See the [RDI architecture overview]({{< relref "/integrate/redis-data-integratio You need to share your source database credentials and certificates in an Amazon secret with Redis Cloud so that the pipeline can connect to your database. -In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Security, Identity, and Compliance** > **Secrets Manager**. [Create a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) of type **Other type of secret** with the following key/value fields: - -- `username`: Database username -- `password`: Database password -- `server_certificate`: Server certificate in PEM format *(TLS only)* -- `client_certificate`: [X.509 client certificate](https://en.wikipedia.org/wiki/X.509) or chain in PEM format *(mTLS only)* -- `client_certificate_key`: Key for the client certificate or chain in PEM format *(mTLS only)* -- `client_certificate_passphrase`: Passphrase or password for the client certificate or chain in PEM format *(mTLS only)* - -{{}} -If your source database has TLS or mTLS enabled, we recommend that you enter the `server_certificate`, `client_certificate`, and `client_certificate_key` into the secret editor using the **Key/Value** input method instead of the **JSON** input method. Pasting directly into the JSON editor may cause an error. -{{}} +In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Security, Identity, and Compliance** > **Secrets Manager**. [Create a secret](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) of type **Other type of secret** with the following settings: + +- **Key/value pairs**: Enter the following key/value pairs. + + - `username`: Database username + - `password`: Database password + - `server_certificate`: Server certificate in PEM format *(TLS only)* + - `client_certificate`: [X.509 client certificate](https://en.wikipedia.org/wiki/X.509) or chain in PEM format *(mTLS only)* + - `client_certificate_key`: Key for the client certificate or chain in PEM format *(mTLS only)* + - `client_certificate_passphrase`: Passphrase or password for the client certificate or chain in PEM format *(mTLS only)* + + {{}} + If your source database has TLS or mTLS enabled, we recommend that you enter the `server_certificate`, `client_certificate`, and `client_certificate_key` into the secret editor using the **Key/Value** input method instead of the **JSON** input method. Pasting directly into the JSON editor may cause an error. + {{}} + +- **Encryption key**: Select a self-managed encryption key from the list of keys, or select **Add a new key** to [create one](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html). + +- **Resource permissions**: Add the following permissions to your secret to allow the Redis data pipeline to access your secret: + + ```json + { + "Version" : "2012-10-17", + "Statement" : [ { + "Sid" : "RedisDataIntegrationRoleAccess", + "Effect" : "Allow", + "Principal" : "*", + "Action" : [ "secretsmanager:GetSecretValue", "secretsmanager:DescribeSecret" ], + "Resource" : "*", + "Condition" : { + "StringLike" : { + "aws:PrincipalArn" : "arn:aws:iam::984612047909:role/redis-data-pipeline-secrets-role" + } + } + } ] + } + ``` After you store this secret, you can view and copy the [Amazon Resource Name (ARN)](https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_iam-permissions.html#iam-resources) of your secret on the secret details page. From 8f274f5672173629aa3850fa43e256904dd96bd5 Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Tue, 5 Nov 2024 12:29:15 -0500 Subject: [PATCH 28/68] Update content/operate/rc/databases/rdi/define.md Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com> --- content/operate/rc/databases/rdi/define.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 247a014926..a2cebe10e6 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -37,7 +37,7 @@ At this point, Redis Cloud will provision the pipeline infrastructure that will Pipelines are provisioned in the background. You aren't allowed to make changes to your data pipeline or to your database during provisioning. This process will take a long time, so you can close the window and come back later. -When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline]({{}}). +When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline](#define-data-pipeline). ## Define data pipeline From 2d2820db2d1089c6382a70e206c30747aae0d228 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 5 Nov 2024 12:34:08 -0500 Subject: [PATCH 29/68] Fix note --- content/operate/rc/databases/rdi/setup.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 746c154fa1..f1f7143d06 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -45,7 +45,7 @@ In the [AWS Management Console](https://console.aws.amazon.com/), use the **Serv - `client_certificate_passphrase`: Passphrase or password for the client certificate or chain in PEM format *(mTLS only)* {{}} - If your source database has TLS or mTLS enabled, we recommend that you enter the `server_certificate`, `client_certificate`, and `client_certificate_key` into the secret editor using the **Key/Value** input method instead of the **JSON** input method. Pasting directly into the JSON editor may cause an error. +If your source database has TLS or mTLS enabled, we recommend that you enter the `server_certificate`, `client_certificate`, and `client_certificate_key` into the secret editor using the **Key/Value** input method instead of the **JSON** input method. Pasting directly into the JSON editor may cause an error. {{}} - **Encryption key**: Select a self-managed encryption key from the list of keys, or select **Add a new key** to [create one](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html). From 46603a61c20a86094eff7396e55b6e6e06a8bc7e Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 5 Nov 2024 13:00:18 -0500 Subject: [PATCH 30/68] replace account ID in resource permissions --- content/operate/rc/databases/rdi/setup.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index f1f7143d06..7901951cbf 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -50,7 +50,7 @@ If your source database has TLS or mTLS enabled, we recommend that you enter the - **Encryption key**: Select a self-managed encryption key from the list of keys, or select **Add a new key** to [create one](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html). -- **Resource permissions**: Add the following permissions to your secret to allow the Redis data pipeline to access your secret: +- **Resource permissions**: Add the following permissions to your secret to allow the Redis data pipeline to access your secret. Replace `` with the provided AWS Account ID. ```json { @@ -63,7 +63,7 @@ If your source database has TLS or mTLS enabled, we recommend that you enter the "Resource" : "*", "Condition" : { "StringLike" : { - "aws:PrincipalArn" : "arn:aws:iam::984612047909:role/redis-data-pipeline-secrets-role" + "aws:PrincipalArn" : "arn:aws:iam:::role/redis-data-pipeline-secrets-role" } } } ] From 89e0c4fe6eaafed4ff85e2a02ae25381f6417efd Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 12 Nov 2024 10:58:39 -0800 Subject: [PATCH 31/68] DOC-4548 Setup and define screenshots --- content/operate/rc/databases/rdi/_index.md | 1 - content/operate/rc/databases/rdi/define.md | 40 +++++++++++++++--- content/operate/rc/databases/rdi/setup.md | 8 +++- static/images/rc/rdi/rdi-add-schema.png | Bin 0 -> 1775 bytes static/images/rc/rdi/rdi-complete-setup.png | Bin 0 -> 2356 bytes .../rc/rdi/rdi-configure-new-pipeline.png | Bin 0 -> 22703 bytes static/images/rc/rdi/rdi-continue-button.png | Bin 0 -> 1742 bytes .../rc/rdi/rdi-create-data-pipeline.png | Bin 0 -> 2705 bytes .../images/rc/rdi/rdi-define-connectivity.png | Bin 0 -> 34377 bytes .../rc/rdi/rdi-define-pipeline-cidr.png | Bin 0 -> 14585 bytes .../rc/rdi/rdi-define-source-database.png | Bin 0 -> 2885 bytes static/images/rc/rdi/rdi-delete-schema.png | Bin 0 -> 439 bytes .../rc/rdi/rdi-missing-unique-constraint.png | Bin 0 -> 9443 bytes .../rc/rdi/rdi-pipeline-setup-in-progress.png | Bin 0 -> 22292 bytes static/images/rc/rdi/rdi-select-columns.png | Bin 0 -> 14297 bytes .../images/rc/rdi/rdi-select-constraints.png | Bin 0 -> 14859 bytes .../images/rc/rdi/rdi-select-source-data.png | Bin 0 -> 22857 bytes static/images/rc/rdi/rdi-select-source-db.png | Bin 0 -> 11003 bytes .../images/rc/rdi/rdi-source-dataset-size.png | Bin 0 -> 7364 bytes static/images/rc/rdi/rdi-start-ingest.png | Bin 0 -> 2066 bytes .../rc/rdi/rdi-start-pipeline-setup.png | Bin 0 -> 2681 bytes 21 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 static/images/rc/rdi/rdi-add-schema.png create mode 100644 static/images/rc/rdi/rdi-complete-setup.png create mode 100644 static/images/rc/rdi/rdi-configure-new-pipeline.png create mode 100644 static/images/rc/rdi/rdi-continue-button.png create mode 100644 static/images/rc/rdi/rdi-create-data-pipeline.png create mode 100644 static/images/rc/rdi/rdi-define-connectivity.png create mode 100644 static/images/rc/rdi/rdi-define-pipeline-cidr.png create mode 100644 static/images/rc/rdi/rdi-define-source-database.png create mode 100644 static/images/rc/rdi/rdi-delete-schema.png create mode 100644 static/images/rc/rdi/rdi-missing-unique-constraint.png create mode 100644 static/images/rc/rdi/rdi-pipeline-setup-in-progress.png create mode 100644 static/images/rc/rdi/rdi-select-columns.png create mode 100644 static/images/rc/rdi/rdi-select-constraints.png create mode 100644 static/images/rc/rdi/rdi-select-source-data.png create mode 100644 static/images/rc/rdi/rdi-select-source-db.png create mode 100644 static/images/rc/rdi/rdi-source-dataset-size.png create mode 100644 static/images/rc/rdi/rdi-start-ingest.png create mode 100644 static/images/rc/rdi/rdi-start-pipeline-setup.png diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 3ac97c0c35..7092f259bd 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -48,7 +48,6 @@ Before you can create a data pipeline, you must have: - SQL Server - PostgreSQL - mariaDB - - Aurora {{< note >}} Please be aware of the following limitations: diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index a2cebe10e6..611766034e 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -5,7 +5,7 @@ categories: - docs - operate - rc -description: Define your data pipeline +description: Define the source connction and data pipeline. hideListLinks: true weight: 2 --- @@ -18,10 +18,13 @@ After you have [prepared your source database]({{}} 1. Enter a **Pipeline name**. This pipeline name will be the prefix to all keys generated by this pipeline in the target database. + {{ADD ALT TEXT}} 1. Enter the **Deployment CIDR** for your pipeline, or use the one generated for you. This CIDR should not conflict with your apps or other databases. -1. In the **Connectivity** section, enter the **PrivateLink service name** of the [PrivateLink connected to your source database]({{< relref "/operate/rc/databases/rdi/setup#set-up-connectivity" >}}). +1. In the **Source database connectivity** section, enter the **PrivateLink service name** of the [PrivateLink connected to your source database]({{< relref "/operate/rc/databases/rdi/setup#set-up-connectivity" >}}). + {{ADD ALT TEXT}} 1. Enter your database details. This depends on your database type, and includes: - **Port**: The database's port - **Database**: Your database's name, or the root database *(PostgreSQL, Oracle only)*, or a comma-separated list of one or more databases you want to connect to *(SQL Server only)* @@ -35,10 +38,14 @@ After you have [prepared your source database]({{}} + Pipelines are provisioned in the background. You aren't allowed to make changes to your data pipeline or to your database during provisioning. This process will take a long time, so you can close the window and come back later. When your pipeline is provisioned, select **Complete setup**. You will then [define your data pipeline](#define-data-pipeline). +{{ADD ALT TEXT}} + ## Define data pipeline After your pipeline is provisioned, you will be able to define your pipeline. You will select the database schemas and columns that you want to import and synchronize with your primary database. @@ -46,20 +53,39 @@ After your pipeline is provisioned, you will be able to define your pipeline. Yo ### Configure a new pipeline 1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. If your pipeline is already provisioned, select **Complete setup** to go to the **Pipeline definition** section. + {{ADD ALT TEXT}} 1. For the **Configure a new pipeline** option, select the Redis data type to write keys to the target. You can choose **Hash** or **JSON**. + {{ADD ALT TEXT}} + Select **Continue**. + {{ADD ALT TEXT}} +1. Select the Schema and Tables you want to migrate to the target database from the **Source data selection** list. + {{ADD ALT TEXT}} + + You can select any number of columns from a table. - Select **Continue**. -1. Select the Schema and Tables you want to migrate to the target database from the **Source data selection** list. You can select any number of columns from a table. + {{ADD ALT TEXT}} If any tables are missing a unique constraint, the **Missing unique constraint** list will appear. Select the columns that define a unique constraint for those tables from the list. - Select **Add schema** to add additional database schemas. + {{ADD ALT TEXT}} + + {{ADD ALT TEXT}} + + Select **Add schema** to add additional database schemas. + + {{ADD ALT TEXT}} Select **Delete** to delete a schema. You must have at least one schema to continue. + {{ADD ALT TEXT}} + After you've selected the schemas and tables you want to sync, select **Continue**. -1. Review the tables you selected in the **Summary**. If everything looks correct, select **Start ingest** to start ingesting data from your source database. + {{ADD ALT TEXT}} + +1. Review the tables you selected in the **Summary**. If everything looks correct, select **Start ingest** to start ingesting data from your source database. + + {{ADD ALT TEXT}} At this point, the data pipeline will ingest data from the source database to your target Redis database. This process will take time, especially if you have a lot of records in your source database. diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 7901951cbf..cfc8bd3705 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -14,12 +14,16 @@ weight: 1 1. In the [Redis Cloud console](https://cloud.redis.io/), go to your target database and select the **Data Pipeline** tab. 1. Select **Create data pipeline**. + {{ADD ALT TEXT}} 1. Select your source database type. The following database types are supported: - MySQL + - mariaDB - Oracle - SQL Server - PostgreSQL + {{ADD ALT TEXT}} 1. If you know the size of your source database, enter it into the **Source dataset size** field. + {{ADD ALT TEXT}} ## Prepare source database @@ -87,4 +91,6 @@ For more details on AWS PrivateLink, see [Share your services through AWS Privat ## Next steps -After you have set up your source database and prepared connectivity and credentials, select **Start pipeline setup** to [provision data pipeline infrastructure]({{}}). \ No newline at end of file +After you have set up your source database and prepared connectivity and credentials, select **Define source database** to [define your source connection and data pipeline]({{}}). + +{{ADD ALT TEXT}} \ No newline at end of file diff --git a/static/images/rc/rdi/rdi-add-schema.png b/static/images/rc/rdi/rdi-add-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..d7053d35b6bb399f14f0be92982a53906f0efd92 GIT binary patch literal 1775 zcmV#Vx#s=Df_x#_65>8H2orncy$wCAF;=Ap6Xpt0qjujQVv zc`mD*vi=5nwoZE_<+liXnh??7nnA(Pz+Ju$ZgO%8Vlh=Wh*MO4OfRWaJ zk=A~Y)_#!HeUH_Aj@5jQ)O(H8dW_U~iqdt7(sYKrb7##?X3S#HHxZNyh=#8qm; zRB6IeXTecs!B1qsO=7=GVZKRUy+&QUMOwQ-Sh_w{xI9z0I8U`SOS3LTuq8dLzTAU~ z000EmNkl^#p~E|<&Ya=BbCm&@gHtulp0 zo|3Y1<$&_C5>HWKW|alSrOGj-#RV%rnI7dN&k9fLdgZM3E67}za~Ex*(sj%2EK-gu zT3%RqQb;{QgZoE~ozm9E+Ob4BxMq1KSXG@%}4Xj6N$ma1=W zQCwsDPNi4T-d?3F@}%x8P^NA`gO>P$S;dWTQ|Z;iZe>$J_NUNl8!oT9(Bd~3a{b*( z<|1HKuC~z9HyDciekI`zav?}N)CJKs(S^)`B63-vYCYtgRS zcxZjX>lKX~6t|;BhR+-=s(N=rCbvhPOhcdHR~;Nu#QV2`Fy0dl?HsYN?zX)W+B*wa zgVhS_9$A3Ul}Z!Z^2CN z3lIc*k4*>|iVlFGDI0Dmm68;pWf_LvbrSbMlZ+==2c`PQn9zEQ=R2j=APJ!%u6d>H z5Bj7I7^#t3ru$4NSF7Zkz>?Gh$0eP`+GIkx^R_xn>OR%_VY8%rcblcE@4%-N%2I@u zXBN5*x)e4QN!bFYoD*xC(BrU6VVwz~+n`xdeuBREU^Jw#y|7(+#uXV895SKKyMBUR zNmXz_F@+keEW|lQ`Kp7QR4N&S`dJuw~3~K~lrzsRfKvN+qk8?s?)u z71BT~^pXjEj9-rNgivk0J`c>d%WHFD={)L$cEIhwBhHx6?<1jBJanT4fq(w|JxyqN zRtKY57>$^O9;pjkj=xOkHAdx_GocB#oSWl;^pt_5p_S08sN|u?u$!IVXzI|iY)&tS zp;1xy2uO8APEt*5FxsK8190>8Px|y5L0_^^O>}8Nt+=Pq7Ja916YsZq30nud_RQq?YqIAnt`z;p&9@tr)}s- z9=a(AfpHrEXbIlPg30&5Ip#t6H1{l^S^1`el3T$sj)(fD)(;J z64lME8x`aI;JuWG@hS~p%QmG^y0)KPFXxYUf!35Xi={cbD4LwdecYKx53uuRNg{t1 znet}YaE(l+`Lg6)>~7Y`&+Rw4J)f?3x5(x9rpG+m#_DppTrQW(<#Oe?{{Wt1a%9el RX#oHL002ovPDHLkV1h`X!z};+ literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-complete-setup.png b/static/images/rc/rdi/rdi-complete-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..39450aca0539b9916cb22aa939870025432ff1b3 GIT binary patch literal 2356 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 LNkvXXu0mjfp!S@B literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-define-connectivity.png b/static/images/rc/rdi/rdi-define-connectivity.png new file mode 100644 index 0000000000000000000000000000000000000000..1b8ca02f7da0d9891cce4db852c9db24902bb37d GIT binary patch literal 34377 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 T%P+|9ae%VChFqPDW%&OAMRp+M literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-define-pipeline-cidr.png b/static/images/rc/rdi/rdi-define-pipeline-cidr.png new file mode 100644 index 0000000000000000000000000000000000000000..66cb61caffb498fcf5ff56e61e37b3ebe249edf4 GIT binary patch literal 14585 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 G@;?AGdJ~@j literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-define-source-database.png b/static/images/rc/rdi/rdi-define-source-database.png new file mode 100644 index 0000000000000000000000000000000000000000..3922b68b64eb669996763eae3be829a788e7b62d GIT binary patch literal 2885 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-delete-schema.png b/static/images/rc/rdi/rdi-delete-schema.png new file mode 100644 index 0000000000000000000000000000000000000000..aff121e8a7f306a1025ad645cd0be7930eb1c3e5 GIT binary patch literal 439 zcmV;o0Z9IdP)pD3*iA>{vm_D#Lez6FG)%HD8Rx;X`8Abd?GlN&MH z;X)*e!5y1<&#_of7rb5i7qSx}d*_lKRN&DeSv?i;tJbnnl}%@{)W9k&10LAX(7sku z(K=^ODtv#w^yiNuApJs!sc5hQSpHzFi%K;TAen#2Lcr3KGQ$6BBEYJ`lthpO!D=0F zViw^OS(xFFH3^(E{Ap78=+hhpjiW2q_{giq6*K{I24Z$56f_Yusiuhq4b;I|lR!i7 zX_8VCYZ?YkY#%Z11M49u15R~~Yo{NkN(RlL?dCbdx1tzKpT=nWd6r5ocy-%isU)#g zH_;^LZUarU$c_#D30U^73no3$Uohj>-T37@J_?KvCgWq$xX0cwLaGPao5pMXus{Cv h7=H*&CX>nM`3C6BU9?hrz6JmQ002ovPDHLkV1oVh)(Zdt literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-missing-unique-constraint.png b/static/images/rc/rdi/rdi-missing-unique-constraint.png new file mode 100644 index 0000000000000000000000000000000000000000..23871ce556b417a2aae53e966ef6c402616f294a GIT binary patch literal 9443 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