## 模块 3: 隔离可用区 1 中的子网 1

### 步骤 1：模拟可用区 1 的完全故障

+ 返回[终端 1](ssh://monitor1-ssh#1) 并执行脚本，通过阻止子网 `demo-subnet-1` (可用区 1 中的子网 10.90.1.0/24)，模拟可用区的完全故障。

  ```bash
  VPC_ID=`aws ec2 describe-vpcs \
    --filters "Name=tag:Name,Values=${LAB:USER_UNIQUE_TAG}" \
    --query "Vpcs[0].VpcId" \
    --output text \
    --region ${LAB:REGION_CODE}`
  SUBNET_ID=`aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=${VPC_ID}" "Name=tag:Name,Values=demo-subnet-1" \
    --query "Subnets[0].SubnetId" \
    --output text \
    --region ${LAB:REGION_CODE}`
  CAGE_NACL_ID=`aws ec2 describe-network-acls \
    --filters "Name=vpc-id,Values=${VPC_ID}" "Name=default,Values=false" "Name=tag:Name,Values=cage" \
    --query "NetworkAcls[0].NetworkAclId" \
    --output text \
    --region ${LAB:REGION_CODE}`
  ASSOC_ID=`aws ec2 describe-network-acls \
    --filters "Name=vpc-id,Values=${VPC_ID}" "Name=default,Values=true" \
    --query "NetworkAcls[0].Associations" \
    --output text \
    --region ${LAB:REGION_CODE} | grep ${SUBNET_ID} | awk -F" " '{print $1}'`
  aws ec2 replace-network-acl-association \
    --association-id ${ASSOC_ID} \
    --network-acl-id ${CAGE_NACL_ID} \
    --region ${LAB:REGION_CODE}
  ```

  ```output
  {
   "NewAssociationId": "aclassoc-0402a6103febf799f"
  }
  ```

### 步骤 2：验证若干组件已断开连接

+ 在[终端 1](ssh://monitor1-ssh#1) 中，查看集群状态以验证若干组件，包括 PD、TiDB 和 TiKV 服务器由于可用区故障而断开连接/隔离。

+ 在示例输出中，受影响的服务器为 `10.90.1.208:2379   pd`、`10.90.1.247:4000   tidb` 和 `10.90.1.122:20160  tikv`。因此，集群的三分之一组件丢失连接。

  ```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  Down          /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|L          /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            /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  Down          -                             /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  Disconnected  /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
  ```

### 步骤 3：验证您的 INSERT 和 QUERY 负载仍在运行

+ 在[终端 2](ssh://monitor1-ssh#2) 和[终端 3](ssh://monitor1-ssh#3) 中，验证您的示例 INSERT/QUERY 负载仍在运行。请注意，现在 INSERT 和 QUERY 负载仅与一个 TiDB 服务器实例工作。

  ```output
  Worker 1 -> TiDB:Mon May 13 05:51:52 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 2 -> TiDB:Mon May 13 05:51:52 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 1 -> TiDB:Mon May 13 05:51:53 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 2 -> TiDB:Mon May 13 05:51:53 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  Worker 1 -> TiDB:Mon May 13 05:51:54 UTC 2024 at ${LAB:HOST_DB2_PRIVATE_IP}
  ...
  ```

  ```output
  Mon May 13 05:51:51 UTC 2024
  COUNT(event)
  5481

  Mon May 13 05:51:54 UTC 2024
  COUNT(event)
  5485
  ...
  ```

### 步骤 4：恢复可用区 1 的连接

+ 在[终端 1](ssh://monitor1-ssh#1) 中，运行脚本以恢复 `demo-subnet-1` 的连接。在 TiDB Cloud 的真实场景中，你无需自行执行此类脚本——由 TiDB Cloud 负责恢复。若可用区问题短暂，网络恢复后断开的组件会自动重新加入集群。若数据中心长时间不可用，TiDB Cloud 可在健康的可用区扩展容量并驱逐不可达节点。无论哪种方式，应用都可继续使用健康的 TiDB 端点——与本自管部署实验中观察到的结果相同。欲了解更多高级 TiDB 技能，请访问 [https://tidb.io/education/](https://tidb.io/education/)。

  ```bash
  VPC_ID=`aws ec2 describe-vpcs \
    --filters "Name=tag:Name,Values=${LAB:USER_UNIQUE_TAG}" \
    --query "Vpcs[0].VpcId" \
    --output text \
    --region ${LAB:REGION_CODE}`
  SUBNET_ID=`aws ec2 describe-subnets \
    --filters "Name=vpc-id,Values=${VPC_ID}" "Name=tag:Name,Values=demo-subnet-1" \
    --query "Subnets[0].SubnetId" \
    --output text \
    --region ${LAB:REGION_CODE}`
  DEFAULT_NACL_ID=`aws ec2 describe-network-acls \
    --filters "Name=vpc-id,Values=${VPC_ID}" "Name=default,Values=true" \
    --query "NetworkAcls[0].NetworkAclId" \
    --output text \
    --region ${LAB:REGION_CODE}`
  ASSOC_ID=`aws ec2 describe-network-acls \
    --filters "Name=vpc-id,Values=${VPC_ID}" "Name=default,Values=false" \
    --query "NetworkAcls[0].Associations" \
    --output text \
    --region ${LAB:REGION_CODE} | grep ${SUBNET_ID} | awk -F" " '{print $1}'`
  aws ec2 replace-network-acl-association \
    --association-id ${ASSOC_ID} \
    --network-acl-id ${DEFAULT_NACL_ID} \
    --region ${LAB:REGION_CODE}
  ```

  ```output
  {
   "NewAssociationId": "aclassoc-0df1e05cfc70356a8"
  }
  ```

### 步骤 5：验证所有集群组件已同步

+ 验证集群状态以确保之前断开的组件现已同步。

  ```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|L    /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      /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
  ```

+ 按 <kbd>Ctrl</kbd>+<kbd>C</kbd> 停止[终端 2](ssh://monitor1-ssh#2) 和[终端 3](ssh://monitor1-ssh#3) 上的两个负载。
