ETCD 3とETCD 2の性能比較

2835 ワード

Server
ETCD2
ETCD3
ETCD2
1.698331852s = 1698.331852ms
error
ETCD3
20.87944695s = 20879.44695ms
156.3686ms
: 2000 。etcd3 TXN 128 , , etcd3 128 txn , 128 。 key , 2000 。

結論

  • etcd.Client 2バージョンでは、keyごとにetcdのset操作が1回行われているため、この操作はロックされているため、回りながらsetする場合はロックに時間がかかることが多い.
  • etcd.Client 3バージョンでは、すべてのconfを分類した後、128操作ごとにトランザクション実行を行うため、パフォーマンスの増加が顕著である.

  • ETCD 3基本命令の使い方:


    バージョンの表示:

    ./etcdctl version

    GET:


    KVを取得./etcdctl get key
    すべてのKVを取得./etcdctl get --from-key ''
    一定範囲のKVを取得./etcdctl get key1 keyn

    PUT:


    書き込みKV./etcdctl put key value

    DEL:


    KVを削除./etcdctl del key
    一定範囲のKVを削除./etcdctl del key1 keyn

    WATCH:


    ウォッチのキー:./etcdctl watch key
    watch一定範囲内のKey./etcdctl watch key1 keyn
    watchある文字列をはじめとするすべてのKey./etcdctl watch --prefix=true string

    LEASE:


    一定時間のリースを作成します.単位はsです../etcdctl lease grant n
    あるKVにリースを付与する./etcdctl put --lease=name key value
    リース情報の表示./etcdctl lease timetolive name
    リースを保持する./etcdctl lease keep-alive name
    リースを取り消すと、リースを取り消すと同時に、リースを付与されたKVが削除されます./etcdctl lease revoke name

    ETCD 3 go-clientv 3使用例

    func main() {
        cli, err := clientv3.New(clientv3.Config{
            Endpoints:   endpoints,
            DialTimeout: dialTimeout,
        })
        if err != nil {
            println(err)
        }
        defer cli.Close()
    
        //PUT 
        if _, err := cli.Put(context.TODO(), "foo", "bar"); err != nil{
            fmt.Println(err.Error())
        }
    
        //GET 
        if resp, err := cli.Get(context.TODO(), "foo"); err != nil {
            fmt.Println(err.Error())
        } else {
            fmt.Println("resp: ", resp)
        }
    
        //TXN
        ctx, cancel := context.WithTimeout(context.Background(), requestTimeout)
        _, err = cli.Txn(ctx).
            If(clientv3.Compare(clientv3.Value("key"), ">", "abc")).
            Then(clientv3.OpPut("key", "XYZ")).
            Else(clientv3.OpPut("key", "ABC")).
            Commit()
        cancel()
        if err != nil {
            fmt.Println(err)
        }
    
        //Watch
        rch := cli.Watch(context.Background(), "", clientv3.WithPrefix())
        for wresp := range rch {
            for _, ev := range wresp.Events {
                fmt.Printf("%s %q : %q
    ", ev.Type, ev.Kv.Key, ev.Kv.Value) } } }