精华内容
下载资源
问答
  • 因此对于快速部署一套高可用的Etcd集群的需求也越来越强烈,本次就带领大家一起使用Kubernetes的Statefulset特性快速部署一套Etcd集群。 什么是Kubernetes? Kubernetes 是一个用于容器集群的自动化部署、扩容以及...
  • k8s etcd 集群部署包
  • etcd操作员管理部署到etcd集群,并自动执行与操作etcd集群相关的任务。 有关使用不同配置设置集群的 阅读,以获取有关如何更好地使用etcd运算符的更多信息。 阅读以了解如何在存在RBAC的情况下为etcd运算符设置RBAC...
  • 172.16.238.11 etcd-0 172.16.238.12 etcd-1 172.16.238.13 etcd-2 添加别名 $ sudo ifconfig lo0 alias 172.16.238.11 $ sudo ifconfig lo0 alias 172.16.238.12 $ sudo ifconfig lo0 alias 172.16.238.13 用法 ...
  • 这是一个Go二进制文件,可在AWS Autoscaling Group中引导ETCD集群 我们为什么这样做: 维护和管理ETCD集群具有巨大的运营成本。 我们希望使其尽可能简单。 因此,我们决定编写此应用程序,以使其更容易在AWS Auto...
  • Docker搭建etcd集群

    2021-02-25 01:08:47
    集群搭建3.API操作4.API说明和etcdctl命令说明etcd是CoreOS团队发起的一个开源项目(Go语言,其实很多这类项目都是Go语言实现的,只能说很强大),实现了分布式键值存储和服务发现,etcd和ZooKeeper/Consul非常相似...
  • 还有的项目和产品,备份应用程序数据(存储在持久卷),但没有项目,提供对存储在ETCD非常重要Kubernetes集群数据相同一流的备份支持。 可以肯定,对于如何采取ETCD快照而是从KubeDR项目食谱旨在提供完整的端到端对...
  • # 一键安装高可用etcd集群(TLS) # qq/wx: 48092788 e-mail: gcode@qq.com # blog: https://blog.csdn.net/guestcode # create: 2018-11-21 ############################################################ #...
  • 角色名称 ... 要求 Ansible本身或角色未涵盖的任何前提条件都应在此处提及。 例如,如果角色使用EC2模块,则在本节中提到需要boto软件包可能是个好主意。 角色变量 此角色的可设置变量的描述应在此处,包括defaults / ...
  • etcd集群部署详解

    千次阅读 2021-05-26 04:23:33
    简介Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。● 简单:支持 curl 方式的用户 API (HTTP+JSON)● 安全:可选 SSL 客户端证书认证● 快速:单实例可达每秒1000次写操作● 可靠:使用 ...

    简介

    Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。

    ● 简单:支持 curl 方式的用户 API (HTTP+JSON)

    ● 安全:可选 SSL 客户端证书认证

    ● 快速:单实例可达每秒1000次写操作

    ● 可靠:使用 Raft 实现分布式

    环境:

    nodeIPOSetcd_version

    etcd0

    10.1.2.61

    etcd3.0.14

    etcd1

    10.1.2.172

    centos7.0

    etcd3.0.14

    etcd2

    10.1.2.173

    centos7.0

    etcd3.0.14

    一、在各节点(etcd0、etcd1、etcd2)上安装etcd

    下载etcd源码包:https://github.com/coreos/etcd/releases,这里用的是etcd-v3.0.14-Linux-amd64.tar.gz,解压并添加etcd命令至环境变量。

    # cd /path/to/etcd-v3.0.14-linux-amd64.tar.gz

    # tar xf etcd-v3.0.14-linux-amd64.tar.gz

    # mv etcd-v3.0.14-linux-amd64 etcd

    # vim /etc/profile

    export PATH=/path/to/etcd

    # source /etc/profile

    二、配置etcd集群

    目前支持三种发现方式:Static,etcd Discovery,DNS Discovery。

    ● Static适用于有固定IP的主机节点

    ● etcd Discovery适用于DHCP环境

    ● DNS Discovery依赖DNS SRV记录

    这里我们采用Static方式,创建etcd0脚本,方便配置etcd启动参数。

    # cd /path/to/etcd

    # mkdir log data //data为节点数据存储文件夹,log为日志文件夹

    # vim etcd0.sh //写入以下脚本内容

    #!/bin/bash

    etcd --name etcd0 --data-dir /data/etcd/data --advertise-client-urls http://10.1.2.61:2379,http://10.1.2.61:4001 --listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 --initial-advertise-peer-urls http://10.1.2.61:2380 --listen-peer-urls http://0.0.0.0:2380 --initial-cluster-token etcd-cluster-1 --initial-cluster etcd0=http://10.1.2.61:2380,etcd1=http://10.1.2.172:2380,etcd2=http://10.1.2.173:2380 --initial-cluster-state new > ./log/etcd.log 2>&1

    # nohup ./etcd0.sh &

    # ps -ef|grep etcd

    # netstat -lnpt|grep etcd

    参数说明:

    ● –data-dir 指定节点的数据存储目录,若不指定,则默认是当前目录。这些数据包括节点ID,集群ID,集群初始化配置,Snapshot文件,若未指 定–wal-dir,还会存储WAL文件

    ● –wal-dir 指定节点的was文件存储目录,若指定了该参数,wal文件会和其他数据文件分开存储

    ● –name 节点名称

    ● –initial-advertise-peer-urls 告知集群其他节点的URL,tcp2380端口用于集群通信

    ● –listen-peer-urls 监听URL,用于与其他节点通讯

    ● –advertise-client-urls 告知客户端的URL, 也就是服务的URL,tcp2379端口用于监听客户端请求

    ● –initial-cluster-token 集群的ID

    ● –initial-cluster 集群中所有节点

    ● –initial-cluster-state 集群状态,new为新创建集群,existing为已存在的集群

    在etcd1、etcd2上分别做相似操作,只需将脚本中–advertise-client-urls 和 –initial-advertis-peer-urls 参数修改一下即可。

    注意:上面的初始化只是在集群初始化时运行一次,之后节点的服务有重启,必须要去掉initial参数,否则报错。

    # etcd --name etcd0 --data-dir /data/etcd/data --listen-peer-urls http://10.1.2.61:2380 --listen-client-urls http://10.1.2.61:2379,http://127.0.0.1:2379 --advertise-client-urls http://10.1.2.61:2379

    三、管理etcd集群

    1.查看集群版本

    # etcdctl --version

    # etcdctl --help

    2.查看集群健康状态

    # etcdctl cluster-health

    3.查看集群成员

    # etcdctl member list

    在任一节点上执行,可以看到集群的节点情况,并能看出哪个是leader节点

    4.更新一个节点

    如果你想更新一个节点的IP(peerURLS),首先你需要知道那个节点的ID

    # etcdctl member list

    # etcdctl member update memberID http://ip:2380

    5.删除一个节点(Etcd集群成员的缩)

    # etcdctl member list

    # etcdctl member remove memberID

    # etcdctl member list

    # ps -ef|grep etcd //在相关节点上kill掉etcd进程

    6.增加一个新节点(Etcd集群成员的伸)

    注意:步骤很重要,不然会报集群ID不匹配

    # etcdctl member add --help

    a. 将目标节点添加到集群

    # etcdctl member add etcd3 http://10.1.2.174:2380

    Addedmember named etcd3 with ID 28e0d98e7ec15cd4 to cluster

    ETCD_NAME="etcd3"

    ETCD_INITIAL_CLUSTER="etcd0=http://10.1.2.61:2380,etcd1=http://10.1.2.172:2380,etcd2=http://10.1.2.173:2380,etcd3=http://10.1.2.174:2380"

    ETCD_INITIAL_CLUSTER_STATE="existing"

    b. 查看新增成员列表,etcd3状态为unstarted

    # etcdctl member list

    d4f257d2b5f99b64[unstarted]:peerURLs=http://10.1.2.174:2380

    c. 清空目标节点etcd3的data-dir

    节点删除后,集群中的成员信息会更新,新节点是作为一个全新的节点加入集群,如果data-dir有数据,etcd启动时会读取己经存在的数据,仍然用老的memberID会造成无法加入集群,所以一定要清空新节点的data-dir。

    # rm -rf /path/to/etcd/data

    d. 在目标节点上启动新增加的成员

    这里的initial标记一定要指定为existing,如果为new,则会自动生成一个新的memberID,这和前面添加节点时生成的ID不一致,故日志中会报节点ID不匹配的错。

    # vim etcd3.sh

    修改etcd3.sh,脚本中–advertise-client-urls 和 –initial-advertis-peer-urls 参数修改为etcd3的,–initial-cluster-state改为existing

    # nohup ./etcd3.sh &

    # etcdctl member list

    五、增删改查

    1.在etcd1上设置一个key/value对,这时就可以在集群任意节点上获取key/value

    etcd1# etcdctl set api_server http://192.168.5.44:8080

    http://192.168.5.44:8080

    etcd0# etcdctl get api_server

    http://192.168.5.44:8080

    2.

    # etcdctl set foo "bar"

    # etcdctl get foo

    # etcdctl mkdir hello

    # etcdctl ls

    # etcdctl --output extended get foo

    # etcdctl --output json get foo

    # etcdctl update foo "etcd cluster is ok"

    # etcdctl get foo

    # etcdctl import --snap /data/etcd/member/snap/db

    3.REST API

    # curl http://10.1.2.61:2379/v2/members

    查看集群成员,其中,id是集群成员的全局唯一的身份标识,name是成员的名字,peerURLs是成员之间通信的入口,clientURLs是成员跟用户通信的访问入口

    # curl http://10.1.2.61:2379/v2/keys

    # curl-fs -X PUT http://10.1.2.61:2379/v2/keys/_test

    # curl-X GET http://10.1.2.61:2379/v2/keys/_test

    六、常见问题

    1.dial tcp 10.1.2.172:2380: getsockopt: no route to host

    此为防火墙没有关闭,要关闭防火墙

    # service iptables stop

    # service firewalld stop

    # systemctl disable firewalld

    2.nohup——真正的Shell后台运行

    # nohup /path/to/start_etcd.sh &

    0b1331709591d260c1c78e86d0c51c18.png

    展开全文
  • linux-etcd集群搭建

    2021-03-08 09:49:02
    在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的...

    在这里插入图片描述

    前言

    随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd为解决这类问题带来了福音,本文将从etcd的应用场景开始,深入解读etcd的实现方式,以供开发者们更为充分地享用etcd所带来的便利。

    1. centos: yum下载

    sudo yum install etcd
    

    单机模式运行

    systemctl start etcd
    

    2. 准备工作

    两台机器:(建议是奇数台,因为我很懒)

    • 10.20.2.192
    • 10.20.2.193

    3. 修改etcd.service

    [Unit]
    Description=Etcd Server
    After=network.target
    After=network-online.target
    Wants=network-online.target
    
    [Service]
    Type=notify
    WorkingDirectory=/var/lib/etcd/
    EnvironmentFile=-/etc/etcd/etcd.conf
    User=etcd
    # set GOMAXPROCS to number of processors
    ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/bin/etcd --name ${ETCD_NAME} \
    --initial-advertise-peer-urls ${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
    --listen-peer-urls ${ETCD_LISTEN_PEER_URLS} \
    --listen-client-urls ${ETCD_LISTEN_CLIENT_URLS} \
    --advertise-client-urls ${ETCD_ADVERTISE_CLIENT_URLS} \
    --initial-cluster-token ${ETCD_INITIAL_CLUSTER_TOKEN} \
    --initial-cluster ${ETCD_INITIAL_CLUSTER} \
    --data-dir=${ETCD_DATA_DIR} \
    --initial-cluster-state ${ETCD_INITIAL_CLUSTER_STATE}"
    Restart=on-failure
    LimitNOFILE=65536
    
    [Install]
    WantedBy=multi-user.target
    

    参考:命令参数解释

    --name
    etcd集群中的节点名,这里可以随意,可区分且不重复就行
    --listen-peer-urls
    监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
    --initial-advertise-peer-urls
    建议用于节点之间通信的url,节点间将以该值进行通信。
    --listen-client-urls
    监听的用于客户端通信的url,同样可以监听多个。
    --advertise-client-urls
    建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信。
    --initial-cluster-token etcd-cluster-1
    节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。
    --initial-cluster
    也就是集群中所有的initial-advertise-peer-urls 的合集
    --initial-cluster-state new
    新建集群的标志,初始化状态使用 new,建立之后改此值为 existing
    

    4. 修改etcd.conf

    vim /etc/etcd/etcd.conf

    • etcd-1节点配置文件
    #[Member]
    #ETCD_CORS=""
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    #ETCD_WAL_DIR=""
    ETCD_LISTEN_PEER_URLS="http://10.20.2.192:2380"
    ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://10.20.2.192:2379"
    #ETCD_MAX_SNAPSHOTS="5"
    #ETCD_MAX_WALS="5"
    ETCD_NAME="etcd-1"
    #ETCD_SNAPSHOT_COUNT="100000"
    #ETCD_HEARTBEAT_INTERVAL="100"
    #ETCD_ELECTION_TIMEOUT="1000"
    #ETCD_QUOTA_BACKEND_BYTES="0"
    #ETCD_MAX_REQUEST_BYTES="1572864"
    #ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
    #ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
    #ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
    #
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.20.2.192:2380"
    ETCD_ADVERTISE_CLIENT_URLS="http://10.20.2.192:2379,http://127.0.0.1:2379"
    #ETCD_DISCOVERY=""
    #ETCD_DISCOVERY_FALLBACK="proxy"
    #ETCD_DISCOVERY_PROXY=""
    #ETCD_DISCOVERY_SRV=""
    ETCD_INITIAL_CLUSTER="etcd-1=http://10.20.2.192:2380,etcd-2=http://10.20.2.193:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-test"
    ETCD_INITIAL_CLUSTER_STATE="new"
    
    • etcd-2节点配置文件
    #[Member]
    #ETCD_CORS=""
    ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
    #ETCD_WAL_DIR=""
    ETCD_LISTEN_PEER_URLS="http://10.20.2.193:2380"
    ETCD_LISTEN_CLIENT_URLS="http://10.20.2.193:2379,http://127.0.0.1:2379"
    #ETCD_MAX_SNAPSHOTS="5"
    #ETCD_MAX_WALS="5"
    ETCD_NAME="etcd-2"
    #ETCD_SNAPSHOT_COUNT="100000"
    #ETCD_HEARTBEAT_INTERVAL="100"
    #ETCD_ELECTION_TIMEOUT="1000"
    #ETCD_QUOTA_BACKEND_BYTES="0"
    #ETCD_MAX_REQUEST_BYTES="1572864"
    #ETCD_GRPC_KEEPALIVE_MIN_TIME="5s"
    #ETCD_GRPC_KEEPALIVE_INTERVAL="2h0m0s"
    #ETCD_GRPC_KEEPALIVE_TIMEOUT="20s"
    #
    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.20.2.193:2380"
    ETCD_ADVERTISE_CLIENT_URLS="http://10.20.2.193:2379,http://127.0.0.1:2379"
    #ETCD_DISCOVERY=""
    #ETCD_DISCOVERY_FALLBACK="proxy"
    #ETCD_DISCOVERY_PROXY=""
    #ETCD_DISCOVERY_SRV=""
    ETCD_INITIAL_CLUSTER="etcd-1=http://10.20.2.192:2380,etcd-2=http://10.20.2.193:2380"
    #ETCD_INITIAL_CLUSTER="default=http://localhost:2380"
    ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-test"
    ETCD_INITIAL_CLUSTER_STATE="new"
    

    5. 启动

    systemctl start etcd
    systemctl enable etcd
    

    6. 命令行查看所有节点信息

    [@super]# etcdctl member list
    198d47b0fd35d587: name=etcd-2 peerURLs=http://10.20.2.193:2380 clientURLs=http://10.20.2.193:2379,http://127.0.0.1:2379 isLeader=false
    f9c2d7e0b359acad: name=etcd-1 peerURLs=http://10.20.2.192:2380 clientURLs=http://10.20.2.192:2379,http://127.0.0.1:2379 isLeader=true
    
    展开全文
  • k8s二进制安装文档--etcd集群配置.txt
  • Etcd集群的搭建以及分析

    千次阅读 2018-11-10 16:13:42
    etcd的架构 从 etcd 的架构图中我们可以看到,etcd 主要分为四个部分。 HTTP Server: 用于处理用户发送的 API 请求以及其它 etcd 节点的同步与心跳信息请求。 Store:用于处理 etcd 支持的各类功能的事务,...

    什么是etcd?

    etcd 是一个高可用强一致性的服务发现存储仓库

    在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd 为解决这类问题带来了福音

    etcd的架构

    在这里插入图片描述

    从 etcd 的架构图中我们可以看到,etcd 主要分为四个部分。

    1. HTTP Server: 用于处理用户发送的 API 请求以及其它 etcd 节点的同步与心跳信息请求。
    2. Store:用于处理 etcd 支持的各类功能的事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是 etcd 对用户提供的大多数 API 功能的具体实现。
    3. Raft:Raft 强一致性算法的具体实现,是 etcd 的核心。
    4. WAL:Write Ahead Log(预写式日志),是 etcd 的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd 就通过 WAL 进行持久化存储。WAL 中,所有的数据提交前都会事先记录日志。Snapshot 是为了防止数据过多而进行的状态快照;Entry 表示存储的具体日志内容。

    流程分析

    一个用户的请求发送过来,会经由 HTTP Server 转发给 Store 进行具体的事务处理,如果涉及到节点的修改,则交给 Raft 模块进行状态的变更、日志的记录,然后再同步给别的 etcd 节点以确认数据提交,最后进行数据的提交,再次同步。

    如何搭建etcd集群

    etcd集群的搭建方式有三种,这里就第一种进行举例,详细的参看下面网址
    网址链接:https://mritd.me/2016/09/01/Etcd-集群搭建/

    静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好 Etcd 的各个 node 节点地址
    Etcd 动态发现: 通过已有的 Etcd 集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
    DNS 动态发现: 通过 DNS 查询方式获取其他节点地址信息

    1 环境准备

    节点 IP
    etcd0 192.168.194.148
    etcd1 192.168.194.144

    2 修改主机名(以etcd0为例,etcd2同理)

    hostnamectl set-hostname etcd0

    3 vi /etc/hosts

    192.168.194.148 etcd0
    192.168.194.144 etcd1

    4 关闭防火墙

    systemctl stop firewalld
    setenforce 0

    5 修改etcd配置文件

    vi /etc/etcd/etcd.conf
    #[Member]
    #ETCD_CORS=""
    ETCD_DATA_DIR="/var/lib/etcd/etcd0"
    #ETCD_WAL_DIR=""
    ETCD_LISTEN_PEER_URLS=“http://0.0.0.0:2380
    ETCD_LISTEN_CLIENT_URLS=“http://0.0.0.0:2379,http://0.0.0.0:4001
    #ETCD_MAX_SNAPSHOTS=“5”
    #ETCD_MAX_WALS=“5”
    ETCD_NAME=“etcd0”
    #ETCD_SNAPSHOT_COUNT=“100000”
    #ETCD_HEARTBEAT_INTERVAL=“100”
    #ETCD_ELECTION_TIMEOUT=“1000”
    #ETCD_QUOTA_BACKEND_BYTES=“0”
    #ETCD_MAX_REQUEST_BYTES=“1572864”
    #ETCD_GRPC_KEEPALIVE_MIN_TIME=“5s”
    #ETCD_GRPC_KEEPALIVE_INTERVAL=“2h0m0s”
    #ETCD_GRPC_KEEPALIVE_TIMEOUT=“20s”

    #[Clustering]
    ETCD_INITIAL_ADVERTISE_PEER_URLS=“192.168.194.148:2380”

    ETCD_ADVERTISE_CLIENT_URLS=“http://192.168.194.148:2379,http://192.168.194.148:4001
    #ETCD_DISCOVERY=""
    #ETCD_DISCOVERY_FALLBACK=“proxy”
    #ETCD_DISCOVERY_PROXY=""
    #ETCD_DISCOVERY_SRV=""

    ===ETCD_INITIAL_CLUSTER=“etcd0=http://192.168.194.148:2380,etcd1=http://192.168.194.144:2380” ===

    ETCD_INITIAL_CLUSTER_TOKEN=“mritd-etcd-cluster”
    ETCD_INITIAL_CLUSTER_STATE=“new”
    #ETCD_STRICT_RECONFIG_CHECK=“true”
    #ETCD_ENABLE_V2=“true”

    6 开启服务

    systemctl start etcd

    7 查看集群节点
    [root@etcd0 ~]# etcdctl member list
    862fcca67d8a6028: name=etcd1 peerURLs=http://192.168.194.144:2380 clientURLs=http://192.168.194.144:2379,http://192.168.194.144:4001 isLeader=false
    afe6bafc65165762: name=etcd0 peerURLs=http://192.168.194.148:2380 clientURLs=http://192.168.194.148:2379,http://192.168.194.148:4001 isLeader=true
    
    
    8 查看集群状况
    [root@etcd0 ~]# etcdctl cluster-health
    member 862fcca67d8a6028 is healthy: got healthy result from http://192.168.194.144:2379
    member afe6bafc65165762 is healthy: got healthy result from http://192.168.194.148:2379
    cluster is healthy
    

    采用命令方式创建
    etcd -name infra0
    -initial-advertise-peer-urls http://10.0.1.10:2380
    -listen-peer-urls http://10.0.1.10:2380
    -initial-cluster-token etcd-cluster-1
    -initial-cluster infra0=http://10.0.1.10:2380,infra1=http://10.0.1.11:2380,infra2=http://10.0.1.12:2380
    -initial-cluster-state new

    参数分析
    -name 节点名称
    -initial-advertise-peer-urls 通知其他 Etcd 实例地址
    -listen-peer-urls 监听其他 Etcd 实例的地址
    -initial-cluster-token 初始化集群 token
    -initial-cluster 初始化集群内节点地址
    -initial-cluster-state 初始化集群状态,new 表示新建

    etcd的应用

    服务发现

    服务发现要解决的也是分布式系统中最常见的问题之一,即在同一个分布式集群中的进程或服务,要如何才能找到对方并建立连接。本质上来说,服务发现就是想要了解集群中是否有进程在监听 udp 或 tcp 端口,并且通过名字就可以查找和连接。要解决服务发现的问题,需要有下面三大支柱

    1. 一个强一致性、高可用的服务存储目录。基于 Raft 算法的 etcd 天生就是这样一个强一致性高可用的服务存储目录。
    2. 一种注册服务和监控服务健康状态的机制。用户可以在 etcd 中注册服务,并且对注册的服务设置key TTL,定时保持服务的心跳以达到监控健康状态的效果。
    3. 一种查找和连接服务的机制。通过在 etcd 指定的主题下注册的服务也能在对应的主题下查找到。为了确保连接,我们可以在每个服务机器上都部署一个 Proxy 模式的 etcd,这样就可以确保能访问 etcd 集群的服务都能互相连接。
      具体分析

    随着 Docker 容器的流行,多种微服务共同协作,构成一个相对功能强大的架构的案例越来越多。透明化的动态添加这些服务的需求也日益强烈。通过服务发现机制,在 etcd 中注册某个服务名字的目录,在该目录下存储可用的服务节点的 IP。在使用服务的过程中,只要从服务目录下查找可用的服务节点去使用即可。

    在这里插入图片描述

    PaaS 平台中的应用一般都有多个实例,通过域名,不仅可以透明的对这多个实例进行访问,而且还可以做到负载均衡。但是应用的某个实例随时都有可能故障重启,这时就需要动态的配置域名解析(路由)中的信息。通过 etcd 的服务发现功能就可以轻松解决这个动态配置的问题。

    在这里插入图片描述

    运行时节点变更

    etcd 集群启动完毕后,可以在运行的过程中对集群进行重构,包括核心节点的增加、删除、迁移、替换

    注意:
    只有当集群中多数节点正常的情况下,你才可以进行运行时的配置管理。因为配置更改的信息也会被 etcd 当成一个信息存储和同步,如果集群多数节点损坏,集群就失去了写入数据的能力。所以在配置 etcd 集群数量时,强烈推荐至少配置 3 个核心节点。

    一 节点的迁移,替换

    当你节点所在的机器出现硬件故障,或者节点出现如数据目录损坏等问题,导致节点永久性的不可恢复时,就需要对节点进行迁移或者替换。当一个节点失效以后,必须尽快修复,因为 etcd 集群正常运行的必要条件是集群中多数节点都正常工作。

    迁移一个节点需要进行四步操作:
     暂停正在运行着的节点程序进程
     把数据目录从现有机器拷贝到新机器
     使用 api 更新 etcd 中对应节点指向机器的 url 记录更新为新机器的 ip
     使用同样的配置项和数据目录,在新的机器上启动 etcd。
    二 节点的增加

    增加节点可以让 etcd 的高可用性更强。举例来说,如果你有 3 个节点,那么最多允许 1 个节点失效;当你有 5 个节点时,就可以允许有 2 个节点失效。同时,增加节点还可以让 etcd 集群具有更好的读性能。因为 etcd 的节点都是实时同步的,每个节点上都存储了所有的信息,所以增加节点可以从整体上提升读的吞吐量。

    增加一个节点需要进行两步操作:
     在集群中添加这个节点的 url 记录,同时获得集群的信息。
     使用获得的集群信息启动新 etcd 节点。
    三 节点的移除

    有时你不得不在提高 etcd 的写性能和增加集群高可用性上进行权衡。Leader 节点在提交一个写记录时,会把这个消息同步到每个节点上,当得到多数节点的同意反馈后,才会真正写入数据。所以节点越多,写入性能越差。在节点过多时,你可能需要移除一个或多个。

    移除节点非常简单,只需要一步操作,就是把集群中这个节点的记录删除。然后对应机器上的该节点就会自动停止。
    四 强制性重启集群

    当集群超过半数的节点都失效时,就需要通过手动的方式,强制性让某个节点以自己为 Leader,利用原有数据启动一个新集群。

    此时你需要进行两步操作。
     备份原有数据到新机器。
     使用-force-new-cluster加备份的数据重新启动节点
    注意:强制性重启是一个迫不得已的选择,它会破坏一致性协议保证的安全性(如果操作时集群中尚有其它节点在正常工作,就会出错),所以在操作前请务必要保存好数据。

    Proxy模式

    Proxy 模式也是新版 etcd 的一个重要变更,etcd 作为一个反向代理把客户的请求转发给可用的 etcd 集群。这样,你就可以在每一台机器都部署一个 Proxy 模式的 etcd 作为本地服务,如果这些 etcd Proxy 都能正常运行,那么你的服务发现必然是稳定可靠的。

    在这里插入图片描述

    那么,为什么要有 Proxy 模式而不是直接增加 etcd 核心节点呢?实际上 etcd 每增加一个核心节点(peer),都会增加 Leader 节点一定程度的包括网络、CPU 和磁盘的负担,因为每次信息的变化都需要进行同步备份。增加 etcd 的核心节点可以让整个集群具有更高的可靠性,但是当数量达到一定程度以后,增加可靠性带来的好处就变得不那么明显,反倒是降低了集群写入同步的性能。因此,增加一个轻量级的 Proxy 模式 etcd 节点是对直接增加 etcd 核心节点的一个有效代替。
    Proxy 模式的本质就是起一个 HTTP 代理服务器,把客户发到这个服务器的请求转发给别的 etcd 节点。

    简单命令

    查看store的状态
    curl http://127.0.0.1:2379/v2/stats/store
    查看自己的状态

    curl http://127.0.0.1:2379/v2/stats/self
    查看leader状态
    curl http://127.0.0.1:2379/v2/stats/leader

    指定某个键的值
    etcdctl set /testdir/testkey “Hello world”
    获取指定键的值(当建不存在事会报错)
    etcdctl get /testdir/testkey
    当键存在时,更新值内容
    etcdctl update /testdir/testkey “Hello”
    移除某个键值
    etcdctl rm /testdir/testkey

    mk
    如果给定的键不存在,则创建一个新的键值
    etcdctl mk /testdir/testkey “Hello world”
    当键存在的时候,执行该命令会报错
    etcdctl mk /testdir/testkey “Hello world”

    mkdir
    如果给定的键目录不存在,则创建一个新的键目录,当键目录存在的时候,执行该命令会报错
    etcdctl mkdir testdir2

    setdir
    创建一个键目录,无论存在与否。
    etcdctl setdir testdir2

    updatedir
    更新一个已经存在的目录
    etcdctl updatedir testdir2

    rmdir
    删除一个空目录,或者键值对。
    etcdctl rmdir dir1

    ls
    etcdctl ls dir
    etcdctl ls

    展开全文
  • 我们在日常工作中经常会遇到各种服务调优,同样,对于 etcd 集群来说,也需要对其进行调优,使其处于最佳的状态。 这一讲我将通过分析 etcd 的架构,结合其核心部分对 etcd 集群进行优化。 etcd 整体分析 在对 ...

    我们在日常工作中经常会遇到各种服务调优,同样,对于 etcd 集群来说,也需要对其进行调优,使其处于最佳的状态。

    这一讲我将通过分析 etcd 的架构,结合其核心部分对 etcd 集群进行优化。

     

    etcd 整体分析


    在对 etcd 进行调优之前,我们先来看看 etcd 集群的架构图,如下图所示:

    上图是一个简化了的 etcd 集群。完整的 etcd 的架构中包括 API 通信层、Raft 算法层、业务逻辑层(包括鉴权、租约等)和 Storage 存储层。

    我在图中只标识出了 Raft 层,Raft 层是实现 etcd 数据一致性的关键,etcd 节点之间通过 Raft 实现一致性通信。Raft 同步数据需要通过网络,因此网络延迟和网络带宽会影响 etcd 的性能。

    还有 Storage 层,Storage 层依赖 BoltDB 作为底层,用以持久化键值对。Storage 层还有 WAL 日志、快照模块。当然,谈起存储势必要提到磁盘 IO 的性能,WAL 日志受到磁盘 IO 写入速度影响,fdatasync 延迟也会影响 etcd 性能。BoltDB Tx 的锁以及 BoltDB 本身的性能也将影响 etcd 的性能。上述这些因素都有可能造成 etcd 的性能损失。

     

    推荐的服务器配置


    接下来,我们来看下部署 etcd 集群服务器的配置,这也是我们优化需要首先考虑的内容 。

    etcd 在开发或测试的场景下,对硬件要求不高,而且也能运行良好。比如我们在笔记本电脑或低配置服务器上就可使用 etcd 进行开发测试。然而在实际生产环境中运行 etcd 集群时,对于性能等方面的要求就变得很高了,比如 etcd 集群对外提供服务时要求的高可用性和可靠性。因此,匹配的硬件环境是进行生产部署的良好开端。下面我就从 CPU 处理器、内存、磁盘和网络几个方面,具体介绍 etcd 官方推荐的生产环境配置。

    CPU 处理器

    大部分情况下,etcd 的部署对 CPU 处理器的要求不高。一般的集群只需要双核到四核的 CPU 就能平稳运行。如果 etcd 集群负载的客户端达到数千个,每秒的请求数可能是成千上万个,这种情况就需要增加 CPU 的配置,通常需要八到十六个专用内核。

    内存大小

    etcd 对内存的需求同样也不是很高,etcd 服务端内存占用相对较小。当然,即使这样我们也得分配足够的内存给 etcd,通常 8GB 大小的内存就足够了。etcd 服务器会缓存键值数据,其余大部分内存用于跟踪 watch 监视器。因此,对于具有数千个 watch 监视器或者数百万键值对的大型部署,我们需要相应地将内存扩展到 16GB 以上。

     磁盘

    磁盘 IO 速度是影响 etcd 集群性能和稳定性的最关键因素。IO 速度慢的磁盘会增加 etcd 请求的延迟,并有可能影响集群的稳定性。etcd 的一致性共识算法 Raft 依赖元数据,持久存储在日志中,因此大多数 etcd 集群成员须将请求写入磁盘。

    另外,etcd 还将以增量的方式将检查点写入磁盘中,以便截断该日志。如果这些写入花费的时间太长,心跳可能会超时并触发选举,进而破坏集群的稳定性。通常,可以使用基准测试工具判断磁盘的速度是否适合 etcd,为了测量实际的顺序 IOPS,建议使用磁盘基准测试工具,例如 DiskBench 或者 fio。

    etcd 对磁盘写入延迟非常敏感,通常需要 7200 RPM 转速的磁盘。对于负载较重的集群,官方建议使用 SSD 固态硬盘。etcd 仅需要适度的磁盘带宽,但是当故障成员需要赶上集群时,更大的磁盘带宽可以缩短恢复时间。通常,10MB/s 的带宽可以在 15 秒内恢复 100MB 数据,对于大型集群,建议使用 100MB/s 或更高的速度在 15 秒内恢复 1GB 数据。

    在条件允许的情况下,一般使用 SSD 作为 etcd 的存储。与机械硬盘相比,SSD 写入延迟较低,能够提高 etcd 的稳定性和可靠性。如果使用机械硬盘,尽量使用转速达到 15,000 RPM 的磁盘。对于机械磁盘和 SSD,使用 RAID 0 也是提高磁盘速度的有效方法。由于 etcd 的一致复制已经获得了高可用性,至少三个集群成员不需要 RAID 的镜像和磁盘阵列。

    网络

    多个成员的 etcd 集群部署得益于快速可靠的网络。为了使 etcd 既能实现一致性,又能够实现容忍分区性,需要网络保证低延迟和高带宽。低延迟使得 etcd 成员可以快速通信,高带宽可以减少恢复故障 etcd 成员的时间,具有分区中断的不可靠网络将导致 etcd 集群的可用性降低。1GbE 对于常见的 etcd 部署就足够了,对于大型 etcd 集群,10GbE 的网络可以缩短平均恢复时间。

    我们还可以通过规避在多个数据中心部署 etcd 成员的方式来减少网络开销,单个数据中心内部署 etcd 成员可以避免延迟开销,提升 etcd 集群的可用性。

     

     

    etcd 调优


    上面我们介绍了部署 etcd 推荐的硬件配置,当硬件配置固定时,我们看看如何优化 etcd 服务。

    etcd 启动时的默认设置适用于网络低延迟的场景,网络延迟较高的场景下,如网络跨域数据中心,心跳间隔和选举超时的设置就需要优化。每一次超时时间应该包含一个请求从发出到响应成功的时间,当然网络慢不仅是延迟导致的,还可能受到 etcd 集群成员的低速磁盘 IO 影响。

    磁盘

    etcd 集群对磁盘的延迟非常敏感。因为 etcd 需要存储变更日志,多个进程同时操作磁盘可能引起更高的 fsync 延迟。IO 的延迟问题可能引起 etcd 丢失心跳、请求超时或者 Leader 临时丢失,可以通过提高 etcd 进程的磁盘优先级来解决磁盘延迟问题。

    在 Linux 系统中,etcd 的磁盘优先级可以通过 Ionic 去配置,我们来看下 Ionice 的命令:

    [root@etcd1 ~]# ionice -h
    ionice - sets or gets process io scheduling class and priority.
    Usage:
      ionice [OPTION] -p PID [PID...]
      ionice [OPTION] COMMAND
    Options:
      -c, --class <class>   scheduling class name or number
                               0: none, 1: realtime, 2: best-effort, 3: idle
      -n, --classdata <num> scheduling class data
                               0-7 for realtime and best-effort classes
      -p, --pid=PID         view or modify already running process
      -t, --ignore          ignore failures
      -V, --version         output version information and exit
      -h, --help            display this help and exit

    根据 Ionice 的提示,我们知道 Ionice 用来获取或设置程序的 IO 调度与优先级。因此,我们可以执行如下的命令:

    $ sudo ionice -c2 -n0 -p `pgrep etcd`

    上述命令指定-c2尽最大努力的调度策略,即操作系统将会尽最大努力设置 etcd 进程为最高优先级。

    展开全文
  • Etcd集群安装部署

    2020-08-10 09:34:04
    etcd 是一个分布式键值对存储系统,由coreos 开发,内部采用 raft 协议作为一致性算法,用于可靠、快速地保存关键...etcd集群是为高可用、持久化数据存储和检索而准备。 本文是绝对可以安装通过的,而且不会出现问题。
  • CentOS 7 ETCD集群部署

    2020-09-16 11:35:10
    Etcd 集群配置分为三种: 静态发现 Etcd 动态发现 DNS 动态发现 通过DNS的SRV解析动态发现集群 二、环境准备 主机名 ip 系统版本 etcd0 192.168.1.85 Centos 7 etcd1 192.168.1.86 Centos 7 etcd2 192....
  • Linux:安装etcd集群

    2020-11-30 17:58:25
    etcd集群安装 etcd三节点安装部署
  • ETCD集群搭建和TLS证书访问

    千次阅读 2020-08-30 12:59:17
    在`/etc/profile`文件中添加环境...ETCD常用命令 $ ENDPOINTS=10.208.2.145:2379,10.208.2.146:2379,10.208.2.150:2379,10.208.2.151:2379,10.208.2.152:2379 $ bin/etcdctl --write-out=table --endpoints=$ENDPOINTS
  • 关闭防火墙和SELINUX systemctl stop firewalld systemctl disable firewalld sed -i 's/#SELINUX=enforcing/SELINUX=disabled/g' /etc/...ETCD_DATA_DIR="/var/lib/etcd/etcd10.etcd" #数据目录 ETCD_WAL_DIR="/var/l
  • Kubernetes集群搭建之Etcd集群配置篇 程序员同行者 https://www.jianshu.com/p/06ca47667e8b 介绍 etcd 是一个分布式一致性k-v存储系统,可用于服务注册发现与共享配置,具有以下优点。 简单 : 相比于晦涩...
  • 部署etcd集群

    2020-05-20 19:41:44
    一、环境说明 ubuntu 18.04 172.18.0.30 (master) ...etcd 版本:v2.3.7 二、安装etcd 分别在master和node1机器上安装etcd # step1:下载某版本etcd的release包 $ wget https://github.com/etcd-io/etcd/releases
  • k8s 部署etcd集群

    2021-12-06 21:06:37
    公司计划使用etcd来做统一配置管理,由于服务都在阿里云托管k8s集群上,所以这里也打算使用k8s来部署etcd集群。 一、创建持久化存储 1、创建etcd目录 mkdir etcd/ mkdir etcd/nas 2、创建storageclass存储 (1)...
  • k8s 二进制部署之部署 Etcd 集群

    千次阅读 2021-08-12 22:19:49
    Etcd 是一个分布式键值存储系统,Kubernetes使用Etcd进行数据存储,所以先准备一个Etcd数据库,为解决Etcd单点故障,应采用集群方式部署,这里使用3台组建集群,可容忍1台机器故障,当然,你也可以使用5台组建集群,...
  • 前言 在使用别人的镜像和yaml...按照我的步骤,前期将启动脚本和etcd所需配置导入镜像中,这样一来后期部署的yaml只需要打入几个环境变量即可,这样将非常简洁方便! 所需脚本和所有内容都将在我的GitHub中找到: ...
  • 上文我们简单介绍了 etcd 的基本概念和使用场景,本文就来介绍如何搭建 etcd 集群。在生产环境中,为了整个集群的高可用,etcd 正常都会以集群方式部署,避免单点故障。引导 etc...
  • Kubernetes部署etcd集群

    2021-04-12 17:05:23
    目录一、 k8s概述1、k8s是什么2、k8s特性3、k8s群集架构与组件4、k8s核心概念二、k8s三种部署方式三、自签SSL证书四、k8s单节点部署(etcd) 一、 k8s概述 1、k8s是什么 kubernetes是Google在2014年开源的一个容器...
  • ETCD集群安装详细步骤

    千次阅读 2020-10-18 21:43:54
    安装注意事项声明: 1.注意事项--环境变量指定了,...2.etcd启动参数部分不支持域名,否则必须用外部DNS动态解析 3.对等证书 https://blog.csdn.net/xiaozhiit/article/details/108304488 4.动态发现,解决问题 ...
  • etcd-client-java 该项目用于etcd集群的动态注册和发现,并实现负载均衡 心跳基于netty连接池长连接实现
  • docker 创建etcd集群

    2021-11-18 10:12:53
    1、本文采用etcd3.5.1版本,首先下载etcd3.5.1 docker镜像 docker pull quay.io/coreos/etcd:v3.5.1 2、在自己设定的目录,比如/home/etcd下创建docker-compose.yml,内容如下 ##xx.xx.xx.xx 为自己服务器ip...
  • ETCD作为开源、分布式、高可用、强一致性的key-value存储系统,提供了配置共享和服务发现等众多功能。目前已广泛应用在kubernetes、ROOK、CoreDNS、M3以及ope...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,284
精华内容 14,113
关键字:

etcd集群