浅谈云原生技术组件—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…


相关文章
|
14天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。
|
14天前
|
Cloud Native 持续交付 开发者
云原生技术在现代企业中的应用与实践####
本文深入探讨了云原生技术的核心概念及其在现代企业IT架构转型中的关键作用,通过具体案例分析展示了云原生如何促进企业的敏捷开发、高效运维及成本优化。不同于传统摘要仅概述内容,本部分旨在激发读者对云原生领域的兴趣,强调其在加速数字化转型过程中的不可或缺性,为后续详细论述奠定基础。 ####
|
3天前
|
Cloud Native
邀您参加云原生高可用技术沙龙丨云上高可用体系构建:从理论到实践
云原生高可用技术专场,邀您从理论到实践一起交流,探索云上高可用体系构建!
|
14天前
|
Cloud Native JavaScript Docker
云原生技术:构建现代应用的基石
在数字化转型的浪潮中,云原生技术如同一艘承载梦想的航船,引领企业驶向创新与效率的新海域。本文将深入探索云原生技术的核心价值,揭示其如何重塑软件开发、部署和运维模式,同时通过一个简易代码示例,展现云原生应用的构建过程,让读者领略到云原生技术的魅力所在。
|
14天前
|
运维 Cloud Native 持续交付
云原生技术深度探索:重塑现代IT架构的无形之力####
本文深入剖析了云原生技术的核心概念、关键技术组件及其对现代IT架构变革的深远影响。通过实例解析,揭示云原生如何促进企业实现敏捷开发、弹性伸缩与成本优化,为数字化转型提供强有力的技术支撑。不同于传统综述,本摘要直接聚焦于云原生技术的价值本质,旨在为读者构建一个宏观且具体的技术蓝图。 ####
|
15天前
|
Cloud Native 持续交付 云计算
云原生技术的崛起与未来展望
本文探讨了云原生技术的核心概念、发展历程及其在现代IT架构中的关键作用。随着云计算的普及,云原生作为一种优化云应用构建和部署的方法,正逐渐成为企业数字化转型的重要推力。文章分析了容器化、微服务、持续集成/持续部署(CI/CD)等关键技术如何支撑起灵活、高效、可扩展的云原生架构,并讨论了面临的挑战与未来的发展趋势。
29 2
|
15天前
|
Kubernetes Cloud Native 持续交付
云端之旅:云原生技术引领未来
在数字时代的浪潮中,云原生技术如同一艘承载梦想的航船,带领企业驶向数字化转型的彼岸。本文将揭示云原生技术的核心价值,探讨其在现代IT架构中的应用,并分享实现云原生转型的实践案例。从容器化和微服务到持续集成与持续部署(CI/CD),我们将一同见证云原生技术如何塑造灵活、高效、自动化的未来。
|
16天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
24天前
|
Cloud Native Devops 云计算
云计算的未来:云原生架构与微服务的革命####
【10月更文挑战第21天】 随着企业数字化转型的加速,云原生技术正迅速成为IT行业的新宠。本文深入探讨了云原生架构的核心理念、关键技术如容器化和微服务的优势,以及如何通过这些技术实现高效、灵活且可扩展的现代应用开发。我们将揭示云原生如何重塑软件开发流程,提升业务敏捷性,并探索其对企业IT架构的深远影响。 ####
39 3
|
25天前
|
Cloud Native 持续交付 云计算
云原生架构的演进与挑战
随着云计算技术的不断发展,云原生架构已成为企业数字化转型的重要支撑。本文深入探讨了云原生架构的概念、发展历程、核心技术以及面临的挑战,旨在为读者提供一个全面了解云原生架构的视角。通过分析Kubernetes、Docker等关键技术的应用,以及微服务、持续集成/持续部署(CI/CD)等实践案例,本文揭示了云原生架构在提高应用开发效率、降低运维成本、增强系统可扩展性等方面的显著优势。同时,也指出了云原生架构在安全性、复杂性管理等方面所面临的挑战,并提出了相应的解决策略。