Physical cluster replication is supported in CockroachDB self-hosted clusters.
- The system virtual cluster for administration tasks in both clusters, and starting the replication stream from the standby cluster.
- The application virtual cluster on the primary cluster to work with databases, tables, workloads, and so on.
Overview
The high-level steps in this tutorial are:- Create and start the primary cluster.
- Configure and create a user on the primary cluster.
- Create and start the standby cluster.
- Configure and create a user on the standby cluster.
- Securely copy certificates.
- Start the replication stream from the standby cluster.
To set up PCR from an existing CockroachDB cluster, which will serve as the primary cluster, refer to Set up PCR from an existing cluster.
Before you begin
- Two separate CockroachDB clusters (primary and standby) with a minimum of three nodes each, and each using the same CockroachDB v24.2 version. The standby cluster should be the same version or one version ahead of the primary cluster. The primary and standby clusters must be configured with similar hardware profiles, number of nodes, and overall size. Significant discrepancies in the cluster configurations may result in degraded performance.
- To set up each cluster, you can follow Deploy CockroachDB on Premises. When you initialize the cluster with the
cockroach initcommand, you must pass the--virtualizedor--virtualized-emptyflag. Refer to the cluster creation steps for the primary cluster and for the standby cluster for details. - The Deploy CockroachDB on Premises tutorial creates a self-signed certificate for each self-hosted cluster. To create certificates signed by an external certificate authority, refer to Create Security Certificates using OpenSSL.
- To set up each cluster, you can follow Deploy CockroachDB on Premises. When you initialize the cluster with the
- All nodes in each cluster will need access to the Certificate Authority for the other cluster. Refer to Manage the cluster certificates.
- The primary and standby clusters must have the same region topology. For example, replicating a multi-region primary cluster to a single-region standby cluster is not supported. Mismatching regions between a multi-region primary and standby cluster is also not supported.
Step 1. Create the primary cluster
Initialize the primary cluster
To enable PCR, it is necessary to initialize the CockroachDB cluster with the appropriate flag to create the appropriate virtual clusters on the primary and standby cluster. When initializing the primary cluster, you pass the--virtualized flag to create a virtualized cluster with a system virtual cluster and a main virtual cluster. When initializing the standby cluster, you pass the --virtualized-empty flag to create a virtualized standby cluster that contains a system virtual cluster.
For example, the cockroach init command to initialize the primary cluster (according to the prerequisite deployment guide):
Connect to the primary cluster system virtual cluster
Connect to your primary cluster’s system virtual cluster usingcockroach sql.
-
To connect to the system virtual cluster, pass the
options=-ccluster=systemparameter in the URL:The prompt will includesystemwhen you are connected to the system virtual cluster.
You should only connect to the system virtual cluster for cluster administration. To work with databases, tables, or workloads, connect to a virtual cluster.
-
Set the
kv.rangefeed.enabledcluster setting totrue. The replication job connects to a long-lived request, a rangefeed, which pushes changes as they happen: -
Confirm the status of your virtual cluster:
The output will include the
systemvirtual cluster and themainvirtual cluster:Because this is the primary cluster rather than the standby cluster, thedata_stateof all rows isready, rather thanreplicatingor another status.
Create a replication user and password
The standby cluster connects to the primary cluster’s system virtual cluster using an identity with theREPLICATION privilege. Connect to the primary cluster’s system virtual cluster and create a user with a password:
-
From the primary’s system virtual cluster SQL shell, create a user and password:
-
Grant the
REPLICATIONsystem privilege to your user:If you need to change the password later, refer toALTER USER.
Connect to the primary virtual cluster (optional)
-
If you would like to run a sample workload on the primary’s virtual cluster, open a new terminal window and use
cockroach workloadto run the workload. For example, to initiate themovrworkload:Replace and with a node’s--advertise-addrIP address or hostname and port. Thecockroach workloadcommand does not support connection or security flags like othercockroachcommands. Instead, you must use a connection string at the end of the command. As a result, for the example in this tutorial, you will need:options=-ccluster=mainsslmode=verify-fullsslrootcert={path}/certs/ca.crt: the path to the CA certificate.sslcert={path}/certs/client.root.crt: the path to the client certificate.sslkey={path}/certs/client.root.key: the path to the client private key.
-
Run the
movrworkload for a set duration using the same connection string: -
To connect to the primary cluster’s virtual cluster, use the
options=-ccluster={virtual_cluster_name}parameter:The prompt will includemainwhen you are connected to the virtual cluster. -
Create a user for your primary cluster’s
mainvirtual cluster: -
You can connect to the DB Console with this user to observe activity on the primary cluster. Open a web browser at
https://{node IP or hostname}:8080/and enter your credentials.
Step 2. Create the standby cluster
Initialize the standby cluster
Similarly to the primary cluster, you must initialize the standby cluster with the--virtualized-empty flag. This creates a virtualized cluster with a system virtual cluster.
For example, the cockroach init command to initialize the standby cluster (according to the prerequisite deployment guide):
Connect to the standby cluster system virtual cluster
Connect to your standby cluster’s system virtual cluster usingcockroach sql.
-
To connect to the system virtual cluster, pass the
options=-ccluster=systemparameter in the URL: -
Add your cluster organization and Enterprise license to the cluster:
-
Set the
kv.rangefeed.enabledcluster setting totrue. The replication job connects to a long-lived request, a rangefeed, which pushes changes as they happen: -
Confirm the status of your virtual cluster:
The output will show the
systemvirtual cluster, but nomainvirtual cluster:
Create a user for the standby cluster
If you would like to access the DB Console to observe your replication, you will need to create a user:-
Create a user:
-
To observe the replication activity, your user will need
adminprivileges:Open the DB Console in your web browser:https://{node IP or hostname}:8080/, where you will be prompted for these credentials. Refer to Physical Cluster Replication Monitoring for more detail on tracking relevant metrics for your replication stream.
Step 3. Manage the cluster certificates
It is important to carefully manage the exchange of CA certificates between clusters if you have generated self-signed certificates with
cockroach cert as part of the prerequisite deployment tutorial.To create certificates signed by an external certificate authority, refer to Create Security Certificates using OpenSSL.cockroach encode-uri command to generate a connection string containing a cluster’s certificate for any PCR statements that require a connection string.
For example, in this tutorial you will need a connection string for the primary cluster when you start the replication stream from the standby.
To generate a connection string, pass the replication user, IP and port, along with the directory to the certificate for the primary cluster:
Step 4. Start replication
The system virtual cluster in the standby cluster initiates and controls the replication stream by pulling from the primary cluster. In this section, you will connect to the primary from the standby to initiate the replication stream.-
From the standby cluster, use your connection string to the primary:
If you generated the connection string using
cockroach encode-uri:Otherwise, pass the connection string that contains:- The replication user and password that you created for the primary cluster.
- The node IP address or hostname of one node from the primary cluster.
- The path to the primary node’s certificate on the standby cluster.
Once the standby cluster has made a connection to the primary cluster, the standby will pull the topology of the primary cluster and will distribute the replication work across all nodes in the primary and standby. -
To view all virtual clusters on the standby, run:
The standby cluster will show the
mainvirtual cluster is in areplicatingstate.The standby cluster’s virtual cluster is offline while the replication stream is running. To bring it online, you must explicitly start its service after cutover. -
To manage the replication stream, you can pause and resume the replication stream as well as show the current details for the job:
With the replication stream running, you can monitor the job via the DB Console, SQL shell, or Prometheus. You can also verify data is correct on the standby cluster at a specific point in time. For more detail, refer to Physical Cluster Replication Monitoring.
Set up PCR from an existing cluster
You can replicate data from an existing CockroachDB cluster that does not have cluster virtualization enabled to a standby cluster with cluster virtualization enabled. In the PCR setup, the existing cluster is the primary cluster, which serves application traffic.When you start PCR with an existing primary cluster that does not have cluster virtualization enabled, you will not be able to cut back to the original primary cluster from the promoted, original standby.For more details on the cutback process when you have started PCR with a non-virtualized primary, refer to Cut back after PCR from an existing cluster.
- An existing primary cluster. If you need to upgrade your existing cluster, refer to Upgrade page.
- A standby cluster that is at the same version or one version ahead of the primary cluster. To set up the cluster, you can follow Deploy CockroachDB on Premises. When you initialize the cluster with the
cockroach initcommand, you must pass the--virtualized-emptyflag. For details, refer to the cluster creation steps for the standby cluster. - Review the remaining prerequisites at the start of this page, which also apply to running PCR from an existing cluster.
Example
- To configure the standby cluster ready for PCR, follow the steps outlined in Connect to the standby cluster system virtual cluster that include enabling the necessary cluster settings.
-
Create a user on both clusters and grant the
SYSTEM REPLICATIONprivilege to the created user on each cluster: -
View the virtual clusters on both clusters:
You will find that both clusters only have the
systemvirtual cluster: -
To create the replication job, you will need a connection string for the primary cluster containing its CA certificate. For steps to generate a connection string with
cockroach encode-uri, refer to Step 3. Manage the cluster certificates. -
If you would like to run a test workload on your existing primary cluster, you can use
cockroach workloadlike the following: -
To start the replication, you will need to replicate
systemfrom the existing primary cluster in order to create a new virtual cluster on the standby cluster (mainin this example). On the standby cluster, run:This statement includes:main: The name of the virtual cluster to create on the standby cluster.system: The system virtual cluster on the existing primary cluster.- The connection string for the existing primary cluster.
-
View the virtual clusters on the standby cluster:
The output shows the newly created
mainvirtual cluster and that the replication job isinitializing:

