浅谈云原生技术组件—etcd

简介: 浅谈云原生技术组件—etcd

浅谈云原生技术组件—etcd

技术官网:etcd.io/

GitHub:github.com/etcd-io/etc…

1 什么是etcd?

etcd是一种强一致性的分布式键值存储组件,使用Raft算法,利用Go语言编写,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它在网络分区期间优雅地处理领导者选举,并且可以容忍机器故障,即使在领导者节点中也是如此。

特点:

  • 操作简单整洁,使用HTTP协议和JSON文件格式进行存取键值对
  • 键值对存储,类似于Zookeeper
  • 更够根据值的变化快速相应
  • 可以利用TLS增强安全性

2 动手运行etcd

2.1 安装要求

支持平台:etcd.io/docs/v3.5/o…

硬件要求:etcd.io/docs/v3.5/o…

本次实验将使用Ubuntu虚拟机,64bit、4GB内存、4核CPU

2.2 下载并测试

下载页面:github.com/etcd-io/etc…

我们选择的版本是v3.5.4,下面演示下:

root@ymx-ubuntu:/usr/local# wget https://github.com/etcd-io/etcd/releases/download/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gz
......
2022-05-15 14:20:34 (1.45 MB/s) - 已保存 “etcd-v3.5.4-linux-amd64.tar.gz” [19432359/19432359])
root@ymx-ubuntu:/usr/local# ls
etcd-v3.5.4-linux-amd64.tar.gz ......
root@ymx-ubuntu:/usr/local# tar -zxvf etcd-v3.5.4-linux-amd64.tar.gz 
......
root@ymx-ubuntu:/usr/local# cd etcd-v3.5.4-linux-amd64/
root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ls -al
总用量 56300
drwxr-xr-x  3 528287 89939     4096 4月  24 18:45 .
drwxr-xr-x 14 root   root      4096 5月  15 14:20 ..
drwxr-xr-x  3 528287 89939     4096 4月  24 18:45 Documentation
-rwxr-xr-x  1 528287 89939 23564288 4月  24 18:45 etcd
-rwxr-xr-x  1 528287 89939 17960960 4月  24 18:45 etcdctl
-rwxr-xr-x  1 528287 89939 16039936 4月  24 18:45 etcdutl
-rw-r--r--  1 528287 89939    42066 4月  24 18:45 README-etcdctl.md
-rw-r--r--  1 528287 89939     7359 4月  24 18:45 README-etcdutl.md
-rw-r--r--  1 528287 89939     9394 4月  24 18:45 README.md
-rw-r--r--  1 528287 89939     7896 4月  24 18:45 READMEv2-etcdctl.md
root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcd -version
etcd Version: 3.5.4
Git SHA: 0xxxxxx
Go Version: go1.16.15
Go OS/Arch: linux/amd64
复制代码
  • etcd:etcd服务
  • etcdctl :etcd的命令行客户端
  • etcdutl :etcd的命令行管理工具

2.3 运行并初步使用etcd

2.3.1 设置环境变量
root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# vim /etc/profile
#### 在文件末尾加入以下内容
export ETCD_HOME=/usr/local/etcd-v3.5.4-linux-amd64
export PATH=$PATH:$ETCD_HOME
复制代码
2.3.1 启动etcd(单节点)
TOKEN=my_etcd
CLUSTER_STATE=new
NAME_1=my_etcd_name
HOST_1=127.0.0.1
CLUSTER=${NAME_1}=http://${HOST_1}:2380
THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
etcd --data-dir=data.etcd --name ${THIS_NAME} \
  --initial-advertise-peer-urls http://${THIS_IP}:2380 --listen-peer-urls http://${THIS_IP}:2380 \
  --advertise-client-urls http://${THIS_IP}:2379 --listen-client-urls http://${THIS_IP}:2379 \
  --initial-cluster ${CLUSTER} \
  --initial-cluster-state ${CLUSTER_STATE} --initial-cluster-token ${TOKEN}
复制代码
2.3.2 使用 etcdctl 连接到 etcd
etcdctl --endpoints=127.0.0.1:2379 member list
复制代码

演示:

root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcdctl --endpoints=127.0.0.1:2379 member list
xxxxxxxx, started, my_etcd_name, http://127.0.0.1:2380, http://127.0.0.1:2379, false
复制代码
2.3.3 使用etcd的Hello World
ENDPOINTS=127.0.0.1:2379
etcdctl --endpoints=$ENDPOINTS put foo "Hello World!"
etcdctl --endpoints=$ENDPOINTS get foo
etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo
复制代码

演示:

root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcdctl --endpoints=$ENDPOINTS put foo "Hello World!"
OK
root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcdctl --endpoints=$ENDPOINTS get foo
foo
Hello World!
root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo
{"header":{"cluster_id":87772999870000089,"member_id":10756500090258089453,"revision":3,"raft_term":2},"kvs":[{"key":"Zm9v","create_revision":2,"mod_revision":3,"version":2,"value":"SGV00000ybGQh"}],"count":1}
复制代码
2.3.4 将etcd数据进行持久化
ENDPOINTS=127.0.0.1:2379
etcdctl --endpoints=$ENDPOINTS snapshot save my.db
etcdctl --write-out=table --endpoints=$ENDPOINTS snapshot status my.db
复制代码

演示:

root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcdctl --endpoints=$ENDPOINTS snapshot save my.db
......
Snapshot saved at my.db
root@ymx-ubuntu:/usr/local/etcd-v3.5.4-linux-amd64# ./etcdctl --write-out=table --endpoints=$ENDPOINTS snapshot status my.db
Deprecated: Use `etcdutl snapshot status` instead.
+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| ebfb411d |        3 |          8 |      20 kB |
+----------+----------+------------+------------+
复制代码

3 使用客户端连接etcd

etcd支持以下客户端:

  • Go
  • Java
  • Scala
  • Perl
  • Python
  • Node
  • Ruby
  • C
  • C++

因为作者本人目前只能够熟练的使用Java和Go,因此只那这两个做演示哈~

3.1 使用Go操作etcd

3.1.1 Go官方推荐的etcd连接工具(3.x版本以上)

github.com/etcd-io/etc…

下载:go get go.etcd.io/etcd/client/v3

3.1.2 代码
func main() {
   cli, err := clientv3.New(clientv3.Config{
      Endpoints:   []string{"127.0.0.1:2379"},
      DialTimeout: 5 * time.Second,
   })
   if err != nil {
      panic(err)
   }
   resp, err := cli.Put(context.TODO(), "sample_key", "sample_value")
   fmt.Println(resp)
   response, err := cli.Get(context.TODO(), "sample_key")
   fmt.Println(response)
   defer cli.Close()
}
复制代码

3.2 使用Java连接etcd

3.2.1 使用jetcd进行连接

github.com/etcd-io/jet…

maven依赖:

<dependency>
  <groupId>io.etcd</groupId>
  <artifactId>jetcd-core</artifactId>
  <version>0.5.0</version>
</dependency>
复制代码
3.2.2 代码
@Test
void TestEtcd() throws Exception {
    //集群模式下可以使用逗号分隔
    Client client = Client.builder().endpoints("http://127.0.0.1:2379").build();
    KV kvClient = client.getKVClient();
    ByteSequence key = ByteSequence.from("test_key".getBytes());
    ByteSequence value = ByteSequence.from("test_value".getBytes());
    // put值
    kvClient.put(key, value).get();
    // get值
    CompletableFuture<GetResponse> getFuture = kvClient.get(key);
    GetResponse response = getFuture.get();
    System.out.println(response);
    // 删除值
    kvClient.delete(key).get();
}
复制代码

4 小总结下

etcd作为Kubernetes集群默认的服务配置中心,可以说是最贴近云原生的,相比Zookeeper,虽说有几分相似,但是他们所使用的分布式一致性算法颇有些不同,etcd使用Raft协议, Zookeeper使用ZAB协议,而且etcd支持使用http和https进行访问,使用上更加方便。

参考:

github.com/etcd-io/jet…

github.com/etcd-io/etc…

github.com/etcd-io/etc…

etcd.io/docs/v3.5/i…


相关文章
|
4月前
|
监控 Cloud Native Java
Quarkus 云原生Java框架技术详解与实践指南
本文档全面介绍 Quarkus 框架的核心概念、架构特性和实践应用。作为新一代的云原生 Java 框架,Quarkus 旨在为 OpenJDK HotSpot 和 GraalVM 量身定制,显著提升 Java 在容器化环境中的运行效率。本文将深入探讨其响应式编程模型、原生编译能力、扩展机制以及与微服务架构的深度集成,帮助开发者构建高效、轻量的云原生应用。
468 44
|
3月前
|
Kubernetes Cloud Native 云计算
云计算与云原生技术探索
🌟蒋星熠Jaxonic,云原生探索者!以代码为舟,遨游技术星河。专注容器化、微服务、K8s与DevOps,践行GitOps理念,拥抱多云未来。用架构编织星辰,让创新照亮极客征途!
云计算与云原生技术探索
|
8月前
|
人工智能 Cloud Native 安全
云原生+AI 为企业出海提供全新技术引擎!明天见
5月22日 14:00「飞天发布时刻」,阿里云云原生应用平台产品负责人李国强将重磅揭晓面向 AI 场景的云原生产品体系升级,通过弹性智能的全球一体化架构、开箱即用的云原生 AI 工程化能力,为中国企业出海提供全新技术引擎。
|
3月前
|
Java Linux 虚拟化
【Docker】(1)Docker的概述与架构,手把手带你安装Docker,云原生路上不可缺少的一门技术!
1. Docker简介 1.1 Docker是什么 为什么docker会出现? 假定您在开发一款平台项目,您的开发环境具有特定的配置。其他开发人员身处的环境配置也各有不同。 您正在开发的应用依赖于您当前的配置且还要依赖于某些配置文件。 您的企业还拥有标准化的测试和生产环境,且具有自身的配置和一系列支持文件。 **要求:**希望尽可能多在本地模拟这些环境而不产生重新创建服务器环境的开销 问题: 要如何确保应用能够在这些环境中运行和通过质量检测? 在部署过程中不出现令人头疼的版本、配置问题 无需重新编写代码和进行故障修复
393 2
|
8月前
|
存储 缓存 分布式计算
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
本文将深入探讨基于 StarRocks 和 Iceberg 构建的云原生湖仓分析技术,详细解析两者结合如何实现高效的查询性能优化。内容涵盖 StarRocks Lakehouse 架构、与 Iceberg 的性能协同、最佳实践应用以及未来的发展规划,为您提供全面的技术解读。 作者:杨关锁,北京镜舟科技研发工程师
StarRocks x Iceberg:云原生湖仓分析技术揭秘与最佳实践
|
6月前
|
缓存 Cloud Native Java
Java 面试微服务架构与云原生技术实操内容及核心考点梳理 Java 面试
本内容涵盖Java面试核心技术实操,包括微服务架构(Spring Cloud Alibaba)、响应式编程(WebFlux)、容器化(Docker+K8s)、函数式编程、多级缓存、分库分表、链路追踪(Skywalking)等大厂高频考点,助你系统提升面试能力。
312 0
|
存储 Cloud Native 数据处理
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
本文整理自阿里云资深技术专家、Apache Flink PMC 成员梅源在 Flink Forward Asia 新加坡 2025上的分享,深入解析 Flink 状态管理系统的发展历程,从核心设计到 Flink 2.0 存算分离架构,并展望未来基于流批一体的通用增量计算方向。
379 0
从嵌入式状态管理到云原生架构:Apache Flink 的演进与下一代增量计算范式
|
5月前
|
运维 监控 Cloud Native
从本土到全球,云原生架构护航灵犀互娱游戏出海
本文内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。
506 16
|
5月前
|
运维 监控 Cloud Native
从本土到全球,云原生架构护航灵犀互娱游戏出海
内容整理自「 2025 中企出海大会·游戏与互娱出海分论坛」,灵犀互娱基础架构负责人朱晓靖的演讲内容,从技术层面分享云原生架构护航灵犀互娱游戏出海经验。