Compilación del código fuente TiDB de TiProxy

17109002:

Autor: ShawnYan Fuente original: https://tidb.net/blog/3d57f54d

no-alt

Introducción a TiProxy

TiProxy es un proxy de base de datos TiDB liviano y de código abierto basado en el protocolo Apache 2.0, escrito en lenguaje Go y compatible con el protocolo MySQL. TiProxy admite el equilibrio de carga, recibe solicitudes de aplicaciones y luego las envía al clúster TiDB. Admite conmutación por error automática: cuando falla el servidor TiDB backend, la conexión se puede transferir automáticamente a otros nodos para mejorar la disponibilidad de la aplicación.

no-alt

Compilación TiProxy

TiProxy es un componente liviano y los pasos de compilación son muy simples.El entorno de compilación es el mismo que el anterior "Compilación de código fuente TiDB - TiUP" .

Los pasos de compilación son los siguientes:

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

Salida del registro:

$ 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

Verifique el número de versión:

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

El primer problema encontrado aquí es que la variable tiproxyctlno se reconoce VERSION, porque hay una codificación rígida en el código. ( Código duro en tiproxyctl#340 )

Después de la modificación, el número de versión se obtiene normalmente.

$ ./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

Pruebe TiProxy

El formato de registro de TiProxy admite el formato, jsonformato y consoleformato nativo de TiDB. A continuación iniciamos el servicio TiProxy, el log adopta jsonformato y DEBUGnivel.

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

Después de que se inicie tiproxy, intente conectarse:

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

Vale la pena señalar que el servidor y el cliente TiDB utilizan conexiones no cifradas de forma predeterminada [1] , y TiDB no generará un certificado TLS de forma predeterminada cuando se inicia [2] , pero la autenticación TLS está habilitada de forma predeterminada cuando se inicia tiproxy. Simplifique la prueba. Elija modificar los elementos de configuración predeterminados y no requiera configuración tls.

vi conf/proxy.toml

[proxy]
require-backend-tls = false

De lo contrario, la conexión fallará y se informará un error:

$ 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)

Y el registro de impresión de la consola:

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"}

Inicie TiProxy usando TiUP

La próxima versión de TiUP debería incluir esta característica. Gracias a la contribución de @xhebox, podemos usar tiup para llamar al componente tiproxy. Aquí hay una experiencia de primera mano de cómo usar tiup Playground para iniciar tidb y tiproxy. Por supuesto, tiup cluster también es compatible.

Dado que el tiup que contiene el código para esta función aún no se ha publicado, debe compilarlo usted mismo. Para conocer los pasos de compilación, consulte "Compilación del código fuente de TiDB - TiUP" .

La información de la versión compilada de tiup es la siguiente:

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

El componente tiproxy aún no se ha lanzado a la biblioteca espejo oficial, por lo que si desea usar tiup para programar el componente tiproxy, primero debe cargar el paquete tiproxy en la biblioteca espejo tiup actualmente utilizada. La biblioteca espejo local se usa aquí Utilice el siguiente comando para cargar:

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

Para conocer los pasos de operación específicos, consulte "TiUP: una herramienta imprescindible para TiDBAer" . Tenga en cuenta que debe enviar nightlyla versión al mismo tiempo; de lo contrario, aparecerá un mensaje de error.

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

Una vez completados los pasos anteriores, podrá ver que tiup-playgroundse han agregado opciones relacionadas con 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)

Inicie la demostración de la siguiente manera:

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

no-alt

Conecte tiproxy a través del puerto 6000:

no-alt

En este punto, tiproxy se inició exitosamente y se conectó exitosamente al clúster tidb backend a través de tiproxy. Debido al espacio limitado, la demostración de la función y el contenido de la prueba de tiproxy se documentarán por separado.

Expectativa

1. Los nombres de los repositorios de código fuente están en minúsculas

El nombre del repositorio actual es [pingcap/TiProxy], se recomienda cambiarlo a minúsculas pingcap/tiproxyy unificar el método de nomenclatura. Después de todo, no es pingcap/tidb[pingcap/TiDB], no es tikv/tikv[tikv/TiKV], no es tikv/pd[tikv/PD].

2. el puerto tiproxy no es 4000

Creo que todos han llegado a un consenso de que el puerto 4000 es el puerto predeterminado del servidor TiDB, por lo que realmente no se recomienda cambiar el puerto del servidor tidb a otros puertos y el puerto de tiproxy a 4000 cuando tiproxy y el servidor tidb se inician al mismo tiempo. Mismo tiempo. Hay publicaciones relacionadas en el foro AskTUG: Publicación de chat | Problema del puerto de la base de datos

3. tiproxy se puede iniciar de forma independiente

Los estudiantes que tienen un conocimiento profundo de TiDB saben que los tres componentes principales de TiDB, TiDB Server / TiKV / PD, se pueden iniciar de forma independiente. Espero que TiProxy también pueda hacer esto y pueda iniciarse de forma independiente sin depender de PD, en lugar de "quedarse tumbado" cuando no puede encontrar PD y volver a intentar conectarse constantemente a PD sin límite de tiempo.

[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"]

Cuando tiproxy no puede conectarse a pd, se informará un error al conectarse al puerto 6000 a través del cliente:

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

4. Actualización de la versión del paquete

Se recomienda actualizar la versión del paquete, como [ go 1.19 ] a [go 1.21], y alinearlo con los componentes principales. Consulte la publicación: [ Anuncio de actualización a Go 1.21 ].

Hay otros paquetes, como:

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

Problema de queja: actualice la versión go-sql-driver/mysql a v1.7.1#2246 .

5. Panel de seguimiento

TiProxy ha proporcionado algunas API para administrarlo, pero aún esperamos tener una página web minimalista con fines de visualización. Después de todo, HAProxy lo tiene http://localhost:9999/haproxy-status, al igual que ProxySQL http://localhost:6080. Incluso TiDB Lightning lo tiene http://localhost:8289, consulte la documentación: TiDB Lightning Web Interface .

6. Soporte del sistema operativo

Dado que tiproxy no se ha cargado en tiup mirror, solo puede descargar tiproxy desde el recurso de repositorio de github o compilarlo usted mismo si desea probar tiproxy . Al probar el paquete en github, se descubrió que no se puede ejecutar en CentOS 7. Para discusiones relacionadas, consulte: no se puede usar tiproxy . Este es solo un punto, también se deben realizar pruebas de compatibilidad con tiproxy.

no-alt

7. Parámetros de compilación

Se recomienda agregar make cleanopciones o se puede mejorar el archivo make. makeSería genial si se pudiera hacer con un comando como tiup. ( soporta la opción de limpieza n.° 343 )

Además, espero que las variables de entorno GO111MODULE="on"también se escriban en el archivo make.

8. Registro de errores

Se recomienda refinar el código de error, de lo contrario será realmente fácil para los usuarios UNKNOWN.

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

Me gustaría ajustar el nivel de alarma de algunos registros. Por ejemplo, el error de consulta ahora es DEBUG, se puede cambiar a WARNo se puede enviar a un archivo de registro por separado.

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"}

Además, después de activar el registro DEBUG, hay una gran cantidad de main.infosync.etcdclisalida del registro, que se imprime cada 3 segundos y se recomienda optimizarlo.

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}

Resumir

Se dice que la versión en la nube de TiProxy se ha utilizado en TiDB Cloud. Se espera que TiProxy pronto sea GA y eventualmente alcance un nivel que pueda reemplazar a HAProxy o ProxySQL.

Adjunto:

no-alt

Fin.

El autor del marco de código abierto NanUI pasó a vender acero y el proyecto fue suspendido. La primera lista gratuita en la App Store de Apple es el software pornográfico TypeScript. Acaba de hacerse popular, ¿por qué los grandes empiezan a abandonarlo? Lista de octubre de TIOBE: Java tiene la mayor caída, C# se acerca Java Rust 1.73.0 lanzado Un hombre fue alentado por su novia AI a asesinar a la Reina de Inglaterra y fue sentenciado a nueve años de prisión Qt 6.6 publicado oficialmente Reuters: RISC-V La tecnología se convierte en la clave de la guerra tecnológica entre China y Estados Unidos. Nuevo campo de batalla RISC-V: no controlado por ninguna empresa o país, Lenovo planea lanzar una PC con Android.
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/5674736/blog/10103135
Recomendado
Clasificación