Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【NewSQL】アプリケーション開発観点からのTiDB - Ruby編その2

【NewSQL】アプリケーション開発観点からのTiDB - Ruby編その2

このスライドでは、アプリケーション開発者やアーキテクトの方々に対して、TiDBというデータベースをアプリケーションからどのように利用するのか、他データベースからの移行にあたって、アプリケーション開発者の観点から考慮するべきかについてご紹介します。

PingCAP-Japan

April 22, 2022
Tweet

More Decks by PingCAP-Japan

Other Decks in Technology

Transcript

  1. アジェンダ 1. ハンズオンの目的 2. ハンズオン環境 3. tiupのインストールとplaygroundの起動 4. TiDBクラスタ定義(topology.yml)の作成とcheck 5.

    TiDBクラスタのデプロイ 6. TiDBクラスタの起動 7. TiDBクラスタ情報の出力 8. TiDBクラスタへの接続 9. SQLの実行と実行計画の確認方法 10. TiDBのモニタリング 11. TiDBのバックアップとリストア 12. (option) TiDBのアップグレード、TiDBのスケールアウト、プロセスの確認 13. TiDBクラスタの停止 14. TiDBクラスタの削除 2
  2. PingCAP.com TiDB 概要 - TiDB, TiKV and PD TiKV TiKV

    TiKV TiKV Raft Raft Raft TiDB TiDB TiDB ... ... ... ... ... Placement Driver (PD) Dashboard, Grafana etc メタデータ/タイムスタンプ管理 SQLレイヤー(TiDB) 分散Key Valueストア(TiKV) gRPC gRPC gRPC
  3. PingCAP.com 今回作成する環境 - TiDB, TiKV, PDが1台ずつ TiKV TiKV TiKV Raft

    Raft TiDB ... ... Placement Driver (PD) Dashboard, Grafana etc メタデータ/タイムスタンプ管理 SQLレイヤー(TiDB) 分散Key Valueストア(TiKV) gRPC gRPC gRPC TiKVは時間に余裕があればスケールアウトして 3台構成にします
  4. ハンズオン環境 • 講師(PingCAP)側が利用している環境 on AWS ◦ CentOS 7 (x86_64) ◦

    PD x 1 ◦ TiKV x 3 ◦ TiDB x 1 ◦ tiup x 1 • 受講者が利用している環境 on OpenStack ◦ PD ◦ TiKV ◦ TiDB ◦ tiup • 必要となるソフトウェア/rpmパッケージ名 ◦ 必須: wget unzip mysql (このmysqlはmysql clientとなります。CentOSでのmysql clientでも mysql-community-clientのどちらでもかまいません) ◦ 推奨: numactl haproxy ◦ $ sudo yum instsall wget unzip mysql numactl hapxory 6
  5. tiupのインストールとplaygroundの起動 • tiup(タイアップ)とは ◦ TiDBをインストール、管理するためのツール • tiupのインストールと playgroundの起動 $ curl

    --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh $ source .bash_profile $ which tiup # ~/.tiup/bin/tiup の結果が返ること $ tiup playground --tiflash 0 v5.2.2 • 確認項目: 下記出力が緑色の文字で出力されていることを確認します CLUSTER START SUCCESSFULLY, Enjoy it ^-^ To connect TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root -p (no password) To view the dashboard: http://127.0.0.1:2379/dashboard PD client endpoints: [127.0.0.1:2379] To view the Prometheus: http://127.0.0.1:9090 To view the Grafana: http://127.0.0.1:3000 • Note: tiup playgroundの起動中は、コマンドプロンプトには戻りません。 • そのターミナルはそのままにし、もう一つのターミナルを開きます 7
  6. tiupのインストールとplaygroundの起動 • playgroundへの接続(もう一つ別のターミナルで) $ mysql --comments --host 127.0.0.1 --port 4000

    -u root -p Enter password: <そのまま改行> • 確認項目: tidb_version() でバージョン番号が出力されることを確認します mysql> select tidb_version()\G *************************** 1. row *************************** tidb_version(): Release Version: v5.2.2 • playgroundの停止 ◦ MySQLクライアントを切断(exit)します mysql> exit Bye ◦ 元のターミナルで Control-C でplaygroundを停止します • 参考: Quick Start Guide for the TiDB Database Platform 8
  7. TiDBクラスタ定義(topology.yml)の作成 • TiUPクラスタ定義テンプレートの確認します ◦ $ tiup cluster template | more

    ◦ この出力はコメントや詳細な設定項目が多いため、今回は利用しません • 今回の例では、下記のtopology.ymlを利用します $ more topology.yaml global: user: "tidb" ssh_port: 22 deploy_dir: "/tidb-deploy" data_dir: "/tidb-data" pd_servers: - host: 172.31.42.157 tidb_servers: - host: 172.31.36.196 tikv_servers: - host: 172.31.17.113 monitoring_servers: - host: 172.31.42.157 grafana_servers: - host: 172.31.42.157 • tiup cluster --template local > topology.yml と実行し、global以下のuser:, deploy_dir: , data_dir, 各servers: の-hostを書き換えて利用いただくことも可能です tiup cluster template --local --user tidb --pd-servers=$PD_SERVER --tidb-servers=$TIDB_SERVER --tikv-servers=$TIKV_SERVER --monitoring-servers=$PD_SERVER --grafana-servers=$PD_SERVER > topology.yaml 10
  8. TiDBクラスタ定義(topology.yml)のcheck • 作成されたTiDBクラスタ定義が正しく定義されているかチェックを行います。 • yamlファイルのcheckコマンド ◦ $ tiup cluster check

    ./topology.yaml ◦ $ tiup cluster check --apply ./topology.yamlを実行して、各ノードでの修正を行う ◦ tiup cluster checkコマンド自体で修正可能な部分と各ノードに sshやansibleなどを利用して設定変更を行う部分があります • 確認項目 Node Check Result Message ---- ----- ------ ------- 172.31.42.157 os-version Pass OS is CentOS Linux 7 (Core) 7.9.2009 172.31.42.157 cpu-cores Pass number of CPU cores / threads: 4 172.31.42.157 memory Pass memory size is 16384MB 172.31.42.157 disk Warn mount point / does not have 'noatime' option set 172.31.42.157 disk Warn mount point / does not have 'noatime' option set ... • Note: 今回のハンズオン環境では WarnやFailであってもそのままインストールを進める場合がありますが、実際のデプロイ時にはこれらの Warn、Failはかならず対処をお願いしま す。 ◦ 例: numactlやファイルシステムのnoatimeオプションなど 11
  9. TiDBクラスタのデプロイ • tiup cluster deploy <クラスタ名> <バージョン> <yamlファイル名> ◦ $

    tiup cluster deploy tidb-test v5.1.2 ./topology.yaml ◦ “Do you want to continue? [y/N]: (default=N)”で y を入力するとデプロイが始まります。 ◦ 現時点での最新バージョンは、v5.2.2ですが、後で行うアップグレードに備えてv5.1.2をデプロイします • 確認項目: 下記のメッセージが出ればデプロイは成功です。 ◦ Cluster `tidb-test` deployed successfully, you can start it with command: `tiup cluster start tidb-test` 12
  10. TiDBクラスタの起動 • TiDBクラスタの起動コマンド tiup cluster start <クラスタ名> ◦ $ tiup

    cluster start tidb-test • 確認事項: 下記のメッセージが出れば起動は成功です。 ◦ Started cluster `tidb-test` successfully 13
  11. TiDBクラスタ情報の出力 • クラスタの詳細情報の出力 tiup cluster display <クラスタ名> $ tiup cluster

    display tidb-test • 確認事項 Cluster type: tidb Cluster name: tidb-test Cluster version: v5.1.2 Deploy user: tidb SSH type: builtin Dashboard URL: http://172.31.42.157:2379/dashboard ID Role Host Ports OS/Arch Status Data Dir Deploy Dir -- ---- ---- ----- ------- ------ -------- ---------- 172.31.42.157:3000 grafana 172.31.42.157 3000 linux/x86_64 Up - /tidb-deploy/grafana-3000 172.31.42.157:2379 pd 172.31.42.157 2379/2380 linux/x86_64 Up|L|UI /tidb-data/pd-2379 /tidb-deploy/pd-2379 172.31.42.157:9090 prometheus 172.31.42.157 9090 linux/x86_64 Up /tidb-data/prometheus-9090 /tidb-deploy/prometheus-9090 172.31.36.196:4000 tidb 172.31.36.196 4000/10080 linux/x86_64 Up - /tidb-deploy/tidb-4000 172.31.17.113:20160 tikv 172.31.17.113 20160/20180 linux/x86_64 Up /tidb-data/tikv-20160 /tidb-deploy/tikv-20160 14
  12. TiDBへの接続 • TiDBへの接続 ◦ TiDBはMySQL 5.7プロトコルと互換性があります (詳細MySQL Compatibility) ◦ TiDBへはTiDBノード経由でMySQLクライアント(mysqlコマンドなど)で接続できます

    • 確認項目 $ tiup cluster display tidb-test -R tidb のHost列からTiDBノードのIPアドレスを確認します $ export TIDB_SERVER=172.31.36.196 # 上記で確認したご自身のTiDBサーバーのIPアドレスを設定してください $ mysql -h $TIDB_SERVER -P 4000 -u root (例) $ mysql -h $TIDB_SERVER -P 4000 -u root mysql> select tidb_version()\G *************************** 1. row *************************** tidb_version(): Release Version: v5.1.2 15
  13. テスト用のbikeshareデータベースの作成 • bikeshareデータベースの作成 ◦ $ export TIDB_SERVER=172.31.36.196 # tiup cluster

    display tidb-test -R tidb で出力された値 ◦ $ mysql -h $TIDB_SERVER -P 4000 -u root -p (パスワードなしでそのままリターン ) CREATE DATABASE bikeshare; USE bikeshare; CREATE TABLE trips ( trip_id bigint NOT NULL PRIMARY KEY AUTO_INCREMENT, duration integer not null, start_date datetime, end_date datetime, start_station_number integer, start_station varchar(255), end_station_number integer, end_station varchar(255), bike_number varchar(255), member_type varchar(255) ); 16
  14. bikeshareへのデータファイルのインポート • データファイルのダウンロード mkdir -p bikeshare-data && cd bikeshare-data curl

    -L --remote-name-all https://s3.amazonaws.com/capitalbikeshare-data/{2015..2017}-capitalbikeshare-tripdata.zip unzip \*-tripdata.zip • データファイルのインポート ◦ export TIDB_SERVER1=172.31.36.196 # ご利用のTiDBサーバーの値に置き換えてください for FILE in *.csv; do echo "== $FILE =="; mysql --host ${TIDB_SERVER1} --port 4000 -u root bikeshare --local-infile=1 -e "SET tidb_dml_batch_size = 20000; LOAD DATA LOCAL INFILE '${FILE}' INTO TABLE trips FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\r\n' IGNORE 1 LINES (duration, start_date, end_date, start_station_number, start_station, end_station_number, end_station, bike_number, member_type);"; done; • bikeshareの詳細 Import Example Database 参照 17
  15. TiDBダッシュボードの接続方法 • TiDB Dashboardのアドレス確認方法 ◦ $ tiup cluster display tidb-test

    --dashboard • ブラウザで TiDB Dashboardを開きます ◦ http://<ダッシュボードIPアドレス>:2379/dashboard ◦ Username root ◦ Passwordは設定されていません ◦ “Sign In”をクリック • DashboardのIPアドレスがご利用のPCからネットワーク的に接続できない場合 ◦ 次のページでのHAProxyを設定し、tiupノードにproxyを起動します 18
  16. Dashboardに接続できない場合 - HAProxy • tiupがインストールされているノード (tiupと共用可能)にHAProxyをインストールします ◦ sudo yum -y

    install haproxy • HAProxyの設定を追加します ◦ sudo vi /etc/haproxy/haproxy.cfg frontend tidb_dashboard_front bind *:8033 use_backend tidb_dashboard_back if { path /dashboard } or { path_beg /dashboard/ } backend tidb_dashboard_back mode http server tidb_dashboard 172.31.42.157:2379 ◦ 172.31.42.157:2379 の部分は、tiup cluster display tidb-test --dashboard で出力されたDashboard URLのIPアドレスとポート番号に置き換え • HAProxyを再起動します ◦ sudo systemctl restart haproxy • HAProxyが稼働している IPアドレスとポート番号に置き換えます ◦ http://<HAProxy>:8033/dashboard 19
  17. TiDBダッシュボードからSQLの確認方法 • TiDB Dashboardの左側のメニューから「SQL Statements」を選択します • 確認項目 ◦ 任意のSQLをクリックします ◦

    Execution Planから青色のExpandをクリックします ◦ SQLの実行計画を確認します ◦ EXPLAIN Overview | PingCAP Docs を参照ください 20
  18. TiDBのモニタリング - Prometheus • TiDBのモニタリング ◦ Grafana ◦ Prometheus •

    Prometheusダッシュボードの確認 ◦ $ tiup cluster display tidb-test -R prometheus ◦ 172.31.42.157:9090 prometheus 172.31.42.157 9090 linux/x86_64 Up /tidb-data/prometheus-9090 /tidb-deploy/prometheus-9090 • 確認事項 ◦ 出力されたIPアドレス(例では172.31.42.157)のポート9090番にhttpプロトコルでブラウザ経由で接続します ◦ Note: ブラウザが動作しているPCからPrometheusサーバーの9090番ポートが開いている必要があります。 21
  19. TiDBのモニタリング - Grafana • Grafanaダッシュボードの確認 ◦ $ tiup cluster display

    tidb-test -R grafana ◦ 172.31.42.157:3000 grafana 172.31.42.157 3000 linux/x86_64 Up - /tidb-deploy/grafana-3000 ◦ 出力されたGrafanaサーバーのIPアドレスのポート3000番にブラウザで接続する ◦ Note: ブラウザが動作しているPCからGrafanaサーバーの3000番ポートが開いている必要があります。 • 確認事項 ◦ Username/Passwordともに admin でログインできることを確認します 22
  20. Prometheus/Grafanaに接続できない場合 • HAProxyの設定を追加します ◦ sudo vi /etc/haproxy/haproxy.cfg # Prometheus frontend

    tidb_prometheus_front bind *:8034 use_backend tidb_prometheus_back backend tidb_prometheus_back mode http server tidb_dashboard 172.31.42.157:9090 # Grafana frontend tidb_grafana_front bind *:8035 use_backend tidb_grafana_back backend tidb_grafana_back mode http server tidb_dashboard 172.31.42.157:3000 ◦ 172.31.42.157:9090 の部分は、tiup cluster display tidb-test -R prometheus で出力されたIPアドレスとポート(9090)に置き換えます ◦ 172.31.42.157:3000 の部分は、tiup cluster display tidb-test -R grafanaで出力されたIPアドレスとポート(3000)に置き換えます • HAProxyを再起動します ◦ sudo systemctl restart haproxy • HAProxyが稼働しているIPアドレスとポート番号に置き換えます ◦ http://<HAProxy>:8034 http://<HAProxy>:8035 23
  21. TiDBのバックアップとリストア • TiDBのバックアップ ◦ 論理的 : dumpling ▪ (狭義の)TiDBを通じて、論理的なバックアップファイルを作成します ◦

    物理バックアップ: BR Tool BR Tool Overview | PingCAP Docs ▪ TiKVから SSTファイル(TiKVのバックエンドとして利用しているRocksDBのファイル)としてバックアップ • TiDBのリストア ◦ 論理リストア: mysqlクライアント, TiDB Lightning ◦ 物理リストア: BR Tool 24
  22. TiDBの論理バックアップ • dumplingのインストール $ tiup install dumpling • dumplingの起動 ◦

    $ export TIDB_SERVER=172.31.36.196 # ご自分の環境に合わせて変更してください $ tiup dumpling -u root -P 4000 --host $TIDB_SERVER --filetype sql -o /tmp/tidb-test.backup • 確認方法 ◦ -o で指定したディレクトリ以下にファイルが生成されていることを確認します $ ls -lh /tmp/tidb-test.backup total 1.4G -rw-rw-r-- 1 centos centos 100 Oct 18 01:51 bikeshare-schema-create.sql -rw-rw-r-- 1 centos centos 1.4G Oct 18 01:51 bikeshare.trips.000000000.sql -rw-rw-r-- 1 centos centos 617 Oct 18 01:51 bikeshare.trips-schema.sql -rw-rw-r-- 1 centos centos 146 Oct 18 01:51 metadata -rw-rw-r-- 1 centos centos 95 Oct 18 01:51 test-schema-create.sql 25
  23. TiDBの論理リストア • TiDBの論理リストア事前準備 (件数の確認とbikeshareデータベースの削除 ) ◦ 今回は通常のmysqlクライアントを利用して SQLスクリプトをリストアします mysql --host

    $TIDB_SERVER --port 4000 -u root mysql> use bikeshare; mysql> select count(*) from trips; +----------+ | count(*) | +----------+ | 10277677 | +----------+ 1 row in set (1.96 sec) mysql> use test; mysql> drop database bikeshare; Query OK, 0 rows affected (0.21 sec) • TiDBの論理リストア実行 $ mysql --host $TIDB_SERVER --port 4000 -u root < /tmp/tidb-test.backup/bikeshare-schema-create.sql $ mysql --host $TIDB_SERVER --port 4000 -u root bikeshare < /tmp/tidb-test.backup/bikeshare.trips-schema.sql $ mysql --host $TIDB_SERVER --port 4000 -u root bikeshare < /tmp/tidb-test.backup/bikeshare.trips.000000000.sql • TiDB Lightningを利用してリストアする方法もあります 26
  24. TiDBの物理バックアップ • TiKVノードにsshします $ tiup cluster display tidb-test -R pd

    で出力されるHostを記録 $ tiup cluster display tidb-test -R tikv で出力されるHostを記録 $ ssh 172.31.17.113 #TiKVサーバー • BRコマンドラインのインストール ◦ TiKVノードにログインした状態で行います。 $ wget http://download.pingcap.org/tidb-toolkit-v5.1.2-linux-amd64.tar.gz $ gunzip tidb-toolkit-v5.1.2-linux-amd64.tar.gz $ tar xvf tidb-toolkit-v5.1.2-linux-amd64.tar • バックアップディレクトリを作成 $ mkdir -p /tmp/backup $ sudo chmod -R 777 /tmp/backup/ (tidbユーザーとしてsshしていない場合のみ ) • バックアップの実行 `PD_SERVER`変数には、tiup cluster display tidb-test -R pd で出力されるHostを入力します $ export PD_SERVER=172.31.42.157 $ cd tidb-toolkit-v5.1.2-linux-amd64/bin/ $ ./br backup full --pd "${PD_SERVER}:2379" -s "local:///tmp/backup" • 確認方法 ◦ ls -l /tmp/backupでsstファイルが作成されていることを確認します 27
  25. TiDBの物理リストア • リストアを検証するためbikeshareデータベースをdropします ◦ tiupノードでmysqlコマンドを起動します $ export TIDB_SERVER=172.31.36.196 # 上記で確認したご自身のTiDBサーバーのIPアドレスを設定してください

    $ mysql -h $TIDB_SERVER -P 4000 -u root mysql> Query OK, 0 rows affected (0.21 sec) • BRを利用してbikeshareデータベースをリストアします (PDにはPDが稼働しているIPアドレスを設定ください) ◦ TiKVノードにログインした状態で行います。 $ export PD_SERVER=172.31.42.157 $ cd ~/tidb-toolkit-v5.1.2-linux-amd64/bin/ $ ./br restore db --pd "${PD_SERVER}:2379" --db "bikeshare" --ratelimit 128 --storage "local:///tmp/backup" --log-file restorefull.log • 確認方法 ◦ $ mysql -h $TIDB_SERVER -P 4000 -u root ◦ mysql> use bikeshare; mysql> select count(*) from trips; +----------+ | count(*) | +----------+ | 10277677 | +----------+ 1 row in set (5.16 sec) 28
  26. option項目 • スケールアウト ◦ 追加ノードが準備できた場合 • TiDBのアップグレード ◦ i.e. v5.1.2からv5.2.2など

    • 各ノードでのプロセスの確認 ◦ pd, tikv, tidbが稼働しているノードにsshしてログやsystemctlコマンドでサービスを確認する 29
  27. (option) TiDBのアップグレード • オンラインアップグレードコマンド : $ tiup cluster upgrade <クラスタ名>

    <バージョン> ◦ $ tiup cluster upgrade tidb-test v5.2.2 ◦ Do you want to continue? [y/N]:(default=N) y を入力します • 確認項目1: 下記のメッセージが出れば起動は成功です ◦ Upgraded cluster `tidb-test` successfully • 確認項目2: MySQLクライアントで接続し、バージョン番号が v5.2.2となっていることを確認します $ export TIDB_SERVER=172.31.36.196 # 上記で確認したご自身のTiDBサーバーのIPアドレスを設定してください $ mysql -h $TIDB_SERVER -P 4000 -u root mysql> select tidb_version()\G *************************** 1. row *************************** tidb_version(): Release Version: v5.2.2 • 補足 ◦ 今回のハンズオンでは、アップグレードに必要な事前確認項目を省略しています。 ◦ 実際のアップグレードに当たっては、 Upgrade TiDB Using TiUP を参照ください 30
  28. (option) TiDBのスケールアウト • TiDBのスケールアウト(例: TiKVノードを1から3に増やす) • yamlファイルの準備 ◦ more scale_out.yaml

    tikv_servers: - host: 172.31.18.9 - host: 172.31.22.11 • スケールアウトコマンド: tiup cluster scale-out <クラスタ名> <yamlファイル名> $ tiup cluster scale-out tidb-test ./scale_out.yaml Do you want to continue? [y/N]: (default=N) y を入力します • 確認項目: 下記のメッセージが出れば起動は成功です。 Scaled cluster `tidb-test` out successfully tiup cluster display tidb-testコマンドでtikvロールを持つノードが2つ増えて3つになっています 31
  29. (option) TiDBのスケールイン • TiDBのスケールイン(例: TiKVノードを3から1に減らす) ◦ tiup cluster scale-in •

    スケールイン tiup cluster scale-in <TiDBクラスタ名> --node <ID> スケールインする(削除する)ノードは下記のようにして複数設定可能です。 $ tiup cluster scale-in tidb-test --force --node 172.31.18.9:20160 --node 172.31.22.11:20160 • 確認項目: 下記のメッセージが出れば起動は成功です。 Scaled cluster `tidb-test` in successfully tiup cluster display tidb-testコマンドでtikvロールを持つノードが2つ減って1つになっています 32
  30. (option) 各ノードでのプロセスの確認 • PD, TiKV, TiDBの稼働する各ノードにsshして、サービス、プロセス、ログファイルを確認します • PD ◦ サービス

    :$ sudo systemctl status pd-2379.service ◦ プロセス: $ pidof bin/pd-server ◦ ログファイル: $ tail -f /tidb-deploy/pd-2379/log/pd.log • TiKV ◦ サービス : $ sudo systemctl status tikv-20160.service ◦ プロセス: $ pidof bin/tikv-server ◦ ログファイル : $ tail -f /tidb-deploy/tikv-20160/log/tikv.log • TiDB ◦ サービス : $ sudo systemctl status tidb-4000.service ◦ プロセス: $ pidof bin/tidb-server ◦ ログファイル: $ tail -f /tidb-deploy/tidb-4000/log/tidb.log 33
  31. TiDBクラスタの停止 • TiDBクラスタの停止 tiup cluster stop <クラスタ名> $ tiup cluster

    stop tidb-test Do you want to continue? [y/N]:(default=N) y を入力する • 確認事項 ◦ 下記のメッセージが出ればTiDBクラスタは停止しています。 ◦ Stopped cluster `tidb-test` successfully • 停止されたTiDBクラスタはtiup cluster startコマンドで起動可能です。 34
  32. TiDBクラスタの削除 • tiup cluster destroy <クラスタ名> $ tiup cluster destroy

    tidb-test Do you want to continue? [y/N]:(default=N) y を入力します • 確認事項 ◦ 下記のメッセージが出ればTiDBクラスタは停止しています。 ◦ Destroyed cluster `tidb-test` successfully • 削除(destroy)されたクラスタは起動できません。再度デプロイをする必要があります。 35