hisamounaのブログ

アウトプットを習慣化するためのブログ

etcd (ローカルでPUT,GETする)

etcdをdokerで起動

Ref: Run etcd clusters inside containers

└─> export NODE1=192.168.1.21

└─> docker volume create --name etcd-data
etcd-data

└─> export DATA_DIR="etcd-data"

└─> REGISTRY=gcr.io/etcd-development/etcd

└─> docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --volume=${DATA_DIR}:/etcd-data \
  --name etcd ${REGISTRY}:latest \
  /usr/local/bin/etcd \
  --data-dir=/etcd-data --name node1 \
  --initial-advertise-peer-urls http://${NODE1}:2380 --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://${NODE1}:2379 --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster node1=http://${NODE1}:2380

clientを実装

Ref: example code

package main

import (
    "context"
    "fmt"
    "log"
    "os"
    "time"

    "github.com/coreos/etcd/clientv3"
    "google.golang.org/grpc/grpclog"
)

var (
    dialTimeout = 5 * time.Second

    endpoints = []string{"localhost:2379"}
)

func main() {
    clientv3.SetLogger(grpclog.NewLoggerV2(os.Stderr, os.Stderr, os.Stderr))

    cli, err := clientv3.New(clientv3.Config{
        Endpoints:   endpoints,
        DialTimeout: dialTimeout,
    })
    if err != nil {
        log.Fatal(err)
    }
    defer cli.Close()

    _, err = cli.Put(context.TODO(), "foo", "bar")
    if err != nil {
        log.Fatal(err)
    }

    output, err := cli.Get(context.TODO(), "foo")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%+v\n", *output)
}

実行

go mod tidyが失敗する

  1. bboltのインストールパスが違う
└─> go mod tidy
.
.
.
github.com/coreos/etcd/clientv3 tested by
        github.com/coreos/etcd/clientv3.test imports
        github.com/coreos/etcd/auth imports
        github.com/coreos/etcd/mvcc/backend imports
        github.com/coreos/bbolt: github.com/coreos/bbolt@v1.3.6: parsing go.mod:
        module declares its path as: go.etcd.io/bbolt
                but was required as: github.com/coreos/bbolt

go.modでインストールパスをfix (issue)

// go.mod
replace github.com/coreos/bbolt v1.3.6 => go.etcd.io/bbolt v1.3.6

replace go.etcd.io/bbolt v1.3.6 => github.com/coreos/bbolt v1.3.6
  1. 最新のgrpcライブラリに google.golang.org/grpc/namingがない?
└─> go mod tidy
.
.
.
google.golang.org/grpc/naming: module google.golang.org/grpc@latest found (v1.40.0), but does not contain package google.golang.org/grpc/naming

ひとまず、grpcをダウングレード (issue)

// go.mod
replace google.golang.org/grpc v1.40.0 => google.golang.org/grpc v1.26.0

解決!

└─> go mod tidy
go: finding module for package github.com/coreos/etcd/clientv3
go: found github.com/coreos/etcd/clientv3 in github.com/coreos/etcd v3.3.25+incompatible
.
.
.

└─> go run main.go
INFO: 2021/09/05 14:00:31 parsed scheme: "endpoint"
INFO: 2021/09/05 14:00:31 ccResolverWrapper: sending new addresses to cc: [{localhost:2379  <nil> 0 <nil>}]
{Header:cluster_id:12743156124158006367 member_id:16536637930688536249 revision:4 raft_term:2  Kvs:[key:"foo" create_revision:2 mod_revision:4 version:3 value:"bar" ] More:false Count:1 XXX_NoUnkeyedLiteral:{} XXX_unrecognized:[] XXX_sizecache:0}