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

TiProxyの紹介

 TiProxyの紹介

ウェビナー開催日:2024年3月28日

本スライドでは、TiProxyについて紹介します。
TiProxyとはデータベースクライアントとTiDB Serverの間で動作するプロキシーです。
データベースサーバーとアプリケーションの間に入るプロキシーは従来からも存在しておりましたが、TiProxyはTiDBに特化したコネクションマイグレーションとサービスディスカバリーの機能を有しており、アプリケーションからは接続を保持したまま、接続先のTiDBサーバーを切り替えることができ、TiDBのローリングアップグレードなどの時にアプリケーションが再接続を行う必要がありません。また、TiDBサーバーの一覧を動的に更新するため、スケールアウトやスケールインの度にTiDBサーバーリストを手動で更新する必要がありません。
従来、TiProxyは独立したコンポーネントとして提供されておりましたが、TiDB 7.6.0 DMRからはTiDB本体のデプロイと統合されましたので、TiDB、またTiDB CloudでのTiProxyの利用方法も紹介いたします。

トピック:
・TiProxyとは
・TiProxyのコネクションマイグレーションとは
・TiProxyのサービスディスカバリーとは
・TiProxyの設定方法

アーカイブ動画:
https://youtu.be/oI0-8lmdI0g

PingCAP-Japan

March 29, 2024
Tweet

More Decks by PingCAP-Japan

Other Decks in Technology

Transcript

  1. これまでのウェビナースケジュール https://pingcap.co.jp/event/ 
 
 2023年5月18日(木) 14:00 - 15:00 TiDB 7.0

    DMR新機能の紹介 2023年6月15日(木) 14:00 - 15:00 【TiDB Serverless GA直前】TiDB新章。Serverless + Data API + AIによる新 たな活用 2023年7月27日(木) 14:00-15:00 TiDB Cloud最新状況の紹介 2023年9月14日(木) 14:00-15:00 TiDBとMySQLの互換性改善アップデート 2023年11月1日(木) 14:00-15:00 TiDB Operatorの紹介 2023年12月21日(木) 14:00-15:00 TiDB 7.4:MySQL 8.0互換性対応の紹介 2024年1月25日(木) 14:00-15:00 TiDB 7.5 LTS新機能の紹介 2024年2月29日(木) 14:00 - 15:00 TiDB Cloud APIとTerraform TiDB Cloud Providerの紹介 2024年3月28日(木) 14:00 - 15:00 TiProxyの紹介 ※過去開催アーカイブ:https://pingcap.co.jp/event-video/
  2. TiProxyが求められる背景 • TiDBサーバーの特徴 ◦ 複数台のTiDBサーバーが存在する ◦ すべてのTiDBサーバーから読み書きできる • TiDBサーバーの”移り変わり”が発生する ◦

    ローリングアップグレード ▪ 接続しているTiDBサーバーがアップグレードされる ◦ スケールイン ▪ 接続しているTiDBサーバーがスケールイン (なくなる) ◦ スケールアウト ▪ 新規TiDBサーバーに接続を振り分ける必要がある • 従来は、アプリケーションから明示的な再接続が必要となる
  3. TiProxyが求められる背景 • MySQLクライアントからの明示的な再接続が必要だった • TiDBクラスタを構成する他のサーバー (PD, TiKV) ◦ PD、TiKVサーバー ◦

    TiDBクラスタでのgRPCを利用した独自プロトコル (DistSQL API, KV APIなど) ◦ エラー時のリトライ、バックオフを実装可能 • TiDBサーバー ◦ MySQLプロトコルであり、クライアントから透過的な (アプリケーションの変更を伴わない )再接続は 困難 • アプリケーション(MySQLクライアント)とTiDBサーバーの間での透過的なプロキシの必要性 ◦ 従来のProxyはコネクションプーリングと併用する必要がある
  4. TiProxyとは • MySQLクライアントとTiDBサーバーの間に入るリバースプロキシー • コネクションマイグレーション ◦ クライアントが接続している TiDBを透過的に切り替える • サービスディスカバリー

    ◦ 利用可能なTiDBサーバーの情報を動的に更新 ◦ PDを利用して情報を取得する • 容易なデプロイメント ◦ TiUP, TiDB Operatorによる容易なデプロイ ◦ TiProxyはTiDB専用です
  5. コネクションマイグレーション • MySQLクライアントの明示的な再接続なく、 TiProxyが接続先のTiDBサーバーを切り替える • スケールイン ◦ スケールイン対象の TiDBサーバーに新規接続を振らない ◦

    スケールイン対象の TiDBサーバーの既存接続を切り替え • ローリングアップグレード ◦ 対象のTiDBサーバーの接続を利用可能な TiDBサーバーに切り替え • スケールアウト ◦ 新規追加されたTiDBサーバーに接続を振る ◦ 接続数が複数のTiDBサーバーで偏らないようにする • コネクションマイグレーションは MySQLクライアントに透過
  6. サービスディスカバリー • 接続先TiDBサーバーのアドレスを自動的に更新 ◦ PDの情報からTiDBサーバーのアドレスを取得 ◦ “接続先TiDBサーバーのリスト”ファイルの手動更新不要 • スケールイン ◦

    存在しなくなるTiDBサーバーのアドレスを除外する • スケールアウト ◦ 新規に追加されたTiDBサーバーのアドレスを追加する • 従来のプロキシー ◦ アドレスを手動で更新する必要がある • TiProxyはTiDBに特化し ◦ PDからTiDBサーバー情報を取得 ◦ pd-addrs でPDのアドレスを設定 ◦ デフォルトは 127.0.0.1:2379
  7. 設定項目(TiDBサーバー) • TiProxyを効果的に利用するために、下記の設定変更が有効です • graceful-wait-before-shutdown ◦ TiDBサーバーを停止する前の待ち時間を設定します ◦ デフォルト値: 0

    秒 ◦ この間に、該当TiDBサーバーへの接続を残りの TiDBサーバーに振り分けます ◦ TiProxy以外でもこの設定は有効です ▪ /status エンドポイントがステータスコード 500 を返すため、このエンドポイントをモニタリング して、接続を切り替えることができます • security.session-token-signing-cert ◦ OpenSSL等で作成された証明書へのパスを設定します ◦ コネクションマイグレーションに必須の設定 • security.session-token-signing-key ◦ コネクションマイグレーションに必須の設定 ◦ OpenSSL等で作成されたキーへのパスを設定します • 上記のセキュリティ設定がされないと、透過的な再接続は実施されません
  8. 設定項目(TiProxyサーバー) • TiProxy ◦ graceful-wait-before-shutdown ▪ TiProxyサーバーを停止する前の待ち時間を設定します ▪ デフォルトは0秒 ▪

    TiProxyを単独で利用する場合は0、TiProxyの前段にロードバランサーを利用する場合は任意の秒数 を設定してください ◦ max-connections ▪ TiProxyが受け付ける最大の接続数を設定します ▪ デフォルトは0(制限なし) ◦ proxy-protocol ▪ TiProxyがPROXYプロトコルを利用するかどうかを設定します • https://www.haproxy.org/download/1.8/doc/proxy-protocol.txt ▪ デフォルト値: ``(空文字、利用しない) ▪ 設定可能な値: 空文字、またはV2 ▪ TiProxyのようなリバースプロキシを経由してデータベースサーバーに接続する場合 • データベースサーバーの「クライアント」アドレスがリバースプロキシ (デフォルト) • リバースプロキシーを利用している実際のクライアントのアドレスを渡したい時に利用 • その他の設定項目は下記ドキュメントを参照してください ◦ https://docs.pingcap.com/tidb/dev/tiproxy-configuration
  9. パフォーマンス • TiProxyを利用した場合のパフォーマンステスト結果を公表しています ◦ 1台(4 CPU, 8GB メモリ)のTiProxyで5から12台のTiDBサーバーへの接続に対応 ◦ HAProxyに比べ現状25%程度QPSが低下する

    ◦ 結果セットのサイズに応じて QPSは増減し、この傾向は HAProxyと同様 ◦ TiProxyの性能はほぼCPUコア数と線形に比例する • https://docs.pingcap.com/tidb/dev/tiproxy-performance-test
  10. 要件 • TiProxyはTiDB v6.5.0以上のTiDBサーバーで利用できます • TiProxyを利用するMySQLクライアントはMySQLクライアントのプラガブル認証に対応している必要があ ります ◦ https://dev.mysql.com/doc/refman/8.0/ja/pluggable-authentication.html •

    対応を確認しているクライアント一覧 ◦ https://docs.pingcap.com/tidb/dev/tiproxy-overview#supported-connectors ◦ 表にないクライアントがありましたらお知らせください
  11. 注意点 • 予期せぬTiDBサーバーの停止時には、コネクションマイグレーションを行いません • TiProxyはコネクションを移行しますが、下記は移行されません ◦ graceful-wait-before-shutdownの設定を超える時間のトランザクション ◦ ローカル一時テーブル CREATE

    TEMPORARY TABLE ◦ アドバイザリーロック : GET_LOCK() ◦ テーブルロック: LOCK TABLE ◦ プリペアドステートメント • TiProxy自体のアップグレードの際には、 TiProxyからの接続は切断されます • 詳細は下記をご確認ください ◦ https://docs.pingcap.com/tidb/dev/tiproxy-overview#limitations
  12. tiup playground • tiup v1.13.0(現在の最新はv1.14.1)以降、tiup playgrond でTiProxyを利用できます ◦ Note: playgroundは1台のコンピュータで動作するため、ノード障害の可用性はありません

    • 必要な環境 ◦ Linux, macOS ◦ openssl ◦ mysqlクライアント • tiupのインストール % curl --proto '=https' --tlsv1.2 -sSf https://tiup-mirrors.pingcap.com/install.sh | sh • CertファイルとKeyファイルの作成(必須) ◦ コネクションの透過的なフェイルオーバーを行うために必須となります ◦ opensslのコマンド引数は一例です % openssl genrsa -out key.pem 2048 % openssl req -new -key key.pem -out csr.pem % openssl x509 -req -days 365 -in csr.pem -signkey key.pem -out cert.pem
  13. tiup playground • tidb.toml ファイルの作成 ◦ graceful-wait-before-shutdown ▪ Scale inなどでTiDBサーバーがshutdownされるとき、指定された秒数待ちます

    ▪ shutdown命令が実行されると、 TiProxyは該当TiDBサーバーへの既存の接続を他の TiDB サーバーに透過的に切り替えます ▪ また、ShutdownされるTiDBサーバーへの新規接続を試みません ◦ security.session-token-signing-cert ▪ 前ページで作成した Certificateファイルへのパスを指定します ◦ security.session-token-signing-key ▪ 全ページで作成した Keyファイルへのパスを指定します • 例 % more tidb.toml graceful-wait-before-shutdown = 15 security.session-token-signing-cert = "/Users/yahonda/cert.pem" security.session-token-signing-key = "/Users/yahonda/key.pem"
  14. tiup playground • tiup playground を TiProxy を有効にして起動します • tiup

    playground --db.config tidb.toml --tiproxy 1 --tiproxy.version v1.0.0 --tag demoenv • –db.config tidb.toml ◦ 前ページで指定した tidb.toml ファイルへのパスを指定します • –tiproxy 1 ◦ TiProxyサーバーの数を指定します。 TiProxyはオプションのため、デフォルトでは TiProxyは起動し ません • –tiproxy.version v1.0.0 ◦ TiProxyのバージョンを指定します。 tiup playgroundでは、デフォルトで最新の TiDBバージョン(現時 点でv7.6.0)を利用しようとしますが、 TiDB, PD, TiKV, TiFlashとTiProxyのバージョン体系が異なる ため、TiProxyのバージョンを別途指定する必要があります • –tag demoenv ◦ tiup playgroundのディレクトリを指定するためのオプション ◦ ログファイルの場所を前もって確定させるために指定するため、任意です
  15. MySQLクライアントからTiProxy経由での接続 • tiup playgroundを起動した画面に、Connect TiDBとConnect TiProxyの2つが表示されます ◦ この時点で起動している TiDBサーバーは1つです Connect

    TiDB: mysql --comments --host 127.0.0.1 --port 4000 -u root Connect TiProxy: mysql --comments --host 127.0.0.1 --port 6000 -u root • MySQLクライアントを利用して TiProxy経由でTiDBに接続します mysql --comments --host 127.0.0.1 --port 6000 -u root --skip-reconnect ◦ --skip-reconnect オプションは、MySQLクライアントからのMySQL(TiDB)サーバーへの接続 が切断されたときに、自動的に再接続を試みるのを無効にするオプションです ◦ TiProxyの透過的なクライアント再接続の効果を確認するために指定しています (任意) • ロードバランス、スケールアウト、スケールインの動作を確認するため複数起動します
  16. TiDBサーバーのスケールアウト • tiup playground を利用して、TiDBサーバーをスケールアウトします tiup playground scale-out --db 1

    • TiProxyのログファイルから、 update backend のメッセージを確認します tail -f .tiup/data/demoenv/tiproxy-0/tiproxy.log ◦ TiProxyにとってのバックエンド = TiDB
  17. TiDBサーバーのスケールイン • TiProxyのログファイルから、 update backend のメッセージを確認します tail -f .tiup/data/demoenv/tiproxy-0/tiproxy.log ◦

    TiProxyにとってのバックエンド = TiDB • TiProxyがTiDBのshutdownのため、http status 500 を受け取り、このTiDBサーバーに接続しているコネ クションのフェイルオーバーを行います
  18. TiDB Serverless • TiDB ServerlessではTiProxyが利用されています ◦ 各テナント毎のTiDBサーバーをアイドル状態の TiDB Serverプールから取り出して使用する ◦

    負荷に応じたスケールアウト、スケールイン • https://www.pingcap.com/blog/maintaining-database-connectivity-in-serverless-infra-with-tiproxy/
  19. TiDB Dedicated • TiDB DedicatedではTiProxyの利用はオプションです • TiDB Cloudコンソールからの操作はできません • TiDB

    DedicatedでTiProxyを利用されたい場合は、弊社テクニカルサポート宛てにチケットを起票ください
  20. Q&A