Etcd分布式键值数据库安装和使用

一、ectd数据库介绍

  etcd 是 CoreOS 团队于2013年6月发起的开源项目, 是一种开源的分布式键值存储库,用于保存和管理分布式系统保持运行所需的关键信息。 etcd 基于 Raft 共识算法而构建,可确保集群中所有节点之间的数据存储一致性。

  etcd 采用全新的设计,具有以下特性:

  • 完全复制:etcd 集群中的每个节点都可以访问完整的数据存储库。
  • 高度可用:etcd 被设计为没有单点故障,并且可以稳定地容忍硬件故障和网络分区。
  • 完全一致:每次数据“读取”都会返回所有集群中最新的“写入”数据。
  • 运行迅速:etcd 的基准测试速度为每秒 10,000 次写入。
  • 安全可靠:etcd 支持自动传输层安全性 (TLS) 和可选的安全套接字层 (SSL) 客户机证书认证。 由于 etcd 存储重要且高度敏感的配置数据,因此管理员应在部署中实施基于角色的访问控制,并确保与 etcd 交互的团队成员只具有执行其工作所需的最低级别的访问权限。
  • 操作简单:任何应用(从简单的 Web 应用到 Kubernetes 等高度复杂的容器编排引擎)都可以使用标准的 HTTP/JSON 工具在 etcd 中读写数据。

  由于 etcd 的性能在很大程度上取决于存储磁盘的速度,因此强烈建议在 etcd 环境中使用 SSD。

  etcd 是 Kubernetes 的核心组件之一,充当主要键值存储库,用于创建可正常运行且具有容错能力的 Kubernetes 集群。 Kubernetes API 服务器会将每个集群的状态数据都存储在 etcd 中。 Kubernetes 使用 etcd 的“观察”功能来监控这些数据,并在发生变化时自行重新配置。 “观察”功能会存储代表集群实际状态和理想状态的值,并且可以在这两种状态不同时作出响应。

  etcd数据库架构分为4个部分:

  • HTTP Server: 处理用户API请求以及其它etcd节点的同步与心跳请求。
  • Store:处理etcd事务,包括数据索引、节点状态变更、监控与反馈、事件处理与执行等等,是etcd对用户提供的大多数API功能的具体实现。
  • Raft:Raft强一致性算法的具体实现,是etcd的核心。
  • WAL:是etcd的数据存储方式。除了在内存中存有所有数据的状态以及节点的索引以外,etcd就通过WAL进行持久化存储。

二、etcd数据库安装和使用

  安装方式有多种,本次采用二进制方式进行集群安装,安装机器为三台Ubuntu虚拟机10.10.1.3、10.10.1.4、10.10.1.5。在服务器上安装Etcd注意的事项: 

  • 关闭selinux子系统;
  • 关闭firewalld或开放需要使用的端口;
  • 关闭swap内存交换;

  1.从官网查找相应系统的二进制版本,并进行下载:

curl -L https://github.com/etcd-io/etcd/releases/download/v3.5.4/etcd-v3.5.4-linux-amd64.tar.gz -o etcd-v3.5.4-linux-amd64.tar.gz

  2.解压文件:

tar xzvf etcd-v3.5.4-linux-amd64.tar.gz

  3.将解压的etcd和etcdctl可执行文件复制到/usr/local/bin目录下:

sudo mv etcd-v3.5.4-linux-amd64/{etcd,etcdctl} /usr/local/bin/

   4.验证安装是成功:

etcd --version

  

  5.创建配置文件,不同版本的配置文件格式可能不同,以3.5.4版本为例,配置文件为yaml格式,参考etcd.yaml简单配置,默认路径/etc/etcd/etcd.yaml,参数信息举例如下:

name: etcd01
data-dir: /var/lib/etcd/data/
wal-dir: /var/lib/etcd/wal/
listen-peer-urls: http://10.10.1.3:2380
listen-client-urls: http://10.10.1.3:2379
initial-advertise-peer-urls: http://10.10.1.3:2380
advertise-client-urls: http://10.10.1.3:2379
initial-cluster: etcd01=http://10.10.1.3:2380,etcd02=http://10.10.1.4:2380,etcd03=http://10.10.1.5:2380
initial-cluster-token: etcd-cluster

   6.创建etcd的systemd服务文件,用于开机启动:

[Unit]
Description=etcd key-value store
Documentation=https://github.com/coreos/etcd
After=network.target
 
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd --config-file /etc/etcd/etcd.yaml
 
[Install]
WantedBy=multi-user.target

   7.设置开机启动,查看状态:

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

   

   8.进行一个简单的数据存取测试:

#存一个值
etcdctl put id 001
#获取一个值
etcdctl get id

#存一个值
etcdctl --endpoints http://10.10.1.3:2379 put id 002
#获取一个值
etcdctl --endpoints http://10.10.1.3:2379 get id

   9.查看集群节点信息:

etcdctl --endpoints http://10.10.1.3:2379,10.10.1.4:2379,10.10.1.5:2379 endpoint status --write-out=table

 

 三、etcd配置参数说明

  etcd 服务可以通过命令行标记和环境变量来配置其行为功能,当命令行启动参数和环境变量同时存在时,命令行上设置的选项优先于环境变量。具体的参数使用方式参考 "etcd --help "帮助器。

  命令行参数对应的环境变量的基本规则:

  • 环境变量全部是大写标记;
  • 环境变量都是以 ETCD_ 为前缀;
  • 参数名称不变,并将其中的短横线-更换为下划线_。

  例如:命令行参数格式--initial-cluster ,其对应的环境变量参数就是 ETCD_INITIAL_CLUSTER,其他参数类似,一些参数的参考说明如下:

# [Member]
#节点名称
ETCD_NAME="etcd01"
#数据存放目录
ETCD_DATA_DIR="/var/lib/etcd"
#WAL目录
ETCD_WAL_DIR="/var/lib/etcd/WAL"
#触发快照到硬盘的已提交事务的数量
ETCD_SNAPSHOT_COUNT=10000
#心跳间隔时间 (单位 毫秒)
ETCD_HEARTBEAT_INTERVAL=100
#选举的超时时间(单位 毫秒)
ETCD_ELECTION_TIMEOUT=1000
#用于监听伙伴通讯的URL列表,不能为域名
ETCD_LISTEN_PEER_URLS="http://10.10.1.3:2380"
#用于监听客户端通讯的URL列表,不能为域名
ETCD_LISTEN_CLIENT_URLS="http://10.10.1.3:2379,http://127.0.0.1:2379"
#保存的快照文件的最大数量 (0 表示不限制)
ETCD_MAX_SNAPSHOTS=5
#保存的 wal 文件的最大数量 (0 表示不限制)
ETCD_MAX_WALS=5
#逗号分割的 origin 白名单,用于 CORS资源共享
ETCD_CORS="none"

# [Clustering]
#列出这个成员的客户端URL,通告给集群中的其他成员。这些 URL 可以包含域名
ETCD_ADVERTISE_CLIENT_URLS="http://10.10.1.3:2379"
#列出这个成员的伙伴 URL 以便通告给集群的其他成员
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://10.10.1.4:2380,http://10.10.1.5:2380"
#初始化集群配置
ETCD_INITIAL_CLUSTER="etcd01=http://10.10.1.3:2380,etcd02=http://10.10.1.4:2380,etcd03=http://10.10.1.5:2380"
#在启动期间用于 etcd 集群的初始化集群记号
ETCD_INITIAL_CLUSTER_TOKEN="etcd-token-aaabbbccc"
#初始化集群状态("new" or "existing")
ETCD_INITIAL_CLUSTER_STATE="new"
#用于启动集群的发现URL
ETCD_DISCOVERY="none"
#用于启动集群的 DNS srv 域名
ETCD_DISCOVERY_SRV="none"
#当发现服务失败时的期待行为("exit" 或 "proxy")
ETCD_DISCOVERY_FALLBACK="proxy"
#用于请求到发现服务的 HTTP 代理
ETCD_DISCOVERY_PROXY="none"
#拒绝将导致法定人数丢失的重配置请求
ETCD_STRICT_RECONFIG_CHECK=false
#自动压缩用于 mvcc 键值存储的保持力,单位小时, 0 表示关闭自动压缩。
ETCD_AUTO_COMPACTION_RETENTION=0

# [Proxy flags]
#代理模式设置("off", "readonly" or "on").
ETCD_PROXY="off"
#在被重新考虑之前,终端将被视为失败状态的时间(单位 毫秒),用于被代理的请求
ETCD_PROXY_FAILURE_WAIT=5000
#终端刷新间隔时间(单位 毫秒)
ETCD_PROXY_REFRESH_INTERVAL=30000
#请求的拨号(dial)超时时间(单位 毫秒),或者 0 禁用超时
ETCD_PROXY_DIAL_TIMEOUT=1000
#写操作的超时时间(单位 毫秒),或者 0 禁用超时
ETCD_PROXY_WRITE_TIMEOUT=5000
#读操作的超时时间(单位 毫秒),或者 0 禁用超时
ETCD_PROXY_READ_TIMEOUT=0

# [Security]
#客户端服务器 TLS 证书文件的路径
ETCD_CERT_FILE="none"
#客户端服务器 TLS key 文件的路径
ETCD_KEY_FILE="none"
#开启客户端证书认证
ETCD_CLIENT_CERT_AUTH=false
#客户端服务器 TLS 信任证书文件的路径
ETCD_TRUSTED_CA_FILE="none"
#使用生成证书的客户端 TLS
ETCD_AUTO_TLS=false
#peer server TLS 证书文件的路径
ETCD_PEER_CERT_FILE="none"
#peer server TLS key 文件的路径
ETCD_PEER_KEY_FILE="none"
#开启 peer client 证书验证
ETCD_PEER_CLIENT_CERT_AUTH=false
#peer server TLS 信任证书文件路径
ETCD_PEER_TRUSTED_CA_FILE="none"
#使用生成证书的peer TLS
ETCD_PEER_AUTO_TLS=false

#请谨慎使用不安全标记,因为它将打破一致性协议提供的保证。
#强制创建新的单一成员的集群。它提交配置修改来强制移除集群中的所有现有成员然后添加自身
ETCD_FORCE_NEW_CLUSTER=false

# [debug]
#设置所有子包的默认日志级别为 DEBUG
ETCD_DEBUG=false 
#设置个人 etcd 子包为指定日志级别。例如 etcdserver=WARNING,security=DEBUG
ETCD_LOG_PACKAGE_LEVELS="none"

 四、etcdctl命令行工具

  该工具在安装etcd时默认安装,可用于操作etcd数据库,etcdctl常见的 语法命令如下:

etcdctl        get                                        获取键或一组键
etcdctl        put                                        将给定的密钥放入存储
etcdctl        del                                        删除指定的键或键范围[key,range_end]
etcdctl        txn                                        Txn在一个事务中处理所有请求
etcdctl        compaction                                 压缩etcd中的事件历史记录
etcdctl        alarm disarm                               解除所有警报
etcdctl        alarm list                                 列出所有报警
etcdctl        defrag                                     对具有给定端点的etcd成员的存储进行碎片整理
etcdctl        endpoint health                            检查“--endpoints”标志中指定的终结点的运行状况
etcdctl        endpoint status                            打印“--endpoints”标志中指定的终结点的状态
etcdctl        endpoint hashkv                            打印--endpoint中每个终结点的KV历史散列
etcdctl        move-leader                                将领导权移交给另一个etcd集群成员。
etcdctl        watch                                      监视密钥或前缀上的事件流
etcdctl        version                                    打印etcdctl的版本
etcdctl        lease grant                                创建租赁
etcdctl        lease revoke                               撤销租约
etcdctl        lease timetolive                           获取租赁信息
etcdctl        lease list                                 列出所有活动租约
etcdctl        lease keep-alive                           保持租约有效(续订)
etcdctl        member add                                 将成员添加到群集中
etcdctl        member remove                              从群集中删除成员
etcdctl        member update                              更新群集中的成员
etcdctl        member list                                列出群集中的所有成员
etcdctl        snapshot save                              将etcd节点后端快照存储到给定文件
etcdctl        snapshot restore                           将etcd成员快照恢复到etcd目录
etcdctl        snapshot status                            获取给定文件的后端快照状态
etcdctl        make-mirror                                在目标etcd集群上制作镜像
etcdctl        migrate                                    将v2存储中的密钥迁移到mvcc存储
etcdctl        lock                                       获取命名锁
etcdctl        elect                                      观察并参与领导人选举
etcdctl        auth enable                                启用身份验证
etcdctl        auth disable                               禁用身份验证
etcdctl        user add                                   添加新用户
etcdctl        user delete                                删除用户
etcdctl        user get                                   获取用户的详细信息
etcdctl        user list                                  列出所有用户
etcdctl        user passwd                                更改用户的密码
etcdctl        user grant-role                            将角色授予用户
etcdctl        user revoke-role                           吊销用户的角色
etcdctl        role add                                   添加新角色
etcdctl        role delete                                删除角色
etcdctl        role get                                   获取角色的详细信息
etcdctl        role list                                  列出所有角色
etcdctl        role grant-permission                      授予角色密钥
etcdctl        role revoke-permission                     从角色中吊销密钥
etcdctl        check perf                                 检查etcd集群的性能
etcdctl        help                                       有关任何命令的帮助

 五、配置ETCD自签证书

  自签证书可以通过CFSSL等工具创建,详见cfssl自签证书工具使用,这里仅提供创建etcd集群证书的两个json文件:

  • 配置文件ca-config.json:
cat > ca-config.json <<EOF
{
  "signing": {
    "default": {
      "expiry": "87600h"
    },
    "profiles": {
      "etcd": {
         "expiry": "87600h",
         "usages": [
            "signing",
            "key encipherment",
            "server auth",
            "client auth"
        ]
      }
    }
  }
}
EOF
  • etcd 服务器证书签名请求描述文件server-csr.json:
cat > server-csr.json <<EOF
{
  "CN": "etcd",
  "hosts": [
    "127.0.0.1",
    "10.10.1.3",
    "10.10.1.4",
    "10.10.1.5"
  ],
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "CN",
      "L": "BeiJing",
      "ST": "BeiJing"
    }
  ]
}
EOF
  • 生成证书的命令: 以下命令最终得到如下三个文件:etcdserver.pem、etcdserver-key.pem、etcdserver.csr。
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare etcdserver
  • 配置证书:移动证书到etcd.yaml相同的目录,然后在/etc/etcd/etcd.yaml文件中指定证书。
name: etcd02
data-dir: /var/lib/etcd/data/
wal-dir: /var/lib/etcd/wal/
listen-peer-urls: https://10.10.1.4:2380
listen-client-urls: https://10.10.1.4:2379
initial-advertise-peer-urls: https://10.10.1.4:2380
advertise-client-urls: https://10.10.1.4:2379
initial-cluster: etcd01=https://10.10.1.3:2380,etcd02=https://10.10.1.4:2380,etcd03=https://10.10.1.5:2380
initial-cluster-token: etcd-cluster

client-transport-security:
  cert-file: /etc/etcd/etcdserver.pem
  key-file: /etc/etcd/etcdserver-key.pem
  trusted-ca-file: /etc/etcd/ca.pem
  client-cert-auth: true
peer-transport-security:
  cert-file: /etc/etcd/etcdserver.pem
  key-file: /etc/etcd/etcdserver-key.pem
  trusted-ca-file: /etc/etcd/ca.pem
  client-cert-auth: true

六、Etcd不同部署模式的访问区别

  1.单机访问,无需指定端点和证书,例如:

etcdctl put key value

  2.集群方式的访问,需要--endpoints参数指定etcd的endpoint,例如:

 etcdctl --endpoints http://10.10.1.3:2379 put key value

  3.如果配置了tls证书,需要使用--cert、--key、--cacert参数指定证书和私钥,例如:

etcdctl  --endpoints=https://10.10.1.3:2379     \
             --cacert=/etc/etcd/ca.pem   \
             --cert=/etc/etcd/etcdserver.pem  \
             --key=/etc/etcd/etcdserver-key.pem \
 put key value

七、常用命令

  • 查看集群状态:
etcdctl  --endpoints=https://10.10.1.3:2379      \
         --cacert=/etc/etcd/ca.pem    \
         --cert=/etc/etcd/etcdserver.pem   \
         --key=/etc/etcd/etcdserver-key.pem  \
         --write-out=table \
  member list 

  •  添加一个键值对:
etcdctl  --endpoints=https://10.10.1.3:2379      \
         --cacert=/etc/etcd/ca.pem    \
         --cert=/etc/etcd/etcdserver.pem   \
         --key=/etc/etcd/etcdserver-key.pem  \
 put id 001

  •  根据key获取一个值:
etcdctl  --endpoints=https://10.10.1.3:2379      \
         --cacert=/etc/etcd/ca.pem    \
         --cert=/etc/etcd/etcdserver.pem   \
         --key=/etc/etcd/etcdserver-key.pem  \
 get id 

posted @ 2024-07-04 21:21  我若安好,便是晴天  阅读(186)  评论(0编辑  收藏  举报