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

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

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上。

  1. upstream phoenix_balance {
  2. sticky expires=1m;
  3. server 192.168.3.190:8765;
  4. server 192.168.3.236:8765;
  5. server 192.168.3.165:8765;
  6. }
  7. server {
  8. listen 8766;
  9. server_name localhost;
  10. location / {
  11. proxy_pass http://phoenix_balance/;
  12. }
  13. }

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

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

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

  1. db, err := sql.Open("avatica", "http://192.168.3.236:8765") //ok
  2. db, err := sql.Open("avatica", "http://192.168.3.236:8766") //失败,driver:bad connection
  3. 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

  1. upstream phoenix_balance {
  2. sticky expires=1m;
  3. server 192.168.3.190:8765;
  4. server 192.168.3.236:8765;
  5. server 192.168.3.165:8765;
  6. }
  7. server {
  8. listen 8766;
  9. server_name localhost;
  10. location / {
  11. proxy_pass http://phoenix_balance/;
  12. }
  13. }

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

  1. Class.forName("org.apache.phoenix.queryserver.client.Driver");
  2. String url = "jdbc:phoenix:thin:url=http://192.168.3.236:8766;serialization=PROTOBUF";
  3. 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

  1. db, err := sql.Open("avatica", "http://192.168.3.236:8765") //ok
  2. db, err := sql.Open("avatica", "http://192.168.3.236:8766") // faield ,driver:bad connection
  3. 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给连接器。请参考下面的示例代码:

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

  1. package main
  2. import (
  3. "context"
  4. "database/sql"
  5. "database/sql/driver"
  6. "fmt"
  7. "net"
  8. "net/http"
  9. "net/http/cookiejar"
  10. "runtime"
  11. "time"
  12. avatica "github.com/apache/calcite-avatica-go/v5"
  13. "golang.org/x/net/publicsuffix"
  14. )
  15. func init() {
  16. sql.Register("sticky-avatica", &StickyDriver{})
  17. }
  18. type StickyDriver struct{}
  19. func (d *StickyDriver) Open(dsn string) (driver.Conn, error) {
  20. jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
  21. if err != nil {
  22. return nil, err
  23. }
  24. // 创建支持cookies的baseClient
  25. baseClient := &http.Client{
  26. Transport: &http.Transport{
  27. Proxy: http.ProxyFromEnvironment,
  28. DialContext: (&net.Dialer{
  29. Timeout: 30 * time.Second,
  30. KeepAlive: 30 * time.Second,
  31. }).DialContext,
  32. MaxIdleConns: 100,
  33. IdleConnTimeout: 90 * time.Second,
  34. TLSHandshakeTimeout: 10 * time.Second,
  35. ExpectContinueTimeout: 1 * time.Second,
  36. MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1,
  37. },
  38. Jar: jar,
  39. }
  40. // 由于我们创建了自己的baseClient,DSN字符串中提供的身份验证方法不会被应用。如果需要,可以手动设置。参见:
  41. // https://github.com/apache/calcite-avatica-go/blob/ed4c274f52a98593e6c99de0d7a88802d4a92cb6/http_client.go#L72-L85
  42. connector := avatica.NewConnector(dsn).(*avatica.Connector)
  43. // 将我们自己的baseClient提供给连接器。
  44. connector.Client = baseClient
  45. return connector.Connect(context.TODO())
  46. }
  47. func main() {
  48. db, err := sql.Open("sticky-avatica", "http://192.168.3.236:8766")
  49. if err != nil {
  50. panic(err)
  51. }
  52. rows, err := db.Query("SELECT COUNT(*) FROM test.test1")
  53. if err != nil {
  54. panic(err)
  55. }
  56. defer rows.Close()
  57. fmt.Printf("%v\n", rows)
  58. }

以上是提供支持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!

  1. package main
  2. import (
  3. "context"
  4. "database/sql"
  5. "database/sql/driver"
  6. "fmt"
  7. "net"
  8. "net/http"
  9. "net/http/cookiejar"
  10. "runtime"
  11. "time"
  12. avatica "github.com/apache/calcite-avatica-go/v5"
  13. "golang.org/x/net/publicsuffix"
  14. )
  15. func init() {
  16. sql.Register("sticky-avatica", &StickyDriver{})
  17. }
  18. type StickyDriver struct{}
  19. func (d *StickyDriver) Open(dsn string) (driver.Conn, error) {
  20. jar, err := cookiejar.New(&cookiejar.Options{PublicSuffixList: publicsuffix.List})
  21. if err != nil {
  22. return nil, err
  23. }
  24. // Create our own baseClient that supports cookies.
  25. baseClient := &http.Client{
  26. Transport: &http.Transport{
  27. Proxy: http.ProxyFromEnvironment,
  28. DialContext: (&net.Dialer{
  29. Timeout: 30 * time.Second,
  30. KeepAlive: 30 * time.Second,
  31. }).DialContext,
  32. MaxIdleConns: 100,
  33. IdleConnTimeout: 90 * time.Second,
  34. TLSHandshakeTimeout: 10 * time.Second,
  35. ExpectContinueTimeout: 1 * time.Second,
  36. MaxIdleConnsPerHost: runtime.GOMAXPROCS(0) + 1,
  37. },
  38. Jar: jar,
  39. }
  40. // Since we create our own baseClient, the auth method provided in the DSN
  41. // string is not applied. If this is needed, set it manually. See:
  42. // https://github.com/apache/calcite-avatica-go/blob/ed4c274f52a98593e6c99de0d7a88802d4a92cb6/http_client.go#L72-L85
  43. connector := avatica.NewConnector(dsn).(*avatica.Connector)
  44. // Provide our own baseClient to the connector.
  45. connector.Client = baseClient
  46. return connector.Connect(context.TODO())
  47. }
  48. func main() {
  49. db, err := sql.Open("sticky-avatica", "http://192.168.3.236:8766")
  50. if err != nil {
  51. panic(err)
  52. }
  53. rows, err := db.Query("SELECT COUNT(*) FROM test.test1")
  54. if err != nil {
  55. panic(err)
  56. }
  57. defer rows.Close()
  58. fmt.Printf("%v\n", rows)
  59. }

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:

确定