【TiDB 使用环境】 /测试/ Poc
【TiDB 版本】
【操作系统】
【部署方式】使用tidb-operator只部署tikv和pd
【遇到的问题:问题现象及影响】
想只用tikv,不使用tidb的sql模式,但是部署后
go 语言使用RawKVClient访问tikv报错,发现client拿到的都是svc地址,这个有解决方案吗
【复制黏贴 ERROR 报错的日志】
[ERROR] [client.go:271] [“[pd] create tso stream error”] [error=“[PD:client:ErrClientCreateTSOStream]rpc error: code = Canceled desc = context canceled”] [stack=“github.com/tikv/pd/client.(*client).tsLoop\n\t/Users/apple/.gvm/pkgsets/go1.23.4/global/pkg/mod/github.com/tikv/pd@v0.0.0-20210105112549-e5be7fd38659/client/client.go:271”]
[2025/04/14 20:53:15.835 +08:00] [WARN] [base_client.go:194] [“[pd] cannot update leader”] [address=http://ti-q7mro677hz15i9ufsdul-pd-0.ti-q7mro677hz15i9ufsdul-pd-peer.ti-q7mro677hz15i9ufsdul.svc:2379] [error=“[PD:client:ErrClientGetMember]error:rpc error: code = DeadlineExceeded desc = context deadline exceeded target:ti-q7mro677hz15i9ufsdul-pd-0.ti-q7mro677hz15i9ufsdul-pd-peer.ti-q7mro677hz15i9ufsdul.svc:2379 status:IDLE”]
[2025/04/14 20:53:24.884 +08:00] [ERROR] [client.go:271] [“[pd] create tso stream error”] [error=“[PD:client:ErrClientCreateTSOStream]rpc error: code = Canceled desc = latest connection error: connection error: desc = "transport: Error while dialing dial tcp: lookup ti-q7mro677hz15i9ufsdul-pd-2.ti-q7mro677hz15i9ufsdul-pd-peer.ti-q7mro677hz15i9ufsdul.svc: i/o timeout"”] [stack=“github.com/tikv/pd/client.(*client).tsLoop\n\t/Users/apple/.gvm/pkgsets/go1.23.4/global/pkg/mod/github.com/tikv/pd@v0.0.0-20210105112549-e5be7fd38659/client/client.go:271”]
[2025/04/14 20:53:32.887 +08:00] [WARN]
2 个赞
不太熟悉k8s,不过看上去问题在于
ti-q7mro677hz15i9ufsdul-pd-2.ti-q7mro677hz15i9ufsdul-pd-peer.ti-q7mro677hz15i9ufsdul.svc
这个地址完全访问不了。网络层面就不行。
端口映射了吗?
kubectl port-forward --address 0.0.0.0 svc/demo-tidb 20160:20160–namespace=tidb
1 个赞
容器化可以做端口映射
可以通过kubectl port-forward svc/mysql-service 3306:3306 --address 0.0.0.0 然后通过就可以外部访问,还有就是通过nodeport的方式任意台机器地址加端口也可以访问。
端口映射和nodeport没用啊,rawKVClient根据提供的pd地址去拿pd实际的地址。。。。和访问入口没关系,访问入口我是通过loadbalancer接入pd,外部可以访问
感觉要看rawKVlClient 是否支持下容器化场景下的case,有大佬熟悉这个sdk吗
1 个赞
访问代码package main
import (
“fmt”
"github.com/pingcap/tidb/config"
"github.com/pingcap/tidb/store/tikv"
)
func main() {
cli, err := tikv.NewRawKVClient(string{“****:2379”}, config.Security{})
if err != nil {
panic(err)
}
defer cli.Close()
fmt.Printf("cluster ID: %d\n", cli.ClusterID())
key := []byte("Company")
val := []byte("PingCAP")
// put key into tikv
err = cli.Put(key, val)
if err != nil {
panic(err)
}
fmt.Printf("Successfully put %s:%s to tikv\n", key, val)
// get key from tikv
val, err = cli.Get(key)
if err != nil {
panic(err)
}
fmt.Printf("found val: %s for key: %s\n", val, key)
// delete key from tikv
err = cli.Delete(key)
if err != nil {
panic(err)
}
fmt.Printf("key: %s deleted\n", key)
// get key again from tikv
val, err = cli.Get(key)
if err != nil {
panic(err)
}
fmt.Printf("found val: %s for key: %s\n", val, key)
}
官网给的demo
1 个赞
集群内部访问时没有问题的,如果想要在集群外部访问的话就需要了
外部访问的时候,需要做一个映射才行吧?
通过负载均衡器也是可以的。