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的变化
持久化:写入磁盘 数据不会丢失
高可用:少量节点宕机也不影响
原子操作