From c4d39e60f9d8856fd8f70e29924a56afb36e674e Mon Sep 17 00:00:00 2001 From: kaitlynmichael Date: Mon, 19 Aug 2024 16:00:30 -0500 Subject: [PATCH 01/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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/39] 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 zcmbtaRa9I-lOCK9AOv>^f#B{C90m#Q9^47;8i61)IKg$02^JiJPJ%mwy95~^4DPyQ zANS!uXLtM5!##Do`*u}-Uv=GEH(FC&5f6tF2LJ%zDJ#iq0{|F6002b^8|_I`zA(iD z0H8K#s_H5{K0ZD?JjuiT{lne;{oUQe-QC^o?cL3j+}vJY-(FqaTwPsXUfoDl?o+2zUU#mVW}@yY4Y$@$Uo$>H(Y;nB(d(b>V_G4k+q|KM!z;A9_p z_!oKncmH5_|77nka%XRUd+&IA?`UiHaC>KO3$eR_IQX-Du(`dnzKz`2Lac4>uWxLx zZ2VpRv$wXsxv+M&xVF2p`e$KvXJ+|iZUwQlygs*#m|aH9EN#y(uFNegPc3ZC&M!^Q zZ%)i_OwTUDXE(-Y|BTJ7PfpKIOwElbLnY=!kT zz$WTDCw_MH)OEnC+s5jD{;K>rQqeqI)7VkgH1xe;5L!Q2Qa?~x+ge=LUtH5yR^41! z-Irat2CZt!uj(nSY|N|bE~#k9sqD(G=*lkp4f$T1S@tU(3QI0tN`u0_m3HP8SA8q# zNGWd5F04p`v}F~PCl-Vpz-Fe0t~ z)3-WsO5W$xx{s-~L5b7hDYfA#HL*!Kp-DAS@max%)j{z;0^+J7K`vo9*cJ$;3O;!Skb`XNIj?sJ?rel}pe&#~$qu-?W@ll)$^$Z1%~s9H#vFx- zViQq&BcQ^-t4PBxOZG+rk46yXC7S_3$pHZHYFAlaM%RB~f2t;i$dWj6UFQqBWnuz@ z%mnM*i1+hPJ;bsWSqj*W?HE6-Oq>t<#0fa%RbMNO`WWta4n=v`8KF|8BfgJa4+_&B zFv0q}(fV0nVHi*R`2RMTXsco6AMV&`K8BLw6r(dJS*bQ+bh2FA93AE%#kZ=cm>dul zl{MTJM|=K9cW)^`%qH}C_{K$s6lCMn6)1(TS81NDk`sjbS9?2tXs05D5VnKlKb2c@ z_Hv=P&%ECCplBZ)1_0giGCE5<5bs8IT3i=ncX<7IUHlJJ`2yz~!5~x#ijgd+Z$`#f z^5jhTD?Xev+q28l=JR_cAhTQJh`>Qbqg&c>e2*PJIOx>Z#LDpUhjU0sLzLvuNbBp{ zI=jn2!s)hUGs)OE<hy481z2%i$doKCu?@T56gA*P5nvZR zn?sM){n!Ics7_ERF~&A=O=B=r$|L}nTlxvm@q4YV)|^t%0PoONN;@u>L`O{21Yai^ zzD|TstvkL+*B8BEc=kY@qop?ahr&!+BbfP!+NPd-`fLha6XF)y2^4~Lp3V}PHIJwR za%281QlW8B3HpBnTUU42;cXILn$uN`qLf6u^j6T8mb@v>XUfeCv+#Mtn^A!3|CZ3; zns!W0{VhJR7-{tbE8%;HvJIO;b?3#bW}5D)I!e0FvFaKduf0qWM`lTg-J2FSm?aL37G?iuY4Dr<7nbx@ zq{EF?6eFm@_R|-1`<#idDsK9i(Y_umf<6hhWurDR)JkBzSw4JmBm+#oEW~nM^K0#l zyyQ1V1AWwxM5c(d$eqxYvHc-VXTG+nAe}bKEN|jy8)8i-;1zZi&z|nz88D3Woi>yPMJ zm?fE~@){c=8W&Ocxp#lBI{=+~bF_bJ*fxA@VdO+EyuN*wr-hrR{gA7Y$vb}3*S|`Y z({=B&eD4reCl=lV(hAFScM~AS*&^2)3Y`2B7YtnOBKtWCXxj7ywPd9|m)2W|L}Sv6 z8>Bd&{fWe1&q>-=$axoR#q$n3yfb%oumj!P zq66g$G;`s`xLPNkAyIJ5>eXhh`3LDc-}QR$jD3m(Piy z1KF_onFuAvNmxj6r7Xvy-aap;P<9NB8weGWXxbn?bPl9z|Oj;Jl=aNCz#N-mM7v=w^*XR862h4$m_=LO?A23{O2^8#@@0v+0n&-w0zcSB- zf5`2UDKYU9fHZ*M2M)loRNfn!oz@DZI_x_ikj(4u+WHCv%6u23%;|4FVK#QC&I^$WEw|#AVB3yAg^(tmJ~bFsv%HHRxzR^yyuU? zy#N8p)oE`vs49^3GkmN(#OfrghaBFRH`CB@im&q{j4 ziE(l+s3Gr;R55@EbM1dY!J|oZ#t?%8&bl^Te8(P+YmCm38)o^yv=~q_B z?NI}R+C>dW9radExuvbHs)BQ^hEZa!;p+ScV?y6J>j@&hfYkk$y*HYw+5}rMC=Sg8 zCqlMVq7OP`U*FY6hJRBr|c)h!Rx^-Q6hcSB|}mmC%e|n zKoKKHRzT3K(7&CahsvZGv$jKzrNH7nL@&IoElXroKF$AgdnHUUEhw&)`e#{X{^mU; zUG8eys$YPclm+j*>Q23KWc|AG=%B*~9rDo~I@p14-OwC}>kjYj%FS_L`{yYcEkIGCWlWt`7h|&lvjw;?5jlv9of4CIf ze+AkmaFB5LAU_cxBnb)A@=prZShv~Q2W@i!-d1)E75$h%;!$S7gU#MzhG0lBv0he< zhvH-ntZ^=Q?PdkYjOo|TWXT{rfv3W4z*;OotO76yiRlnOwu1u@c)j~pTpY5@n0%Rw zGG4_z(6IdsrtB&14l_VlFku;PVUQv)a!dL z_vT>0IpaVR7NBj3!xm=WY8Kw*l%)Ft;J{g&22TxrQ2&u=>W?ms#MA^W1!H7SH5DY< zyzu1{WB%R&n2TiuA3GN7XQ*oIo-8Z`n~zyH=e^Pq*0(=7 z7V{f4YpJYUq{7SRw+1rp;+aVlj{hX&XH#}7(+$IyE^Q$HcWrHDc|T+N0Qv42z?a0R z{J)gl5Z(}DmC4ECHX;awTm3yq(t+rG=;<_qj_I-5xr5ua$b?$z`Xi9(i!>@>(G5fX zN8*Dja#7fGV`bo21NrAXHico<+=@tx6L>;`8HA`an>xSOZ%5J}xHlo<1*a6=O1=#VTaETiTEu9vF_ z4f;EhZDiI<%-qRUD?%kgWhdGLz|i;L(6428s=-uXOfFOG$9&2hG`n4a$dC74%75;n z%^V7KqEVxQe}UnGBC6TbR(y@kM{>?7Urn5J^)GBG!P}Zvl{A{VTlNg&ZaUpEoh7Hv z!{+QqM_AK4{FXc!8xKDjJs#RHcXWTtLP}T2B~ed^42-Kl+$c(U@c%hk2uj6^$nTY9 z@VwNwjRV_ZrjW<6Hq4Ga@QaUNa>pC|CTJNvtOQO_{a#To)T)f~UTV$R*_&o3pRZv= z5BwkpHb*ak4vvAw9g1E9x&Gvk-E9&mHBBeVxi0n`u~MEhixK6HuV2_mJLrCi_7l44 z2S!@`2|-@a8H;T&dX!<;pUh?ILk}IECFR$2>DjX$>#LjEF!3`I43Ka4SDC*fo^a7mY4Q?<$+s%GD^44bqD>|LF;Ot3pIg9v=P#X>)vNUhDDLD* z6(C|^?%rf|w$YYk2tL*XW>3bjT;taP~d19mU(*fg-Ij!`1DE*J^Xb1Bx zxvbZ~ zZ<=wq#R>nTqSM1c-cqs(zNCo*DtfZiEUC!f+-nMPE5CV-$j3k8_j zgV_)jaKX7YhS>abZ4|>}qQo!^+ij@4)L_^?)0?k+Cc0r?__EG@cbMk(1w|-REvvqt zu%|KrBLl&N&hlz~fEd8RQ(lb5&{u?zn17B3;|CHoq>l68WJ zAS^k2Kk_;K@l6Jjx}$-r2I73Ja$B$@8=3c#61s3XA4ONTj(^%v{Jglorn<3@Ru84# zr~w3~>-J6`ML4Rz34PdG6PeCADrvE0+@EID&G^!m82{_*sTL%kIiCbzxO8$?1Wqax zX@bW2BOHr5P>keY5zZVFUx{6ZBKWOn$Iv`tKqm6Hwvdrr4H~q@F6IuyMuIYe((T=@ z^3sUVIW53Q(ujop4(09c$uur9f3{MKxOZ{#1;9}G43Mr8!R-dnv>6<%&?+td%&dHe zNqopiS%)F*G&OGON-3Ba_x^nsf1xA2ALqmkfTcv?2}Hkl&w}X9ej}XBrDAj>;5P*f zDPt=y602^3+{zf#QoGLdU}_Sxk~Y&$yo&eWCJh!wcB@vhQ&MXe#WL(+-##vhK3X_T zS+VX7I5Sd?_<#mibjdQsu-Rk%hL%T1^m(l_@c_!uGG5N}@JhIc#kmvs&bIho z-Q<>T*jpa9zR+0(``Yz0r1xcc?kwJ%WAgO(>3@j^#P>4<<_JV;b|&;_i<$+-hQtFK zVm@K4iKxq)!L0xJZr>`0`=y3CE{0t zPEH?k{ycIHzF|SzpVo?YhQ;+Sm{5cnAslI!8<|8f>yJaDysv@3EMAggJ)b8?B!6;J zbH!Hu+N6*D$SOF-O0}*L1(cw0$yDa!Ctx)Wbrg|bKe(Xipz85z&-~qzj$t$}x5i!T z@8T?gx4+lXuvjOEyF?$$ps&DJA{qu5_84bw1U6N2;_U+-2A@JzIdC;u0k2wKUc4Wx zzpybXG-QUT8y8?*^fR85*OBX+hsD2#h58JDyKMv)JfvSxy$_V ziF=3jXT1t{ken4Y_@qv!vtzZidYy%^w_=#m$M|MOnE~(ZdL8{g%So@2(~Z`|9B0Cd z`i%|Vp!bY;P2$@GNXfSZLyA0N^62R>wxBzFTU%(e=ox~0oZD63X`Wfcr<)wa#gPj* zQQ~Vgw}xPX+31X13h3=*^c!(WUdKiju2hst#|RuA8#+v7fjmYp&1B+T!M=6+lc~u}R@HQE6=)z{n}q_`u=DYFQ%S>7n%goG@>WkvT1eY^nu_& zlR@Prlt88APgBtEKPRQ>c(c^GtYMsqf(CB{%E~SGjK%qc&q-#W;$|Ii`FFl{R80Dt zPp0;40jibrW}z&=`p+cd3d1R_kUGqNh$kII@;iIy2t1e89R38|C#UPTQ+D=7b8w#K zuvGhJr{n0oI~I6n7dN5D4JN(y6fpE4O-f$j@$z8z8YSX6>1arg$;{etmqJnzP%im) zy!tkjDa&>9dTx;C^G)Q)fTz41G%T@)+nslBW(V777|?j;HTQ2P$CDJJ+vkVO!N7h7 z%sa(c*L0T^l*kGY<#}UDayka3vd;7GS~_0uQAfI|{~T@pv@o?nR)WR^g*B3mxTL!% zNp^8wDgC(wEWLyj4iOWj07xZ&Xw_gu`rhH(0f*oDDW>633gUm|SaQr$hSZI^xeAih z(X+>9zeTxMBy*1Y6N)$IcjN#?-Ylw-xcA{Nn}8ekQ_ujBW_P$`SLbRSu>GGw zx#Wk@GdqdpoX<%pQwRD*(OF8<63jf)gO(~=P;x@7zl|J^}FoadjHU5 zj*2t~_g*Eho7DlYfy!+1s?U$~L4$Y}DVyj>6f&jPR;L(GAQUf@9z{g;FT=IerT6>h z1=to4v>(1}@jfrCwPgvaY56p>^E`i}f>LlaV3b5aLlzPUW*hdK+Cj4zpq=_6n2a1L z3c%EpYrtWX%XC@TGL*g^dXKu?NY_3W(yYLA=L}1@m#}`Fi0zdlfCoG5?$YA{~u-_NA7?sQ?%gFkO_!vOqZ^_9*ya9zMQA ziDAkZ`>VM)B3{r|YJZ@jJr#Zk3;6-;f)yOdjaFz~f{zal1VlIEs*=^#(0I5MG18eu zWiCG|-17LZ|xlNs+V$GuB`MDQrEoq>O35Pd?-+yVDr>HE)_99vAIw#&YYW(sm zO0xoPL+igp7Gr8GE$J@=4m5~@-ub`Q3dA87cADx$B~C*K70e3T_HdxG)2x5=$u7~N z#KLL%jfd7(Ex3TQ_P%BcUFD1_OB?_V6aLEQcAT;!dc>t9BQ!$opJ7(kv zqXwgv=I(Y)RV+QXH%{oKpZAw+^zP7XHOR`v!1{%g?o&+V2*l>7zfP*Vqna0}zI2{g zy;Nm2JbvfKIJte~6m0L}6o>YE#!9pfah7qUYp~a#aHv+<;+O5q z02XU~RUO*Q28lZ0IfD>;BhZmhNFzMd%gYTiY{Ib0FnE^uWWQ0gpkc7P;17dNv^g<7 zNHFA*{HB+fS|4Ji8d(cNGDmkDU?(xe%rwj#aae9x5THJ5knUW)SNEb%XO<%O%}7H=u|d4C14UnN z1@%PM;EAazoe5k!6q(0`s;Tp<7U;Nu^X<_Gdq=AHXIBu52ULw9*i=4xq+I@A5>C1< zy3Fi%s-4Ah%wQF3k9GSm6^E=?ljqHSiR%A+iCCZVw4XtB#&C6+kJ7lcwlz0()v|OxGk-U1MK2|A50k(PSMeq zGAr!bT&lWr2F^A)1icv2wjWd-<3W^inY-qx6TLY^d0biQ>bcK5SKLj&3lyEXzTiVfCV;8n%BndeD6oKdvrd8c(&F*v@rYh@ypGDW0?8> zUMUjEub3X3fa?EMMP1WyRd6YO8PL6m4l4?_WlGixM+>6#cn3tWA+|^Yq26Kj@?}<% zf@?tAJ$nPI{Knir1PKB5m6X02h+D3!C+W2$?|eonLtSLTN+Z9QAk7+qo`@S`Vp=r* zJ$dcVCIfLAzAQb2ScMh)lSoRO?6VK}3^=7zh6?rP5{L)t2!#JzrCH2wulsL^2XwNq z+GN=WGHn8I?n3DlE zSK2|OLk%}ntvNPlb%eqX8MbHRRc-jbA@omUI3V0Y+%!cLIR<~`W{rT{**{62MwkH= ztrwYZTTLE>A;M2ubmfijpe^JKD`A)=;#1GP{HbwwUanaY5TC8rl zMm)_C=$9=*l~R;Z&0OqLnu!V^&a6Q;7yUxUA>VhEeqf#s7WezG*vf=)XuT+?{La2H zq)vwvAgx^>p!fHAIUjF+5O9y^v&y+{iE~7CuEtE>zsmoAXs|B+83&{S;HV$jKxw@f z14IXi!Zpb%fN-k@gD35|J{iQJfvU-&oDI+);q>=$6=Drvy*RKCtZKnqJ9<|S-0Y56& z8XopqAg2$wP>42l+sQub&7$zg?A;WF(ZizOKmdF=S!>zg18MaIayyS{E|-!L_3L`&sYI{^Ep;&J$>Rb^OT3}nenzUwdb{m zWK)AF-$Lt$r8%cwB$a&`TV8pY6DPpDU&Qvz)J~8N%M_{4%fHG+fizRB*v{)1k_CQ* zT%I{nAMNiZ@Ke6G+3vdJ?(Mi{%d2Q3MOIdYRhxjuS8dAc$VAL+lTzUUdRcwAXgC^+STMYR^<-9vtX{H>I%wWM^=d&r9MqG z%f~&$!h_3{yJd4l!AaW4mnR>b6Ltz5*eUSgZ+vpgr=+nH&rf`mlZzRZZxZ6eSVq%8 zw8p|47!(+hh3NI7*%hE(C6;;?#!O(=C( zfZ(Z&Jhgde^0n>0$;cfGAjW#v;rmWCe@oK)?CZbwm*U)g-VKjIcP2Sea|3y=|E#r$ zZ@UOo<$(?RgNe=DMn=>WvU9SWed2QfB9t0=Jp=takm2Cwz+!&Cjoab2Wp7?D#6j_Q zuOXA4FJDU8hCcNE%suzCJD2&JdJVqg_|w34dT{-GwlF7y|K+OvN_=zjPa43Z9WE_q z`xVQj9y`1_x99T*ZmLJAwm83`Df#nB7hUf5Yek^24e^zqbqYL+{XNpg`gSq)_-lE5 z*3X+`Pl1&me07s`aj8hV;95#>tKO;pUumG*5X(_~FDqp1{)fbBhFEpFnS%oFwD}IT zA(=g5MT|zlIdq0D8o=!`{Dki(@IL|mCQ&Q=CH?<`7f*ffpZgw z;x%kNw*shwdIE(po$JhBgh$tyyY*UdPID=K9H=pzeaCB&bzT*RN@V5Hv;z8g+fX%2 zwrr2uyYju~yyZbK4rYhP^Gaw#iNp2aU>ack!OhQ$^*_X;|8(o-h9+=iv**W~=?EduZ;`r?9 z0Ivy*|HuKK~oGw6Zp{ytA;hI=}dPZee9|?qqg;d1h`2I=eYFvsAY| zF*%KELkrmkO&o#jo?+J?^3hS6$BdljUu7&1~+y;1qArJ#1G zyr%g_1_HbDPt$OHwimBhuz0vl^4Y1!3U&g!KIQwC};` zkf4N_*p$4O@m1at6QMES;OGpG*h=?MXkb)Y zKxC?GRJl{&sAG7kZ)lQtaDr_}v1eesjn9a6P?7uBSj&JPAkQIJzvwT1-<^CSzqk!L zc!isI=h=CL8awsbxP<^6dJWvaS-Ax1x@2nG^jbK6HFx-`N2zUGqdy6v`;s- z_Exh^RW<7{1bG52+?9;mbJ5sYtrRpZ zWj~qoe5{jJGm}s@7E?45mIpFPRK1tcbAhB{^wrpWnyxyvqG%2$5Tx(r?h@58jD#Y?FDoU7<{F^owZa%-7)oO6ku;Tjn4-SLNr_z!#|Z0aRz6^rGeDuzBwm|bPSRK-oJ;E?ZI)Y&8&f= z1VUx?Rkj9~kf&#f=Bqf@PZDV`BzLx+5+Wcq{prt1NU7}v6z;Bw_|m$S4Pf}}a;^wo zND8`MCHchi^`zX(@hO{##z6ookuvXbMO^uA0KmT-F-Iy5?btNrw>I}FSeO;Nk=XBmm28siigM381^mQY zrYlU!GNSwY8eQbSLa!uQRKDXCm|whZ1T)@&2`U*9htrF|f(7 z_8OCni@P=RZw!>{yGTM2m{_F*b`6mFBm8v>vS~pk5{i_4)@Va6S~{|BW#D12$@^s= zM5iY2iZC41KZd8fOcT!Irx8zm+$)oe8)he`O$)-6o2Ge?{XnE>#vPd=pNdaP#7xA? zieaxo8vZ4`sP9neD{cu9FK^EB#njql?dI9idh3#-$B84(qxkW6$J<>0nOHt}#HbclYEXuwp*+`1U!P$}0~ldBacvCR6`yngMX&Sd>gPX+m7_+I^$ zP@R5nRuNO+N}`n;UxX+2#=IYe9N8Bxz3o9`mYa6+1QB-^=iEpQ zGRKl)=;Pa_`3e05R|C2^KkSS%d(tgL+%v*dnzGnf^>}?#)@IbOXT_ng;{izsz`S$f z1bM^*gS3W1eFB1hU)%XjnwUo=`aok!B-nq18Cg#(i2evsH(~p-dT)a?)~9WhB*i8O zR%u-QO~L(Ms*8b4^mFUZu~>ren_}adnP2Wlbu60XMAEvt%=PtOlkHa2hMAl*9)2IJ zu2ySr(g#l{M~EFJHS53Tb70N=C~At?V*+JkH3>uz`L8caH#>)j7favX`>8+sj`C4_ zU2Y(^8C6^jq@n5?bkdnj2kbZ7D{&T&x-FU0E+reIx?znvApR;+#BKqJq^rm#&3m9M zb2C===!Um6nPqY0qG;mx@zEOFIN#yvL35tc@>RgH_Du2aiXTF^+O`^ii=I+$o3tG6 z>DRs(zxXU)C~1X~b&#{=_&VQ>{KiXz?T#J^q)PORwKU_{{CS^`Ab|Y`HUPbI$B0H< z#{mW{3+*IV)(9sC(R|9MzmzXWDY=U3JI4VX;3^lJ(a*T>j=z&h64?c>@cHpLHG)jqN`q-JzSQakqsyV{gh}bHpzxo0xD>vI zlyBYnS$wj@-(?o99r4f5G@?J+m0DiNBwcYCn~h-E&#ABBaUyr+bQ@`TvO3Bh=N^4@POJSKPMh!HNggI}|!9#IU`D_;u&~Gt5 zF2FHj735vm%onG=%z{!_1GQ$^Ja^lC49d^Bei=P z9`#X%-&T$kTEw3(tpRwd92IykR!rFjt$-o9yzDMuxj^JiqdXoFP;BSmFA7W+9^^yv z=&7X%A4oX54LQYHP|CplVqfr+ujc`@!@5HN!acVcxJj0341%`kyEjte8n!K^*{)vw zV;DL|(-G&rcMV?&2Y$Sdwe3^q>_*a*!OOlTM!x_>G=ENp$aJH0XKnIns{KP7$mws6 zp6{bg2ix5LA}j7qNKKs+uH>{jss!|F$(4C{kFBSSwS$V%)e&3SUpPb=9yG}lOP8(x z6DETGfK_CO%}0X!3LfRt;deSern|6 zZ(+b^XFFu%S}E-A*%;FSr9USHR|!u0mErd8x>HVpIXG#WtI15%fZ-Atkkzd^+g6pp z%dT~?%UVJ<`~4ecfB9*|K{7mQUcHmPX>m>d2AquvO4BK}hXmaHpw}+S0VQT2xoz!D zQ<@Lshhor=xvFP#9LYqs2RYX)etyCE*CvAxB=S&;*niNvEjT4d`IO#l&AagvqW$H3 zV0S;CQ7~AvZiJ;~hq*2<)0oHJd)ej!o4^`I27&1B>boD>KP^|l=pV)8Vh&xAT?aNI z^%(ljg7q4z4zmgzT{!Dy^LZ?!qc|i)9x&wYzKDp6<5N__#zpEMlGXf}33rHs6Z zdDj{NXLd%P2S{h-<3(BjO(ahq>4nX`sJjMXJ{Wntm-cu!k!M1Nj%;aiY;VSm)Aru9 zEy_o(z~Wa}{U4N?s4RMI%+bG0wT>$mbF>Xr^*{@pKRLt;W@`AiE^o?9=+Uv3!B1i5lHkAGCxLK1yTu^x^%HT8ZnKxph(>* zgbh0z4czUh#gWpOpF)JJ+*gVL8TMX}+ltJ+IrNuH1!o+SfK zAxoFghP+*K*|~7MG%(DksJ);rpN9O)0$+Ifqv6pvADQ*m#0;SnaCVV&4Nu$q0T>Cd z!D-i_qDxt%S6y!6i$(I7u(y;rq`{uB&XatXI`-hGc@F;d3bhqi&?Z?0@rHl$(BH2~ zo%0Ag!B=t-WUsGcdTA7hgp(vUR0w0N`OPbtyy(nI9)fh}KpgeM^YYro!QjT5VnAfM zFmG< z#UAYa#8BO?^1)ty%L4srXB;G^v}WM7sg57IUFj}{fuZLpbY*IBWZN2c%F-kVtq4lS z8Wes$b8A{@!;(EeSF~(#>_&0T`nEg!yR^hd?6PO{n27!qnp;F2KlVj-U@-60fD7E@ zobf5g2En$KCN`2cjNiMqZ(*$5u4q|--ZtCw-ZP0rjKCHuimJ4zmVK-B>2#fxvw1|g zK3#B;>lgJhE9mvO5lq>o_59^0O={DyPTxbktLWF@4Z5z5JS@j0K7U548w|&;Ko!oY zl1$`gkjAcnJx1L4&xpTNhu5mV;Ga(lF1eT63?{8ZbCT~2W%%YknEo41qi3Cj?N-|6eOPIaxxp? zzSvqtF5dA|Jm5H%>~X}+v+1UL=8#(c4Km7C_qfqYsxTAVR^>4mH|*YD zFHPvXa`mu@l5JBgj{^Yp+2r=8@u^ z`yb|f4`*^9P$X$E7f@yD$$Vx`>;0U&(Vmh|N%;k-bmL4gG%<*0g zp!2m=V&_!1lkSfF2Hb@B_qeXT23y@9G62EQ573}dBQRv;mCuE8_yU0ZWWMC&Nbt4@ z0V}^4RdWvU+gmwDcb0Owyy8MkGjuVtWW`dcU^8SuDjpA(H2STq%bVVdw6$dMDco8= z!!h`3!S|p6V56kzA_8Ph3!LNZD|Y`_@c^|lM@)v@Ksq?|0+FS_t5CN_uFS(P2y0m| z&5kY$Hqi4tz*?rl1^04b~HO3o6F3Lb=!#$2oAu9AJ%Qm?OtfP zuWnxl_4m9`SCWbzsx)(6=dX3+ow=hXn=;FG!0T-<)C3PHt+-3Nhkk6QqGLMy6ysr{a9nbN6{K_l{gAv+Iik0?-UQ)wD`S0Nx}ypvyt)6XWM@X%|NP2~yw- z_2l3PJbDVU?;A9}-j#ax$VB|*r)1ISn`!42+wD{#cUxtn7da6cE*olstotdiU zD0uFgy}YvMv+t6-R#_tWBpY^cr>K{9qrDjj2m(`lYG%BhaD!ZH&swisif3?{W;9z= z>mSk?*OW(QqVm+{fF$^tT_xXDy;J=59${!DS%>2LOGWca)@thFM6nFFnu69?7R~DL zyT2|C77}ItL}uI5Su22KkXT*EE5lU)^_vU>zP;q!FBa-bnH#9V*N_l4SYY*Y% z?JT}XJfjX^E51Lun3I^09Ic(aC4F_~VDh@kDfdd8IS33zw(5&XL%=yV<&CxfS-f+Bo8`vj1w)@x8CK6R-)4p{||-0}=bn#ti2 zVV<8lOk@lFGT7l$E`8Nr#ZA_-Ulk#BuHWNH#XmE9K5AQ}!SV-@eOP-g90K|7`^}2{ zxrmv+f3wU1<^B_rGZF`#P|Aea$(E|>(p;&0y7y@AtPI4p%5boM6uJs{Nq(=a+I#7x zbJedO0_Y!`SWIj_zjy`KWQ8pF`F`IY^xzE2h=anr|9q#9G*eytbUqFe5Z>Az$xJ=m zim37?&1_A|NcFHf19U5oB`920H6!T39@GV(r3;5Gbtt_TE`=g&9ODp$A0HRlOBL)| zz9qj`Vs>+Er7^KWYkULg&|;`KMrMRTjNYR`+5Rca_zqGU{Lm(jfE=seFECPxvF!Hl zEA3Cr2XE{94<77S+Eke1-!!M~A8wGZD0@tQ9X$GjaLC>3 zpF%vct73y|kboaJj@WWNfa;vRUmO3K*PNpP*hDz&Nvc!BI6j&kiu?t63Mz`y-(LTO zsW6$*2@(IP2rfFx3x9MAgyzG{oLc0awm04CtH^|z|GsM&s}OU2cq$j;%z>d)(YViI z5sg6XZ#i2ishtCYZ;9aIQ*qpIRiomu#O=GcR_Q-6OrT_uO}|3WEZ_HBt^+qLjnyAb zfPq94ZXTUE(+t+%Y`|fwjFMCE9fvcK6Mr=^?ka%SqOkT4LsMX2Ocg2Cf0akoQ?pOvq6sT z1QhhZMO5hs)UCqyNTk25f18=V!L0rSEQWQ~cQlDXOJ%?B`!ZRsc&@y3>V5^k$Hd8C zz#!jv4a$^$4&XDU>YoUPCJRiW{B5wf(=U;GCH-5Z`H*{y#{inv0IH z6K;)PVD@WHkA^Kw_G6${5>(4-g7nN(kOV?k#=ftKLlncAUXu4qGlai>91{7si@SOdF52HtLAp?MS(xWY zNmD)01iO{<{FTN5EM;_eo(_0DgxN6NU~33F)|w)d*jx*MhR3D0q){c~@?6C`K>m?I z)-VeeLjh!YYX#gyY~J<#PO=oCn5nW15PKJwe9g|ZP`%^uo=pMlnK7*p1$DcpEEt#T z0Q|IznNF&W`^U?N5J#LMlInW_7i9sTODo^F@a1W-h@fIx1C3DwlmD5-C`IgRi32## z@)oeT=TTO*hf!6*0Eu+xdtelTN?H)wQBuBoHn7}F-kfGJz2%8VzGILUVWr<*o@We| zm6gSBL6?r2nIS|AF%%}deM3%39ud~`qjZS1ymos2;16L-xJm=Mt@mqBS_dWx(Pa9j zv)?8R7LX~4b9OGS^05RquPZb;J6kJblDg9@U!Og6-t(E&>ps>!Sb4TV%C6M}Lr*{dl^XZ#z+W23L&Un^n%jJ#W{9{Zg3k3T zPJ(Ey?van(XrpLnogTlZ&3j*CgiOPBcL;f2=W*31-SvBLJyHAATtK`2`^FiyQ<5H- z;HHR@f0u%losg2B5=2bX`n)icah(y!5v)=h5F$w$@Tu!Ib$2PVLNsl~8%=3;HDjzN zWBT~12*}`lc~O)t8buLTJy?g-LjSG50INsdUU2n9y=>iSisb(~j``ny@bqOETjpE* z4o{*au@g2Sr7S6C3NFPdEjgdGExI8tisx@Sbf#2GRw_}Cia4|+s$$vc0=yy>V{zXL zd}*P-^!%*iiVZzHO6!XI8!V=qTLPvh>)$xx_qiMWX8~K!G+j@3anb*yRMe~lby|ZWj7#^*$s)-4tPI31vX52gSVdJG#!sWaKc9IK@6X}GBjCQ_9=n5}U zHp9pF;K!-KL+p|L`3H*Na$vqwC6_38ox<(PjcSK z^0QAi-C7gm=ka|7K#vmZkH7v-6{d&gG3FbEe!gTJn^E}?7M&~eGW#xaU1G>lSgTpp z$+*7;GcFgv4-JaRfZ1g;(;$sOqP2mhjQD+cvx!SE49GMRVM2?#ELbx6`d?S>0OUAi z^o5+^B#OXvgl*X-0f(4|3vJ3gsaf(+R1n&=ERybn#{C=ZR}IHvXur``h(dZxf7pfv zWNmsgBA{c&L@05d*dD<2!TPeS=CquGNv)16(-GVrwfd!uPF%w|6Snh7SMG(TU>oA# z`~(Zbr9@BmCBY_rAAfg%e~&G-^V2bP$bmq0Yeg;9hzgm^aqsg z`kbvlZ=Ay}cBD&f>_tAp%`v3Lp3k4*%Ka6a>3D2uqpMnMI72*_wUb!@Le<~9n8yc{ zwD<-%vIA2GzpPzP)rIAg7L}xmuLIZfuJ6C9^`%b2U#Dh?$^B)he`w`CsSoqwiqlsp zQKKR-{*6Um^)Tj7A!E7Kzj|jLDc?$9N0?n-IZ=p0nPZ8Lo`Uv9>wt9tWdcgmUT4Jn zpr1xh5viCxqv!o6Rnw5KwyJj~t>nTXv4&J|;;wm_3GpH~p2%N% z$SHD&%x{!P$_QSyG5LUIm0t^7b8%~af~NMk_I9ZBlf=K2Z$8^IG9C1Y}rvqrV)skjxQ|<&M>ECPs^QUezJH_6{u*dBP zzvM(Rhv8wwWTZ&TC?883;E|-tXh;h%hteCM0Aq+TLa(L$&X26z&*p;x>{716EnPzLkpnIo$#5deaTS zNln^9A9Fh&A&=C=zoC(6>pr;HMjd5|08&Syr*NnlfW3dn<@_dqqrL)?q(;vPrs>aS z!JR;C=~e}=7MYwe>uKFfbjkN@vRZ%o0A;yS%D?wV_LxE6l=1=j!R0J0;y`MJjmgMG z3zpGhY}Z4Fd2Xn27m%7|ig4op)7r!eEgQX!0Cu5k%4TLF;GZqBBGrFI9LqP->Lm{r z+!=Kv|BbV&qi2&Z>n|m^O=gUJZ+VZAu9N}O;p09^gDFSb!3$WRBn4Di%AZw~Kh-m~ zKJCg$gLk@sf$EDS|Gyd={G!x`F-(Yf`Db~zMOTUz)!Fa)z7hmku*(|2t)hElYcSw8 zb?GbQYraG3Y>5?>=O854EAKC6KHv;v3{IO)oU=Q7e1(|@I;H}a`jA{$w*F3oLD`{G zBawwbY-(UXk8&UJI$SojgCZHmbC1Y{*)X;3?063-L#jXKvi6xs1Ie^2d)=#=cND&h zPr=wF8inKkgSngSkS;%+-xmB}HO7MBPy7Wz=PJQvoFL zRbNO;Kq^gX(ZJcmuvy_LI&bmQmK+1E!npJ&E>5(3nj&RyM&17W$0_M8FFh}c1{bUpySlx%o(=>?MZCqw zw03h|mTPV_b3O)(xE&*4mt{fcgQ(mc4F^W%ZYBzp@(E?G} z63q2zSBKU|3jQrO$Au3gA_|k`?K zs@#XCbW0CAj>a_rq0|mi`!1zJ`vZm(`)g2)P_9P3M6O-sJ#VPq?&FPw_2+Z|TGD?E z_ocs<{de9gz}VWhdl-(tS}Kk;O5UxHSvvRwB=fpA3>CDUTPwv=phAIbmM| zes8W=row$Lw&(UXqUs<@2d$Ou3^7BD+6%cSlvTj(3lRp4bMM`*kOx2JfgIC+Bj0bDzVp3RS3^*~37-rz6D z7n2se4kqw5p=Ps&I%RFEngSqmmMc8*wbB_^&Fp^` z9K8pbmEstu`v0pjl>NMS-DM?Ux&q#`Dh4k3T^m5{q|yaU{05+i)O=f+7#pS|_T#ub zl~pCwkL?_+J`>8!YWGy{Zg2mbC>l`6bUBI*w18?ERZmzXbm6y$1!jkLtG)a{&IO*cCg- zVjA2Oa^$q7Azi{JhoBp$^^tp-w!#5<3azzx-X}Citc&`A$Owvhr@k_8S*C{A>%Y#n z{SpzX{__m1`Jgnnq03OQ8B^@MQI}}+nly)FbzdsqjQB($YuuqbyJN*~Z4v`?1{?Y{ zWXF3vodSdyg^nEcW!H9q~W$;p%Wpd~?iwdjLZ+*cL##dH-^A!ld`IyLL3a$XB^{lsb&WVKxdi@Ns z24urvLeW#l6K=_dPofCFAOO>=;_}WfR@Ph%DZkUw=D7^3j<{+WD!i>&aMVxfgmT^m zhHK4NwM&}=rEge@`?lQ&6gb=UG@-2*}l+)Yb-sM7U|-5zy23-8LI-ws)+awlkL2=r53P0C?VOV4$QLBCSdBnyvyzxBRE5Q@>5ncAnHm;aH^%NT7ny2wI!i`A9)oL zKG&Xnl4fac^xN859hv214Lmi2zldT-^}FJ6*4xL7|FDp2r0c@B9oJ*gvY=8FirCiu zregDLBddc2{+Eo8qY6$pWJM5*^7$N^OeRMU&wElBFs=J}eiHI=Mxem(CoHv5uRBEI z(x0Y4VjcEF< zg5$h;l8NZ?w?F6I{Hd*3BiT`uSJZpYT}+_da)lUM1~LMp-3BjTcPRY5?Sy_=*Gxn7 z%oIP>?6?S1W4C>X7N=Fjj4=vd*~S#K1s<-=hw2@kIcr!Omd9nerVW`ojU9$FWHLrGT3-Dsi4iqP)` zEELGZs~mj*mGxf$l-v6LV4A;D^-`NW z93?dwu;wNjItuuH(G5cP@$Vv$bPxqKgYowrUAbb6Tl!WQ7Zg5Wp>y@w=4lp$c4^T` zCBwnQMB?sG4+Zwyzvqkr_oiUh1Kh20RPqt*CEbXI$nfei6F!v{rEBSpx{<~6yKSA| z6fy^VH93;nPURx?rY~UrSa3MielK$YmDBulrikm86nMIfJJVU5@tWcb9qfh+> zj9O}FvJZew`aGpOZVw5rvZ@7Vd_5rl!6bsFzp(dp(^1Q4n+R4a`KCit+G|Lz9?*)| zQ^m|%2YQEQ#`|mciD1C`w94##m6RwSWPXUF$5BE3qbcV%OIQr*kVg>`E1+#(q!KQVvk_ntJ;UbP%hhT=D7@ zE97T${Z8c>sWe^7RO&vX2STgNR?-z3y8idss_ay!D7p^;E68?U7c7A2D$SE;(r;GV zNZG6KhGO+|**TJ22ijRr-_X$H?@6sVbhcDn8Ri^rM!FTLKrgSpWX|tpfk(F|b0z=F z?)BgBVAkZyRz#y6cK=a9I=fR2dYFBi2lbgQ*&Y}HkAVzTDAxwGvizoloQy}iTgn>kb z9-lj5=ZR(DK?BTIqMRms6ZuD`mh%gYC2joa`hEfWNfL+e^`rOWJ$K?-_X@bV&B^zl ztQ=0{fcMwRY90*@-&=3R6D3~KX#5>~&E`0f0WE$B2R5AU5X!QRH4)37^AHe!qr6eZfh6e|qrrWSj_a-BnaRodcI3%ZhI$sYJyC?STvK887{Ai|uDKJ-Tf zC2N#*W3*oG+TYHpmGzJnc?mhdz8+`)vA9)i(r|s90}yFi6Sc6FZiBgkB& z-Ji`Sl`=OY#o$0oBwKFLfsxT4$~4en%>FDNkSv^l-TI3iK5W#PvW8s8Q#gB{uqLYy z21)E4o$J2@mt`^Kj9`w+vhN4a(X%mr!bBi1CPp$W)}2owOZ})yMXPIlxEGpA@zFy} zbwYN9*0_f$2bsAzbQ$Mx`#k|Pdwsue;F@9pe0BQbPx^XA-_C$A7Le+i&^;>s@a^@d zWw>@6fPt~!qoe2qMAIiYzDOnJg@q5I9CCfS#jgmXr^6?lr6uH~cN1phHu@1aFe;5# zKr70Kk1lE?D!i=gAsZboD=WQb_Bm7rTLD)#cg2wZBU2TzJI8^ zr;!py1@(_|# z2u~^fzB?<_|C*gVcs+KyE7Q3*{brobL{7dDtx6jT@%^bg#kdr)E=nZ-MKwe-8cK2k zPLIU6UtHmjJ8x6Akai%Uqqc0_K-TM$JF5H7ls^vxrurO&p*ehB!onP;jv>-iF*1dI zV1D>QPus4KC8z;01K7o3L0~r~bJRGpq(RH^PF8D3e02eGECP4@oP0$t3bOPm=|RrY z{(&*e=U1=@@MG`4k6AM7O3e)gu>48*y7eDLI^L4$FlEsMl&bK0aqfKNO$H`3@ia}E zzlm>msNZXJ(iZvL$EMhR5YSdOPx={|gw>rN%YzMu{=rhA3xhg$lD`o4={U#U+%+ z9Mnjs7ZxrLqeZ7Dl9wBhCiJM&U@gqSj@1~^DAuq+!yt`yR4SLnbey~DtUc*$ZQjr6 zcz)w_dyi}a|3|;J+_n%*WMojrb zx9*0D%H)%TcYs^{g^qIAwGiU4;s^%4-H@{sLG2#YlD;1O_E{QiO<(Vj$=^gi#ly?c(D2wq-v#Ee+n*;yUqyh*8t)KZrG2&I}+DK^ld18(}d1}mPs-&xpv>RPj|fs zfPJ%-B!_KZnRx9<>hzq@vO-T&OzTz}aKY-Bn^Csy-p{{5B>(iWjGd^B3W9WlP0yT- zf`kyqe*@LWdn|+OJ}rq2Vx#~`9nviL=j+8$+}A5GPw;?=M7@vq)v9SnjF+uG4|Sm% z({ECWIP>xg7WY0$`cJi)XLpH6EDNH;_$wBp0Z?4P+EFy{mT&ais>J5c^e>h#E(I+EW`;cD1Q*E zCR*Cha~7+C6G(cf>goaB6**X(;XA^UK@S$67#1bpNHvzHr7Z#Bje!Pl^zY9zJ0Gnb z>Er*iTr^hcn9@_3G_ZsTGqK1h$-^UY(Hj`kq8Vvh+B`>DsoF3SokG>Sko0;v zLY~;i z0e5TL4xs*d--RFOpT2n2KvHPUvdQ*qkO+e$DVE5U_8j!+cKxLc~byrPvODj-rFIK3)n5==~5sm zM7`8Xgd5tETYk$j-+!!Mac!rPHvIOUXV9QmLDWor-unF*LR_WEnb(efyxV_66!`y& z2!vP+(>ltz{!5~wZ51VzlM5%%#1(G~$EFLTXUq!zTr$no8Elafd^A(x;lk#@TH?Xc z5EsEUD9w;1x6^2cNk^6b>BFi-OXjP;%O;)N|5OM; z^Pa|2?(3?ka&q%dWZc1DnCb1f2|$tA(dDu&86WC-ZdHoPa%sg7FRiSC|)x@x9 z1MB(gLo#{yhxc;R@y&zVm>$WdgWC>agHVog;%SW2O0GiNfJzS9!o`b2_gY41XQD-c zLpA>g&sA45$_g%8+7_G0M4mmYqM3qPS+GUo+%SNkG5^T823q%3Ug>o=flSV)P&5wm zDes~pNGHM-cg)RY28(J-u6g=kdWjCIw4gW6r@0F1a0i`B#}1r-~)5rWedO#5f^?Ev}J{wS7+G)xK6^ah`8IatKlbKQfnA z`vFhM^T~dWLNdM`_mYX_$Vt&l;6A0S@kAe(+r6rIbsCV2yG^wd=wxIFk8S@PK3r`H zL&Up|8NsKHUPJ!HkP~KK$iC{U-2teyv#og4Sj6LLFwj~^n<}+gIXmR&s#6t^Gbs}q z<9_z&n=0^?F`UTp9T18Fv3Xh;?lQA)#1&7Nn;jVAp%Kx@x$%7X?qrV0dR%e#hfe*? zh7j=krryHNdk%4f>3Z4glMkr48%O1ru^TRHZoVLm5hu;xGQ`lj zFZt=0TZuHfRdsbD1$Q1w2O`%Es=4yyR5nLmuTEOXkb2Z z*7Ud6wCF@v8h9uvT5sP-ME^jELDzLCuH(JznjFueJ83{C?wr_9&qfOhyhM_;qIQ_v zBV?68wNc~9P(JCcHLZcs+-O5r$jyRD$dsaT_1%>ZhwOEbQ<>&Uo?4B`oua-RLzz$g3FT_pdwY1c*~4pF_oD$yZIO9vhk74x-Yv#f!`SQC zY{NzjVL~w-qpMWa{^8@lzH-R@{&F;hKx)>XBCw1k{wG$eVqT~gM&Mro+Q(R}&wQ_@5et(bicj?2Ug4^c z=1!t^MCK0Ax?{r6B$l&Rq4jPDYuSKnXM*Zv^ph{?N7+*p@pJbZC1>A&hq9VkzVQLE zhvTU}=cFGCEPt74xZ_VHeO6vRipbWxX~y>5^u#Wx>{{Q(T_hDY zs2hij2enhyS0dWKQ8GTGWdQZ2?{YLXEx-W)5%@dpVsh4=tR6BiJ0bdHkx$hk`MLnfd!hzzLc*KbZNdCjNw{Ye3o>{$(git zchj^D2cfEF;GWp3cO#M0_;348`+v*CvWCwN{z9RV8;C$Jk%^7Qj=|92(p+nBJ)T<1uAWNLPa zYJd6q(cx#`*9lvZq0fRrB1Iyd_89tjF=%^oT>aMOe}jE_cMH_;@$om(F}uJL8#4cH z@=$BAuL*1$l8ZGYfpt_f6ZlGLxg&2{z=km^f2z_xX1qK3y7>Q8Z=K(8N8OqTqKh6i zL{CO1Y9vG*(M4twb<`0h7(H5)1VNM^Vh}yL7^8O)VMZS&dP#=py@l|~d;fyF*8OtN z*R$4M&)(0o&N|Otdj|nW^{oLia03uVnvMR$<)fTp`!ZB8&6fKo!Zg~ycOe)C8hUFJ zjo1aFUW8Tjl?z)s+ySj@svQ~FLZV>o$_64^fks70fQ|-vFNhMqUOR(OR&9ACyelo5 zK%wD({CA#i{yxux8=d!GSCZ^ocX)78CM6~g7XYf~--lBGrFW7-qvphZh!8(IP+E`J z(YMFk;fF@_W1jb!dZdVRVr%s2LrRb46aT@~!##jkCaogi^l}M<}iyk;YtrPkDwP<$iyo&;hrDf z?ir;)iV0gEf%)XOmuflB>R_E)>wpWC+YDrNy(=}cmns`D$?R}g?X}GUwmU*k?}^4z zdF8?(n%v~yu=#>gL2kE_BO)T|aW$j0K$d|@Jo2wtXw|r3_nDJ_%W_4hpB~lK^alUj zS7Dw4d-H_YDFcl8LefhUA0@OC{z>bPyzY2Wa9x7oXIW0}w@dNI=ndVn;zQh_>$A!s zWNli+O#{sQ@6ejkO+*4;!-Kv8ed%Roqp`iXf$R`1AIMH7TS6XJbnZ(i-keul_wtu$ z1lN?UuC}(5C8l31X8LsTxf7)Sx^u}L4t6ff@Uk-}g)8l+d-Y3={l57o10@(`vh({k zs5#(VxVb}R_ai_T-EtxwMDUr)quFfk&R5*{At=Fceis|F_%ZXp=u(%*YG_xRus6^2 z4nPK&pS#f;+#Nb4uqKBsM@F5etRt-Bg-7_bMWyhQErg;A+nEMMK`mph_ z_c|LklAsa0Z)!Kje`@r_QT91Q+TOT^$4#%sJcUi#^zy-r^|XJ$@<{M^e0$HJM_^RY z@ZG3wiZMh6>9B-o(ObVH!~xSImES(pWJj{xFsZ?` zTdUO?l|$=_4|0kQAB4-vlA-I7ptp~BQto!Dew8?Q$Is8-qQDyT@p2d8K#?8iIITZN zsUXH>V_#}ww1T8o?x%UbG|VoQaLf(=FO0@|s&$~mbPpyul(%)5zCF&9%&y)}(J*Y+l;M$g)j4VD%5*~97TdbWMVimQgvz7l zx7@rfD4&E(4V8Cnwhg}HQU+m!BSN+Zn6f>FQV!N^tx7NVXicinFD+R{8%2hz?Hgu6 z+v2%U!0cq`;fm1eShauU;dcQfAj0jU@Q1{-35&w%)fVfUn_^JdEFGP*A4QGM^3X6P zM=7pu4N+$uZSBP6`Sr>3vKU&>8)FraIxqe84xi%6dcLj+mD+nGW?2$V8akYtms%8; zx0C3MveDe1?W?#|b%XhAN1P!nq1?p;zmXbnAFYz&H9m*OZPy4<@-w^Hz~9jnEG_-h zu$^*ki)Dorh!sYPxS#Q6;~RS@ytdWvZ!bPXCWP~uI$Al-M*fiP?Kev(C{2xeQD-yi z_X+#2_Zzw4h`gP_m5{1x;w>_na5nN;y?X%G%v@caw9JWTc{kEoPI8i;3L> zURv3FVaQQLdGpFGfA#*kR81^@5yGAt)}N+8HIoLsBuXu4rzWcTZI9_HnwwE}eF{y3 z-jNI4(kUY&`g@s#RCR{<@#_pmR_$>;yu*b)4JHny4z@Z1-C3zuOu_{Rbdrs%jD943 zIG=N722zhaP3V{V6t#bfBz~9^+XyELEjKG`<7r`mjsBlm)BjbV+XDsLX9Gps=2z)_ zhoWz(OOiZv$TKcVC$@fgGH`u9;HmOL%A%EDPoCqXC{u5RFRVwBWY{-3cwZuUB2$uU zp`7&?S}`s6FuNWK79mgQjj6Sr49Eozx6nQ`59ej+RxZWSNbxk4^{EtY$WaWThICFl z2f`mLL7lav*J!6Q>sx4yup_Y3Z$v&{;;@sC1%ozur z1Mcl88ev8{Z+pko1=m};DMB!-x$$Bd!mU8P0Q?pk)40R0H`!Or@xL}b+$%6Bi_5UBo_#!xy~qD4Fpt7 z77toTqEu&5CYk!4N*I
    #LwxtjI5dk(hwcS`=63_GE%1WFKis*fFwN+<(gC#RU@O*)C>mhQWFyszmn;zP@80g*A>d z!XeY*s-)@dGfQ6$G0)xkJC-1YA2B1XPqM6tPMozJ>TJ%Q$()o3Z3&CQyrK%P>xV|pR#^-BnFW03$VBK2x7Es?UHzYwDA*rz zCRtj1%3Arp-fC>dFr$ZA$p8h|Rrks0FmG0*^$VJj=t}yT!30r1aYi^Y$|RScm4&$f zRPqo+f>ZiDFRpqrbdao0rGvawPr#osNdL0O~cM$&!B)Am-(_3A5 zaLSN>D=p+ z$M^_K8r(vxO3!5=WpZwm&Dw06@A86XP!=Y67VcYO8fIKlTMxqR0TIy8HTx3Wa0SMu zhNg2#J>ee^(eaEc*G)3|F7==}USLGRl3avo`q-e(xD-4AvKm>`ns zB<{g;xK;-foO}8D{MzeYQ#sbWW2Y4?yOS^K9N0zI>%*++u(%T-B-Vy<-C@`Pm_Ux( zuD>_PVUcxT*ip~z95}oWNO61edUC;Eo_w@d#EtQ!gkVb*{6+;zU}RH;*Z7??UOpFm zjxo0`1%W!HjUx>MBDFk}aXSOvARFii0x2{FKg@-Hwtr3HtfwNdN-6H3J|8h=%&sJ| zoC9*#)%GcVj<;E#8Ung6w!2nNolb>Xd3>CEG}vgnKh6q@s1`N9pSiSa`yjk-<6vi| z^XGN@Q|j&>gg$cqo(@ccLtN{)?m8+fsg_P3gSE_sX6H`bgq99UI%hb-`|(ow&|QIz zRLv{H&(kpkMc+^=v?j+2n?;F~+|bEST+02H_|rGqWKBEwX!c+pUR0?VGgn1OZz|XZz>91SeB3* zz6J6F&zPz2nk|AeCdpcP@Sb)g=ovC9^+%~g1xgaHZM|Zlv^@t}@?!71-x~M41o?K{ zk!_&~F)@T$igwi+n;5>W`l&owv4<`{li*(^XESUA%)&aWcR%f+gAj+uG~EMem(v>K zt8MUjmS{>jI<9*;;o#M3hQcMuR?=kk5{8t0^i``2V)m%FqpjOrt?=+&ZAEaD`iQ5u zdq~(K{gN1S#^inp;jflSdkGNO*8rk1C0=&phBN~Z!!>GTVq3Hu>7gEIJ6uE-8A->4 zHB5^sWA>w>+(o1a&6a9_5<2gX`ZN@y;ivL5iA{@bo@ivzwi%r9++`E`paREdz^sLd zHa;z8ePGQ5alON0kHlKtR z({1TLx~dA8GQKk>kMMg=%>Ds31^coajof_!S76d8Sl{G8G%&EQX~#kzG)_GaL`~Or z!ery@FE!h$EkRoTT~9&qQ$FMv162mA`fuxN58zaoC$dExu8^m2HbG{Y`774{;gIa3 z&{3ox_mnBxc_E~qB1y0MwSg>+GRd@f^v`3a7oi{g6awAH&~jINloA%4hJ#*RlEEQV zII8|t{ZU0_@(^bujEY1)&b200mi)ExFiE>8;zsa`dO$t<{AuU0$HPhJT++@ju7*T^ z$q3pQ3WNA)LXp6lGw)yGN|8gI{d&8(|01Csr!j#_a*ul|7jZYF8KfAk?5=$;O}p+&{Uu7Vd!x5y!9xUildw`wBYtTB8!#(uNyd@mPc3dS}F^=Tu1_v z=uJ_BJ{LJp-ozFXlok{Zi|fq);|I&q zrDZJ!jo)^?mAyF}GuZCkkCj{d3)FsqZXu&WvNz_uclINa>IBDkEuFW`(i3ZC!``)p z!7i^<4cJ`m0FZ{pJY_D*HQw5|Y{>R@X`s#7*pNTCQB?bn!@LR^GIX*Ex#mZ-GLeVH z0CX?{kkNiN*hJPI@6$eBb^OVv=?5a{)?iug=|uzZ)9H~QPTT{LcBIFMzpCS`*~!_q zVm)_89`w7Qu|$%LCJX%3tHIZ>^?s=CI-^b9i{Fju9qCLUt>Yth>}#3f2PeJu->#H? z8K`pq!b~GGB<#}>pvm~jk{k#SSam1j=W@Z<$e5DcR=9|Z`51$`-pAqGcl}stqJki7 z(2^QVwqSz-5Olv?COqY8`OUgKCngk$(h8~QgG!?|&hr1KsP0AGZ>;j6SC4%)W#zh6do1S3ieSi}ts#x^3}ek9-_^6Ng7+uiWFG$2bPRyjMJX+< z%Nw+q?Xq;Vw1rofN;Z_;ZuvnC(g}%dj-l39mp`20>loFL?cq^Ge~0yqgufKt^rx0+ zq!E*iMlYw6h3FA257leDV?z3qc{Fc70IyQ0PJ~4(IhNEu*d2-A9t~yX7r7Ea#W&Vb zj1q|yD($cA$(N&xz4grTY8P+2z@mJz{xeFb!F@e#NM!Dwo9xTLR^?|uo@M)$b!G2; zg1%KV=)6hr=3<{M!3}ojH$z+65w$^|yTV>?Ue2b=(EwmBqrCFA?kZmqm^^3m#k)+p z6!Iyi$C%w#v!UGXSt%6jQI2NobrPQXy9lni;k%#79mZpN?Ht5Q(+;I(Y!_{-aQn=r zN{5t9lqAgzQAKM+X!7m==B!BZ zTH1s@Z1!dQ*(M%rs(j#+V`;=?VX+CtU!JF9HxyX+gEKNFF?AuABl)X%+ZI9T|9=Pd b{^Wj(^@n25CkxE~%!-bN{^LqD>+t^oQ_Z-~ literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-select-columns.png b/static/images/rc/rdi/rdi-select-columns.png new file mode 100644 index 0000000000000000000000000000000000000000..ae98822e0fc7f63a9ae1f473c691d503823cd44f GIT binary patch literal 14297 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 R@uyaRuBMSjjhfxt{{}yd0n`8h literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-source-dataset-size.png b/static/images/rc/rdi/rdi-source-dataset-size.png new file mode 100644 index 0000000000000000000000000000000000000000..f2a9c7f2be52ba2f9c07dc79fd1c29a61e5e93a1 GIT binary patch literal 7364 zcma)hWl$8}_x@5664D@{bfbiHhk(+cw4^8{At_zElyr!6ij+&ol1nT|_rd}$T}#8# z%b(Bp?f=d1%rj^1oICeCXP$fJ+!r@mS6hvQ=qV8Z03gv&SJ4Lmu;CBuTmqa2FQ4+= z6#&2i=xQ3O-rwJ2Fb}}o-C=I;?rv}IZf-F*x3||fx7XJx;_=T%s?o z&e0cV=*zS7i=#8l>Dl?o*~P&r=J@37=;Zw9_~h{TZ14E);OK1s=*lb(>Yu7QTG$(D}3x{is;w!PZ+@tXGWrnVk% z+h`*M3WkjRX&tR^>8@%SDQ(=YY#y#?dcaUkW5@5tA#g)`S^eMYy0+5#!P2^clG=fa znwFv(SUI@45Zqr@-IV{Q?^ji0UR7^SRZnhZZ+0cLxV$dA99s0d_Gfu_VOi~u-(4AH zT^YYR(tma4m;6a9?MN+Y&nc=(E^13EY)dR?&CL6qkl*?vx9odfOKi>qn$ogLW3rp0 zvznr_8d5TgL79!9%m!d)eL{Lcct%}VdR=H*ZCpxjNNR0JYE3}=bWn0lbYgZu5*QT! z(?8*lUwn0B+z;RHRbkQTo-q|cpp>sszXO5E?w~T4&@ne)*|+dS=ZI3@(0J#tlFuQ< zUO{p8L4_XvF?NCZZr?!G-}1ir0xf-WoV+6}yt7Te^qG17{Ol2G?2-B2EyLC&z}h)L z|4X`_eYc)d>W9xhS`Nu(AH9sMzrMHfF#O=AZ{ebA=Avoj_~zYbaqR|m1N+x{c1qgT z((2|CswNz=m9LbHgcS@0W%PI@v^YiIunMU$@hQ=A%91d>!XoF@LEwD`0O*4?R1^(; z7f_SkP83#*{l_mhtd$~rZ64K}3R*}}Ijd0NHN0jbD*Q}KW*t7L8BNphHW-?(id!>N z+|`4Pzt)b+dd#du$5fcb#2%Sk%dNEe0!pgQ$Zc#QlXrT$*b()Ava@KUik&lUJ1rwI z%ZU%MUFU+%Vd2?AAOd+|Qa)o7RWE)!Fh4nn(oA=7>e4z6VGPB2XT}haj(H~5? zqa#!&3czKqKGum`Y61Hbx%Iso2B)busjHICL^8gzwy9U4rT zV}^*GYeP&zu4b;jKuIB=)Pw*2_zoV_UH!N}k%DVk+;Q@?F`b5*rEisZTMU1fd zQ0=@GADR8^z5G-VJD`RU;81aAHAbpj)Nv>gAKc7n9+oMstTfC`^ktP%!kDg=y&fya zYZ|Tq-=5`6k$Th`BJz5hxFJd{wSn^|_1on6K9wwPBEptMi_0*oFx+QU1yNMba942@ zKk1*b`Wz?U1YiF*K8Kd>7eIk-WC!O+kBiR33+DFw;GidfDf6E!SGb=`tVyt&bxOjW z!U)Taia1dnqTfp#4adF6f;A_>=x#A37=iPWXl}-epv8>ta`$@=h9|%FNagi=_)D)5a&INOH$X0C5>5D8G*d-tFJv|tUn-B* z&ytxkD!oS1`*jwrIZZ~$4ow@X4Mp|&r2>@*1tXOTn#L8K#HJ~}^}Pc?2Dp~K?|%&- z$PdrntK3&VPWr8@O_bJ3O*07uW$vjD$IQq-d{NT~N z6cTA{$ZBhww=hQvon4fcoJSCEk4rMNAUE_1za;DS<)0)aKqF|&x|sd>q*7y^h%uvLfG$yFq0(FsbXc!aA*@Euh4SIJmeQq7lg}y$^{8YJw!2?nm@8aY@#N^Dr!jwF@M$wmrp(90ye{f3{y6Ca=yf~OQlN-k zI2TGG(0^M=exA&kEdzwUEGQi`=ogV2ek?7$O#%VQq;_WZ$h;pL00@r`sk(@nk|MMm z&_G#!d~0d$o^LEDP-74ty`G-{Wg{k#K^3oR^LMFVEDa-#YoI(T^(J}%+`K7fzRn#- zZu)dhhQt;Av1#cY3Bz3ldlmjUAlGf=v<)m9J`ZLXbXa$_ccD7Q3Qlq7=7Oy)pg79b zJQf(d4K`qxeC5 zeZCn^YUl;gI37xL)B2+B+yt{Ld}0rIW;n-N6De*YdOW#}~22&uH1k zIT5RCi~+y}RzZBcHx2Vsx`zYQI&cP#M{Jx7BX|hcSI+k!A-xuBvH^TN>DYqrRTl)X$=>OA_?G(l|-Qf$7jDz$jPec|JuWx zexYj^g*gX5itkKx3E3#U4N32iqWJ4~rx8pmmnsM$df-njrK~ zCw3HDCw5-qbe4}x44PBV4X+uL-20~p^cg3)!Ja4Dm>;H|Fc6YU9~jFQi`Ynx_MOB> z+^_%X5^BjNWDs8`1Gn>tBMBi!7{V^vDe#{`EPxb*K{aw4Z_39ktSfzwW(o@_Cb<#r z8g@(3MIcEa%6T4-7kX7c=hQ=)yH$`E5eOQJ>2VB>Lm zPH`D@5&2_WCng&Jwp=$-sOt?{ji`FD_6~j7oP7oid@qOZrgS!kVcRNTt)+jcHAU2g z#%1u)MYkh|fE3xmPb0f;X#pq_2Fo4apXLBZBXuVpEz|iQq)D130~`b)8ld94zR8+oe;)df(nS;fZ>dKF}9SPLKBQsiwSIE#k9*exad15a@Ga<#-sn zuZmujr5`*hxHY)G>N5m5!oJ>(Pkn;suJTC)7&wf4ZDmy0zl-Py2IHA9=?HjiC^Zo> zDF0koGp(g*1iETy)xMkiAjS#DH~gnDk$xK=c;oLN9J3~YahHVxM;ojpREU}knadG$(-Gr0R6KX*QAQO;;r{7;%)-hp4c7vzz-Y8(R9F;QA>3_I+pN|DE!zoE z5)25D=^8sZgzsg?7qNax%Z~61D+ruTT`O;cDEL0^6WWhU-pi7Ont3>4346f7WF%7j z)zu+ASTGQo&GjAy5FXL)lSmj*IANFAV*7e41Q^l}JMB%zQ$XXLost092uFROu6A(a z^=xsZU_$6L|LJ)Rf=E=WNNYfZOl*z#&0+KVleC(20}(ZU>UA#?aiy<*o?xL2gT?#5yiP55u!AyFkY@{DmAV%`?^eB zteAgp7C0_Jc&(B&etXuC-1b4Jlrl_|aC8*Rd~n1_+52 z%KCI?Wjje^@L8HVM~tlpWig)ss++?`@f24$&zO2bWc;mU&&90pUycPm?xs6sfnBlx zTrgu$dhPG)6uc2nKQO!lqO!&UeAR4Ue~U@fk^c4XS0VY^B%d(!{8IR~t{`f5zUqz& zV##H+d;Z?tS$Z zN4e#WmElP@;sx3!kE3)Z^aR?TqMMTLJX?@GV(+S6tK!np8BG1@zu032 zE;X;GS>7IGM7mFow~P-8-`6QyG8y>vl?uy$1(>16L?-;RqCE#i``Wo`?~y^n}4q(0J+ezi?tvRC37MA8_1 zt|=MDEN&0*t`|!~2*$J>oBs07xE_+o>N$U~!(sKk>67DdnC7vdNs`=t;u;$mzdPj~ zS;&WWcG`{~DUUZZ#FiASF*gOtUBaW5##Lk7;G7hHl4+AGq!x9wm1HShyWjAD>raeOD3rS9~x9M<{Y`|MlX{w-3+hB>z z@fE_ESZ4)X*G~9%+gKXJhZLumoVil?{6Bpof#m*NtFWS&9SIT_Ot#g;&FjX_LBi9Q z)oW7ztomZ#80rr2dr7^wl7NH|#w0mDG$3Fl(B-J$^Q;6BIV889tA!Idu2BueF&mC@ z@%yVckN{&y?C5%=a)gfE|5x))2}Y;szgrKLe@2I7Bma@`1oGL(qB>_#lH+*Z*jox; z@@u<@x7q&qu_SfU`VObrrk?`J%7?iqkwS~;^;nDm_0ypqjfuAW07qXlU6jQ{B{J&m zHhWXM&3hC&i_&t7wCtwu%O2#$ZIi<@uL$cf;K=VVBRt#^9fawYo-{9nICj8cHb=ij zLeyU4mSWcSJ6M{%Ibq4>@9E;;=x_4a6Z{53k1k@ZK{o#*eq1({l#ACpnu--eZ+jF^ zcWuSZ?X4)PYIM|f)@}0|6^cU~R3j}Wl>G~SctMPb&%G##R`Kyt>^q1^BYeBtNr}i? z%gJ4>lTY|m_z)u(Lg^j#j<%Vg)Sl34F_zxiF!TpYVT-8-m9hiPj*_^%2f5HXtzZ_< zWS&1iXl{f>Po^%^9tYLD1q+G0`(NMo2L16lB5ps_po~7)EsPF){`0BiF+t3o40q$8 zWb7LA1hYWnbSAY{Wp#p|#yio+ zAgr1@$#mSxZ3&HfxHMyy>@~|-)|gr~B8cTr^aLIFi=_dON12=@eZJhJ(HujkG4T)97-U;Oz2pt|_dk zD>l61M$-bm=ZM(cc<}p#D&vo+C5ur*VlZp`Ovl^&AfR_lI2@kE-;@lTo6 zRNy0(c5Kc0FTZ)7VwlVXpM`jY^o?tn#(b$MpR|F!9p~nCtcFV}blziMR=wU2=slp1 zD^~m2l?8E3hX>PM(WnvsEn{2a2q8@xwkIi*d;7GCIVJ(|E}viZq>%ol&COSSHc~gw zCF}mErH??I3I6$o`8lHO0MO@T29mNi6tH^xfd9B8&?=aRoJtxqC#>MoUCC~AN?JCT zV$-}9vOtfSiL$V>Ft4Tp@XkkROx~9P%yM9+&Kejv;QS89v2;P4$e22_0t;a=eh%u3 zU$(m+$h|v&P_SP)a85083jRLpL_pTYIZvhI*Z%d=tZJmEv8h!GD4Nopv77J+2%Nr2 z)YE_C>cbabh?GhtNqAG>x%A9vlxWRLTjeYwnu4<-PCIq!PLEUSlaZ1;%)3C{s5Mzh z@TLpX+If3gow0S%D|ffi!lg6yLFVS{^jeubP6le`m%KH2Dij@_!!(l^@F|R`3QO-P zf;1{c-6&Q^RQnI1_iQvnuncQ@dKqHEgw#`l*|w}fgqs2Ce!nTt@!WbH>uX1~Zq zv8KNFwzhk2appPjx>3Qa+O92^d(Ue=?AfjB-CLft0KmpzKHa8XeE>w!y!qJ-bIXAW zf(#<7_a4%Ga=%jHWd_GEz+W;5_l#1n>mAv;uY5Bk&iYGx^cvd7u)3<&A5|lOqJJ(w zs|R@@SC8vi4nB-wxea1=QmpxXR7NM}05o4NdWXRrU+nGOWBeW9hk!g))p?&4N*h^JhsG<^A8T#7{RbPX=opwim!{ff9qrc58ieMlZ4(?w(R% zJa)0R8<7!6Gzo&>h7^27bLK9B+6YUNS$sB~>_&`$f*ts*@2^`9VwoZXfBS|j`PN$z zu4RqY*d~PLRsrvhT7cFDk-u0wum2q6NlQ`F&j)xNM>98GW(c*<7$lvNrETR^TMrJuqtEvlGuJ1Jbd1!5pg7BdD?5*ZYc2($Hb9rm zC$#eQk?m%#Vc4Ssqgr-#hXn15i1+v9kuE#gf4dU{-FTm~CRqQKZC?@)d(i!=XXzWF zoThOv7nJf=+E4vvC6xKNgEwHJ%Y=KGx`MI>A#Eu-4)qR{YD<|qJzc7`C>n^pc!!w* z^TL%aNe~)vDWJv3i_?Sbt&ZU#a3^)ZEp#aG7TPym_G7eEZromYnn3M4-IwA86&`Jq zHu0OCX{!Muh+S9_M;eien*EfKzv={9re2YxFF;kDVO2LEhjw$SX}MCXY6&{u1^H0n?$kgx(3K2od1+0^*F>N}6Tym8<)R%<_=x*mt_4 z(Ta%E@kg(yPN~nYpMX}FQ-$(%h)N3<$3fz`-SzCt{c73oI6uT0k75bAaP|l}TODi# z8ik~RsT;+*lWw-!UNfV1w@X+vfKlv%k$D>X{4jRhxUPJYi8j!1rVq~0r* z!Xn8ZxzWY`20D5k6R|ZiGeJB{x<|?Q4UU#23)JnAbk4-3f$0R}ilBh}v+?_s(IXpZ zryhn$Y<^FT0j}JBFrPT!Igd@&VB$Z3F_zqjgSGr13xwFJ*4F~RqN$#c^x=wfL1JZk zV$Lmi8??O64x`vteT<2RlOSh*ukYb`Xq(h)eO{A^lxnh&MS=;6DbG9PQ{V|)JNu6(__94~<9Z|lz#X99% zMB_(9z}tF^N{HCc>1jAn+>^~son z#K9mXfBD1nxb^po1UdD>X(0^4#(Ygy%{dvEZDF9O<@9fmWlUmzZnq$~ROSC{UpgKg Ywgd{=wER$g_?-l3sA{WJD_Mp8Kb8B&l>h($ literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-start-ingest.png b/static/images/rc/rdi/rdi-start-ingest.png new file mode 100644 index 0000000000000000000000000000000000000000..9c09b04206fe155fade0636f191bf1ba0036b474 GIT binary patch literal 2066 zcmV+t2<`WYP)GtO6_T}gGc`FN#mnl%%Id_)>ch$D!pP~t$LYVu=)cA1zQpIf!{@xi=exq@y20kTz~#8V z<+r}%w!P%Cx#F<7;;*>kt+wE+wBf3=;Hk6Vsj}dxvEQe#-=?qMrLW$kuHK=m-Jq)6 zpQ+rPr`wyR+M1-0e2UL|iOzb6&UuH;c81J%h0Sz=%W{Isae>NkfXQxt z$!vVcYkbIRddO#Z$7OcLW_8A5bH!nE#9(p6UvR@-Z^K+~!(45`S!}^rYr$7)!B%O& zRA;|aX1`HozENbpPh!1JV!cdYyh~rZNnN`~T)IYDxkOpHLRYv#R=7b`w?9<2JyNzk zQnfo!wKz|-I8C!ROtUpivolJvGD)#BNUvTC_k+yKdmM{ ztR+3Hg9zN`000HONkliIfIRQR2QsQ?x78M%3&?l zN1O1euui3IVrzVrutu>h8o80D7#2{2w4I=eX*)+-I)~|T-K0(3bYU8bZ8fS* z?ta=>|4S!#+4y{Gd@j5k+xG9co3m;>pZ3_U(*CF-ZN)a6w135(_jd|BbqUu8d=b#Xn5TDVesC43 zsig@g9GsL8{BcKXh(>qn`%Mn=QOg4w3bfr0(`dN0>nSIMy`5ue1+PVFnrUJI@Pw1j zC<*}OnR>EwlM?{)s;T)@Q9@O@z@fbObKH!}SC*2jRg}wTasgz07^1FbJ^-w}yFqbM zcQ^+CR&-Ife=YzlI6@j~Cf97$e04pr#&8CHMO;0r5T_^q2zVO+DsvE%&$xM*OY$^O z3SqU#4Iy(86ly8}KmoGuk&F}}W<3oxt(mp@X`)*@jL$BPP#E@l3jwd!+a6^-96PQ( zd~(_WB`Sggo9p@_cf57Lx@XV1pBNnY@=DJM1*jo;4Zx0$$5-8e2wnv&YY0XgGLZX( zybKhb4@5nyv6F_H$@!6*AkEY`pqcaD&w=Or`0){Hz6Ux*aHajZ{+Jm2WUM3ZB{N zyZArxcZe3y*`+JRQoSW*9~yi`!GlcIz+M1Hrvz_YkpUqV{Jv@MQ`F7DeDXMOlEQL; zWHu&cl3_OhINv!HqV-MP&(u`|?;3+21E4G{T2(X={DEokYD4e~zz-DM07)mXEKYl+ z$l=A%yOF+H9rC%xe@q_38HyGC|1*4vsF{p9OoYt z!i#|_lDkAs4g=XFIg*nQJPIfg^Wa;7f`3W=?hwH}K(;6m_$ENM-KFkhD8X1w>!z$K zlWPQ!{l%H<-V1xP0B3+?1CUWO(Aq>du)U8Ri;xhU1;Dzld$qx2!Nt_fv0}qQ#3wMH z1M`k`M{fU=g#%=Pvdv5OA5l;;rDjs9MITF}2Ng_MHbl)5XcqH|0>A;}CkDR?-PPp5 zIaUDOt`9_TZbjUF2C@Js8QQ}oV@+#5mSU792EJVgO~%siC=9O$pe5_Jo0Bc>_`C5#!kaea_+LoL^O)2ivQ#eJ0M-dKz}VE603*y!T_ z=Oi3owUZ-<9l#A*!exsa3P%-);So4ZOL%N@3(3Dd6Z*W@qTDRE&rQRp?G5cwTEr)B z6WidFTgWGug3SDZ-AW$0+-r7?Z>n6=GB9RL6T07*qoM6N<$f+|=w%K!iX literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-start-pipeline-setup.png b/static/images/rc/rdi/rdi-start-pipeline-setup.png new file mode 100644 index 0000000000000000000000000000000000000000..2152f92daadf3c81e1885da50bd167888abda6ff GIT binary patch literal 2681 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 nX_}^Knx<)*rfHg{{jdECT Date: Tue, 12 Nov 2024 11:30:08 -0800 Subject: [PATCH 32/39] stash commit --- content/operate/rc/databases/rdi/define.md | 3 ++- content/operate/rc/databases/rdi/setup.md | 14 +++++++++----- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 611766034e..67187db329 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -19,7 +19,7 @@ After you have [prepared your source database]({{}} + {{The defined source database button.}} 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. @@ -32,6 +32,7 @@ After you have [prepared your source database]({{}}) in the **Source database secrets ARN** field. 1. Select **Start pipeline setup**. + {{The start pipeline setup button.}} 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. diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index cfc8bd3705..98fedfa66a 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -14,22 +14,26 @@ 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}} + {{The create data pipeline button.}} 1. Select your source database type. The following database types are supported: - MySQL - mariaDB - Oracle - SQL Server - PostgreSQL - {{ADD ALT TEXT}} + {{The select source database type list.}} 1. If you know the size of your source database, enter it into the **Source dataset size** field. - {{ADD ALT TEXT}} + {{Enter the amount of source data you plan to ingest.}} ## 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 [Prepare source databases]({{}}) to find steps for your database type. +See [Prepare source databases]({{}}) to find steps for your database type: +- [MySQL and mariaDB]({{}}) +- [Oracle]({{}}) +- [SQL Server]({{}}) +- [PostgreSQL]({{}}) See the [RDI architecture overview]({{< relref "/integrate/redis-data-integration/architecture#overview" >}}) for more information about CDC. @@ -93,4 +97,4 @@ For more details on AWS PrivateLink, see [Share your services through AWS Privat 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 +{{ADD ALT TEXT}} \ No newline at end of file From 35c8dc52499b2ec494b20039bfe4893e8b5ec723 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 12 Nov 2024 13:27:19 -0800 Subject: [PATCH 33/39] Fix screenshot widths --- content/operate/rc/databases/rdi/define.md | 32 +++++++++++----------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 67187db329..5630d100b9 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -19,12 +19,12 @@ After you have [prepared your source database]({{}} + {{The define source database button.}} 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}} + {{The pipeline name and deployment CIDR fields.}} 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 **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}} + {{The Source database connectivity section, with database connection details and connectivity options.}} 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)* @@ -39,13 +39,13 @@ After you have [prepared your source database]({{}} +{{The Pipeline setup in progress screen.}} 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}} +{{The complete setup button.}} ## Define data pipeline @@ -54,39 +54,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}} + {{The complete setup button.}} 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}} + {{The Pipeline definition screen. Configure a new pipeline is selected.}} Select **Continue**. - {{ADD ALT TEXT}} + {{The continue button.}} 1. Select the Schema and Tables you want to migrate to the target database from the **Source data selection** list. - {{ADD ALT TEXT}} + {{The select source data section. }} You can select any number of columns from a table. - {{ADD ALT TEXT}} + {{The select source data section. A table is expanded with a few columns selected.}} 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. - {{ADD ALT TEXT}} + {{The missing unique constraint list.}} - {{ADD ALT TEXT}} + {{The missing unique constraint list with columns selected.}} Select **Add schema** to add additional database schemas. - {{ADD ALT TEXT}} + {{The add schema button.}} Select **Delete** to delete a schema. You must have at least one schema to continue. - {{ADD ALT TEXT}} + {{The delete schema button.}} After you've selected the schemas and tables you want to sync, select **Continue**. - {{ADD ALT TEXT}} + {{The continue button.}} 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}} + {{The start ingest button.}} 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. From 52412cc4938aab00fd27b2ae5dd96440a7921bdc Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Tue, 12 Nov 2024 15:30:21 -0800 Subject: [PATCH 34/39] add edit pipeline images --- content/operate/rc/databases/rdi/view-edit.md | 28 ++++++++++++++++-- static/images/rc/rdi/rdi-edit-button.png | Bin 0 -> 1060 bytes 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 static/images/rc/rdi/rdi-edit-button.png diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index 6e1a18f658..6342cab1cc 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -20,20 +20,42 @@ To change the data you want to ingest from the data pipeline: 1. From the **Data pipeline** tab, select **Edit**. + {{The edit pipeline button.}} + 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**. + {{The Pipeline definition screen. Configure a new pipeline is selected.}} + Select **Continue**. + + {{The continue button.}} + +1. Select the schema and tables you want to migrate to the target database from the **Source data selection** list. + + {{The select source data section. }} + + You can select any number of columns from a table. -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. + {{The select source data section. A table is expanded with a few columns selected.}} 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. + {{The missing unique constraint list.}} + {{The missing unique constraint list with columns selected.}} + + Select **Add schema** to add additional database schemas. + + {{The add schema button.}} + Select **Delete** to delete a schema. You must have at least one schema to continue. + {{The delete schema button.}} + After you've selected the schemas and tables you want to sync, select **Continue**. + {{The continue button.}} + 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. @@ -44,7 +66,7 @@ To change the data you want to ingest from the data pipeline: 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. +If you selected **Apply to new data changes only**, the data pipeline will enter the *change streaming* phase without ingesting data. ## Reset data pipeline diff --git a/static/images/rc/rdi/rdi-edit-button.png b/static/images/rc/rdi/rdi-edit-button.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b9af90c3911c5e9a5407bec753ca31c98ca049 GIT binary patch literal 1060 zcmV+<1l#+GP)003MF0{{R3-a$@%0003>P)t-s^!E4v z|Ns8}|NZ^`{QUm=`~CX*{rUR+`1$+SgJ?Dy&G z_vh>L=jrz5==SC3_2cLDL?atHf z&C=}5(d^03>&edR$j$1;%ch$D!pP~r#^}1i=D5G*w!q@IzT~gC;-aqGmZ8{{ zq1KO^)Q_6hi78cEx6O z#$t2DU2(!*Z^K+|!dYy=S8BmlYQI)#z*AL zL|M5(RkuG>wmnj|JyNwiQM5ZywKz|-I8C!POtUjevNK4rF-Wm5MzAeKuq{QeD?+X* zL9Qr2ttUUNCO)hsJ*-6!=X(GE0+mTbK~#9!?b=y)(m)u-@p(h*zO=@z*3_-mT~ZO; zYK;^WQEF4IR)kuyjn?vf|68E}0XfQKm?VQ|ewSSRPv9lV%rH&UG)>bqO&iR#GmcyJ z>X4xBRb3}zn@k!jT|x*-X^Y8V=MkE`J$zmXp(+iRXgLU-V=-YV4-xQEOwa-%vcN=` z1w^J`vcRTXM97^AeEnQR$_;uA3y4@j(fJUZloVo+V%#hbG4L$L%Rww0#>qxZY{sXA zn3SYmz@18$Z|JgJsr(G{66V2Wk-A()m%Bu(z?1RuX#|w#8ezx@d_Z&v4IkG&fg8^t zr}+ctb8Tz=fsb2(V>AhFX-Ol}3cQbwzCfQJD056q#2E;aXNJWCzrT6C%@-&>#~Ja! zSEs4rzZ2-=aQASfO zF+`xp2C0kw2KW6AnI0mr9$MfRq6_fd2sO|X46G1cgzsjkUvX9ZD?S0=`9A_Dqz;KI z6zC7h2Aa0UdII-TVi(-p@cyWiM02fMaZlhR(Gs{hQg3y)pSCRn8wZGHmUmZXsW3^IA7hB%r)^qA|4Gk}jQ^T=m_lQ0KTdhF6ouGzU za52Murz>Zd%IH_iW!L4s*QF7oG}lX0j4Zy_&e-JDUikp*|6}Px{lz2Ym*3Q1z*K$- zSp7wG^|v9^-^fvZD@^^(MD@30M_@x+{UZVDAF3FEV<{tWuxA90MroR+Y1%&=QJfCc efq$n1_xu81& Date: Mon, 25 Nov 2024 10:45:20 -0500 Subject: [PATCH 35/39] 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/view-edit.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 5630d100b9..2b2f0a8f68 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -72,7 +72,7 @@ After your pipeline is provisioned, you will be able to define your pipeline. Yo {{The missing unique constraint list with columns selected.}} - Select **Add schema** to add additional database schemas. + Select **Add schema** to add more database schemas. {{The add schema button.}} diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index 6342cab1cc..7edd2eaf29 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -10,7 +10,7 @@ hideListLinks: true weight: 3 --- -You can use the **Data pipeline** tab in your database to view and edit it. +Use the **Data pipeline** tab in your database to view and edit your data pipeline. The **Data pipeline** tab gives an overview of your data pipeline and lets you view your data stream metrics. @@ -44,7 +44,7 @@ To change the data you want to ingest from the data pipeline: {{The missing unique constraint list with columns selected.}} - Select **Add schema** to add additional database schemas. + Select **Add schema** to add more database schemas. {{The add schema button.}} From ff2c06196af4964d9046332ee074632c80d9f792 Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Wed, 27 Nov 2024 15:11:13 -0500 Subject: [PATCH 36/39] Added metrics --- content/operate/rc/databases/rdi/view-edit.md | 26 ++++++++++++++++++ .../images/rc/rdi/pipeline-status-error.png | Bin 0 -> 855 bytes .../rc/rdi/pipeline-status-initial-sync.png | Bin 0 -> 1596 bytes .../images/rc/rdi/pipeline-status-stopped.png | Bin 0 -> 1694 bytes .../rc/rdi/pipeline-status-streaming.png | Bin 0 -> 1691 bytes 5 files changed, 26 insertions(+) create mode 100644 static/images/rc/rdi/pipeline-status-error.png create mode 100644 static/images/rc/rdi/pipeline-status-initial-sync.png create mode 100644 static/images/rc/rdi/pipeline-status-stopped.png create mode 100644 static/images/rc/rdi/pipeline-status-streaming.png diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index 7edd2eaf29..a629b40077 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -14,6 +14,32 @@ Use the **Data pipeline** tab in your database to view and edit your data pipeli The **Data pipeline** tab gives an overview of your data pipeline and lets you view your data stream metrics. +The **Status** table shows statistics for the whole data pipeline: +- **Status**: The status of the data pipeline. Possible statuses include: + | Status | Description | + |--------|-------------| + | {{Initial Sync}} | The data pipeline is ingesting all records from the source database into the target database. | + | {{Streaming}} | The data pipeline is capturing new changes from the source database as they happen. Changes in the source database are added to the target database within a few seconds. | + | {{Stopped}}| The data pipeline has been [stopped](#stop-and-restart-data-pipeline). | + | {{Error}} | There is an error in the data pipeline. [Reset the pipeline](#reset-data-pipeline) and contact support if the issue persists. | +- **Total ingested**: Total number of records ingested from the source database. +- **Total inserted**: Total number of records inserted into the target database. +- **Total filtered**: Total number of records filtered from being inserted into the target database. +- **Total rejected**: Total number of records that could not be parsed or inserted into the target database. + +The **Data stream metrics** table shows the following metrics for each data stream: +| Metric | Description | +|--------|-------------| +| **Name** | Name of the data stream. Each stream corresponds to a table from the source database. | +| **Total** | Total number of records arrived from the source table. | +| **Pending** | Number of records from the source table that are waiting to be processed. | +| **Inserted** | Number of new records from the source table that have been written to the target database. | +| **Updated** | Number of updated records from the source table that have been updated in the target database. | +| **Deleted** | Number of deleted records from the source table that have been deleted in the target database. | +| **Filtered** | Number of records from the source table that were filtered from being inserted into the target database. | +| **Rejected** | Number of records from the source table that could not be parsed or inserted into the target database. | + + ## Edit data pipeline To change the data you want to ingest from the data pipeline: diff --git a/static/images/rc/rdi/pipeline-status-error.png b/static/images/rc/rdi/pipeline-status-error.png new file mode 100644 index 0000000000000000000000000000000000000000..2429dd725ccabfa04b83eca16742ac43af4ad7b4 GIT binary patch literal 855 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 literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/pipeline-status-streaming.png b/static/images/rc/rdi/pipeline-status-streaming.png new file mode 100644 index 0000000000000000000000000000000000000000..18fa67c96ccc5d8ec94b06ea31a2ba8dd1907d3f GIT binary patch literal 1691 zcmV;M24wk(P){Qdj;{QCR+`uh9$`TO|z`uF(y_V@Yp_W1Pm`1ADl^7Qxe^Y-!c z_VDuc@A38T@$~NS^z88T?eFvK?)2*J^6TyM>Fx38?DFaB^5*LC*zxA%=-{kDxf7My+TZBd-sjle=hxlm*4*aS+ve5V<-N(+{#Le5o%-X`s+QQ4(!OGdd%Gkfj z*uBTryvEhL#n!sS*15ygxWm-A!qm3F(zU?Sv%b-=yU&T#w6D9)t+~ytxXi1!%&NA_ zsJ6?gwaTcp%BHl*rL)MSvdE>e$D**tpsvNAt;C(J!=9|foUFr|s==A5z?Z1NmZ!g! zroNP=y_2N8T*jM{qr8!#ypW;0kDq{ss&j~`afhgIhNy3ar)-3# zY=Wg}fuv}Fqh@}hWPPAwd!J!?o?m#KU3Q#XbedRlnO1O@Qf`(}Ym`lCk{uK)rT_p0 zg-Jv~RCwC$*!xoxR~W|eCm}#cqOBkptV&{l6h%d=Xtk@f+KaWdG_BQQFSHelTE$wi ztq4`b8_Fd#ggwt++jGu_>~08Svl9n(_VY_-nGExOd0{zO_w6EUV|Y~I!F$};h7L5g%FPr6=EQLLolxf9b6(QE;T?|H!wqK{ydZcVMYc_ zl6PCtd7otNCn!G)vmW}pbo@ioycdTSyDUil`*Dj9r%)O9_=b@vx27gibie$&sPFhKapv;p&NE^r@XVODxqhtuULjlWC&q+qc zu$N>fl?v>6O6E$EMxZp&;ZFc9BROizNt>a}asf(=yy#521nnwW3*?xECG9OqziNgf zsl3`*aDwGzI_m+JFY!@VF?v0HWlj4P>Y}uq?XVNtDutPB_L;6jNzeFKL^?$Jk&9gdbfNU%z%{h}U=%lbS zsRqi1uYVsO?hCe)pP)kS8v`=-Rf%Y_I~9b(n>%*I;1+D{?h2zQXYllmw;6;p#k^Tzl_4(m}aDB6y87_Uw6e l9`5>lKA+F$^Z9(w^&dg*h=x!}O4tAZ002ovPDHLkV1n3wmpK3c literal 0 HcmV?d00001 From 40891ded90417be63f01fe517dd2a8bfe8569b5d Mon Sep 17 00:00:00 2001 From: Cameron Bates Date: Wed, 8 Jan 2025 16:10:06 -0500 Subject: [PATCH 37/39] DOC-4674 Addressing feedback from Georgiana, Yaron, and Cornel --- content/operate/rc/databases/rdi/_index.md | 6 ++- content/operate/rc/databases/rdi/define.md | 6 +-- content/operate/rc/databases/rdi/setup.md | 39 ++++++++++++++---- content/operate/rc/databases/rdi/view-edit.md | 12 +++--- .../rc/rdi/rdi-setup-connectivity-arn.png | Bin 0 -> 10385 bytes .../rc/rdi/rdi-status-metrics-tables.png | Bin 0 -> 19813 bytes 6 files changed, 47 insertions(+), 16 deletions(-) create mode 100644 static/images/rc/rdi/rdi-setup-connectivity-arn.png create mode 100644 static/images/rc/rdi/rdi-status-metrics-tables.png diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 7092f259bd..0c6a87432b 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -41,18 +41,22 @@ RDI encrypts all network connections with TLS. The pipeline will process data fr Before you can create a data pipeline, you must have: -- A [Redis Cloud Pro database]({{< relref "/operate/rc/databases/create-database/create-pro-database-new" >}}) hosted on Amazon Web Services (AWS) +- A [Redis Cloud Pro database]({{< relref "/operate/rc/databases/create-database/create-pro-database-new" >}}) hosted on Amazon Web Services (AWS). This will be the target database. - One supported source database, also hosted on AWS and connected to [AWS PrivateLink](https://aws.amazon.com/privatelink/): - MySQL - Oracle - SQL Server - PostgreSQL - mariaDB + - Amazon 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. +- The target database must use multi-zone [high availability]({{< relref "/operate/rc/databases/configuration/high-availability" >}}). +- The target database can use TLS, but can not use mutual TLS. +- The target database cannot be in the same subscription as another database that has a data pipeline. - Source databases must also be hosted on AWS. - One source database can only be synced to one target database. {{< /note >}} diff --git a/content/operate/rc/databases/rdi/define.md b/content/operate/rc/databases/rdi/define.md index 2b2f0a8f68..c6aedda6cc 100644 --- a/content/operate/rc/databases/rdi/define.md +++ b/content/operate/rc/databases/rdi/define.md @@ -33,7 +33,7 @@ After you have [prepared your source database]({{}}) in the **Source database secrets ARN** field. 1. Select **Start pipeline setup**. {{The start pipeline setup button.}} -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). +1. Redis Cloud will attempt to connect to PrivateLink. If your PrivateLink does not allow automatic acceptance of incoming connections, 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. @@ -49,13 +49,13 @@ When your pipeline is provisioned, select **Complete setup**. You will then [def ## 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. +After your pipeline is provisioned, you will be able to define your pipeline. You will select the database schemas, tables, 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. {{The complete setup button.}} -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**. +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** if the target database supports JSON. {{The Pipeline definition screen. Configure a new pipeline is selected.}} Select **Continue**. {{The continue button.}} diff --git a/content/operate/rc/databases/rdi/setup.md b/content/operate/rc/databases/rdi/setup.md index 98fedfa66a..305c49783d 100644 --- a/content/operate/rc/databases/rdi/setup.md +++ b/content/operate/rc/databases/rdi/setup.md @@ -24,6 +24,11 @@ weight: 1 {{The select source database type list.}} 1. If you know the size of your source database, enter it into the **Source dataset size** field. {{Enter the amount of source data you plan to ingest.}} +1. Under **Setup connectivity**, save the provided ARN and extract the AWS account ID for the account associated with your Redis Cloud cluster from it. + + {{The select source database type list.}} + + The AWS account ID is the string of numbers after `arn:aws:iam::` in the ARN. For example, if the ARN is `arn:aws:iam::123456789012:role/redis-data-pipeline`, the AWS account ID is `123456789012`. ## Prepare source database @@ -41,24 +46,44 @@ 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. +To do this, you need to: +1. [Create an encryption key](#create-encryption-key) using AWS Key Management Service with the right permissions. +1. [Create a secret](#create-database-credentials-secret) containing the source database credentials encrypted using that key. + +### Create encryption key + +In the [AWS Management Console](https://console.aws.amazon.com/), use the **Services** menu to locate and select **Security, Identity, and Compliance** > **Key Management Service**. [Create an encryption key](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html) with the following settings: + +1. In **Step 1 - Configure key**: + - **Key type**: Select **Symmetric**. + - **Key usage**: Select **Encrypt and decrypt**. + - Under **Advanced options**, set the following: + - **Key material origin**: Select **KMS - recommended**. + - **Regionality**: Select **Single-Region key**. +1. In **Step 2 - Add labels**, add an alias and description for the key. +1. In **Step 3 - Define key administrative permissions**, under **Key deletion**, select **Allow key administrators to delete this key**. +1. In **Step 4 - Define key usage permissions**, under **Other AWS accounts**, select **Add another AWS account**. Enter the AWS account ID for the Redis Cloud cluster that you saved earlier. + +### Create database credentials secret + 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)* + - `trust_certificate`: Server certificate in PEM format *(TLS only)* + - `client_public_key`: [X.509 client certificate](https://en.wikipedia.org/wiki/X.509) or chain in PEM format *(mTLS only)* + - `client_private_key`: Key for the client certificate or chain in PEM format *(mTLS only)* + - `client_private_key_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 `trust_certificate`, `client_public_key`, and `client_private_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). +- **Encryption key**: Select the [encryption key](#create-encryption-key) you created earlier. -- **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. +- **Resource permissions**: Add the following permissions to your secret to allow the Redis data pipeline to access your secret. Replace `` with the AWS account ID for the Redis Cloud cluster that you saved earlier. ```json { diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index a629b40077..dbeea984c1 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -1,19 +1,21 @@ --- -Title: View and edit data pipeline +Title: View data pipeline alwaysopen: false categories: - docs - operate - rc -description: Edit and observe your data pipeline. +description: Observe and stop your data pipeline. hideListLinks: true weight: 3 --- -Use the **Data pipeline** tab in your database to view and edit your data pipeline. +Use the **Data pipeline** tab in your database to view your data pipeline. The **Data pipeline** tab gives an overview of your data pipeline and lets you view your data stream metrics. +{{The select source database type list.}} + The **Status** table shows statistics for the whole data pipeline: - **Status**: The status of the data pipeline. Possible statuses include: | Status | Description | @@ -39,7 +41,7 @@ The **Data stream metrics** table shows the following metrics for each data stre | **Filtered** | Number of records from the source table that were filtered from being inserted into the target database. | | **Rejected** | Number of records from the source table that could not be parsed or inserted into the target database. | - + ## Stop and restart data pipeline diff --git a/static/images/rc/rdi/rdi-setup-connectivity-arn.png b/static/images/rc/rdi/rdi-setup-connectivity-arn.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3e746503b87da1e6845f0f88569f5bdac3db63 GIT binary patch literal 10385 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 Ce%3(% literal 0 HcmV?d00001 diff --git a/static/images/rc/rdi/rdi-status-metrics-tables.png b/static/images/rc/rdi/rdi-status-metrics-tables.png new file mode 100644 index 0000000000000000000000000000000000000000..07a2b03ce0184a0f501b438669448eb2d650546b GIT binary patch literal 19813 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 T>2m?`7f?naZ4i}ax1at86?bv| literal 0 HcmV?d00001 From 375cf155732d1809d89620314883a363ccbcfae3 Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Thu, 9 Jan 2025 11:04:37 -0500 Subject: [PATCH 38/39] Update content/operate/rc/databases/rdi/view-edit.md Co-authored-by: andy-stark-redis <164213578+andy-stark-redis@users.noreply.github.com> --- content/operate/rc/databases/rdi/view-edit.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/content/operate/rc/databases/rdi/view-edit.md b/content/operate/rc/databases/rdi/view-edit.md index dbeea984c1..3a4d1c8ee2 100644 --- a/content/operate/rc/databases/rdi/view-edit.md +++ b/content/operate/rc/databases/rdi/view-edit.md @@ -33,7 +33,7 @@ The **Data stream metrics** table shows the following metrics for each data stre | Metric | Description | |--------|-------------| | **Name** | Name of the data stream. Each stream corresponds to a table from the source database. | -| **Total** | Total number of records arrived from the source table. | +| **Total** | Total number of records that arrived from the source table. | | **Pending** | Number of records from the source table that are waiting to be processed. | | **Inserted** | Number of new records from the source table that have been written to the target database. | | **Updated** | Number of updated records from the source table that have been updated in the target database. | From c8483dec2d4b4bfb63a0ead8c3cdfecdf12fd19d Mon Sep 17 00:00:00 2001 From: Cameron Bates <102550101+cmilesb@users.noreply.github.com> Date: Thu, 16 Jan 2025 12:37:46 -0500 Subject: [PATCH 39/39] Apply suggestions from code review --- content/operate/rc/databases/rdi/_index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/content/operate/rc/databases/rdi/_index.md b/content/operate/rc/databases/rdi/_index.md index 0c6a87432b..95177a26e0 100644 --- a/content/operate/rc/databases/rdi/_index.md +++ b/content/operate/rc/databases/rdi/_index.md @@ -25,13 +25,13 @@ 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. The data pipeline translates relational database rows to Redis hashes or JSON documents. +An 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 sync* phase. After this initial sync is complete, the data pipeline enters the *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 and TLS certificates 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 Kubernetes 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 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.