## 模块 1: 将 TiDB 集群部署在三个可用区之间

### 步骤 0：（可选）TiDB 简介

- 下图展示了 TiDB 在本地部署时的基本架构。
- TiDB 集群有三个主要组件：Placement Driver (PD) 集群、SQL 层集群和存储集群。
- Placement Driver (PD) 集群是 TiDB 的大脑。它管理元数据，为事务提供 Timestamp Oracle (TSO)，决定数据位置等。
- SQL 层是无状态的。TiDB Server 中不存储任何业务数据。TiDB Server 接收并处理来自客户端的 SQL，并将关系型数据转换为键值对。
- 存储层中的 TiKV 是行存储。在 TiKV 中，数据被分割成 Region（从 8.5 版本开始默认为 256 MB），每个 Region 默认复制 3 次以形成 Raft 组。然后，这些 Region 被调度到多个 TiKV 节点上，以实现高可用性（HA）。在每个 TiKV 节点上，数据通过 RocksDB 持久化到磁盘。
- 存储层中的 TiFlash 是列式存储，提供分析能力。当 TiFlash 启用时，TiDB 集群会自动决定是否将您的查询（或查询的一部分）发送到 TiFlash 以获得更好的性能。TiFlash 服务器在 TiDB 集群中是可选的——如果您的工作负载中没有分析查询，则无需部署 TiFlash 服务器。
- 更多详细信息，请参阅 TiDB [文档](https://docs.pingcap.com/tidb/stable/tidb-architecture/)。

![TiDBClusterArchitectureNormal_aa_001_20220506.png 85%](https://lab-static.pingcap.com/images/2025/12/30/c1b377be79b802bc06a4b40ad818c9aa16855450.png)

### 步骤 1：打开终端，SSH 登录到实验虚拟机

+ 通过点击以下链接打开三个 SSH 连接到你的实验虚拟机：
  + [终端 1](ssh://monitor1-ssh#1)
  + [终端 2](ssh://monitor1-ssh#2)
  + [终端 3](ssh://monitor1-ssh#3)

+ 现在你将拥有三个活动的终端会话。

### 步骤 2：在多个可用区启动 TiDB 集群

+ 在[终端 1](ssh://monitor1-ssh#1)中，查看已配置的集群拓扑 YAML。

  ```bash
  cat nine-nodes.yaml
  ```

  ```output
  global:
      user: "ec2-user"
      ssh_port: 22
      deploy_dir: "/tidb-deploy"
      data_dir: "/tidb-data"
      arch: "amd64"
  server_configs:
      pd:
          replication.max-replicas: 3
  pd_servers:
    - host: ${LAB:HOST_PD1_PRIVATE_IP}
      client_port: 2379
      peer_port: 2380
      advertise_client_addr: "http://${LAB:HOST_PD1_PUBLIC_IP}:2379"
    - host: ${LAB:HOST_PD2_PRIVATE_IP}
      client_port: 2379
      peer_port: 2380
      advertise_client_addr: "http://${LAB:HOST_PD2_PUBLIC_IP}:2379"
    - host: ${LAB:HOST_PD3_PRIVATE_IP}
      client_port: 2379
      peer_port: 2380
      advertise_client_addr: "http://${LAB:HOST_PD3_PUBLIC_IP}:2379"
  tidb_servers:
    - host: ${LAB:HOST_DB1_PRIVATE_IP}
      port: 4000
      status_port: 10080
      deploy_dir: /tidb-deploy/tidb-4000
      log_dir: /tidb-deploy/tidb-4000/log
    - host: ${LAB:HOST_DB2_PRIVATE_IP}
      port: 4000
      status_port: 10080
      deploy_dir: /tidb-deploy/tidb-4000
      log_dir: /tidb-deploy/tidb-4000/log
  tikv_servers:
    - host: ${LAB:HOST_KV1_PRIVATE_IP}
      port: 20160
      status_port: 20180
    - host: ${LAB:HOST_KV2_PRIVATE_IP}
      port: 20160
      status_port: 20180
    - host: ${LAB:HOST_KV3_PRIVATE_IP}
      port: 20160
      status_port: 20180
  monitoring_servers:
    - host: ${LAB:HOST_MONITOR1_PRIVATE_IP}
  grafana_servers:
    - host: ${LAB:HOST_MONITOR1_PRIVATE_IP}
  alertmanager_servers:
    - host: ${LAB:HOST_MONITOR1_PRIVATE_IP}
  ```

+ 修正系统配置以部署 TiDB 集群。

  ```bash
  tiup mirror set tidb-community-server-tidb_version-linux-amd64
  tiup cluster check nine-nodes.yaml \
    --user ec2-user \
    -i /home/ec2-user/.ssh/pe-class-key-${LAB:REGION_NAME}.pem \
    --apply
  ```

  ```output
  ...
  + Try to apply changes to fix failed checks
   - Applying changes on ${LAB:HOST_PD1_PRIVATE_IP} ... ⠧ Sysctl: host=${LAB:HOST_PD1_PRIVATE_IP} vm.swappiness = 0
  + Try to apply changes to fix failed checks
   - Applying changes on ${LAB:HOST_PD1_PRIVATE_IP} ... ⠇ Sysctl: host=${LAB:HOST_PD1_PRIVATE_IP} vm.swappiness = 0
  + Try to apply changes to fix failed checks
  + Try to apply changes to fix failed checks
   - Applying changes on ${LAB:HOST_PD1_PRIVATE_IP} ... Done
  + Try to apply changes to fix failed checks
   - Applying changes on ${LAB:HOST_PD1_PRIVATE_IP} ... Done
  + Try to apply changes to fix failed checks
   - Applying changes on ${LAB:HOST_PD1_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_PD3_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_KV2_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_DB1_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_PD2_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_KV1_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_KV3_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_DB2_PRIVATE_IP} ... Done
   - Applying changes on ${LAB:HOST_MONITOR1_PRIVATE_IP} ... Done
  ```

+ 部署 TiDB 集群。

  ```bash
  tiup cluster deploy tidb-demo tidb_version ./nine-nodes.yaml \
    --user ec2-user \
    -i /home/ec2-user/.ssh/pe-class-key-${LAB:REGION_NAME}.pem \
    --yes
  ```

  ```output
  ...
  Cluster `tidb-demo` deployed successfully, you can start it with command: `tiup cluster start tidb-demo --init`
  ```

+ 启动已部署的 TiDB 集群。

  ```bash
  tiup cluster start tidb-demo
  ```

  ```output
  ...
  Started cluster `tidb-demo` successfully
  ```

### 步骤 3：验证 TiDB 集群的状态

+ 关键集群组件分布在三个子网中：10.90.1.0/24、10.90.2.0/24 和 10.90.3.0/24，每个子网对应一个可用区。

+ 集群包括 3 个 PD 服务器、3 个 TiKV 服务器和 2 个 TiDB 服务器。

+ 特别关注托管有 PD 服务器、TiDB 服务器和 TiKV 服务器的子网 10.90.1.0/24。

+ 虽然您环境中的 IP 地址和示例输出可能有所不同，但子网配置保持一致。

  ```bash
  tiup cluster display tidb-demo
  ```

  ```output
  Cluster type:       tidb
  Cluster name:       tidb-demo
  Cluster version:    v${LAB:TIDB_VERSION}
  Deploy user:        ec2-user
  SSH type:           builtin
  Dashboard URL:      http://${LAB:HOST_PD1_PUBLIC_IP}:2379/dashboard
  Grafana URL:        http://${LAB:HOST_MONITOR1_PRIVATE_IP}:3000
  ID                 Role          Host         Ports        OS/Arch       Status  Data Dir                      Deploy Dir
  --                 ----          ----         -----        -------       ------  --------                      ----------
  ${LAB:HOST_MONITOR1_PRIVATE_IP}:9093     alertmanager  ${LAB:HOST_MONITOR1_PRIVATE_IP}    9093/9094    linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
  ${LAB:HOST_MONITOR1_PRIVATE_IP}:3000     grafana       ${LAB:HOST_MONITOR1_PRIVATE_IP}    3000         linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
  ${LAB:HOST_PD1_PRIVATE_IP}:2379   pd            ${LAB:HOST_PD1_PRIVATE_IP}  2379/2380    linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
  ${LAB:HOST_PD2_PRIVATE_IP}:2379    pd            ${LAB:HOST_PD2_PRIVATE_IP}   2379/2380    linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
  ${LAB:HOST_PD3_PRIVATE_IP}:2379   pd            ${LAB:HOST_PD3_PRIVATE_IP}  2379/2380    linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
  ${LAB:HOST_MONITOR1_PRIVATE_IP}:9090     prometheus    ${LAB:HOST_MONITOR1_PRIVATE_IP}    9090/12020   linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
  ${LAB:HOST_DB1_PRIVATE_IP}:4000   tidb          ${LAB:HOST_DB1_PRIVATE_IP}  4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  ${LAB:HOST_DB2_PRIVATE_IP}:4000    tidb          ${LAB:HOST_DB2_PRIVATE_IP}   4000/10080   linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
  ${LAB:HOST_KV1_PRIVATE_IP}:20160   tikv          ${LAB:HOST_KV1_PRIVATE_IP}   20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  ${LAB:HOST_KV2_PRIVATE_IP}:20160  tikv          ${LAB:HOST_KV2_PRIVATE_IP}  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  ${LAB:HOST_KV3_PRIVATE_IP}:20160  tikv          ${LAB:HOST_KV3_PRIVATE_IP}  20160/20180  linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
  Total nodes: 11
  ```
