认识etcd

认识etcd演示如何启动 etcd 写入 查看数据以及如何签发证书通过 https 方式访问 etcd

选举机制

Etcd是基于Raft协议实现的,为了了解etcd工作原理,需要先了解下Raft协议原理。先来看看Raft中的选举机制。初始启动时,节点都处于Follower状态,并设定了一个选举超时时间(election timeout),如果这段时间内没有手动来自Leader的heartbeat,节点将主动发起选举,将自己切换成candidate,向集群中其他Follower发送请求,询问是否同意自己成为Leader,如果收到来自集群过半节点数的同意后,节点即成为Leader,开始接受client的数据并向其他Follower节点同步日志,如果未达成一致,candidate会随机选择一个等待时间间隔(150ms-300ms)后再次发起投票。故为了避免冲突,一般情况下节点数据保持奇数,而非偶数。每成功选取一次新Leader的任期Term会比之前Leader的任期大1,且Leader为了保持自己的地位会持续给Follower发heartbeat。

日志复制机制

当Leader接受到client的数据请求后,是如何保持各个节点的数据同步的呢?是通过日志复制机制。当Leader收到客户端的请求后,会把日志追加到本地Log中,然后通过hearbeat把该信息同步给其他Follower,Follower接收到日志后记录日志然后向Leader发送ACK,当Leader收到半数以上的Follower的ACK信息后,将该日志设置为已提交并追加到本地磁盘中,通知客户端已经写入数据,且在下一次heartbeat中Leader通知所有Follower将该日志存储到自己的本地磁盘中。

安全保障机制

2.安装完成后通过如下命令启动etcd

etcd --listen-client-urls 'http://localhost:12379' \ --advertise-client-urls 'http://localhost:12379' \ --listen-peer-urls 'http://localhost:12380' \ --initial-advertise-peer-urls 'http://localhost:12380' \ --initial-cluster 'default=http://localhost:12380'

etcd中常用参数含义如下,更多参数含义可查看这里。

listen-client-url:用于监听客户端通讯的URL列表。这个标记告诉 etcd 在特定的 scheme://IP:port 组合上从客户端接收进来的请求.

listen-peer-url:用于监听伙伴通讯的URL列表。这个标记告诉 etcd 在特定的 scheme://IP:port 组合上从它的伙伴接收进来的请求.

3.写入/获取/查看etcd的数据

认识etcd 上面演示了如何启动etcd,并进行数据写入和查看,接下来看看如果要通过https访问etcd应该如何实现,如果要通过https访问需要签发证书,目前能制作根证书和服务器证书常用工具有cfssl和Openssl,这里演示如何cfssl签发生成证书,然后通过https访问访问etcd。

第一:安装cfssl,如果是mac,可使用命令brew install cfssl进行安装。更多安装细节可查看这里

第二:编写ca的证书请求配置文件ca-csr.json,内容如下所示

{ "CN": "Autogenerated CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "O": "Certificates", "OU": "Hastily-Generated Values Divison", "L": "Chengdu", "ST": "Chengdu", "C": "CN" } ] }

第三:通过命令生成证书签发机构CA的私有key的证书

cfssl gencert -initca ca-csr.json | cfssljson -bare ca

执行命令后会生成ca.csr文件(证书请求文件,属于中间文件,后续不会用到),ca-key.pem文件,私有密钥文件,ca.pem文件即ca的证书文件,后续会用到。

认识etcd

第四:为需要签发证书的服务编写服务证书请求配置文件和CA的配置文件,内容如下所示

服务证书请求的配置文件req-csr.config,hosts里面存放需要签发证书的IP地址或者域名

req-csr.json { "CN": "etcd", "hosts": [ "localhost", "127.0.0.1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "O": "autogenerated", "OU": "etcd cluster", "L": "the internet" } ] }

CA的配置文件ca-config.json,内容如下所示,里面设置了证书的实效时间

{ "signing": { "default": { "usages": [ "signing", "key encipherment", "server auth", "client auth" ], "expiry": "h" } } }

 第五:通过命令给服务签发证书,会生成服务的私有key的pem证书文件

cfssl gencert -ca ca.pem -ca-key ca-key.pem -config ca-config.json req-csr.json  | cfssljson -bare server

修改生成的文件prefix为peer,再次执行命令生成peer-key.pem,peer.pem以及中间的证书请求文件peer.csr

第六:证书生成后,通过如下命令启动etcd,启动etcd过程中需要传入ca.pem,server.pem,key.pem.

./etcd --listen-client-urls 'https://localhost:12379' \ --data-dir=/tmp/etcd/data \ --advertise-client-urls 'https://localhost:12379' \ --listen-peer-urls 'https://localhost:12380' \ --initial-advertise-peer-urls 'https://localhost:12380' \ --initial-cluster 'default=https://localhost:12380' \ --client-cert-auth --trusted-ca-file=/tmp/certs/ca.pem \ --cert-file=/tmp/certs/server.pem \ --key-file=/tmp/certs/server-key.pem \ --peer-client-cert-auth --peer-trusted-ca-file=/tmp/certs/ca.pem \ --peer-cert-file=/tmp/certs/peer.pem \ --peer-key-file=/tmp/certs/peer-key.pem

etcd成功启动后,尝试通过https方式向etcd写入、输出。

./etcdctl --endpoints=https://localhost:12379 \ --cert /tmp/certs/server.pem \ --key /tmp/certs/server-key.pem \ --cacert /tmp/certs/ca.pem put key1 value1

实验结果如下图所示,可以看到写入、查看数据成功,说明签发证书正确,能通过https的方式访问启动的etcd服务。

认识etcd

除了进行写入查看数据外,还可以对etcd中的数据进行备份和恢复,磁盘碎片整理等。

./etcdctl --endpoints=https://localhost:12379 \ --cert /tmp/certs/server.pem \ --key /tmp/certs/server-key.pem \ --cacert /tmp/certs/ca.pem snapshot save snapshot.db
./etcdctl --endpoints=https://localhost:12379 \ --cert /tmp/certs/server.pem \ --key /tmp/certs/server-key.pem \ --cacert /tmp/certs/ca.pem snapshot restore snapshot.db
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213621.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午5:58
下一篇 2026年3月18日 下午5:58


相关推荐

  • java写helloworld_Java编写的第一个程序:HelloWorld

    java写helloworld_Java编写的第一个程序:HelloWorld原理:Java文件需要编译后才能运行,编译命令为javacHelloWorld.java(使用javac.exe命令),编译之后会出现以.class结尾的字节码文件(HelloWorld.class)。运行的是字节码文件,运行命令为javaHelloWorld在桌面上创建一个code文件夹,在code文件夹中创建一个HelloWorld.java文件1、编写代码在HelloWorld.jav…

    2022年7月9日
    29
  • 循环神经网络(RNN)原理通俗解释

    循环神经网络(RNN)原理通俗解释1 RNN 怎么来的 2 RNN 的网络结构及原理 3 RNN 的改进 1 双向 RNN4 RNN 的改进 2 深层双向 RNN4 1PyramidalRN RNN 的训练 BPTT6 RNN 与 CNN 的结合应用 看图说话 7 RNN 项目练手 1 RNN 怎么来的 循环神经网络的应用场景比较多 比如暂时能写论文 写程序 写诗 但是 总是会有但是的 但是他们现在还不能正常使

    2026年3月26日
    2
  • OpenClaw单机部署_OpenClaw单机部署详解

    OpenClaw单机部署_OpenClaw单机部署详解

    2026年3月13日
    2
  • java integer范围值的大小_求最大值最小值的代码

    java integer范围值的大小_求最大值最小值的代码java中的Integer.MAX_VALUE和Integer.MIN_VLAUE最近在刷leetcode的题时,才发现有几道题的利用到Integer类型的最大值和最小值,尤其是在判断是否溢出的时候,有道题就非常经典直接判断最后一位,比如最大值231-1的最后一位是7,而最小值-231的最后一位是8,这样进行一个判断8.字符串转换整数(atoi)这道题对我在面试过程中被问到如何判…

    2025年10月4日
    8
  • scipy.interpolate.interp1d()函数详解

    scipy.interpolate.interp1d()函数详解插值模块scipy.interpolate是插值模块,插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其他点处的近似值。与拟合不同的是,要求曲线通过所有的已知数据。计算插值有两种基本的方法:对一个完整的数据集去拟合一个函数;仿样内插法:对数据集的不同部分拟合出不同的函数,而函数之间的曲线平滑对接。SciPy的interpolate模块提供了许多对数…

    2022年6月9日
    199
  • 计算机语言cobol,COBOL语言编译器

    计算机语言cobol,COBOL语言编译器COBOL 语言 是一种面向过程的高级程序设计语言 主要用于数据处理 是国际上应用最广泛的一种高级语言 COBOL 是英文 CommonBusine OrientedLang 的缩写 原意是面向商业的通用语言 COBOL 语言编译器是指将 COBOL 源代码编译转换成机器代码的编译器 编译器首先检查是否有任何语法错误 然后将其转换为机器语言 编译器创建一个称为加载模块输出文件 此输出文件包含 0 和

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号