Slide 1

Slide 1 text

TiProxyの紹介 本多康夫 Technical support engineer at PingCAP Japan

Slide 2

Slide 2 text

これまでのウェビナースケジュール 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/

Slide 3

Slide 3 text

次回以降のウェビナースケジュール https://pingcap.co.jp/event/ 
 
 2024年5月予定 現在未定

Slide 4

Slide 4 text

アジェンダ ● TiProxyが求められる背景 ● TiProxyとは ● tiup playgroundを利用したTiProxyデモ ● TiProxyをTiDB Cloudで利用するには ● Q&A, アンケートのお願い ● お知らせ

Slide 5

Slide 5 text

TiProxyが求められる背景

Slide 6

Slide 6 text

TiProxyが求められる背景 ● TiDBサーバーの特徴 ○ 複数台のTiDBサーバーが存在する ○ すべてのTiDBサーバーから読み書きできる ● TiDBサーバーの”移り変わり”が発生する ○ ローリングアップグレード ■ 接続しているTiDBサーバーがアップグレードされる ○ スケールイン ■ 接続しているTiDBサーバーがスケールイン (なくなる) ○ スケールアウト ■ 新規TiDBサーバーに接続を振り分ける必要がある ● 従来は、アプリケーションから明示的な再接続が必要となる

Slide 7

Slide 7 text

TiProxyが求められる背景 ● MySQLクライアントからの明示的な再接続が必要だった ● TiDBクラスタを構成する他のサーバー (PD, TiKV) ○ PD、TiKVサーバー ○ TiDBクラスタでのgRPCを利用した独自プロトコル (DistSQL API, KV APIなど) ○ エラー時のリトライ、バックオフを実装可能 ● TiDBサーバー ○ MySQLプロトコルであり、クライアントから透過的な (アプリケーションの変更を伴わない )再接続は 困難 ● アプリケーション(MySQLクライアント)とTiDBサーバーの間での透過的なプロキシの必要性 ○ 従来のProxyはコネクションプーリングと併用する必要がある

Slide 8

Slide 8 text

TiProxyとは

Slide 9

Slide 9 text

TiProxyとは ● MySQLクライアントとTiDBサーバーの間に入るリバースプロキシー ● コネクションマイグレーション ○ クライアントが接続している TiDBを透過的に切り替える ● サービスディスカバリー ○ 利用可能なTiDBサーバーの情報を動的に更新 ○ PDを利用して情報を取得する ● 容易なデプロイメント ○ TiUP, TiDB Operatorによる容易なデプロイ ○ TiProxyはTiDB専用です

Slide 10

Slide 10 text

TiProxyとは ● バージョン ○ 最新 v1.0.0 (2024年3月25日リリース) ● ライセンス ○ Apache License 2.0 ● https://github.com/pingcap/tiproxy

Slide 11

Slide 11 text

コネクションマイグレーション ● MySQLクライアントの明示的な再接続なく、 TiProxyが接続先のTiDBサーバーを切り替える ● スケールイン ○ スケールイン対象の TiDBサーバーに新規接続を振らない ○ スケールイン対象の TiDBサーバーの既存接続を切り替え ● ローリングアップグレード ○ 対象のTiDBサーバーの接続を利用可能な TiDBサーバーに切り替え ● スケールアウト ○ 新規追加されたTiDBサーバーに接続を振る ○ 接続数が複数のTiDBサーバーで偏らないようにする ● コネクションマイグレーションは MySQLクライアントに透過

Slide 12

Slide 12 text

サービスディスカバリー ● 接続先TiDBサーバーのアドレスを自動的に更新 ○ PDの情報からTiDBサーバーのアドレスを取得 ○ “接続先TiDBサーバーのリスト”ファイルの手動更新不要 ● スケールイン ○ 存在しなくなるTiDBサーバーのアドレスを除外する ● スケールアウト ○ 新規に追加されたTiDBサーバーのアドレスを追加する ● 従来のプロキシー ○ アドレスを手動で更新する必要がある ● TiProxyはTiDBに特化し ○ PDからTiDBサーバー情報を取得 ○ pd-addrs でPDのアドレスを設定 ○ デフォルトは 127.0.0.1:2379

Slide 13

Slide 13 text

設定項目(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等で作成されたキーへのパスを設定します ● 上記のセキュリティ設定がされないと、透過的な再接続は実施されません

Slide 14

Slide 14 text

設定項目(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

Slide 15

Slide 15 text

パフォーマンス ● 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

Slide 16

Slide 16 text

要件 ● 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 ○ 表にないクライアントがありましたらお知らせください

Slide 17

Slide 17 text

注意点 ● 予期せぬTiDBサーバーの停止時には、コネクションマイグレーションを行いません ● TiProxyはコネクションを移行しますが、下記は移行されません ○ graceful-wait-before-shutdownの設定を超える時間のトランザクション ○ ローカル一時テーブル CREATE TEMPORARY TABLE ○ アドバイザリーロック : GET_LOCK() ○ テーブルロック: LOCK TABLE ○ プリペアドステートメント ● TiProxy自体のアップグレードの際には、 TiProxyからの接続は切断されます ● 詳細は下記をご確認ください ○ https://docs.pingcap.com/tidb/dev/tiproxy-overview#limitations

Slide 18

Slide 18 text

tiup playgroundを利用したTiProxyデモ

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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"

Slide 21

Slide 21 text

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のディレクトリを指定するためのオプション ○ ログファイルの場所を前もって確定させるために指定するため、任意です

Slide 22

Slide 22 text

tiup playground起動例

Slide 23

Slide 23 text

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の透過的なクライアント再接続の効果を確認するために指定しています (任意) ● ロードバランス、スケールアウト、スケールインの動作を確認するため複数起動します

Slide 24

Slide 24 text

MySQLクライアントからTiProxy経由での接続 ● MySQLクライアントからSHOW STATUS like 'server_id';を実行します ○ この時点ではTiDBサーバーは1つのため、どちらのMySQLクライアントからも同じ server_id 582dcac7-7043-453d-b7c7-34ca60b9700dを表示します

Slide 25

Slide 25 text

TiDBサーバーのスケールアウト ● tiup playground を利用して、TiDBサーバーをスケールアウトします tiup playground scale-out --db 1 ● TiProxyのログファイルから、 update backend のメッセージを確認します tail -f .tiup/data/demoenv/tiproxy-0/tiproxy.log ○ TiProxyにとってのバックエンド = TiDB

Slide 26

Slide 26 text

スケールアウト後のserver_idの確認 ● MySQLクライアントからSHOW STATUS like 'server_id';を実行します ○ MySQLクライアントから明示的な connect/disconnectを行わずに、1つのserver_idが 0f9516b3-c9e9-4b59-b5c1-0d0452f7caaf に変化していることが確認できます

Slide 27

Slide 27 text

TiDBサーバーのスケールイン ● tiup playground displayを利用して、スケールインする TiDBサーバーのプロセスを確認します tiup playground display ● 任意のPidを指定してスケールインします (今回はPid 66094) tiup playground scale-in --pid 66094

Slide 28

Slide 28 text

TiDBサーバーのスケールイン ● TiProxyのログファイルから、 update backend のメッセージを確認します tail -f .tiup/data/demoenv/tiproxy-0/tiproxy.log ○ TiProxyにとってのバックエンド = TiDB ● TiProxyがTiDBのshutdownのため、http status 500 を受け取り、このTiDBサーバーに接続しているコネ クションのフェイルオーバーを行います

Slide 29

Slide 29 text

スケールイン後のserver_idの確認 ● MySQLクライアントからSHOW STATUS like 'server_id';を実行します ○ MySQLクライアントから明示的な connect/disconnectを行わずに、2つのserver_idが 0f9516b3-c9e9-4b59-b5c1-0d0452f7caaf に変化していることが確認できます

Slide 30

Slide 30 text

TiProxyをTiDB Cloudで利用するには

Slide 31

Slide 31 text

TiDB Serverless ● TiDB ServerlessではTiProxyが利用されています ○ 各テナント毎のTiDBサーバーをアイドル状態の TiDB Serverプールから取り出して使用する ○ 負荷に応じたスケールアウト、スケールイン ● https://www.pingcap.com/blog/maintaining-database-connectivity-in-serverless-infra-with-tiproxy/

Slide 32

Slide 32 text

TiDB Dedicated ● TiDB DedicatedではTiProxyの利用はオプションです ● TiDB Cloudコンソールからの操作はできません ● TiDB DedicatedでTiProxyを利用されたい場合は、弊社テクニカルサポート宛てにチケットを起票ください

Slide 33

Slide 33 text

Q&A

Slide 34

Slide 34 text

Thank You!
 https://www.pingcap.com/
 [email protected]