0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ETCD集群的工作原理和高可用技术细节介绍

Linux爱好者 来源:csdn 作者:fanren224 2021-02-23 10:54 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

【导读】新年快乐!本文介绍了etcd集群的工作原理和高可用技术细节。

etcd 简介

coreos 开发的分布式服务系统,内部采用 raft 协议作为一致性算法。作为服务发现系统,有以下的特点:

简单:安装配置简单,而且提供了 HTTP API 进行交互,使用也很简单

安全:支持 SSL 证书验证

快速:根据官方提供的 benchmark 数据,单实例支持每秒 2k+ 读操作

可靠:采用 raft 算法,实现分布式系统数据的可用性和一致性

etcd 目前默认使用 2379 端口提供 HTTP API 服务,2380 端口和 peers(集群内其他节点)通信

虽然 etcd 也支持单点部署,但是在生产环境中推荐集群方式部署,一般 etcd 节点数会选择 3、5、7。etcd 会保证所有的节点都会保存数据,并保证数据的一致性和正确性。

工作原理

每个 etcd cluster 都是有若干个 member 组成的,每个 member 是一个独立运行的 etcd 实例,单台机器上可以运行多个 member。

在正常运行的状态下,集群中会有一个 leader,其余的 member 都是 followers。leader 向 followers 同步日志,保证数据在各个 member 都有副本。leader 还会定时向所有的 member 发送心跳报文,如果在规定的时间里 follower 没有收到心跳,就会重新进行选举。

客户端所有的请求都会先发送给 leader,leader 向所有的 followers 同步日志,等收到超过半数的确认后就把该日志存储到磁盘,并返回响应客户端。

每个 etcd 服务有三大主要部分组成:raft 实现、WAL 日志存储、数据的存储和索引。WAL 会在本地磁盘(就是之前提到的 --data-dir)上存储日志内容(wal file)和快照(snapshot)。

集群规划

nameIPHOSTNAME

etcd01192.168.255.131master1

etcd02192.168.255.132master2

etcd03192.168.255.133master3

安装

在安装和启动 etcd 服务的时候,各个节点需要知道集群中其他节点的信息(一般是 ip 和 port 信息)。根据你是否可以提前知道每个节点的 ip,有几种不同的启动方案:

静态配置:在启动 etcd server 的时候,通过 --initial-cluster 参数配置好所有的节点信息

etcd动态发现:通过已有的etcd集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制。比如官方提供的:discovery.etcd.io

DNS动态发现: 通过DNS查询方式获取其他节点地址信息。

一般生产环境都是使用静态配置,我们这里也采用这种方法。并配置 SSL来保证通信安全。

1、安装cfssl

wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64

wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64

chmod +x cfssl_linux-amd64 cfssljson_linux-amd64

mv cfssl_linux-amd64 /usr/local/bin/cfssl

mv cfssljson_linux-amd64 /usr/local/bin/cfssljson

2、创建ca证书,客户端,服务端,节点之间的证书

Etcd属于server ,etcdctl 属于client,二者之间通过http协议进行通信。

ca证书 自己给自己签名的权威证书,用来给其他证书签名

server证书 etcd的证书

client证书 客户端,比如etcdctl的证书

peer证书 节点与节点之间通信的证书

1) 创建目录

mkdir -p /etc/etcd/pki

cd /etc/etcd/pki

cfssl print-defaults config 》 ca-config.json

cfssl print-defaults csr 》 ca-csr.json

2) 创建ca证书

修改ca-config.json

server auth表示client可以用该ca对server提供的证书进行验证

client auth表示server可以用该ca对client提供的证书进行验证

{

“signing”: {

“default”: {

“expiry”: “43800h”

},

“profiles”: {

“server”: {

“expiry”: “43800h”,

“usages”: [

“signing”,

“key encipherment”,

“server auth”,

“client auth”

},

“client”: {

“expiry”: “43800h”,

“usages”: [

“signing”,

“key encipherment”,

“client auth”

},

“peer”: {

“expiry”: “43800h”,

“usages”: [

“signing”,

“key encipherment”,

“server auth”,

“client auth”

}

}

}

}

创建证书签名请求ca-csr.json

{

“CN”: “etcd”,

“key”: {

“algo”: “rsa”,

“size”: 2048

}

}

生成CA证书和私钥

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

# ls ca*

ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem

3) 生成客户端证书

vim client.json

{

“CN”: “client”,

“key”: {

“algo”: “ecdsa”,

“size”: 256

}

}

生成

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client.json | cfssljson -bare client -

# ls ca*

ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem client-key.pem client.pem

4) 生成server,peer证书

vim etcd.json

{

“CN”: “etcd”,

“hosts”: [

“127.0.0.1”,

“192.168.255.131”,

“192.168.255.132”,

“192.168.255.133”

],

“key”: {

“algo”: “ecdsa”,

“size”: 256

},

“names”: [

{

“C”: “CN”,

“L”: “SH”,

“ST”: “SH”

}

}

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server etcd.json | cfssljson -bare server

cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd.json | cfssljson -bare peer

3、安装etcd二进制文件

wget https://github.com/coreos/etcd/releases/download/v3.1.5/etcd-v3.1.5-linux-amd64.tar.gz

tar -xvf etcd-v3.1.5-linux-amd64.tar.gz

mv etcd-v3.1.5-linux-amd64/etcd* /usr/local/bin

4、service配置文件

vim /usr/lib/systemd/system/etcd.service, 三台机器配置不一样,需要替换为相应的IP和name。

[Unit]

Description=Etcd Server

After=network.target

After=network-online.target

Wants=network-online.target

Documentation=https://github.com/coreos

[Service]

Type=notify

WorkingDirectory=/var/lib/etcd

ExecStart=/usr/local/bin/etcd

--data-dir=/var/lib/etcd

--name=master1

--cert-file=/etc/etcd/pki/server.pem

--key-file=/etc/etcd/pki/server-key.pem

--trusted-ca-file=/etc/etcd/pki/ca.pem

--peer-cert-file=/etc/etcd/pki/peer.pem

--peer-key-file=/etc/etcd/pki/peer-key.pem

--peer-trusted-ca-file=/etc/etcd/pki/ca.pem

--listen-peer-urls=https://192.168.255.131:2380

--initial-advertise-peer-urls=https://192.168.255.131:2380

--listen-client-urls=https://192.168.255.131:2379,http://127.0.0.1:2379

--advertise-client-urls=https://192.168.255.131:2379

--initial-cluster-token=etcd-cluster-0

--initial-cluster=master1=https://192.168.255.131:2380,master2=https://192.168.255.132:2380,master3=https://192.168.255.133:2380

--initial-cluster-state=new

--heartbeat-interval=250

--election-timeout=2000

Restart=on-failure

RestartSec=5

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

配置参数的含义

--name:方便理解的节点名称,默认为 default,在集群中应该保持唯一,可以使用 hostname

--data-dir:服务运行数据保存的路径,默认为 ${name}.etcd

--snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘

--heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms

--eletion-timeout:重新投票的超时时间,如果 follow 在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms

--listen-peer-urls:和集群内其他节点通信的地址, http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost!

--listen-client-urls:节点与客户端通信的地址,比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和 etcd 交互

--advertise-client-urls:对外通告的该节点客户端监听地址,http://ip:2379,这个值会通知集群中其他节点

--initial-advertise-peer-urls:节点与其他节点通信的地址,会通告给集群的其他成员。这个地址用来传输集群数据。因此这个地址必须是可以被集群中所有的成员访问http://ip:2380

--initial-cluster:集群中所有节点的信息,格式为 node1=http://ip1:2380,node2=http://ip2:2380,…。注意:这里的 node1 是节点的 --name 指定的名字;后面的 ip1:2380 是 --initial-advertise-peer-urls 指定的值

--initial-cluster-state:新建集群的时候,这个值为 new;假如已经存在的集群,这个值为 existing

--initial-cluster-token:创建集群的 token,这个值每个集群保持唯一。这样的话,如果你要重新创建集群,即使配置和之前一样,也会再次生成新的集群和节点 uuid;否则会导致多个集群之间的冲突,造成未知的错误

所有以--initial 开头的配置都是在 bootstrap(引导) 集群的时候才会用到,后续节点重启时会被忽略。

5、创建存放etcd数据的目录,启动 etcd

mkdir /var/lib/etcd

systemctl daemon-reload && systemctl enable etcd && systemctl start etcd && systemctl status etcd

6、验证是否成功

在任意一台机器(无论是不是集群节点,前提是需要有etcdctl工具和ca证书,server证书)上执行如下命令:

[root@master1] /etc/etcd/pki$ etcdctl --ca-file=/etc/etcd/pki/ca.pem --cert-file=/etc/etcd/pki/server.pem --key-file=/etc/etcd/pki/server-key.pem --endpoints=https://192.168.255.131:2379 cluster-health

2019-01-27 2026.909601 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated

2019-01-27 2026.910165 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated

member 5d7a44f5c39446c1 is healthy: got healthy result from https://192.168.255.132:2379

member e281e4e43dceb752 is healthy: got healthy result from https://192.168.255.133:2379

member ea5e4f12ed162d4b is healthy: got healthy result from https://192.168.255.131:2379

cluster is healthy

如果你没有指定证书,会报如下错误

client: etcd cluster is unavailable or misconfigured; error #0: x509: certificate signed by unknown authority

查看集群成员

[root@master1] /etc/etcd/pki$ etcdctl --ca-file=/etc/etcd/pki/ca.pem --cert-file=/etc/etcd/pki/server.pem --key-file=/etc/etcd/pki/server-key.pem --endpoints=https://192.168.255.131:2379 member list

2019-01-27 2246.914338 I | warning: ignoring ServerName for user-provided CA for backwards compatibility is deprecated

5d7a44f5c39446c1: name=master2 peerURLs=https://192.168.255.132:2380 clientURLs=https://192.168.255.132:2379 isLeader=false

e281e4e43dceb752: name=master3 peerURLs=https://192.168.255.133:2380 clientURLs=https://192.168.255.133:2379 isLeader=false

ea5e4f12ed162d4b: name=master1 peerURLs=https://192.168.255.131:2380 clientURLs=https://192.168.255.131:2379 isLeader=true

etcd的使用

HTTP API

etcd 对外通过 HTTP API 对外提供服务,这种方式方便测试(通过 curl 或者其他工具就能和 etcd 交互),也很容易集成到各种语言中(每个语言封装 HTTP API 实现自己的 client 就行)。

etcdctl 命令行工具

除了 HTTP API 外,etcd 还提供了 etcdctl 命令行工具和 etcd 服务交互。这个命令行用 go 语言编写,也是对 HTTP API 的封装,日常使用起来也更容易。

总结

etcd 默认只保存 1000 个历史事件,所以不适合有大量更新操作的场景,这样会导致数据的丢失。etcd 典型的应用场景是配置管理和服务发现,这些场景都是读多写少的。

相比于 zookeeper,etcd 使用起来要简单很多。不过要实现真正的服务发现功能,etcd 还需要和其他工具(比如 registrator、confd 等)一起使用来实现服务的自动注册和更新。一般etcd大多用于配置管理的场景,比如kubernetes。

目前 etcd 还没有图形化的工具。

原文标题:快速搭建高可用 ETCD 集群

文章出处:【微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11817

    浏览量

    219535

原文标题:快速搭建高可用 ETCD 集群

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    深入剖析 TMS570LS0914 微控制器:特性、应用与技术细节

    深入剖析 TMS570LS0914 微控制器:特性、应用与技术细节 引言 在当今高度智能化和自动化的时代,微控制器作为电子系统的核心部件,广泛应用于各个领域。TMS570LS0914 作为德州仪器
    的头像 发表于 04-23 15:15 136次阅读

    深度剖析 TMS570LS31x5/21x5 微控制器:特性、应用及技术细节

    深度剖析 TMS570LS31x5/21x5 微控制器:特性、应用及技术细节 在电子工程领域,高性能、安全可靠的微控制器一直是各类应用的核心需求。德州仪器(TI)的 TMS570LS31x5
    的头像 发表于 04-23 15:05 95次阅读

    NXP K61 Sub-Family芯片:功能特性与技术细节深度解析

    NXP K61 Sub-Family芯片:功能特性与技术细节深度解析 在电子设计领域,选择一款合适的芯片对于项目的成功至关重要。NXP的K61 Sub-Family芯片凭借其丰富的功能和出色的性能
    的头像 发表于 04-10 10:35 106次阅读

    T89C51CC01微控制器:特性、应用与技术细节深度解析

    T89C51CC01微控制器:特性、应用与技术细节深度解析 在嵌入式系统开发领域,微控制器是核心组件之一,它的性能和功能直接影响着整个系统的表现。T89C51CC01作为一款增强型8位微控制器,集成
    的头像 发表于 04-08 14:40 168次阅读

    2.4 GHz低通滤波器2450LP15A050:技术细节与设计考量

    2.4 GHz低通滤波器2450LP15A050:技术细节与设计考量 在高频电路设计中,滤波器的性能直接影响着整个系统的稳定性和信号质量。今天,我们来深入探讨Johanson Technology
    的头像 发表于 02-04 16:45 925次阅读

    探索Tag-it HF-I标准应答器IC:技术细节与应用指南

    探索Tag-it HF-I标准应答器IC:技术细节与应用指南 在电子工程领域,RFID(射频识别)技术凭借其高效、便捷的特性,在物品识别和管理方面发挥着重要作用。今天,我们将深入探讨德州仪器
    的头像 发表于 01-06 11:15 310次阅读

    有哪些具体的技术细节需要企业在选择电能质量在线监测装置数据存储方式时注意?

      企业选择电能质量在线监测装置数据存储方式时,需重点关注 **“数据不丢、能用、安全、可扩展”** 四大核心目标,对应的技术细节多隐藏在 “数据格式适配、同步机制、安全加密、硬件可靠性、运维兼容性
    的头像 发表于 10-30 09:56 395次阅读

    PCIe 7.0技术细节曝光

    6 月 11 日 PCI SIG官宣 PCI Express 7.0(PCIe 7.0)规范最终版已制定完毕,但几乎没有公开任何技术细节。不过,在 7 月 16 日,PCI-SIG 通过 BrightTalk 公开了一些更详细的技术信息,下面就为大家
    的头像 发表于 09-08 10:43 3091次阅读
    PCIe 7.0<b class='flag-5'>技术细节</b>曝光

    香港服务器部署Windows集群服务的网络拓扑设计与实现-可用性架构方案

    ,重点讲解网络拓扑设计的3种典型模型及其适用场景,并提供香港本地化部署的实操建议。如何在遵守《网络安全法》要求前提下实现多节点集群可用性?冗余网络配置如何平衡成本与效能?本文将为您揭晓具体实施路径。 香港机房选址对网络架构的
    的头像 发表于 08-26 17:16 936次阅读

    揭秘徐工新能源重卡的技术细节

    对于一台新能源重卡而言,无论在安全方面多做多少努力都不为过。徐工汽车将新能源重卡的“安全”筑入整车的结构设计中,融进控制系统每一个响应逻辑里,更深藏技术细节的每一行代码之后。
    的头像 发表于 08-11 11:45 1365次阅读

    解析基带和射频的工作原理

    在现代通信技术中,基带和射频是两个核心概念,它们共同构成了无线通信的基础。尽管这两个术语频繁出现在技术文档和行业讨论中,但其具体功能和技术细节却常常被误解。本文将以移动通信为例,深入解析基带和射频的
    的头像 发表于 08-06 09:28 2997次阅读
    解析基带和射频的<b class='flag-5'>工作原理</b>

    SMA连接器名称由来:SubMiniature Version A 的技术细节

    SMA连接器名称中的“SubMiniature Version A”,精准概括了其小型化、开创性的设计理念,而德索精密工业以卓越的技术细节和严谨的制造工艺,为SMA连接器的高性能连接提供了有力支撑,让这一经典连接器在射频与微波连接领域持续焕发新的光彩。
    的头像 发表于 06-24 11:30 781次阅读
    SMA连接器名称由来:SubMiniature Version A 的<b class='flag-5'>技术细节</b>

    烟气检测仪是如何工作的?工作原理大揭秘

    。红外吸收技术具有选择性好、精度、稳定性强等优点,尤其适用于检测 CO₂、甲烷(CH₄)等气体。 以上所介绍的就是烟气检测仪的工作原理,有需要的话可以简单了解一下。
    发表于 06-16 16:10

    介绍三种常见的MySQL可用方案

    在生产环境中,为了确保数据库系统的连续可用性、降低故障恢复时间以及实现业务的无缝切换,可用(High Availability, HA)方案至关重要。本文将详细介绍三种常见的 MyS
    的头像 发表于 05-28 17:16 1437次阅读

    MYSQL集群可用和数据监控平台实现方案

    该项目共分为2个子项目,由MYSQL集群可用和数据监控平台两部分组成。
    的头像 发表于 05-28 10:10 1455次阅读
    MYSQL<b class='flag-5'>集群</b><b class='flag-5'>高</b><b class='flag-5'>可用</b>和数据监控平台实现方案