{
  "schema_version": 2,
  "id": "integrate/redis-data-integration/installation/install-vm",
  "title": "Install on VMs",
  "url": "https://redis.io/docs/latest/integrate/redis-data-integration/installation/install-vm/",
  "summary": "Learn how to install RDI on one or more VMs",
  "tags": [
    "docs",
    "integrate",
    "rs",
    "rdi"
  ],
  "last_updated": "2026-09-18T16:39:21+01:00",
  "page_type": "content",
  "content_hash": "4f25438f4cb3758a5a2f2f4fec991c693d78fbaa6321932ef5a797f4444979ce",
  "sections": [
    {
      "id": "overview",
      "title": "Overview",
      "role": "overview",
      "text": "This guide explains how to install Redis Data Integration (RDI) on one or more VMs and integrate it with\nyour source databases. You can also\n[Install RDI on Kubernetes](https://redis.io/docs/latest/integrate/redis-data-integration/installation/install-k8s).\n\n> [!NOTE]\n> We recommend you always use the latest version, which is RDI v."
    },
    {
      "id": "create-the-rdi-database",
      "title": "Create the RDI database",
      "role": "content",
      "text": "RDI uses a database on your Redis Enterprise cluster to store its state\ninformation. Use the Redis Enterprise Cluster Manager UI to create the RDI database with the following\nrequirements:\n\n* Redis Enterprise v6.4 or greater for the cluster.\n* For production, 250MB RAM with one primary and one replica is recommended, but for the\n  quickstart or for development, 125MB and a single shard is sufficient.\n* If you are deploying RDI for a production environment then secure this database with a password\n  and TLS.\n* Set the database's\n  [eviction policy](https://redis.io/docs/latest/operate/rs/databases/memory-performance/eviction-policy) to `noeviction`. Note that you can't set this using\n  [`rladmin`](https://redis.io/docs/latest/operate/rs/references/cli-utilities/rladmin),\n  so you must either do it using the admin UI or with the following\n  [REST API](https://redis.io/docs/latest/operate/rs/references/rest-api)\n  command:\n\n  [code example]\n* Set the database's\n  [data persistence](https://redis.io/docs/latest/operate/rs/databases/configure/database-persistence)\n  to AOF - fsync every 1 sec. Note that you can't set this using\n  [`rladmin`](https://redis.io/docs/latest/operate/rs/references/cli-utilities/rladmin),\n  so you must either do it using the admin UI or with the following\n  [REST API](https://redis.io/docs/latest/operate/rs/references/rest-api)\n  commands:\n\n  [code example]\n If you don't have permissions to use AOF persistence, please check the [Using RDI without persistence](https://redis.io/docs/latest/integrate/redis-data-integration/faq#can-i-use-rdi-without-persistence-enabled) section in the FAQ.\n\n* **Ensure that the RDI database is not clustered.** RDI will not work correctly if the\n  RDI database is clustered (but note that the target database *can* be clustered without\n  any problems).\n\n  When you create the RDI database, expand the **Clustering** section and make sure the\n  **Sharding** option is *unchecked* (as shown below).\n\n  ![The Sharding option is unchecked in the Clustering section of the create database form.](https://redis.io/docs/latest/images/rdi/ingest/RDIClusterSetting.webp)\n\n  You can check if your RDI database is clustered from its **Configuration** tab in the\n  Cluster Manager UI. In the **Clustering** section, **Sharding** should be set to **Disabled**,\n  as shown in the following screenshot:\n\n  ![The Clustering section of the database Configuration tab shows Sharding: Disabled.](https://redis.io/docs/latest/images/rdi/ingest/RDICheckUnclustered.webp)\n\n  If you find the database has been clustered by mistake, you must create a new database with\n  sharding disabled before continuing with the RDI installation."
    },
    {
      "id": "hardware-sizing",
      "title": "Hardware sizing",
      "role": "content",
      "text": "RDI is mainly CPU and network bound. \nEach of the RDI VMs should have at least:\n\n* **CPU**: A minimum of 4 CPU cores. You should consider adding\n  2-6 extra cores on top of this if your dataset is big and you want to ingest the\n  baseline snapshot as fast as possible.\n* **RAM**: 8GB \n* **Disk**: On top of the OS footprint,\n  RDI requires 20GB in the `/var` folder and 1GB in the `/opt` folder (to\n  store the log files). This allows space for upgrades.\n* **Network interface**: 10GB or more."
    },
    {
      "id": "vm-installation-requirements",
      "title": "VM Installation Requirements",
      "role": "content",
      "text": "You would normally install RDI on two VMs for High Availability (HA) but you can also install\njust one VM if you don't need this. For example, you might not need HA during\ndevelopment and testing.\n\n> [!NOTE]\n> You can't install RDI on a host where a Redis Enterprise cluster\n> is also installed, due to incompatible network rules. If you want to install RDI on a\n> host that you have previously used for Redis Enterprise then you must\n> use [`iptables`](https://www.netfilter.org/projects/iptables/index.html) to\n> \"clean\" the host before installation with the following command line:\n>\n> [code example]\n>\n> You may encounter problems if you use `iptables` v1.6.1 and earlier in\n> `nftables` mode. Use `iptables` versions later than v1.6.1 or enable the `iptables`\n> legacy mode with the following commands:\n>\n> [code example]\n>\n> Also, `iptables` versions 1.8.0-1.8.4 have known issues that can prevent RDI\n> from working, especially on RHEL 8. Ideally, use `iptables` v1.8.8, which is\n> known to work correctly with RDI.\n\nThe supported OS versions for RDI are:\n\n* RHEL 8 or 9\n* Ubuntu 20.04, 22.04, or 24.04\n\nYou must run the RDI installer as a privileged user because it installs\n[containerd](https://containerd.io/) and registers services. However, you don't\nneed any special privileges to run RDI processes for normal operation.\n\nRDI has a few\nrequirements for cloud VMs that you must implement before running the\nRDI installer, or else installation will fail. The following sections\ngive full pre-installation instructions for [RHEL](#firewall-rhel) and\n[Ubuntu](#firewall-ubuntu)."
    },
    {
      "id": "firewall-rhel",
      "title": "RHEL",
      "role": "content",
      "text": "We recommend you turn off\n[`firewalld`](https://firewalld.org/documentation/)\nbefore installation using the command:\n\n[code example]\n\nHowever, if you do need to use `firewalld`, you must add the following rules:\n\n[code example]\n\nIf you have `nm-cloud-setup.service` enabled, you must disable it and reboot the\nnode with the following commands:\n\n[code example]"
    },
    {
      "id": "firewall-ubuntu",
      "title": "Ubuntu",
      "role": "content",
      "text": "We recommend you turn off\n[Uncomplicated Firewall](https://wiki.ubuntu.com/UncomplicatedFirewall) (`ufw`)\nbefore installation with the command:\n\n[code example]\n\nHowever, if you do need to use `ufw`, you must add the following rules:\n\n[code example]"
    },
    {
      "id": "installation-steps",
      "title": "Installation steps",
      "role": "setup",
      "text": "Follow the steps below for each of your VMs.\n\n> [!NOTE]\n> RDI installs executables by default in the `/var` partition, so you must\n> ensure it is mounted without the `noexec` option. Use the following command to\n> find any partitions mounted with the `noexec` option:\n>\n> [code example]\n>\n> If your `/var` partition is listed in the output from this command, you must remount\n> it without the `noexec` option. See\n> [Using the mount command](https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/5/html/deployment_guide/chap-using_the_mount_command) in the Red Hat documentation to learn how to remount a partition.\n\n1.  Download the RDI installer from the\n    [Redis download center](https://redis-enterprise-software-downloads.s3.amazonaws.com/redis-di/rdi-installation-.tar.gz)\n    (from the *Modules, Tools & Integration* category) and extract it to your preferred installation\n    folder.\n\n    [code example]\n\n1.  Go to the installation folder:\n\n    [code example]\n\n1.  Run the `install.sh` script as a privileged user:\n\n    [code example]\n\n    > [!NOTE]\n    > RDI uses [K3s](https://k3s.io/) as part of its implementation.\n    > By default, the installer installs K3s in the `/var/lib` directory,\n    > but this might be a problem if you have limited space in `/var`\n    > or your company policy forbids you to install there. You can\n    > select a different directory for the K3s installation using the\n    > `--installation-dir` option with `install.sh`:\n    >\n    > [code example]\n\n    **Advanced**: You can also pass custom K3s parameters to the installer using the\n    `INSTALL_K3S_EXEC` environment variable. For example, to set the kubeconfig file \n    permissions to be readable by all users:\n\n    [code example]\n\n    You can combine multiple K3s options in the `INSTALL_K3S_EXEC` variable. See the\n    [K3s documentation](https://docs.k3s.io/installation/configuration) for a full list of \n    available options.\n\n    > [!WARNING]\n    > Only modify K3s parameters if you understand exactly what you are changing \n    > and why. Incorrect K3s configuration can cause RDI installation to fail or result in an \n    > unstable deployment. \n    \n\nThe RDI installer collects all necessary configuration details and alerts you to potential issues, \noffering options to abort, apply fixes, or provide additional information. \nOnce complete, it guides you through creating secrets and setting up your pipeline.\n\n> [!NOTE]\n> It is strongly recommended to specify a hostname rather than an IP address for\n> connecting to your RDI database, for the following reasons:\n>\n> -   Any DNS resolution issues will be detected during the installation rather than\n>     later during pipeline deployment.\n> -   If you use TLS, your RDI database CA certificate must contain the hostname you specified\n>     either as a common name (CN) or as a subject alternative name (SAN). CA certificates\n>     usually don't contain IP addresses.\n\n> [!NOTE]\n> If you specify `localhost` as the address of the RDI database server during\n> installation then the connection will fail if the actual IP address changes for the local\n> VM. For this reason, we recommend that you don't use `localhost` for the address. However,\n> if you do encounter this problem, you can fix it using the following commands on the VM\n> that is running RDI itself:\n>\n> [code example]\n\nAfter the installation is finished, RDI is ready for use."
    },
    {
      "id": "supply-cloud-dns-information",
      "title": "Supply cloud DNS information",
      "role": "content",
      "text": "> [!NOTE]\n> This section is only relevant if you are installing RDI\n> on VMs in a cloud environment.\n\nIf you are using [Amazon Route 53](https://aws.amazon.com/route53/),\n[Google Cloud DNS](https://cloud.google.com/dns?hl=en), or\n[Azure DNS](https://azure.microsoft.com/en-gb/products/dns)\nthen you must supply the installer with the nameserver IP address\nduring installation. The table below\nshows the appropriate IP address for each cloud provider:\n\n| Platform | Nameserver IP |\n| :-- | :-- |\n| [Amazon Route 53](https://aws.amazon.com/route53/) | 169.254.169.253 |\n| [Google Cloud DNS](https://cloud.google.com/dns?hl=en) | 169.254.169.254 |\n| [Azure DNS](https://azure.microsoft.com/en-gb/products/dns) | 168.63.129.16 |\n\nIf you are using Route 53, you should first check that your VPC\nis configured to allow it. See\n[DNS attributes in your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/AmazonDNS-concepts.html#vpc-dns-support)\nin the Amazon docs for more information."
    },
    {
      "id": "installing-with-high-availability",
      "title": "Installing with High Availability",
      "role": "setup",
      "text": "To install RDI with High Availability (HA), perform the [Installation steps](#installation-steps)\non two different VMs. The first VM will automatically become the active (primary) instance, \nwhile the second VM will become the passive (secondary) one. \nWhen starting the RDI installation on the second VM, the installer will detect that the RDI\ndatabase is already in use and ask you to confirm that you intend to install RDI with HA.\n\nAfter the installation is complete, you must set the source and target database secrets\non both VMs as described in [Deploy a pipeline](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/deploy). If you use `redis-di` to deploy your configuration, you only need to do this on one of the VMs, not both.\n\nIn a High Availability setup, the RDI pipeline is only active on the primary instance (VM).\nThe two RDI instances will use the RDI database for leader election. If the primary instance fails \nto renew the lease in the RDI database, it will lose the leadership and a failover to the secondary instance\nwill take place. After the failover, the secondary instance will become the primary one, \nand the RDI pipeline will be active on that VM.\n\nThe secondary instance keeps the pipeline and its configuration, and reports it with the\n`standby` status, but runs none of its collectors or its stream processor, and it does not\ntouch the pipeline's keys in the RDI database. A standby pipeline is read-only, so\nrunning [`redis-di describe`](https://redis.io/docs/latest/integrate/redis-data-integration/reference/cli/redis-di-describe)\nagainst the secondary instance works and shows `Status: standby`. Attempting to change a standby pipeline\nfails with `423 Locked` and a message saying that the pipeline is standing by because this instance is\ncurrently a leader election follower. Operations such as deploy, start, stop, reset, and delete\ncan only be performed against the primary instance.\n\nYou can still set pipeline secrets for an instance when it is on standby. Secrets are maintained per\ninstance and are not replicated between the two, because they can legitimately differ in some cases.\n\nYou may find it useful to trigger a failover deliberately to check that RDI is correctly configured to handle it. See [Test HA failover](https://redis.io/docs/latest/integrate/redis-data-integration/installation/ha-test) to learn how to do this."
    },
    {
      "id": "prepare-your-source-databases",
      "title": "Prepare your source databases",
      "role": "content",
      "text": "Before deploying a pipeline, you must configure each source database to enable CDC. See the\n[Prepare source databases](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/prepare-dbs)\nsection to learn how to do this. A pipeline can capture from more than one source database,\nand you must prepare each one separately. See\n[Multiple sources in one pipeline](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/multiple-sources) for more information."
    },
    {
      "id": "deploy-a-pipeline",
      "title": "Deploy a pipeline",
      "role": "content",
      "text": "When the installation is complete, and you have prepared your source databases for CDC,\nyou are ready to start using RDI. See the guides on how to\n[configure](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines) and\n[deploy](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/deploy)\nRDI pipelines for more information. You can also configure and deploy a pipeline\nusing [Redis Insight](https://redis.io/docs/latest/develop/tools/insight). See\n[RDI in Redis Insight](https://redis.io/docs/latest/develop/tools/insight/rdi-connector)\nfor full details on how to connect to RDI and deploy pipelines.\n\n> [!NOTE]\n> The [`redis-di` CLI](https://redis.io/docs/latest/integrate/redis-data-integration/reference/cli)\n> is bundled with the VM installer, so it is already available on the VM where RDI is installed. If you\n> prefer to run it from your own laptop or desktop instead, you can\n> [download it separately](https://redis.io/docs/latest/integrate/redis-data-integration/installation/install-k8s#download-the-rdi-cli)\n> for your platform."
    },
    {
      "id": "configure-the-flink-processor",
      "title": "Configure the Flink processor",
      "role": "configuration",
      "text": "RDI ships with two stream processor implementations: the *classic* processor and the\ndefault [Apache Flink](https://flink.apache.org/)-based *Flink* processor.\nSee\n[Stream processor implementations](https://redis.io/docs/latest/integrate/redis-data-integration/architecture#stream-processor-implementations)\nfor an overview of the differences and\n[Differences between the classic and Flink processors](https://redis.io/docs/latest/integrate/redis-data-integration/architecture/classic-vs-flink)\nfor a side-by-side comparison.\n\nA pipeline runs on the Flink processor unless its `config.yaml` sets\n[`processors.type`](https://redis.io/docs/latest/integrate/redis-data-integration/data-pipelines/pipeline-config#processors)\nto `classic`. Fine-tune the Flink runtime\nthrough the `processors.advanced` section of `config.yaml` (see the\n[configuration reference](https://redis.io/docs/latest/integrate/redis-data-integration/reference/config-yaml-reference#processors)).\n\nFor migrating existing pipelines to the Flink processor, see\n[Migrate from the classic processor to the Flink processor](https://redis.io/docs/latest/integrate/redis-data-integration/installation/migration-classic-to-flink)."
    },
    {
      "id": "uninstall-rdi",
      "title": "Uninstall RDI",
      "role": "content",
      "text": "If you want to remove your RDI installation, go to the installation folder and run\nthe uninstall script as a privileged user:\n\n[code example]\n\nThe script will ask if you are sure before proceeding:\n\n[code example]\n\nIf you type anything other than \"y\" here, the script will abort without making any changes\nto RDI or your source databases."
    }
  ],
  "examples": [
    {
      "id": "create-the-rdi-database-ex0",
      "language": "bash",
      "code": "curl -v -k -d '{\"eviction_policy\": \"noeviction\"}' \\\n    -u '<USERNAME>:<PASSWORD>' \\\n    -H \"Content-Type: application/json\" \\\n    -X PUT https://<CLUSTER_FQDN>:9443/v1/bdbs/<BDB_UID>",
      "section_id": "create-the-rdi-database"
    },
    {
      "id": "create-the-rdi-database-ex1",
      "language": "bash",
      "code": "curl -v -k -d '{\"data_persistence\":\"aof\"}' \\\n    -u '<USERNAME>:<PASSWORD>' \\\n    -H \"Content-Type: application/json\" \n    -X PUT https://<CLUSTER_FQDN>:9443/v1/bdbs/<BDB_UID>\n  curl -v -k -d '{\"aof_policy\":\"appendfsync-every-sec\"}' \\\n    -u '<USERNAME>:<PASSWORD>' \\\n    -H \"Content-Type: application/json\" \\\n    -X PUT https://<CLUSTER_FQDN>:9443/v1/bdbs/<BDB_UID>",
      "section_id": "create-the-rdi-database"
    },
    {
      "id": "vm-installation-requirements-ex0",
      "language": "bash",
      "code": ">  sudo iptables-save | awk '/^[*]/ { print $1 } \n>                      /^:[A-Z]+ [^-]/ { print $1 \" ACCEPT\" ; }\n>                      /COMMIT/ { print $0; }' | sudo iptables-restore\n>",
      "section_id": "vm-installation-requirements"
    },
    {
      "id": "vm-installation-requirements-ex1",
      "language": "bash",
      "code": "> sudo update-alternatives --set iptables /usr/sbin/iptables-legacy\n> sudo update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy\n>",
      "section_id": "vm-installation-requirements"
    },
    {
      "id": "firewall-rhel-ex0",
      "language": "bash",
      "code": "sudo systemctl disable firewalld --now",
      "section_id": "firewall-rhel"
    },
    {
      "id": "firewall-rhel-ex1",
      "language": "bash",
      "code": "sudo firewall-cmd --permanent --add-port=443/tcp # RDI API\nsudo firewall-cmd --permanent --add-port=6443/tcp # kube-apiserver\nsudo firewall-cmd --permanent --zone=trusted --add-source=10.42.0.0/16 # Kubernetes pods\nsudo firewall-cmd --permanent --zone=trusted --add-source=10.43.0.0/16 # Kubernetes services\nsudo firewall-cmd --reload",
      "section_id": "firewall-rhel"
    },
    {
      "id": "firewall-rhel-ex2",
      "language": "bash",
      "code": "sudo systemctl disable nm-cloud-setup.service nm-cloud-setup.timer\nsudo reboot",
      "section_id": "firewall-rhel"
    },
    {
      "id": "firewall-ubuntu-ex0",
      "language": "bash",
      "code": "sudo ufw disable",
      "section_id": "firewall-ubuntu"
    },
    {
      "id": "firewall-ubuntu-ex1",
      "language": "bash",
      "code": "sudo ufw allow 443/tcp # RDI API\nsudo ufw allow 6443/tcp # kube-apiserver\nsudo ufw allow from 10.42.0.0/16 to any # Kubernetes pods\nsudo ufw allow from 10.43.0.0/16 to any # Kubernetes services\nsudo ufw reload",
      "section_id": "firewall-ubuntu"
    },
    {
      "id": "installation-steps-ex0",
      "language": "bash",
      "code": "> mount | grep noexec\n>",
      "section_id": "installation-steps"
    },
    {
      "id": "installation-steps-ex1",
      "language": "bash",
      "code": "export RDI_VERSION=\n    wget https://redis-enterprise-software-downloads.s3.amazonaws.com/redis-di/rdi-installation-$RDI_VERSION.tar.gz\n    tar -xvf rdi-installation-$RDI_VERSION.tar.gz",
      "section_id": "installation-steps"
    },
    {
      "id": "installation-steps-ex2",
      "language": "bash",
      "code": "cd rdi_install/$RDI_VERSION",
      "section_id": "installation-steps"
    },
    {
      "id": "installation-steps-ex3",
      "language": "bash",
      "code": "sudo ./install.sh",
      "section_id": "installation-steps"
    },
    {
      "id": "installation-steps-ex4",
      "language": "bash",
      "code": "> sudo ./install.sh --installation-dir <custom-installation-directory>\n    >",
      "section_id": "installation-steps"
    },
    {
      "id": "installation-steps-ex5",
      "language": "bash",
      "code": "sudo INSTALL_K3S_EXEC='--write-kubeconfig-mode=644' ./install.sh",
      "section_id": "installation-steps"
    },
    {
      "id": "installation-steps-ex6",
      "language": "bash",
      "code": "> sudo k3s kubectl delete nodes --all\n> sudo service k3s restart\n>",
      "section_id": "installation-steps"
    },
    {
      "id": "uninstall-rdi-ex0",
      "language": "bash",
      "code": "sudo ./uninstall.sh",
      "section_id": "uninstall-rdi"
    },
    {
      "id": "uninstall-rdi-ex1",
      "language": "plaintext",
      "code": "This will uninstall RDI and its dependencies, are you sure? [y, N]",
      "section_id": "uninstall-rdi"
    }
  ]
}
