Autor: ShawnYan Fuente original: https://tidb.net/blog/3d57f54d
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.
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 tiproxyctl
no 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, json
formato y console
formato nativo de TiDB. A continuación iniciamos el servicio TiProxy, el log adopta json
formato y DEBUG
nivel.
./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 nightly
la 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-playground
se 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
Conecte tiproxy a través del puerto 6000:
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/tiproxy
y 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.
7. Parámetros de compilación
Se recomienda agregar make clean
opciones o se puede mejorar el archivo make. make
Serí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 WARN
o 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.etcdcli
salida 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:
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.