-
Notifications
You must be signed in to change notification settings - Fork 680
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add dr auto sync #6592
Merged
Merged
add dr auto sync #6592
Changes from all commits
Commits
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -308,6 +308,8 @@ Usage: | |
config set cluster-version 1.0.8 // Set the version of the cluster to 1.0.8 | ||
``` | ||
|
||
- `replication-mode` controls the replication mode of Regions in the dual data center scenario. See [Enable the DR Auto-Sync mode](/two-data-centers-in-one-city-deployment.md#enable-the-dr-auto-sync-mode) for details. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. ditto |
||
|
||
- `leader-schedule-policy` is used to select the scheduling strategy for the leader. You can schedule the leader according to `size` or `count`. | ||
|
||
- `scheduler-max-waiting-operator` is used to control the number of waiting operators in each scheduler. | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,233 @@ | ||
--- | ||
title: Two Data Centers in One City Deployment | ||
summary: Learn the deployment solution of two data centers in one city. | ||
aliases: ['/tidb/dev/synchronous-replication'] | ||
--- | ||
|
||
# Two Data Centers in One City Deployment | ||
|
||
This document introduces the deployment mode of two data centers (DCs) in one city, including the architecture, configuration, how to enable this deployment mode, and how to use replicas in this mode. | ||
|
||
In an on-premises environment, TiDB usually adopts the multi-data-center deployment solution to ensure high availability and disaster recovery capability. The multi-data-center deployment solution includes multiple deployment modes, such as three data centers in two cities and three data centers in one city. This document introduces the deployment mode of two data centers in one city. Deployed in this mode, TiDB can also meet the requirements of high availability and disaster recovery, with a lower cost. This deployment solution adopts Data Replication Auto Synchronous mode, or the DR Auto-Sync mode. | ||
|
||
Under the mode of two data centers in one city, the two data centers are less than 50 kilometers apart. They are usually located in the same city or in two adjacent cities. The network latency between the two data centers is lower than 1.5 milliseconds and the bandwidth is higher than 10 Gbps. | ||
|
||
## Deployment architecture | ||
|
||
This section takes the example of a city where two data centers IDC1 and IDC2 are located respectively in the east and west. | ||
|
||
The architecture of the cluster deployment is as follows: | ||
|
||
- The TiDB cluster is deployed to two DCs in one city: the primary IDC1 in the east, and the disaster recovery (DR) IDC2 in the west. | ||
- The cluster has 4 replicas: 2 Voter replicas in IDC1, 1 Voter replica and 1 Learner replica in IDC2. For the TiKV component, each rack has a proper label. | ||
- The Raft protocol is adopted to ensure consistency and high availability of data, which is transparent to users. | ||
|
||
![2-DC-in-1-city architecture](/media/two-dc-replication-1.png) | ||
|
||
This deployment solution defines three statuses to control and identify the replication status of the cluster, which restricts the replication mode of TiKV. The replication mode of the cluster can automatically and adaptively switch between the three statuses. For details, see the [Status switch](#status-switch) section. | ||
|
||
- **sync**: Synchronous replication mode. In this mode, at least one replica in the disaster recovery (DR) data center synchronizes with the primary data center. The Raft algorithm ensures that each log is replicated to the DR based on the label. | ||
- **async**: Asynchronous replication mode. In this mode, the DR data center is not fully synchronized with the primary data center. The Raft algorithm follows the majority protocol to replicate logs. | ||
- **sync-recover**: Synchronous recovery mode. In this mode, the DR data center is not fully synchronized with the primary data center. Raft gradually switches to the label replication mode and then reports the label information to PD. | ||
|
||
## Configuration | ||
|
||
### Example | ||
|
||
The following `tiup topology.yaml` example file is a typical topology configuration for the two data centers in one city deployment mode: | ||
|
||
``` | ||
# # Global variables are applied to all deployments and used as the default value of | ||
# # the deployments if a specific deployment value is missing. | ||
global: | ||
user: "tidb" | ||
ssh_port: 22 | ||
deploy_dir: "/data/tidb_cluster/tidb-deploy" | ||
data_dir: "/data/tidb_cluster/tidb-data" | ||
server_configs: | ||
pd: | ||
replication.location-labels: ["zone","rack","host"] | ||
pd_servers: | ||
- host: 10.63.10.10 | ||
name: "pd-10" | ||
- host: 10.63.10.11 | ||
name: "pd-11" | ||
- host: 10.63.10.12 | ||
name: "pd-12" | ||
tidb_servers: | ||
- host: 10.63.10.10 | ||
- host: 10.63.10.11 | ||
- host: 10.63.10.12 | ||
tikv_servers: | ||
- host: 10.63.10.30 | ||
config: | ||
server.labels: { zone: "east", rack: "east-1", host: "30" } | ||
- host: 10.63.10.31 | ||
config: | ||
server.labels: { zone: "east", rack: "east-2", host: "31" } | ||
- host: 10.63.10.32 | ||
config: | ||
server.labels: { zone: "west", rack: "west-1", host: "32" } | ||
- host: 10.63.10.33 | ||
config: | ||
server.labels: { zone: "west", rack: "west-2", host: "33" } | ||
monitoring_servers: | ||
- host: 10.63.10.60 | ||
grafana_servers: | ||
- host: 10.63.10.60 | ||
alertmanager_servers: | ||
- host: 10.63.10.60 | ||
``` | ||
|
||
### Placement Rules | ||
|
||
To deploy a cluster based on the planned topology, you need to use [placement rules](/configure-placement-rules.md) to determine the locations of the cluster replicas. If 4 replicas and 2 Voter replicas are at the primary center and 1 Voter replica and 1 Learner replica are at the DR center, you can use the placement rules to configure the replicas as follows: | ||
|
||
``` | ||
cat rule.json | ||
[ | ||
{ | ||
"group_id": "pd", | ||
"id": "zone-east", | ||
"start_key": "", | ||
"end_key": "", | ||
"role": "voter", | ||
"count": 2, | ||
"label_constraints": [ | ||
{ | ||
"key": "zone", | ||
"op": "in", | ||
"values": [ | ||
"east" | ||
] | ||
} | ||
], | ||
"location_labels": [ | ||
"zone", | ||
"rack", | ||
"host", | ||
] | ||
}, | ||
{ | ||
"group_id": "pd", | ||
"id": "zone-west", | ||
"start_key": "", | ||
"end_key": "", | ||
"role": "voter", | ||
"count": 1, | ||
"label_constraints": [ | ||
{ | ||
"key": "zone", | ||
"op": "in", | ||
"values": [ | ||
"west" | ||
] | ||
} | ||
], | ||
"location_labels": [ | ||
"zone", | ||
"rack", | ||
"host" | ||
] | ||
}, | ||
{ | ||
"group_id": "pd", | ||
"id": "zone-west", | ||
"start_key": "", | ||
"end_key": "", | ||
"role": "learner", | ||
"count": 1, | ||
"label_constraints": [ | ||
{ | ||
"key": "zone", | ||
"op": "in", | ||
"values": [ | ||
"west" | ||
] | ||
} | ||
], | ||
"location_labels": [ | ||
"zone", | ||
"rack", | ||
"host" | ||
] | ||
} | ||
] | ||
``` | ||
|
||
### Enable the DR Auto-Sync mode | ||
|
||
The replication mode is controlled by PD. When deploying a cluster, you can configure the replication mode in the PD configuration file. For example: | ||
|
||
{{< copyable "" >}} | ||
|
||
```toml | ||
[replication-mode] | ||
replication-mode = "dr-auto-sync" | ||
[replication-mode.dr-auto-sync] | ||
label-key = "zone" | ||
primary = "east" | ||
dr = "west" | ||
primary-replicas = 2 | ||
dr-replicas = 1 | ||
wait-store-timeout = "1m" | ||
wait-sync-timeout = "1m" | ||
``` | ||
|
||
In the configuration above: | ||
|
||
+ `replication-mode` is the replication mode to be enabled. In the above example, it is set to `dr-auto-sync`. By default, the majority protocol is used. | ||
+ `label-key` is used to distinguish different data centers and needs to match placement rules. In this example, the primary data center is "east" and the DR data center is "west". | ||
+ `primary-replicas` is the number of Voter replicas in the primary data center. | ||
+ `dr-replicas` is the number of Voter replicas in the DR data center. | ||
+ `wait-store-timeout` is the waiting time for switching to asynchronous replication mode when network isolation or failure occurs. If the time of network failure exceeds the waiting time, asynchronous replication mode is enabled. The default waiting time is 60 seconds. | ||
|
||
To check the current replication status of the cluster, use the following API: | ||
|
||
{{< copyable "shell-regular" >}} | ||
|
||
```bash | ||
curl http://pd_ip:pd_port/pd/api/v1/replication_mode/status | ||
``` | ||
|
||
{{< copyable "shell-regular" >}} | ||
|
||
```bash | ||
{ | ||
"mode": "dr-auto-sync", | ||
"dr-auto-sync": { | ||
"label-key": "zone", | ||
"state": "sync" | ||
} | ||
} | ||
``` | ||
|
||
#### Status switch | ||
|
||
The replication mode of a cluster can automatically and adaptively switch between three statuses: | ||
|
||
- When the cluster is normal, the synchronous replication mode is enabled to maximize the data integrity of the disaster recovery data center. | ||
- When the network connection between the two data centers fails or the DR data center breaks down, after a pre-set protective interval, the cluster enables the asynchronous replication mode to ensure the availability of the application. | ||
- When the network reconnects or the DR data center recovers, the TiKV node joins the cluster again and gradually replicates the data. Finally, the cluster switches to the synchronous replication mode. | ||
|
||
The details for the status switch are as follows: | ||
|
||
1. **Initialization**: At the initialization stage, the cluster is in the synchronous replication mode. PD sends the status information to TiKV, and all TiKV nodes strictly follow the synchronous replication mode to work. | ||
|
||
2. **Switch from sync to async**: PD regularly checks the heartbeat information of TiKV to judge whether the TiKV node fails or is disconnected. If the number of failed nodes exceeds the number of replicas of the primary data center (`primary-replicas`) and the DR data center (`dr-replicas`), the synchronous replication mode can no longer serve the data replication and it is necessary to switch the status. When the failure or disconnect time exceeds the time set by `wait-store-timeout`, PD switches the status of the cluster to the async mode. Then PD sends the status of async to all TiKV nodes, and the replication mode for TiKV switches from two-center replication to the native Raft majority. | ||
|
||
3. **Switch from async to sync**: PD regularly checks the heartbeat information of TiKV to judge whether the TiKV node is reconnected. If the number of failed nodes is less than the number of replicas of the primary data center (`primary-replicas`) and the DR data center (`dr-replicas`), the synchronous replication mode can be enabled again. PD first switches the status of the cluster to sync-recover and sends the status information to all TiKV nodes. All Regions of TiKV gradually switch to the two-data-center synchronous replication mode and then report the heartbeat information to PD. PD records the status of TiKV Regions and calculates the recovery progress. When all TiKV Regions finish the switching, PD switches the replication mode to sync. | ||
|
||
### Disaster recovery | ||
|
||
This section introduces the disaster recovery solution of the two data centers in one city deployment. | ||
|
||
When a disaster occurs to a cluster in the synchronous replication mode, you can perform data recovery with `RPO = 0`: | ||
|
||
- If the primary data center fails and most of the Voter replicas are lost, but complete data exists in the DR data center, the lost data can be recovered from the DR data center. At this time, manual intervention is required with professional tools. You can contact the TiDB team for a recovery solution. | ||
|
||
- If the DR center fails and a few Voter replicas are lost, the cluster automatically switches to the asynchronous replication mode. | ||
|
||
When a disaster occurs to a cluster that is not in the synchronous replication mode and you cannot perform data recovery with `RPO = 0`: | ||
|
||
- If most of the Voter replicas are lost, manual intervention is required with professional tools. You can contact the TiDB team for a recovery solution. |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
这两处中文文档中是没有的。但因为原来英文文档中就有,所以加上了。PTAL~