当前位置: 首页 > article >正文

【ETCD】etcd简单入门之基础操作基于etcdctl进行操作

这里将使用etcdctl命令行工具来进行演示,

1、使用put命令向etcd写入kv对

使用etcdctl put命令来设置键值对。put命令接受两个参数:键和值

使用方法:

NAME:
        put - Puts the given key into the store

USAGE:
        etcdctl put [options] <key> <value> (<value> can also be given from stdin) [flags]

DESCRIPTION:
        Puts the given key into the store.

        When <value> begins with '-', <value> is interpreted as a flag.
        Insert '--' for workaround:

        $ put <key> -- <value>
        $ put -- <key> <value>

        If <value> isn't given as a command line argument and '--ignore-value' is not specified,
        this command tries to read the value from standard input.

        If <lease> isn't given as a command line argument and '--ignore-lease' is not specified,
        this command tries to read the value from standard input.

        For example,
        $ cat file | put <key>
        will store the content of the file to <key>.

OPTIONS:
  -h, --help[=false]            help for put
      --ignore-lease[=false]    updates the key using its current lease
      --ignore-value[=false]    updates the key using its current value
      --lease="0"               lease ID (in hexadecimal) to attach to the key
      --prev-kv[=false]         return the previous key-value pair before modification

示例:

# 写入一个键为foo 值为 hello world数据
[root@localhost etcd]# ./etcdctl put foo "hello world"
OK
# 使用put命令需要注意的事项为,当需要插入以“-”开通的值时,将被解释为一个标志,需要先插入--标志来解决该问题
[root@localhost etcd]# ./etcdctl put key3 -- -pzh
OK
[root@localhost etcd]# ./etcdctl get key3
key3
-pzh
2、使用get命令从etcd中读取kv对

使用get 命令来获取键对应的值,put命令接受一个参数:键

使用方法:

[root@localhost etcd]# ./etcdctl get --help
NAME:
        get - Gets the key or a range of keys

USAGE:
        etcdctl get [options] <key> [range_end] [flags]

OPTIONS:
      --consistency="l"                 Linearizable(l) or Serializable(s)
      --count-only[=false]              Get only the count
      --from-key[=false]                Get keys that are greater than or equal to the given key using byte compare
  -h, --help[=false]                    help for get
      --keys-only[=false]               Get only the keys
      --limit=0                         Maximum number of results
      --order=""                        Order of results; ASCEND or DESCEND (ASCEND by default)
      --prefix[=false]                  Get keys with matching prefix
      --print-value-only[=false]        Only write values when using the "simple" output format
      --rev=0                           Specify the kv revision
      --sort-by=""                      Sort target; CREATE, KEY, MODIFY, VALUE, or VERSION

示例:

# 获取key为foo的值
[root@localhost etcd]# ./etcdctl get foo
foo
hello world
# 获取前缀为key的所有键 
[root@localhost etcd]# ./etcdctl get key --prefix
key1
v9
key2
v1
3、使用del命令从etcd中删除KV对
# 删除键foo
[root@localhost etcd]# ./etcdctl del foo
# 先新增以前缀为key开头的五个键,key1~key5
[root@localhost etcd]# ./etcdctl put key1 v1
OK
[root@localhost etcd]# ./etcdctl put key2 v2
OK
[root@localhost etcd]# ./etcdctl put key3 v3
OK
[root@localhost etcd]# ./etcdctl put key4 v4
OK
[root@localhost etcd]# ./etcdctl put key5 v5
OK
# 按前缀匹配的方式删除所有的key
[root@localhost etcd]# ./etcdctl del --prefix key
5

4、查看ctcd的数据版本
# 查看
[root@localhost etcd]# ./etcdctl get foo -w fields
# 发送响应的集群id
"ClusterID" : 14841639068965178418  
# 响应请求的节点ID
"MemberID" : 10276657743932975437
# 创建key时集群中当前全局数据版本号
"Revision" : 53
# 请求时当前raft主节点的任期号
"RaftTerm" : 10
# 查看的键
"Key" : "foo"
# 当前key创建时候的全局版本号值
"CreateRevision" : 32
# 当前key修改时候的全局版本号值
"ModRevision" : 32
# key的数据版本号
"Version" : 1
# key当前对应的值
"Value" : "v1"
# 使用的租约对应的id,如果没有使用则该值为0
"Lease" : 0
"More" : false
"Count" : 1
5、监控key
  • 使用方法:
# watch的用法参考如下
[root@localhost etcd]# ./etcdctl watch --help
NAME:
        watch - Watches events stream on keys or prefixes

USAGE:
        etcdctl watch [options] [key or prefix] [range_end] [--] [exec-command arg1 arg2 ...] [flags]

OPTIONS:
  -h, --help[=false]            help for watch
  -i, --interactive[=false]     Interactive mode
      --prefix[=false]          Watch on a prefix if prefix is set
      --prev-kv[=false]         get the previous key-value pair before the event happens
      --rev=0                   Revision to start watching
  • 监控单个key
# 在第一个客户端输入如下指令:
[root@localhost etcd]# ./etcdctl watch  foo
PUT
foo
v2
PUT
foo
v3
PUT
foo
v3
# 在第二客户端输入监控命令
[root@localhost etcd]# ./etcdctl watch foo
PUT
foo
v2
PUT
foo
v3
PUT
foo
v3

# 其他端口对foo这个键进行操作
[root@localhost etcd]# ./etcdctl put foo v2
OK
[root@localhost etcd]# ./etcdctl put foo v3
OK
[root@localhost etcd]# ./etcdctl put foo v3
OK

  • 监控多个key
# 监控以foo开头的所有键,只要是foo
[root@localhost etcd]# ./etcdctl watch foo --prefix
PUT
foo1
muiltvalue
PUT
foo2
muiltwatch
PUT
foo3
v3
DELETE
foo3
# 另外一个客户端进行put、del操作
[root@localhost etcd]# ./etcdctl put foo1 muiltvalue
OK
[root@localhost etcd]# ./etcdctl put foo2 muiltwatch
OK
[root@localhost etcd]# ./etcdctl put foo3 v3
OK
[root@localhost etcd]# ./etcdctl del foo4
0
[root@localhost etcd]# ./etcdctl del foo3
1

如果删除一个不存在的key时不会唤醒watch的客户端。

6、使用etcd来实现锁

go的代码示例:

package main

import (
	"context"
	"fmt"
	clientv3 "go.etcd.io/etcd/client/v3"
	"go.etcd.io/etcd/client/v3/concurrency"
	"log"
	"time"
)

func main() {
	// 初始化etcd客户端
	cli, err := clientv3.New(clientv3.Config{
		Endpoints:   []string{"192.168.188.101:2379"}, // 替换为你的etcd集群地址
		DialTimeout: 5 * time.Second,
	})
	if err != nil {
		log.Fatal(err)
	}
	defer cli.Close()

	// 创建一个上下文
	ctx, cancel := context.WithTimeout(context.Background(), 1000*time.Second)
	defer cancel()

	// 创建一个新的session
	session, err := concurrency.NewSession(cli)
	if err != nil {
		log.Fatal(err)
	}
	defer session.Close()

	// 使用session创建锁
	mutualTxn := concurrency.NewMutex(session, "mutex")
	// 尝试获取锁
	err = mutualTxn.Lock(ctx)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Lock acquired")

	// 模拟一些工作
	time.Sleep(2 * time.Second)

	// 释放锁
	err = mutualTxn.Unlock(ctx)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println("Lock released")

}


http://www.kler.cn/a/419138.html

相关文章:

  • webrtc ios h264 硬编解码
  • 响应式编程一、Reactor核心
  • 51c视觉~YOLO~合集4
  • 详细讲解Sort自定义排序(JavaJavaScript)
  • AtomicIntegerFieldUpdater能否降低内存
  • <项目代码>YOLOv8 红绿灯识别<目标检测>
  • arkTS:持久化储存UI状态的基本用法(PersistentStorage)
  • 基于Java Springboot宠物医院微信小程序
  • UI设计-色彩、层级、字体、边距(二)
  • 民锋视角:数据分析如何助力金融决策
  • 【docker集群应用】Docker--harbor私有仓库部署与管理
  • C语言——管理系统
  • glog在vs2022 hello world中使用
  • MySQL Inception工具
  • 泷羽sec-shell(5)字符串运算符和逻辑运算符 学习笔记
  • 编程基础篇
  • 英语写作中以rationale 替代reason(理由)
  • node.js基础学习-querystring模块-查询字符串处理(三)
  • 二分搜索(二)搜索插入位置
  • javascript切换类、删除类、修改类以及增加类
  • 低代码与微服务融合在医疗集团中的补充应用探究
  • 计算机网络--网络安全测试
  • 【关闭or开启电脑自带的数字键盘】
  • 第1章-JVM和Java体系架构
  • 【QNX+Android虚拟化方案】127 - QNX侧 uart 读写程序分析
  • MySQL中的count函数