avatica-go客户端读取Phoenix查询服务器:[驱动程序:连接错误]

huangapple 未分类评论185阅读模式
英文:

avatica-go client read Phoenix Query Server:[driver: bad connection]

问题

Hbase 2.0.0v
Phoenix 5.0.0v
Avatica-go-client 5.2.0v
Nginx 1.8.1 with sticky module

3个Regionserver,3个Query Server,Nginx配置了负载均衡器来负责3个Query Server的负载均衡。

Nginx配置如下:
Nginx运行在192.168.3.236上。

upstream phoenix_balance {
        sticky expires=1m;
        server 192.168.3.190:8765;
        server 192.168.3.236:8765;
        server 192.168.3.165:8765;
    }

server {
        listen 8766;
        server_name localhost;
        location / {
                proxy_pass http://phoenix_balance/;
        }
    }

当我使用Java读取PQS时,连接单个PQS和连接负载均衡URL都没有问题,代码如下:

Class.forName("org.apache.phoenix.queryserver.client.Driver");
String url = "jdbc:phoenix:thin:url=http://192.168.3.236:8766;serialization=PROTOBUF";
conn = DriverManager.getConnection(url, prop);

当我使用go连接单个PQS时,连接负载均衡URL失败,代码来自avatica-go-client-reference

db, err := sql.Open("avatica", "http://192.168.3.236:8765") //ok
db, err := sql.Open("avatica", "http://192.168.3.236:8766") //失败,driver:bad connection
rows, err := db.Query("SELECT COUNT(*) FROM test.test1")

请问我的nginx配置有问题吗?

我真的希望有人能回答我的问题。

英文:

Hbase 2.0.0v
Phoenix 5.0.0v
Avatica-go-client 5.2.0v
Nginx 1.8.1 with sticky module

3 Regionserver,3 Query Server , Nginx configed stick load balance for 3Query server

nginx conf
nginx in 192.168.3.236

upstream phoenix_balance {
        sticky expires=1m;
        server 192.168.3.190:8765;
        server 192.168.3.236:8765;
        server 192.168.3.165:8765;
    }

server {

        listen 8766;
        server_name localhost;
        location / {
                proxy_pass http://phoenix_balance/;
        }
    }

when i use Java to Read PQS its ok(connect one PQS, connect load balance url),

Class.forName("org.apache.phoenix.queryserver.client.Driver");
String url = "jdbc:phoenix:thin:url=http://192.168.3.236:8766;serialization=PROTOBUF";
conn = DriverManager.getConnection(url, prop);

i use go to connect one PQS its ok,connect to load balance url its failed,
code from avatica-go-client-reference

db, err := sql.Open("avatica", "http://192.168.3.236:8765") //ok
db, err := sql.Open("avatica", "http://192.168.3.236:8766") // faield ,driver:bad connection
rows, err := db.Query("SELECT COUNT(*) FROM test.test1")

Is there a problem with my nginx configuration?

I really hope someone can answer this question for me

答案1

得分: 0

我猜原因是Avatica Go客户端不支持cookies。我们可以提供自己的baseClient来支持cookies给连接器。请参考下面的示例代码:

注意:我没有测试实现的环境。如果不起作用,请告诉我,我会进一步研究。谢谢!

package main

import (
	"context"
	"database/sql"
	"database/sql/driver"
	"fmt"
	"net"
	"net/http"
	"net/http/cookiejar"
	"runtime"
	"time"

	avatica "github.com/apache/calcite-avatica-go/v5"
	"golang.org/x/net/publicsuffix"
)

func init() {
	sql.Register("sticky-avatica", &StickyDriver{})
}

type StickyDriver struct{}

func (d *StickyDriver) Open(dsn string) (driver.Conn, error) {
	jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
	if err != nil {
		return nil, err
	}

	// 创建支持cookies的baseClient
	baseClient := &http.Client{
		Transport: &http.Transport{
			Proxy: http.ProxyFromEnvironment,
			DialContext: (&net.Dialer{
				Timeout:   30 * time.Second,
				KeepAlive: 30 * time.Second,
			}).DialContext,
			MaxIdleConns:          100,
			IdleConnTimeout:       90 * time.Second,
			TLSHandshakeTimeout:   10 * time.Second,
			ExpectContinueTimeout: 1 * time.Second,
			MaxIdleConnsPerHost:   runtime.GOMAXPROCS(0) + 1,
		},
		Jar: jar,
	}

	// 由于我们创建了自己的baseClient,DSN字符串中提供的身份验证方法不会被应用。如果需要,可以手动设置。参见:
	// https://github.com/apache/calcite-avatica-go/blob/ed4c274f52a98593e6c99de0d7a88802d4a92cb6/http_client.go#L72-L85

	connector := avatica.NewConnector(dsn).(*avatica.Connector)

	// 将我们自己的baseClient提供给连接器。
	connector.Client = baseClient

	return connector.Connect(context.TODO())
}

func main() {
	db, err := sql.Open("sticky-avatica", "http://192.168.3.236:8766")
	if err != nil {
		panic(err)
	}
	rows, err := db.Query("SELECT COUNT(*) FROM test.test1")
	if err != nil {
		panic(err)
	}
	defer rows.Close()

	fmt.Printf("%v\n", rows)
}

以上是提供支持cookies的baseClient给连接器的示例代码。

英文:

I guess the reason is that the Avatica Go client does not support cookies. We can provide our own baseClient that supports cookies to the connector. See the demo below:

Note: I don't have the environment to test the implementation. Please let me know if it does not work and I will look into it. Thank you!

package main

import (
	"context"
	"database/sql"
	"database/sql/driver"
	"fmt"
	"net"
	"net/http"
	"net/http/cookiejar"
	"runtime"
	"time"

	avatica "github.com/apache/calcite-avatica-go/v5"
	"golang.org/x/net/publicsuffix"
)

func init() {
	sql.Register("sticky-avatica", &StickyDriver{})
}

type StickyDriver struct{}

func (d *StickyDriver) Open(dsn string) (driver.Conn, error) {
	jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
	if err != nil {
		return nil, err
	}

	// Create our own baseClient that supports cookies.
	baseClient := &http.Client{
		Transport: &http.Transport{
			Proxy: http.ProxyFromEnvironment,
			DialContext: (&net.Dialer{
				Timeout:   30 * time.Second,
				KeepAlive: 30 * time.Second,
			}).DialContext,
			MaxIdleConns:          100,
			IdleConnTimeout:       90 * time.Second,
			TLSHandshakeTimeout:   10 * time.Second,
			ExpectContinueTimeout: 1 * time.Second,
			MaxIdleConnsPerHost:   runtime.GOMAXPROCS(0) + 1,
		},
		Jar: jar,
	}

	// Since we create our own baseClient, the auth method provided in the DSN
	// string is not applied. If this is needed, set it manually. See:
	// https://github.com/apache/calcite-avatica-go/blob/ed4c274f52a98593e6c99de0d7a88802d4a92cb6/http_client.go#L72-L85

	connector := avatica.NewConnector(dsn).(*avatica.Connector)

	// Provide our own baseClient to the connector.
	connector.Client = baseClient

	return connector.Connect(context.TODO())
}

func main() {
	db, err := sql.Open("sticky-avatica", "http://192.168.3.236:8766")
	if err != nil {
		panic(err)
	}
	rows, err := db.Query("SELECT COUNT(*) FROM test.test1")
	if err != nil {
		panic(err)
	}
	defer rows.Close()

	fmt.Printf("%v\n", rows)
}

huangapple
  • 本文由 发表于 2023年4月25日 10:50:50
  • 转载请务必保留本文链接:https://java.coder-hub.com/76097349.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定