Couchbase operation has timed out if there is more than one node
我将实现一个分布式计数器,如果该长沙发集群只有一个节点,则该计数器工作良好,但是当我添加一个新节点时,对于存储桶上的每种操作类型,它都会返回
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | type Incrementer struct { bucket *gocb.Bucket gap uint64 initial int64 ttl uint32 } func New(conn, bucketName, bucketPassword string, gap uint64, initial int64) *Incrementer { cluster, err := gocb.Connect(conn) if err != nil { fmt.Println("ERRROR CONNECTING TO CLUSTER:", err) return nil } // Open Bucket bucket, err := cluster.OpenBucket(bucketName, bucketPassword) if err != nil { fmt.Println("ERRROR OPENING BUCKET:", err) return nil } return &Incrementer{ bucket: bucket, gap: gap, initial: initial, } } func (i *Incrementer) Add(key string) error { var current interface{} cas, err := i.bucket.GetAndLock(key, i.ttl, ¤t) if err == gocb.ErrKeyNotFound { _, _, err := i.bucket.Counter(key, 1, i.initial, 0) if err != nil { return err } } if err != nil { return err } newValue := current.(float64) + 1 if newValue >= float64(i.gap) { newValue = float64(i.initial) } _, err = i.bucket.Replace(key, newValue, cas, 0)*/ // https://developer.couchbase.com/documentation/server/3.x/developer/dev-guide-3.0/lock-items.html return err } |
通常这是整个代码,并且还有一个docker compose:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | version:"3" services: cb1: image: arungupta/couchbase deploy: replicas: 2 ports: - 8091:8091 - 8092:8092 - 8093:8093 - 8094:8094 - 11210:11210 links: - cb2 cb2: image: arungupta/couchbase deploy: replicas: 2 |
场景:
设置Docker架构师时,只有一个节点,因为我必须在Couchbase的UI中手动添加它。很好,它可以正常工作,但是当我使用
我真的不明白为什么只有一个节点时它的工作方式不一样。
首先,我建议您使用官方的Couchbase映像而不是
第二,您的Go代码是否在Docker主机中运行?我怀疑不是,这就是您遇到此问题的原因。 Go客户端需要能够访问每个Couchbase节点。在Docker主机之外,它只能进入一个主机。
我的建议是将Go客户端移至Docker主机内部。