Autor: ShawnYan Fonte original: https://tidb.net/blog/3d57f54d
Introdução ao TiProxy
TiProxy é um proxy de banco de dados TiDB leve e de código aberto baseado no protocolo Apache 2.0. Ele é escrito na linguagem Go e suporta o protocolo MySQL. TiProxy suporta balanceamento de carga, recebendo solicitações de aplicativos e enviando-as para o cluster TiDB. Suporta failover automático. Quando o servidor backend TiDB falha, a conexão pode ser transferida automaticamente para outros nós para melhorar a disponibilidade do aplicativo.
Compilação TiProxy
TiProxy é um componente leve e as etapas de compilação são muito simples. O ambiente de compilação é o mesmo da "compilação de código-fonte TiDB - TiUP" anterior .
As etapas de compilação são as seguintes:
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
Saída de 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 o número da versão:
$ ./bin/tiproxy -v
./bin/tiproxy version v0.1.1-ShawnYan, commit 81f4897fcf859154255adc86f875eda3f7e5c8a0
$ ./bin/tiproxyctl -v
./bin/tiproxyctl version test, commit test commit
O primeiro problema encontrado aqui é que a variável tiproxyctl
não é reconhecida VERSION
, o motivo é que há codificação rígida no código. ( Código rígido em tiproxyctl#340 )
Após a modificação, o número da versão é obtido 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
Experimente o TiProxy
O formato de log do TiProxy suporta formato, json
formato e console
formato nativos do TiDB. Em seguida, inicie o serviço TiProxy. O log adota json
formato e DEBUG
nível.
./bin/tiproxy --config ./conf/proxy.toml --log_encoder console --log_level debug
Depois que o tiproxy for iniciado, tente conectar:
mysql --comments --host 127.0.0.1 --port 6000 -u root
É importante notar que o servidor e o cliente TiDB usam conexões não criptografadas por padrão [1] , e o TiDB não irá gerar um certificado TLS por padrão quando for iniciado [2] , mas a autenticação TLS é habilitada por padrão quando o tiproxy é iniciado. simplifique o teste, opte por modificar os itens de configuração padrão e não exija configuração tls.
vi conf/proxy.toml
[proxy]
require-backend-tls = false
Caso contrário, a conexão falhará e um erro será relatado:
$ 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)
E o log de impressão do console:
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 o TiProxy usando TiUP
A próxima versão do TiUP deve incluir esse recurso. Graças à contribuição de @xhebox, podemos usar o tiup para chamar o componente tiproxy. Aqui está uma experiência em primeira mão de como usar o tiup playground para iniciar o tidb e o tiproxy. Claro, o tiup cluster também é suportado.
Como o tiup contendo o código para esta função ainda não foi lançado, você mesmo precisa compilar o tiup. Para as etapas de compilação, consulte "Compilação do código-fonte do TiDB - TiUP" .
As informações da versão tiup compilada são as seguintes:
$ tiup --version
1.12.5 tiup
Go Version: go1.21.0
Git Ref: master
GitHash: a9580bd
O componente tiproxy ainda não foi lançado na biblioteca de espelhos oficial, portanto, se você quiser usar o tiup para agendar o componente tiproxy, será necessário fazer upload do pacote tiproxy para a biblioteca de espelhos tiup usada atualmente. Aqui, a biblioteca de espelhos local é usada . Use o seguinte comando para fazer upload:
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 etapas de operação específicas, consulte "TiUP: uma ferramenta obrigatória para TiDBAer" . Observe que você precisa enviar nightly
a versão ao mesmo tempo, caso contrário, uma mensagem de erro será exibida.
Error: Playground bootstrapping failed: component tiproxy doesn't have nightly version on platform linux/amd64
Depois que as etapas acima forem concluídas, você poderá ver que tiup-playground
as opções relacionadas ao tiproxy foram adicionadas.
$ ./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 a demonstração da seguinte maneira:
tiup playground 7.0 --tag 7.0 --without-monitor --tiflash 0 --tiproxy 1
Conecte o tiproxy via porta 6000:
Neste ponto, o tiproxy foi iniciado com sucesso e conectado com sucesso ao cluster backend tidb por meio do tiproxy. Devido ao espaço limitado, a demonstração da função e o conteúdo do teste do tiproxy serão documentados separadamente.
Expectativa
1. Os nomes dos repositórios de código-fonte estão em letras minúsculas
O nome do repositório atual é [pingcap/TiProxy].Recomenda-se alterá-lo para minúsculas pingcap/tiproxy
e unificar o método de nomenclatura. Afinal, pingcap/tidb
não é [pingcap/TiDB], não é tikv/tikv
[tikv/TiKV], não é tikv/pd
[tikv/PD].
2. A porta tiproxy não é 4000
Acredito que todos chegaram a um consenso de que a porta 4000 é a porta padrão do servidor TiDB, então não é realmente recomendado alterar a porta do servidor tidb para outras portas e a porta do tiproxy para 4000 quando o servidor tiproxy e tidb são iniciados no mesmo tempo. Existem postagens relacionadas no fórum AskTUG: Postagem de bate-papo | Problema na porta do banco de dados
3. O tiproxy pode ser iniciado de forma independente
Os alunos que possuem um conhecimento profundo do TiDB sabem que os três componentes principais do TiDB, TiDB Server/TiKV/PD, podem ser iniciados de forma independente. Espero que o TiProxy também possa fazer isso e possa ser iniciado de forma independente, sem depender do PD, em vez de "ficar deitado" quando não consegue encontrar o PD e tentar constantemente conectar-se ao PD sem limite de tempo.
[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"]
Quando o tiproxy não consegue se conectar ao pd, um erro será relatado ao conectar-se à porta 6000 através do cliente:
$ mysql -uroot -hlocalhost -P6000
ERROR 1105 (HY000): Unknown error%!(EXTRA string=No available TiDB instances, please check TiDB cluster)
4. Atualização da versão do pacote
Recomenda-se atualizar a versão do pacote, como [ go 1.19 ] para [ go 1.21 ] e alinhá-la com os componentes principais. Consulte a postagem: [ Anuncing upgrade to Go 1.21 ].
Existem outros pacotes, 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 reclamação: atualize a versão go-sql-driver/mysql para v1.7.1#2246 .
5. Painel de monitoramento
O TiProxy forneceu algumas APIs para gerenciá-lo, mas ainda esperamos ter uma página Web minimalista para fins de visualização. Afinal, o HAProxy tem isso http://localhost:9999/haproxy-status
e o ProxySQL também http://localhost:6080
. Até o TiDB Lightning tem http://localhost:8289
, veja a documentação: TiDB Lightning Web Interface .
6. Suporte ao sistema operacional
Como o tiproxy não foi carregado no espelho tiup, você só pode baixar o tiproxy do recurso de repositório do github ou compilá-lo você mesmo se quiser testar o tiproxy . Ao testar o pacote no github, descobriu-se que ele não pode ser executado no CentOS 7. Para discussões relacionadas, consulte: tiproxy não pode ser usado . Este é apenas um ponto, o teste de compatibilidade do tiproxy também deve ser feito.
7. Parâmetros de compilação
Recomenda-se adicionar make clean
opções, ou o arquivo make pode ser melhorado. make
Seria ótimo se isso pudesse ser feito com um comando como o tiup. ( suporte para opção make clean#343 )
Além disso, espero que as variáveis de ambiente GO111MODULE="on"
também sejam gravadas no arquivo make.
8. Registro de erros
Recomenda-se refinar o código de erro, caso contrário será muito fácil para os usuários UNKNOWN
.
ERROR 1105 (HY000): Unknown error%!(EXTRA string=TiProxy fails to connect to TiDB, please check network)
Gostaria de ajustar o nível de alarme de alguns logs. Por exemplo, o erro de consulta é agora DEBUG
, pode ser alterado para WARN
ou pode ser enviado para um arquivo de log separadamente.
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"}
Além disso, após ativar o log DEBUG, há uma grande quantidade de main.infosync.etcdcli
saída de log, que é impressa a cada 3 segundos, sendo recomendado otimizá-lo.
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
Diz-se que a versão em nuvem do TiProxy foi usada no TiDB Cloud, espera-se que o TiProxy seja GA em breve e eventualmente atinja um nível que possa substituir o HAProxy ou ProxySQL.
Apegado:
Fim.
O autor da estrutura de código aberto NanUI passou a vender aço e o projeto foi suspenso. A lista gratuita número um na App Store da Apple é o software pornográfico TypeScript. Ele acaba de se tornar popular, por que os grandes começam a abandoná-lo ? Lista TIOBE de outubro: Java tem o maior declínio, C # está se aproximando Java Rust 1.73.0 lançado Um homem foi encorajado por sua namorada AI a assassinar a Rainha da Inglaterra e foi condenado a nove anos de prisão Qt 6.6 lançado oficialmente Reuters: RISC-V a tecnologia se torna a chave para a guerra tecnológica sino-americana Novo campo de batalha RISC-V: não controlada por nenhuma empresa ou país, a Lenovo planeja lançar o Android PC