如何仅连接到Mongo实例的主节点?

huangapple go评论114阅读模式
英文:

How does one attach to just the primary node of a mongo instance?

问题

这可能是我对Mongo的工作方式或新的Go开发有误解,但我无法从Go中连接到我的Mongo实例。当我使用Studio 3T连接到我的Mongo实例时,可以正常连接,浏览表等。但是,如果我尝试使用Go模块连接,它会抱怨无法找到所有节点。它需要能够访问所有节点吗?我以为副本集本身应该处理复制?

例如,我有以下Go代码:

  1. package main
  2. import (
  3. "context"
  4. "go.mongodb.org/mongo-driver/mongo"
  5. "go.mongodb.org/mongo-driver/mongo/options"
  6. "go.mongodb.org/mongo-driver/mongo/readpref"
  7. "log"
  8. "time"
  9. )
  10. func main() {
  11. log.Println("Hello World!")
  12. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  13. defer cancel()
  14. client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://MongoInsance:27017"))
  15. if err != nil {
  16. log.Fatal("Failed to connect to Mongo DB", err)
  17. }
  18. if err := client.Ping(ctx, readpref.Primary()); err != nil {
  19. log.Fatal("Not actually connected ", err)
  20. }
  21. res, err := client.ListDatabases(ctx, nil)
  22. if err != nil{
  23. log.Fatal("Failed to list databases")
  24. }
  25. for _, val := range res.Databases {
  26. log.Println(val.Name)
  27. }
  28. defer disconnect(client, &ctx)
  29. }
  30. func disconnect(client *mongo.Client, ctx *context.Context) {
  31. if err := client.Disconnect(*ctx); err != nil {
  32. panic(err)
  33. }
  34. }

但是,当我运行上述代码时,收到以下错误响应:

  1. Not actually connected server selection error: context deadline exceeded, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: mqtt-ingester-db-mast:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-mast: no such host }, { Addr: mqtt-ingester-db-rep1:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-rep1: no such host }, { Addr: mqtt-ingester-db-rep2:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-rep2: no such host }, ] }

我是否真的需要暴露所有副本集?
目前,我在主机MongoInstance上使用Docker运行主节点和2个从节点,主节点连接到端口27017:

  1. docker-compose.yml
  2. services:
  3. ...
  4. mqtt-ingester-db-mast:
  5. container_name: mqtt-ingester-db-mast
  6. restart: always
  7. image: mongo:latest
  8. ports:
  9. - 27017:27017
  10. volumes:
  11. - 'mongo_main:/data/db'
  12. entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  13. mqtt-ingester-db-rep1:
  14. container_name: mqtt-ingester-db-rep1
  15. restart: always
  16. image: mongo:latest
  17. expose:
  18. - 27017
  19. volumes:
  20. - 'mongo_rep1:/data/db'
  21. entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  22. mqtt-ingester-db-rep2:
  23. container_name: mqtt-ingester-db-rep2
  24. restart: always
  25. image: mongo:latest
  26. expose:
  27. - 27017
  28. volumes:
  29. - 'mongo_rep2:/data/db'
  30. entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  31. mqtt-ingester-setup:
  32. image: mongo:latest
  33. container_name: mqtt-ingester-setup
  34. links:
  35. - mqtt-ingester-db-mast:mqtt-ingester-db-mast
  36. - mqtt-ingester-db-rep1:mqtt-ingester-db-rep1
  37. - mqtt-ingester-db-rep2:mqtt-ingester-db-rep2
  38. depends_on:
  39. - mqtt-ingester-db-mast
  40. - mqtt-ingester-db-rep1
  41. - mqtt-ingester-db-rep2
  42. volumes:
  43. - ./mqtt-ingester:/scripts
  44. restart: "no"
  45. entrypoint: [ "bash", "/scripts/mqtt_ingester_setup.sh" ]
  46. mqtt-ingester-explorer:
  47. container_name: mqtt-ingester-explorer
  48. restart: always
  49. image: mongo-express:latest
  50. ports:
  51. - '8081:8081'
  52. depends_on:
  53. - mqtt-ingester-db-mast
  54. links:
  55. - mqtt-ingester-db-mast:mongo
  56. ...
英文:

This might be me misunderstanding how Mongo works/new Go dev - but I'm not able to connect to my mongo instance from Go. When I connect to my Mongo instance using Studio 3T, I can connect just fine, browse the tables, etc. But If I try to connect using the Go module, it complains about not being able to find all the nodes. Is it necessary for it to be able to access all nodes? I thought the replica set itself was supposed to handle the replication?

For example, I have this Go code:

  1. package main
  2. import (
  3. "context"
  4. "go.mongodb.org/mongo-driver/mongo"
  5. "go.mongodb.org/mongo-driver/mongo/options"
  6. "go.mongodb.org/mongo-driver/mongo/readpref"
  7. "log"
  8. "time"
  9. )
  10. func main() {
  11. log.Println("Hello World!")
  12. ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
  13. defer cancel()
  14. client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://MongoInsance:27017"))
  15. if err != nil {
  16. log.Fatal("Failed to connect to Mongo DB", err)
  17. }
  18. if err := client.Ping(ctx, readpref.Primary()); err != nil {
  19. log.Fatal("Not actually connected ", err)
  20. }
  21. res, err := client.ListDatabases(ctx, nil)
  22. if err != nil{
  23. log.Fatal("Failed to list databases")
  24. }
  25. for _, val := range res.Databases {
  26. log.Println(val.Name)
  27. }
  28. defer disconnect(client, &ctx)
  29. }
  30. func disconnect(client *mongo.Client, ctx *context.Context) {
  31. if err := client.Disconnect(*ctx); err != nil {
  32. panic(err)
  33. }
  34. }

But the response I get when running said code gives the error:

  1. Not actually connected server selection error: context deadline exceeded, current topology: { Type: ReplicaSetNoPrimary, Servers: [{ Addr: mqtt-ingester-db-mast:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-mast: no such host }, { Addr: mqtt-ingester-db-rep1:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-rep1: no such host }, { Addr: mqtt-ingester-db-rep2:27017, Type: Unknown, Last error: connection() error occured during connection handshake: dial tcp: lookup mqtt-ingester-db-rep2: no such host }, ] }

Do I actually need to expose all the replica sets as well?
Currently I have the primary node and 2 secondary nodes running in docker on host MongoInstance, with the primary node attached to port 27017:

  1. docker-compose.yml
  2. services:
  3. ...
  4. mqtt-ingester-db-mast:
  5. container_name: mqtt-ingester-db-mast
  6. restart: always
  7. image: mongo:latest
  8. ports:
  9. - 27017:27017
  10. volumes:
  11. - 'mongo_main:/data/db'
  12. entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  13. mqtt-ingester-db-rep1:
  14. container_name: mqtt-ingester-db-rep1
  15. restart: always
  16. image: mongo:latest
  17. expose:
  18. - 27017
  19. volumes:
  20. - 'mongo_rep1:/data/db'
  21. entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  22. mqtt-ingester-db-rep2:
  23. container_name: mqtt-ingester-db-rep2
  24. restart: always
  25. image: mongo:latest
  26. expose:
  27. - 27017
  28. volumes:
  29. - 'mongo_rep2:/data/db'
  30. entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ]
  31. mqtt-ingester-setup:
  32. image: mongo:latest
  33. container_name: mqtt-ingester-setup
  34. links:
  35. - mqtt-ingester-db-mast:mqtt-ingester-db-mast
  36. - mqtt-ingester-db-rep1:mqtt-ingester-db-rep1
  37. - mqtt-ingester-db-rep2:mqtt-ingester-db-rep2
  38. depends_on:
  39. - mqtt-ingester-db-mast
  40. - mqtt-ingester-db-rep1
  41. - mqtt-ingester-db-rep2
  42. volumes:
  43. - ./mqtt-ingester:/scripts
  44. restart: "no"
  45. entrypoint: [ "bash", "/scripts/mqtt_ingester_setup.sh" ]
  46. mqtt-ingester-explorer:
  47. container_name: mqtt-ingester-explorer
  48. restart: always
  49. image: mongo-express:latest
  50. ports:
  51. - '8081:8081'
  52. depends_on:
  53. - mqtt-ingester-db-mast
  54. links:
  55. - mqtt-ingester-db-mast:mongo
  56. ...

答案1

得分: 1

是的。客户端需要看到复制集中的所有节点,这样当主节点宕机时,它们可以进行故障转移。

英文:

> Do I actually need to expose all the replica sets as well?

Yes. Clients need to see all nodes in a replica set, so they can fail over when master goes down.

huangapple
  • 本文由 发表于 2021年6月8日 19:52:27
  • 转载请务必保留本文链接:https://go.coder-hub.com/67886337.html
匿名

发表评论

匿名网友

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

确定