# Lab 1: Deploying a TiDB Cluster Using TiUP

### Overview
In these exercises, you install the TiUP utility, deploy a TiDB cluster using TiUP, verify the running status of the TiDB cluster. Connect to the TiDB server, start/stop the TiDB cluster and then view the configuration file. The diagram below illustrates the deployment topology of the TiDB cluster.

   ![60](https://pingcap-edu.s3.us-west-2.amazonaws.com/quick-demo/TiDBClusterDeploymentTopologyExercise_aa_007_20220914.png)

### Notes
+ Click the private key file [pe-class-key-oregon.pem](lab-controller/class_303_get_ec2_key_for_lab.php?region=oregon) to download it. It is required to log into the Control Machine for this lab.
+ Commands and SQL statements presented on this page are clickable for easy copy and paste.
+ Your environment may be different with these exercises, including but not limited to IP, port, username, password and directory. Example output is displayed in a gray background in this guide.
+ The `$` in your terminal window is an OS prompt. The `tidb>` or `mysql>` in your terminal window is SQL command prompt.

### Assumptions
+ You have downloaded and secured the TiUP Control Machine private key (for example the file is saved under `~/.ssh/` folder locally): [chmod 400 ~/.ssh/pe-class-key-oregon.pem](lab-controller/class_303_get_ec2_key_for_lab.php?region=oregon)
+ Windows users please refer to this [guide](https://github.com/pingcap-inc/tidb-course-labs/blob/master/README_303_class_setup_guide_for_student_lab_control_en.md) for private key preparation.

## Exercise 1 
### Subject: Installing TiUP

### Overview
+ In this exercise, you install the TiUP utility and TiUP cluster component. You will perform all tasks on the Control Machine (monitor1_address).

### Duration
+ This exercise should take you approximately 10 minutes to complete.

### Tasks
+ Login as user `ec2-user` on Control Machine (monitor1_address).
+ Check the contents of the `hosts-env.sh` file for IP address information of the nodes that have been assigned to you.
+ Install TiUP.
+ Setup TiUP environment variables.
+ Install the TiUP cluster component.

### Solution

1. Login as user ec2-user on monitor1_address. Enter the following command at the terminal prompt and receive the results shown. If you do not possess the credentials to connect, kindly review the <kbd>Assumptions</kbd> section under the <kbd>OVERVIEW</kbd> tab. The returned message may be slightly different from what is displayed here. If prompted, answer `yes`.
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@monitor1_address
   ```
   ```output
      ,     #_
      ~\_  ####_        Amazon Linux 2
   ~~  \_#####\
   ~~     \###|       
   ~~       \#/ ___
      ~~       V~' '->
      ~~~         /    A newer version of Amazon Linux is available!
         ~~._.   _/
            _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
         _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/
   ```

2. Stay in ec2-user home directory, check the contents of the `hosts-env.sh` file for IP address information. The output might be different:
   ```command
   $ cat hosts-env.sh
   ```
   ```output
   export HOST_MONITOR1_PRIVATE_IP=10.90.4.19
   export HOST_MONITOR1_PUBLIC_IP=44.234.33.106
   export HOST_CM_PRIVATE_IP=10.90.4.19
   export HOST_CM_PUBLIC_IP=44.234.33.106
   export HOST_PD1_PRIVATE_IP=10.90.1.197
   export HOST_PD1_PUBLIC_IP=18.236.76.37
   export HOST_PD2_PRIVATE_IP=10.90.3.218
   export HOST_PD2_PUBLIC_IP=18.237.226.109
   export HOST_PD3_PRIVATE_IP=10.90.2.84
   export HOST_PD3_PUBLIC_IP=18.237.105.199
   export HOST_DB1_PRIVATE_IP=10.90.3.216
   export HOST_DB1_PUBLIC_IP=34.222.212.46
   export HOST_DB2_PRIVATE_IP=10.90.2.245
   export HOST_DB2_PUBLIC_IP=54.188.31.139
   export HOST_KV1_PRIVATE_IP=10.90.1.94
   export HOST_KV1_PUBLIC_IP=35.87.137.198
   export HOST_KV2_PRIVATE_IP=10.90.2.38
   export HOST_KV2_PUBLIC_IP=35.91.214.228
   export HOST_KV3_PRIVATE_IP=10.90.3.112
   export HOST_KV3_PUBLIC_IP=54.184.160.176
   export HOST_TIFLASH1_PRIVATE_IP=10.90.4.28
   export HOST_TIFLASH1_PUBLIC_IP=34.223.94.92
   ```

3. Set the node IP address variables in your terminal environment.
   ```command
   $ source ./hosts-env.sh
   ```

4. (optional) Install TiUP. Enter the following command at the terminal prompt and receive the results shown. You can skip this step as TiUP is already installed.
   ```command
   $ curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
   ```
   ```output
   curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh
     % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                    Dload  Upload   Total   Spent    Left  Speed
   100 5152k  100 5152k    0     0  14.8M      0 --:--:-- --:--:-- --:--:-- 14.8M
   Successfully set mirror to https://tiup-mirrors.pingcap.com
   Detected shell: bash
   Shell profile:  /home/ec2-user/.bash_profile
   Installed path: /home/ec2-user/.tiup/bin/tiup
   ===============================================
   Have a try:     tiup playground
   ===============================================
   ```

5. (optional) Setup TiUP environment variables. Enter the following command at the terminal prompt. You can skip this step as `.bash_profile` is already executed automatically during your login.
   ```command
   $ source .bash_profile
   ```

6. Verify that the TiUP cluster component has been already installed by executing `tiup cluster`. Enter the following command at the terminal prompt and receive the results shown. Note that the `tiup cluster` command can install the `cluster` component from the configured TiUP mirror if it is not already installed. 
   ```command
   $ tiup cluster
   ```
   ```output
   Checking updates for component cluster... Deploy a TiDB cluster for production

   Usage:
   tiup cluster [command]

   Available Commands:
   check       Perform preflight checks for the cluster.
   deploy      Deploy a cluster for production
   start       Start a TiDB cluster
   stop        Stop a TiDB cluster
   restart     Restart a TiDB cluster
   scale-in    Scale in a TiDB cluster
   scale-out   Scale out a TiDB cluster
   destroy     Destroy a specified cluster
   clean       (EXPERIMENTAL) Cleanup a specified cluster
   upgrade     Upgrade a specified TiDB cluster
   display     Display information of a TiDB cluster
   prune       Destroy and remove instances that is in tombstone state
   list        List all clusters
   audit       Show audit log of cluster operation
   import      Import an exist TiDB cluster from TiDB-Ansible
   edit-config Edit TiDB cluster config
   show-config Show TiDB cluster config
   reload      Reload a TiDB cluster's config and restart if needed
   patch       Replace the remote package with a specified package and restart the service
   rename      Rename the cluster
   enable      Enable a TiDB cluster automatically at boot
   disable     Disable automatic enabling of TiDB clusters at boot
   replay      Replay previous operation and skip successed steps
   template    Print topology template
   tls         Enable/Disable TLS between TiDB components
   meta        backup/restore meta information
   rotatessh   rotate ssh keys on all nodes
   help        Help about any command
   completion  Generate the autocompletion script for the specified shell

   Flags:
   -c, --concurrency int     max number of parallel tasks allowed (default 5)
      --format string       (EXPERIMENTAL) The format of output, available values are [default, json] (default "default")
   -h, --help                help for tiup
      --ssh string          (EXPERIMENTAL) The executor type: 'builtin', 'system', 'none'.
      --ssh-timeout uint    Timeout in seconds to connect host via SSH, ignored for operations that don't need an SSH connection. (default 5)
   -v, --version             version for tiup
      --wait-timeout uint   Timeout in seconds to wait for an operation to complete, ignored for operations that don't fit. (default 120)
   -y, --yes                 Skip all confirmations and assumes 'yes'

   Use "tiup cluster help [command]" for more information about a command.
   ```

7. Verify that the permission of the provisioned private key file is read only.
   ```command
   $ ls -l /home/ec2-user/.ssh/pe-class-key-oregon.pem
   ```
   ```output
   -r-------- 1 ec2-user ec2-user 1674 May 25 04:09 /home/ec2-user/.ssh/pe-class-key-oregon.pem
   ```

8. Make sure the local TiUP mirror is set to the folder `tidb-community-server-7.5.0-linux-amd64` on the Control Machine. Is had been already cloned for this hands-on lab.
   ```command
   $ tiup mirror set tidb-community-server-7.5.0-linux-amd64
   $ tiup mirror show
   ```
   ```output
   Successfully set mirror to /home/ec2-user/tidb-community-server-7.5.0-linux-amd64
   /home/ec2-user/tidb-community-server-7.5.0-linux-amd64
   ```

9. The environment is ready for deploying a TiDB cluster, please proceed to the next exercise.

## Exercise 2
### Subject: Deploying a TiDB Cluster

### Overview
+ In this exercise, you read the `solution-topology-ten-nodes.yaml` file, and then deploy a TiDB cluster using TiUP. You will perform all tasks on the Control Machine (monitor1_address).

### Duration
+ This exercise should take you approximately 20 minutes to complete.

### Tasks
+ Create a cluster topology file.
+ Read the `topology-ten-nodes.yaml` file.
+ Install `numactl` on all machines, and then return to the Control Machine.
+ Check for potential risks.
+ Enable automatic repair.
+ Deploy a TiDB cluster.

### Solution
1. View `solution-topology-ten-nodes.yaml`. This is the yaml file used to deploy TiDB cluster. The IP address shown below will be different from yours.
   ```command
   $ cat solution-topology-ten-nodes.yaml
   ```
   ```output
   global:
      user: "ec2-user"
      ssh_port: 22
      deploy_dir: "/tidb-deploy"
      data_dir: "/tidb-data"
      arch: "amd64"
   server_configs:
      pd:
         replication.location-labels: ["region","zone","storage-performance"]
         replication.max-replicas: 3
   pd_servers:
      - host: 10.90.2.84
        client_port: 2379
        peer_port: 2380
        advertise_client_addr: "http://54.251.28.224:2379"
        config:
          server.labels:
            region: seattle
            zone: az1
      - host: 10.90.2.134
        client_port: 2379
        peer_port: 2380
        advertise_client_addr: "http://54.179.198.121:2379"
        config:
          server.labels:
            region: seattle
            zone: az2
      - host: 10.90.2.214
        client_port: 2379
        peer_port: 2380
        advertise_client_addr: "http://13.215.194.132:2379"
        config:
          server.labels:
            region: seattle
            zone: az3
   tidb_servers:
      - host: 10.90.2.124
         port: 4000
         status_port: 10080
         deploy_dir: /tidb-deploy/tidb-4000
         log_dir: /tidb-deploy/tidb-4000/log
      - host: 10.90.2.219
         port: 4000
         status_port: 10080
         deploy_dir: /tidb-deploy/tidb-4000
         log_dir: /tidb-deploy/tidb-4000/log
   tikv_servers:
      - host: 10.90.3.239
         port: 20160
         status_port: 20180
         config:
            server.labels:
            region: seattle
            zone: az1
            storage-performance: high
      - host: 10.90.3.119
         port: 20160
         status_port: 20180
         config:
         server.labels:
            region: seattle
            zone: az2
            storage-performance: high
      - host: 10.90.3.181
        port: 20160
        status_port: 20180
        config:
        server.labels:
           region: seattle
           zone: az3
           storage-performance: high
   tiflash_servers:
      - host: 10.90.4.159
        tcp_port: 9000
        flash_service_port: 3930
        deploy_dir: /tidb-deploy/tiflash-9000
        data_dir: /tidb-data/tiflash-9000
        log_dir: /tidb-deploy/tiflash-9000/log
   monitoring_servers:
      - host: 10.90.4.93
   grafana_servers:
      - host: 10.90.4.93
   alertmanager_servers:
      - host: 10.90.4.93
   ```
   
2. Make sure to install `numactl` on all cluster nodes (the task should be already completed in the classroom environment, so there is no need to actually execute the installation on all nodes.) Enter the following command at the terminal prompt to install `numactl` on `TiKV server 1` for example (type `yes` if prompt for `SSH`):
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_KV1_PRIVATE_IP}
   ```
   ```output
      ,     #_
      ~\_  ####_        Amazon Linux 2
     ~~  \_#####\
     ~~     \###|       
     ~~       \#/ ___
      ~~       V~' '->
       ~~~         /    A newer version of Amazon Linux is available!
         ~~._.   _/
            _/ _/       Amazon Linux 2023, GA and supported until 2028-03-15.
          _/m/'           https://aws.amazon.com/linux/amazon-linux-2023/
   ```
   ```command
   $ sudo yum -y install numactl
   ```
   ```output
   Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
   amzn2-core                                                                                                                                 | 3.6 kB  00:00:00     
   60 packages excluded due to repository priority protections
   Package numactl-2.0.9-7.amzn2.x86_64 already installed and latest version
   Nothing to do
   ```

   + Return to the Control Machine: 
   
   ```command
   $ exit
   ```

3. Check system settings for cluster deployment prerequisites. Enter the following command at the terminal prompt and receive the results shown. 
   ```command
   $ tiup cluster check ./solution-topology-ten-nodes.yaml --user ec2-user -i /home/ec2-user/.ssh/pe-class-key-oregon.pem
   ```
   ```output
   + Detect CPU Arch Name
     - Detecting node 10.90.2.90 Arch info ... ⠙ Shell: host=10.90.2.90, sudo=false, command=`uname -m`
     - Detecting node 10.90.2.231 Arch info ... ⠙ Shell: host=10.90.2.231, sudo=false, command=`uname -m`
     - Detecting node 10.90.2.138 Arch info ... ⠙ Shell: host=10.90.2.138, sudo=false, command=`uname -m`
     - Detecting node 10.90.2.242 Arch info ... ⠙ Shell: host=10.90.2.242, sudo=false, command=`uname -m`
   ...
   10.90.2.97   sysctl        Fail    fs.file-max = 376482, should be greater than 1000000
   10.90.2.97   sysctl        Fail    net.core.somaxconn = 4096, should be greater than 32768
   10.90.2.97   sysctl        Fail    net.ipv4.tcp_syncookies = 1, should be 0
   10.90.2.97   sysctl        Fail    vm.swappiness = 60, should be 0
   10.90.2.97   service       Pass    service firewalld not found, ignore
   10.90.2.97   command       Pass    numactl: policy: default
   10.90.2.97   timezone      Pass    time zone is the same as the first PD machine: UTC
   10.90.2.97   os-version    Pass    OS is Amazon Linux 2 
   10.90.2.97   memory        Pass    memory size is 4096MB
   10.90.2.97   limits        Fail    soft limit of 'nofile' for user 'ec2-user' is not set or too low
   10.90.2.97   limits        Fail    hard limit of 'nofile' for user 'ec2-user' is not set or too low
   10.90.2.97   limits        Fail    soft limit of 'stack' for user 'ec2-user' is not set or too low
   10.90.2.97   selinux       Pass    SELinux is disabled
   10.90.2.97   thp           Fail    THP is enabled, please disable it for best performance
   ```

4. Enable auto fix for the failed checks. Enter the following command at the terminal prompt and receive the results shown. 
   ```command
   $ tiup cluster check ./solution-topology-ten-nodes.yaml --user ec2-user -i /home/ec2-user/.ssh/pe-class-key-oregon.pem --apply
   ```
   ```output
   ...
   10.90.3.79   cpu-governor  Warn    Unable to determine current CPU frequency governor policy, auto fixing not supported
   10.90.3.79   sysctl        Fail    will try to set 'fs.file-max = 1000000'
   10.90.3.79   sysctl        Fail    will try to set 'net.core.somaxconn = 32768'
   10.90.3.79   sysctl        Fail    will try to set 'net.ipv4.tcp_syncookies = 0'
   10.90.3.79   sysctl        Fail    will try to set 'vm.swappiness = 0'
   + Try to apply changes to fix failed checks
     - Applying changes on 10.90.2.231 ... Done
     - Applying changes on 10.90.2.138 ... Done
     - Applying changes on 10.90.2.242 ... Done
     - Applying changes on 10.90.2.158 ... Done
     - Applying changes on 10.90.1.56 ... Done
     - Applying changes on 10.90.4.138 ... Done
     - Applying changes on 10.90.2.90 ... Done
     - Applying changes on 10.90.1.169 ... Done
     - Applying changes on 10.90.4.126 ... Done
     - Applying changes on 10.90.2.95 ... Done
   ```

5. Deploy a TiDB cluster named `tidb-test`. Enter the following command at the terminal prompt and receive the results shown. We include `--yes` in the command. Without `--yes`, you will be prompted to check the cluster topology during the deployment. 
   ```command
   $ tiup cluster deploy tidb-test 7.5.0 ./solution-topology-ten-nodes.yaml --user ec2-user -i /home/ec2-user/.ssh/pe-class-key-oregon.pem --yes
   ```
   ```output
   + Detect CPU Arch Name
     - Detecting node 10.90.2.90 Arch info ... ⠙ Shell: host=10.90.2.90, sudo=false, command=`uname -m`
     - Detecting node 10.90.2.231 Arch info ... ⠙ Shell: host=10.90.2.231, sudo=false, command=`uname -m`
     - Detecting node 10.90.2.138 Arch info ... ⠙ Shell: host=10.90.2.138, sudo=false, command=`uname -m`
     - Detecting node 10.90.2.242 Arch info ... ⠙ Shell: host=10.90.2.242, sudo=false, command=`uname -m`
   ...
   Cluster `tidb-test` deployed successfully, you can start it with command: `tiup cluster start tidb-test --init`
   ```

## Exercise 3
### Subject: Checking the Status of the Deployed TiDB Cluster

### Overview
+ In this exercise, you check the cluster status and start the deployed TiDB cluster, and then verify the running status of the TiDB cluster using TiUP command line and TiDB Dashboard or Grafana Dashboard. You complete the majority tasks on the Control Machine (monitor1_address).

### Duration
+ This exercise should take you approximately 15 minutes to complete.

### Tasks
+ Check the clusters managed by TiUP.
+ Check the status of the deployed TiDB cluster.
+ Start the deployed TiDB cluster.
+ Verify the running status of the TiDB cluster.

### Solution
1. On the Control Machine, check the clusters managed by TiUP. Enter the following command at the terminal prompt and receive the results shown:
   ```command
   $ tiup cluster list
   ```
   ```output
   Name       User      Version  Path                                                     PrivateKey
   ----       ----      -------  ----                                                     ----------
   tidb-test  ec2-user  v7.5.0   /home/ec2-user/.tiup/storage/cluster/clusters/tidb-test  /home/ec2-user/.tiup/storage/cluster/clusters/tidb-test/ssh/id_rsa
   ```

2. Check the status of the deployed TiDB cluster. Enter the following command at the terminal prompt and receive the results shown:
   ```command
   $ tiup cluster display tidb-test
   ```
   ```output
   Cluster type:       tidb
   Cluster name:       tidb-test
   Cluster version:    v7.5.0
   Deploy user:        ec2-user
   SSH type:           builtin
   Grafana URL:        http://10.90.4.138:3000
   ID                 Role          Host         Ports                            OS/Arch       Status  Data Dir                      Deploy Dir
   --                 ----          ----         -----                            -------       ------  --------                      ----------
   10.90.4.138:9093   alertmanager  10.90.4.138  9093/9094                        linux/x86_64  Down    /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
   10.90.4.138:3000   grafana       10.90.4.138  3000                             linux/x86_64  Down    -                             /tidb-deploy/grafana-3000
   10.90.2.138:2379   pd            10.90.2.138  2379/2380                        linux/x86_64  Down    /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.2.231:2379   pd            10.90.2.231  2379/2380                        linux/x86_64  Down    /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.2.90:2379    pd            10.90.2.90   2379/2380                        linux/x86_64  Down    /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.4.138:9090   prometheus    10.90.4.138  9090/12020                       linux/x86_64  Down    /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
   10.90.1.169:4000   tidb          10.90.1.169  4000/10080                       linux/x86_64  Down    -                             /tidb-deploy/tidb-4000
   10.90.1.56:4000    tidb          10.90.1.56   4000/10080                       linux/x86_64  Down    -                             /tidb-deploy/tidb-4000
   10.90.4.126:9000   tiflash       10.90.4.126  9000/8123/3930/20170/20292/8234  linux/x86_64  N/A     /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
   10.90.2.158:20160  tikv          10.90.2.158  20160/20180                      linux/x86_64  N/A     /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.2.242:20160  tikv          10.90.2.242  20160/20180                      linux/x86_64  N/A     /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.2.95:20160   tikv          10.90.2.95   20160/20180                      linux/x86_64  N/A     /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   Total nodes: 12
   ```

3. Start the TiDB cluster with standard startup mode (root user with empty password). Enter the following command at the terminal prompt and receive the results shown. In this step, we do NOT use the `--init` option to generate a random password for root user.
   ```command
   $ tiup cluster start tidb-test
   ```
   ```output
   ...
   Started cluster `tidb-test` successfully
   ```

4. Check the status of the started TiDB cluster. Enter the following command at the terminal prompt and receive the results shown. Find and copy the URL of Dashboard URL from the command output, it is `http://34.222.39.121:2379/dashboard` in our example, you will find it's different for your actual environment.
   ```command
   $ tiup cluster display tidb-test
   ```
   ```output
   Cluster type:       tidb
   Cluster name:       tidb-test
   Cluster version:    v7.5.0
   Deploy user:        ec2-user
   SSH type:           builtin
   Dashboard URL:      http://34.222.39.121:2379/dashboard
   Grafana URL:        http://10.90.4.138:3000
   ID                 Role          Host         Ports                            OS/Arch       Status  Data Dir                      Deploy Dir
   --                 ----          ----         -----                            -------       ------  --------                      ----------
   10.90.4.138:9093   alertmanager  10.90.4.138  9093/9094                        linux/x86_64  Up      /tidb-data/alertmanager-9093  /tidb-deploy/alertmanager-9093
   10.90.4.138:3000   grafana       10.90.4.138  3000                             linux/x86_64  Up      -                             /tidb-deploy/grafana-3000
   10.90.2.138:2379   pd            10.90.2.138  2379/2380                        linux/x86_64  Up|L    /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.2.231:2379   pd            10.90.2.231  2379/2380                        linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.2.90:2379    pd            10.90.2.90   2379/2380                        linux/x86_64  Up      /tidb-data/pd-2379            /tidb-deploy/pd-2379
   10.90.4.138:9090   prometheus    10.90.4.138  9090/12020                       linux/x86_64  Up      /tidb-data/prometheus-9090    /tidb-deploy/prometheus-9090
   10.90.1.169:4000   tidb          10.90.1.169  4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
   10.90.1.56:4000    tidb          10.90.1.56   4000/10080                       linux/x86_64  Up      -                             /tidb-deploy/tidb-4000
   10.90.4.126:9000   tiflash       10.90.4.126  9000/8123/3930/20170/20292/8234  linux/x86_64  Up      /tidb-data/tiflash-9000       /tidb-deploy/tiflash-9000
   10.90.2.158:20160  tikv          10.90.2.158  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.2.242:20160  tikv          10.90.2.242  20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   10.90.2.95:20160   tikv          10.90.2.95   20160/20180                      linux/x86_64  Up      /tidb-data/tikv-20160         /tidb-deploy/tikv-20160
   Total nodes: 12
   ```

## Exercise 4
### Subject: Connecting to TiDB Server

### Overview
+ In this exercise, you connect to TiDB. You can perform the task on any node, the `Control Machine` is preferred.

### Duration
+ This exercise should take you approximately 10 minutes to complete.

### Tasks
+ Connect to TiDB.

### Solution
1. Connect to TiDB and modify the password. You should provide option `-p` if `root` has a password, otherwise you can omit the `-p` option. (if you don't know how to get the `${HOST_DB1_PRIVATE_IP}` please ask your instructor for help).
   ```command
   $ mysql -h ${HOST_DB1_PRIVATE_IP} --port 4000 -u root
   ```

2. Verify the version of TiDB cluster.
   ```command
   SELECT TIDB_VERSION()\G
   ```
   ```output
   *************************** 1. row ***************************
   TIDB_VERSION(): Release Version: v7.5.0
   Edition: Community
   Git Commit Hash: 069631e2ecfedc000ffb92c67207bea81380f020
   Git Branch: heads/refs/tags/v7.5.0
   UTC Build Time: 2023-11-24 08:50:14
   GoVersion: go1.21.3
   Race Enabled: false
   TiKV Min Version: 7.2.0-alpha
   Check Table Before Drop: false
   Store: tikv
   1 row in set (0.00 sec)
   ```

3. Exit to the Control Machine terminal.
   ```command
   EXIT;
   ```
   ```output
   Bye
   ```

## Exercise 5
### Subject: Stopping TiDB Cluster

### Overview
+ In this exercise, you practice stopping the TiDB cluster. You complete all tasks on the `Control Machine`.

### Duration
+ This exercise should take you approximately 10 minutes to complete.

### Tasks
+ Stop the TiDB cluster.

### Solution
1. Stop the TiDB cluster. Enter the following command at the terminal prompt and receive the results shown:
   ```command
   $ tiup cluster stop tidb-test
   ```
   ```output
   Will stop the cluster tidb-test with nodes: , roles: .
   Do you want to continue? [y/N]:(default=N) y
   + [ Serial ] - SSHKeySet: privateKey=/home/ec2-user/.tiup/storage/cluster/clusters/tidb-test/ssh/id_rsa, publicKey=/home/ec2-user/.tiup/storage/cluster/clusters/tidb-test/ssh/id_rsa.pub
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.2.95
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.2.90
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.2.158
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.1.169
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.1.56
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.4.126
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.4.138
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.4.138
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.4.138
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.2.138
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.2.242
   + [Parallel] - UserSSH: user=ec2-user, host=10.90.2.231
   + [ Serial ] - StopCluster
   ...
   Stopped cluster `tidb-test` successfully
   ```

## Exercise 6
### Subject: Reviewing Configuration Files

### Overview
+ In this exercise, you view the contents of the configuration files directory.

### Duration
+ This exercise should take you approximately 20 minutes to complete.

### Tasks
+ On `Control Machine`, check the cluster configuration by using `tiup`.
+ On `TiDB server 1`, view the contents of the `TiDB server` configuration files directories.
+ On `TiKV server 1`, view the contents of the `TiKV server` configuration and data files directories.
+ On `PD server 1`, view the contents of the `PD server` configuration and data files directories.

### Solution
1. On the Control Machine, review the contents of the configuration files directory. Enter the following command at the terminal prompt and receive the results shown, and type `:q!` to quit to the terminal:
   ```command
   $ tiup cluster edit-config tidb-test
   ```
   ```output
   global:
     user: ec2-user
     ssh_port: 22
     ssh_type: builtin
     deploy_dir: /tidb-deploy
     data_dir: /tidb-data
     os: linux
     arch: amd64
     systemd_mode: system
   ...
   alertmanager_servers:
   - host: 10.90.4.138
     ssh_port: 22
     web_port: 9093
     cluster_port: 9094
     deploy_dir: /tidb-deploy/alertmanager-9093
     data_dir: /tidb-data/alertmanager-9093
     log_dir: /tidb-deploy/alertmanager-9093/log
     arch: amd64
     os: linux
   ```

2. On `TiDB server 1`, check `TiDB server` configuration directories. Enter `yes` if prompted by `ssh`:
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_DB1_PRIVATE_IP} ls -l /tidb-deploy/tidb-4000/
   ```
   ```output
   total 0
   drwxr-xr-x 2 ec2-user ec2-user 25 May 25 04:16 bin
   drwxr-xr-x 2 ec2-user ec2-user 23 May 25 04:16 conf
   drwxr-xr-x 3 ec2-user ec2-user 90 May 25 04:21 log
   drwxr-xr-x 2 ec2-user ec2-user 25 May 25 04:16 scripts
   ```

3. On `TiKV server 1`, view the contents of the `TiKV server` configuration files directory. Enter `yes` if prompted by `ssh`:
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_KV1_PRIVATE_IP} ls -l /tidb-deploy/
   ```
   ```output
   total 0
   drwxr-xr-x 6 ec2-user ec2-user 55 May 25 04:16 monitor-9100
   drwxr-xr-x 6 ec2-user ec2-user 55 May 25 04:16 tikv-20160
   ```
   
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_KV1_PRIVATE_IP} ls -l /tidb-deploy/tikv-20160/
   ```
   ```output
   total 0
   drwxr-xr-x 2 ec2-user ec2-user 25 May 25 04:16 bin
   drwxr-xr-x 2 ec2-user ec2-user 23 May 25 04:16 conf
   drwxr-xr-x 2 ec2-user ec2-user 45 May 25 04:20 log
   drwxr-xr-x 2 ec2-user ec2-user 25 May 25 04:16 scripts
   ```

4. On `TiKV server 1`, view the contents of the `TiKV server` data files directory.
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_KV1_PRIVATE_IP} ls -l /tidb-data/
   ```
   ```output
   total 0
   drwxr-xr-x 2 ec2-user ec2-user   6 May 25 04:16 monitor-9100
   drwxr-xr-x 6 ec2-user ec2-user 164 May 25 04:20 tikv-20160
   ```

   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_KV1_PRIVATE_IP} ls -l /tidb-data/tikv-20160/
   ```
   ```output
   total 1048672
   drwxr-xr-x 2 ec2-user ec2-user        134 May 25 04:20 db
   drwxr-xr-x 4 ec2-user ec2-user         33 May 25 04:20 import
   -rw-r--r-- 1 ec2-user ec2-user      20330 May 25 04:20 last_tikv.toml
   -rw-r--r-- 1 ec2-user ec2-user          0 May 25 04:20 LOCK
   -rw-r--r-- 1 ec2-user ec2-user          0 May 25 04:20 raftdb.info
   drwxr-xr-x 2 ec2-user ec2-user         82 May 25 04:20 raft-engine
   -rw-r--r-- 1 ec2-user ec2-user      75538 May 25 04:20 rocksdb.info
   drwxr-xr-x 2 ec2-user ec2-user          6 May 25 04:21 snap
   -rw-r--r-- 1 ec2-user ec2-user 1073741824 May 25 04:20 space_placeholder_file
   ```

5. On `PD server 1`, view the contents of the `PD server` configuration files directory. Enter `yes` if prompted by `ssh`:
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_PD1_PRIVATE_IP} ls -l /tidb-deploy/
   ```
   ```output
   total 0
   drwxr-xr-x 6 ec2-user ec2-user 55 May 25 04:16 monitor-9100
   drwxr-xr-x 6 ec2-user ec2-user 55 May 25 04:16 pd-2379
   ```

   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_PD1_PRIVATE_IP} ls -l /tidb-deploy/pd-2379/
   ```
   ```output
   total 0
   drwxr-xr-x 2 ec2-user ec2-user 23 May 25 04:16 bin
   drwxr-xr-x 2 ec2-user ec2-user 21 May 25 04:16 conf
   drwxr-xr-x 2 ec2-user ec2-user 41 May 25 04:20 log
   drwxr-xr-x 2 ec2-user ec2-user 23 May 25 04:16 scripts
   ```

6. On `PD server 1`, view the contents of the `PD server` data files directory.
   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_PD1_PRIVATE_IP} ls -l /tidb-data/
   ```
   ```output
   total 0
   drwxr-xr-x 2 ec2-user ec2-user  6 May 25 04:16 monitor-9100
   drwxr-xr-x 5 ec2-user ec2-user 57 May 25 04:20 pd-2379
   ```

   ```command
   $ ssh -i ~/.ssh/pe-class-key-oregon.pem ec2-user@${HOST_PD1_PRIVATE_IP} ls -l /tidb-data/pd-2379/
   ```
   ```output  
   total 0
   drwxr-xr-x 2 ec2-user ec2-user 85 May 25 04:20 hot-region
   drwx------ 4 ec2-user ec2-user 29 May 25 04:20 member
   drwxr-xr-x 2 ec2-user ec2-user 85 May 25 04:20 region-meta
   ```

7. Close all open terminal windows.

## End of Exercises