英文:
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)
}
专注分享java语言的经验与见解,让所有开发者获益!
评论