Compilação do código-fonte TiDB do TiProxy

17109002:

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

sem alt

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.

sem alt

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 tiproxyctlnã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, jsonformato e consoleformato nativos do TiDB. Em seguida, inicie o serviço TiProxy. O log adota jsonformato e DEBUGní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 nightlya 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-playgroundas 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

sem alt

Conecte o tiproxy via porta 6000:

sem alt

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/tiproxye unificar o método de nomenclatura. Afinal, pingcap/tidbnã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-statuse 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.

sem alt

7. Parâmetros de compilação

Recomenda-se adicionar make cleanopções, ou o arquivo make pode ser melhorado. makeSeria ó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 WARNou 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.etcdclisaí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:

sem alt

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
{{o.nome}}
{{m.nome}}

Acho que você gosta

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