TiProxy の TiDB ソース コード コンパイル

17109002:

著者: ShawnYan 元のソース: https://tidb.net/blog/3d57f54d

Alt なし

TiProxy の概要

TiProxy は、Apache 2.0 プロトコルに基づいたオープン ソースの軽量 TiDB データベース プロキシで、Go 言語で書かれており、MySQL プロトコルをサポートしています。TiProxy はロード バランシングをサポートしており、アプリケーションからリクエストを受信して​​ TiDB クラスターに送信します。自動フェイルオーバーのサポート バックエンド TiDB サーバーに障害が発生した場合、接続を他のノードに自動的に転送して、アプリケーションの可用性を向上させることができます。

Alt なし

TiProxy コンパイル

TiProxy は軽量なコンポーネントであり、コンパイル手順は非常に簡単で、コンパイル環境は以前の「TiDB ソース コードのコンパイル - TiUP」と同じです

コンパイル手順は次のとおりです。

git clone https://github.com/shawn0915/tiproxy --depth=1
cd tiproxy
go mod download -x
go mod tidy -v
export VERSION='v0.1.1-ShawnYan'
make

ログ出力:

$ make
go build -gcflags '' -ldflags ' -X github.com/pingcap/TiProxy/pkg/util/versioninfo.TiProxyVersion=v0.1.1-ShawnYan -X github.com/pingcap/TiProxy/pkg/util/versioninfo.TiProxyGitHash=b944a8fe77a56bd39a7de3bf17d7deb1da039494' -tags '' -o ./bin/tiproxy ./cmd/tiproxy
go build -gcflags '' -ldflags ' -X github.com/pingcap/TiProxy/pkg/util/versioninfo.TiProxyVersion=v0.1.1-ShawnYan -X github.com/pingcap/TiProxy/pkg/util/versioninfo.TiProxyGitHash=b944a8fe77a56bd39a7de3bf17d7deb1da039494' -tags '' -o ./bin/tiproxyctl ./cmd/tiproxyctl

バージョン番号を確認します。

$ ./bin/tiproxy -v
./bin/tiproxy version v0.1.1-ShawnYan, commit 81f4897fcf859154255adc86f875eda3f7e5c8a0
$ ./bin/tiproxyctl -v
./bin/tiproxyctl version test, commit test commit

ここで最初に発生する問題は、コード内にハードコーディングがあるため、変数tiproxyctlが認識されないことです。VERSION( tiproxyctl#340 のハードコード)

変更後は正常にバージョン番号が取得されます。

$ ./bin/tiproxy -v
./bin/tiproxy version v0.1.1-ShawnYan, commit b944a8fe77a56bd39a7de3bf17d7deb1da039494-dirty
$ ./bin/tiproxyctl -v
./bin/tiproxyctl version v0.1.1-ShawnYan, commit b944a8fe77a56bd39a7de3bf17d7deb1da039494-dirty

TiProxy を試してみる

TiProxy のログ形式は、TiDB ネイティブ形式、json形式、console形式をサポートしています。次に、TiProxy サービスを開始すると、ログのjson形式とDEBUGレベルが適用されます。

./bin/tiproxy --config ./conf/proxy.toml --log_encoder console --log_level debug

tiproxy が開始したら、接続を試みます。

mysql --comments --host 127.0.0.1 --port 6000 -u root

TiDB サーバーとクライアントはデフォルトで非暗号化接続を使用し[1]、TiDB は起動時にデフォルトで TLS 証明書を生成しません[2]が、tiproxy の起動時にデフォルトで TLS 認証が有効になることは注目に値します。テストを簡素化するには、デフォルトの構成項目を変更することを選択し、TLS 構成を必要としません。

vi conf/proxy.toml

[proxy]
require-backend-tls = false

そうしないと、接続が失敗し、エラーが報告されます。

$ mysql --comments --host 127.0.0.1 --port 6000 -u root
ERROR 1105 (HY000): Unknown error%!(EXTRA string=TiProxy fails to connect to TiDB, please check network)

そしてコンソールの印刷ログ:

2023/08/23 12:00:27.645 +09:00  INFO    main.proxy      proxy/proxy.go:159      new connection  {"connID": 0, "client_addr": "127.0.0.1:42944"}
2023/08/23 12:00:27.645 +09:00  DEBUG   main.proxy.conn.be.authenticator        backend/authenticator.go:135    frontend send capabilities unsupported by proxy {"connID": 0, "client_addr": "127.0.0.1:42944", "common": "CLIENT_LONG_PASSWORD|CLIENT_LONG_FLAG|CLIENT_LOCAL_FILES|CLIENT_PROTOCOL_41|CLIENT_INTERACTIVE|CLIENT_TRANSACTIONS|CLIENT_SECURE_CONNECTION|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS|CLIENT_PLUGIN_AUTH|CLIENT_CONNECT_ATTS|CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA|CLIENT_DEPRECATE_EOF", "frontend": "CLIENT_PS_MULTI_RESULTS|CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS|CLIENT_SESSION_TRACK|CLIENT_QUERY_ATTRIBUTES|MULTI_FACTOR_AUTHENTICATION", "proxy": "CLIENT_FOUND_ROWS|CLIENT_CONNECT_WITH_DB|CLIENT_ODBC|CLIENT_RESERVED"}
2023/08/23 12:00:27.646 +09:00  INFO    main.proxy.conn.be      backend/backend_conn_mgr.go:218 connected to backend    {"connID": 0, "client_addr": "127.0.0.1:42944", "ns": "default", "backend_addr": "127.0.0.1:4000"}
2023/08/23 12:00:27.646 +09:00  DEBUG   main.proxy.conn.be.authenticator        backend/authenticator.go:200    backend does not support capabilities from proxy        {"connID": 0, "client_addr": "127.0.0.1:42944", "common": "CLIENT_LONG_PASSWORD|CLIENT_FOUND_ROWS|CLIENT_LONG_FLAG|CLIENT_CONNECT_WITH_DB|CLIENT_LOCAL_FILES|CLIENT_PROTOCOL_41|CLIENT_INTERACTIVE|CLIENT_TRANSACTIONS|CLIENT_SECURE_CONNECTION|CLIENT_MULTI_STATEMENTS|CLIENT_MULTI_RESULTS|CLIENT_PLUGIN_AUTH|CLIENT_CONNECT_ATTS|CLIENT_DEPRECATE_EOF", "proxy": "CLIENT_ODBC|CLIENT_RESERVED|CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA", "backend": "CLIENT_SSL"}
2023/08/23 12:00:27.646 +09:00  INFO    main.proxy.conn client/client_conn.go:61        new connection failed   {"connID": 0, "client_addr": "127.0.0.1:42944", "proxy-protocol": false, "backend_addr": "127.0.0.1:4000", "quit source": "proxy error", "error": "require TLS config on TiProxy when require-backend-tls=true"}

TiUP を使用して TiProxy を開始する

TiUP の次のバージョンには、この機能が含まれるはずです。@xhebox の貢献のおかげで、tiup を使用して、tiproxy コンポーネントを呼び出すことができます。ここでは、tiup プレイグラウンドを使用して tidb とtiproxy を開始する方法を直接体験します。もちろん、tiup クラスターもサポートされています。

この機能のコードを含む tiup はまだ公開されていないため、tiup を自分でコンパイルする必要があります (コンパイル手順については、「TiDB ソースコードのコンパイル - TiUP」を参照してください) 。

コンパイルされた tiup バージョン情報は次のとおりです。

$ tiup --version
1.12.5 tiup
Go Version: go1.21.0
Git Ref: master
GitHash: a9580bd

tiproxy コンポーネントはまだ公式ミラー ライブラリにリリースされていないため、tiup を使用してtiproxy コンポーネントをスケジュールしたい場合は、まず現在使用されている tiup ミラー ライブラリにtiproxy パッケージをアップロードする必要があります。ここではローカル ミラー ライブラリが使用されます。 . 次のコマンドを使用してアップロードします。

tiup mirror publish tiproxy v0.1.1 ./tiproxy.tar.gz tiproxy --desc tiproxy
tiup mirror publish tiproxy nightly ./tiproxy.tar.gz tiproxy --desc tiproxy

具体的な操作手順については、 「TiUP: TiDBAer 必須ツール」を参照してください。nightly同時にバージョンを送信する必要があることに注意してください。そうしないと、エラー メッセージが表示されます。

Error: Playground bootstrapping failed: component tiproxy doesn't have nightly version on platform linux/amd64

tiup-playground上記の手順が完了すると、 tiproxy 関連のオプションが追加されたことがわかります。

$ ./tiup-playground --version
tiup version 1.12.5 tiup
Go Version: go1.21.0
Git Ref: master
GitHash: a9580bd

$ ./tiup-playground --help | grep tiproxy
--tiproxy int                      TiProxy instance number
--tiproxy.binpath string           TiProxy instance binary path
--tiproxy.config string            TiProxy instance configuration file
--tiproxy.host host                Playground TiProxy host. If not provided, TiProxy will still use host flag as its host
--tiproxy.port int                 Playground TiProxy port. If not provided, TiProxy will use 6000 as its port
--tiproxy.timeout int              TiProxy max wait time in seconds for starting, 0 means no limit (default 60)

次のようにデモを開始します。

tiup playground 7.0 --tag 7.0 --without-monitor --tiflash 0 --tiproxy 1

Alt なし

ポート 6000 経由でティプロキシを接続します。

Alt なし

この時点で、tiproxy は正常に開始され、tiproxy を通じてバックエンド tidb クラスターに正常に接続されました。スペースが限られているため、tiproxy の機能デモとテスト内容は個別に文書化されます。

期待

1. ソースコードのリポジトリ名は小文字です

現在のリポジ名は「pingcap/TiProxy」ですが、小文字に変更してpingcap/tiproxy命名方法を統一することを推奨します。結局のところ、pingcap/tidb[pingcap/TiDB] ではなく、tikv/tikv[tikv/TiKV] でも、tikv/pd[tikv/PD] でもありません。

2.tiproxy ポートは 4000 ではありません

ポート 4000 が TiDB サーバーのデフォルトのポートであるということは誰もがコンセンサスに達していると思います。そのため、tiproxy と tidb サーバーが起動されるときに tidb サーバーのポートを他のポートに変更し、tiproxy のポートを 4000 に変更することは実際には推奨されません。同時。AskTUG フォーラムには関連する投稿があります:チャット投稿 | データベース ポートの問題

3.tiproxy は独立して開始できます

TiDB を深く理解している学生は、TiDB の 3 つのコア コンポーネントである TiDB サーバー / TiKV / PD が独立して起動できることを知っています。TiProxy もこれが可能で、PD が見つからないときに「横たわって」時間制限なく PD への接続を再試行するのではなく、PD に依存せずに独立して起動できることを願っています。

[2023/08/22 11:47:46.122 +09:00] [WARN] [main.infosync.etcdcli] [[email protected]/retry_interceptor.go:62] [retrying of unary invoker failed]  [target=etcd-endpoints://0xc000802380/127.0.0.1:2379] [attempt=0] [error="rpc error: code = DeadlineExceeded desc = latest balancer error: last connection error: connection error: desc = \"transport: Error while dialing dial tcp 127.0.0.1:2379: connect: connection refused\""]
[2023/08/22 11:47:46.122 +09:00] [INFO] [main.infosync.etcdcli] [[email protected]/client.go:210] [Auto sync endpoints failed.]  [error="context deadline exceeded"]

tiproxy が pd への接続に失敗すると、クライアント経由でポート 6000 に接続するときにエラーが報告されます。

$ mysql -uroot -hlocalhost -P6000
ERROR 1105 (HY000): Unknown error%!(EXTRA string=No available TiDB instances, please check TiDB cluster)

4. パッケージのバージョンアップ

[ Go 1.19 ] から [ go 1.21 ]など、パッケージのバージョンをアップグレードして、コア コンポーネントに合わせることをお勧めします (投稿: [ Go 1.21 へのアップグレードのお知らせ] を参照)。

他にも次のようなパッケージがあります。

github.com/go-mysql-org/go-mysql v1.6.0
github.com/pingcap/tidb v1.1.0-beta.0.20230103132820-3ccff46aa3bc
github.com/pingcap/tidb/parser v0.0.0-20230103132820-3ccff46aa3bc

相关 Issue 如,upgrade go-sql-driver/mysql version to v1.7.1#2246

5. 監視パネル

TiProxy はそれを管理するための API をいくつか提供していますが、視覚化を目的とした最小限の Web ページが必要と考えています。結局のところ、HAProxy にはそれがありhttp://localhost:9999/haproxy-status、ProxySQL にもそれがありますhttp://localhost:6080TiDB Lightning にもそれがありますhttp://localhost:8289。ドキュメントを参照してください: TiDB Lightning Web Interface

6. オペレーティング システムのサポート

tiproxy は tiup ミラーにアップロードされていないため、 tiproxy をテストしたい場合は、github リポジトリ アセットからtiproxy をダウンロードするか、自分でコンパイルすることしかできません。github でパッケージをテストしたところ、CentOS 7 では実行できないことが判明しました。関連する議論については、「tiproxy を使用できない」を参照してください。これは単なるポイントであり、tiproxy 互換性テストも行う必要があります。

Alt なし

7. コンパイルパラメータ

make cleanオプションを追加したり、メイクファイルを改良したりすることをお勧めしますがmake、tiup のようにコマンド 1 つでできると良いですね。( make clean オプション#343 をサポート)

また、環境変数もGO111MODULE="on"makeファイルに書き込んでいただけると幸いです。

8. エラーログ

エラー コードを修正することをお勧めします。そうしないと、ユーザーにとって非常に簡単になりますUNKNOWN

ERROR 1105 (HY000): Unknown error%!(EXTRA string=TiProxy fails to connect to TiDB, please check network)

一部のログのアラームレベルを調整したいのですが、例えばクエリエラーが になっているのをDEBUGに変更したりWARN、別途ログファイルに出力したりすることができます。

2023/08/22 23:51:33.138 +08:00    DEBUG    main.proxy.conn.be    backend/backend_conn_mgr.go:283    got a mysql error    {"connID": 0, "client_addr": "127.0.0.1:41942", "ns": "default", "error": "ERROR 1105 (HY000): conflict hypo index name hypo_a", "cmd": "Query"}

2023/08/22 23:59:08.745 +08:00    DEBUG    main.proxy.conn.be    backend/backend_conn_mgr.go:283    got a mysql error    {"connID": 0, "client_addr": "127.0.0.1:41942", "ns": "default", "error": "ERROR 8108 (HY000): Unsupported type *ast.DropProcedureStmt", "cmd": "Query"}

また、DEBUGログをONにすると、3秒ごとに出力されるログが大量に出力されるためmain.infosync.etcdcli、最適化することをお勧めします。

2023/08/22 23:59:02.799 +08:00    DEBUG    main.infosync.etcdcli    [email protected]/retry_interceptor.go:53    retrying of unary invoker  {"target": "etcd-endpoints://0xc000980000/127.0.0.1:2379", "attempt": 0}

要約する

TiDB CloudではTiProxyのクラウド版が採用されているとのことですが、TiProxyは間もなくGAとなり、最終的にはHAProxyやProxySQLを置き換えるレベルに達すると予想されます。

添付:

Alt なし

終わり。

オープンソース フレームワーク NanUI の作者がスチールの販売に切り替えたため、プロジェクトは中断されました。Apple App Store の無料リストのナンバー 1 はポルノ ソフトウェア TypeScript です。人気が出てきたばかりなのに、なぜ大手はそれを放棄し始めるのでしょうか。 ? TIOBE 10月リスト:Javaが最大の下落、C#はJavaに迫る Rust 1.73.0リリース AIガールフレンドにイギリス女王暗殺を勧められた男性に懲役9年の実刑判決 Qt 6.6正式リリース ロイター:RISC-Vテクノロジーが中米テクノロジー戦争の鍵となる 新たな戦場 RISC-V: 単一の企業や国に支配されない レノボ、Android PC の発売を計画
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/5674736/blog/10103135