## モジュール 3: アベイラビリティゾーン1のサブネット1を隔離する

### 手順 1. アベイラビリティゾーン1での完全な障害をシミュレートする

+ [ターミナル 1](ssh://monitor1-ssh#1)に戻り、スクリプトを実行してアベイラビリティゾーン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`です。したがって、クラスタコンポーネントの3分の1が接続を失いました。

  ```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サーバインスタンス1つのみで機能していることに注意してください。

  ```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 エンドポイントを使い続けられます。本 Self-Managed 演習で観察した結果と同じです。より高度な 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)で押して、両方のワークロードを停止します。
