【面试】etcd知识点

28 阅读2分钟

1.etcd是什么

分布式中存储关键数据 配置共享

2.etcd的命令有哪些

etcdctl push 写入数据
ctcdctl get 获取数据
etcdctl weatch 监控etcd中键值的变化

3.watch命令如何监听key的变化

在代码中 调用watch方法后 写一个循环

rch := client.Watch(context.Background(), "/foo")
for wresp := range rch {
    for _, ev := range wresp.Events {
        fmt.Printf("Type: %s  Key: %s  Value: %s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
    }
}

4.etcd中分布式锁怎么用

//创建租约 
lease, _ := cli.Grant(ctx, 5)

// 尝试原子创建锁 key
txn := cli.Txn(ctx)
txn.If(clientv3.Compare(clientv3.CreateRevision("/my-lock"), "=", 0)).Then(clientv3.OpPut("/my-lock", "owner1", clientv3.WithLease(lease.ID))).
        Else()resp, _ := txn.Commit()

if resp.Succeeded {
    fmt.Println("成功获取锁!")
    // 持有锁期间做业务操作
    time.Sleep(2 * time.Second)
    // 释放锁(删除 key 或让租约过期)
    cli.Delete(ctx, "/my-lock")
} else {
    fmt.Println("获取锁失败,锁已被占用")
}

5.etcd中如何回滚key的版本?

// 1.通过命令获取旧版本 
  resp, _ := cli.Get(ctx, "/foo", clientv3.WithRev(5))
  oldValue := string(resp.Kvs[0].Value)
//2.把旧值写回去 完成回滚
   _, _ = cli.Put(ctx, "/foo", oldValue) 

6.Raft协议的内容有啥

1.角色有三种 leader follow candidate
leader:处理请求 同步数据
follow:保存leader的日志
candidate:leader的候选人
2.选举机制:没有leader了 就选一个leader
3.日志复制 :leader给follow日志 所有 follow都保存了 才写入
4.日志压缩:久远的日志可以打包成快照 节省空间

7.为什么要用Raft这个词

Raft:木筏, 在复杂的分布式一致性问题的“湍流”中安全渡河

8.如何在k8s扩充etcd节点

// 1.安装etcd Operator
  kubectl apply -f https://github.com/etcd-io/etcd-operator/releases/download/v0.11.1/etcd-operator.yaml

// 2.创建etcd CR
    apiVersion: etcd.database.coreos.com/v1beta2
    kind: EtcdCluster
    metadata:
      name: example-etcd
      namespace: default
    spec:
      size: 3         # 集群节点数
      version: "3.5.10"
// 3.想修改节点个数的话 直接修改CR中节点个数  然后执行 
    kubectl apply -f etcd-cluster.yaml

9.为什么要用etcd而不用redis

ectd:强一致性 一致性方面比redis强
watch监听: 监听key value的变化
持久化:写入磁盘 数据不会丢失
高可用:少量节点宕机也不影响
原子操作