文章目录


前言

本文介绍了etcd的基本概念、特点和端口介绍。然后提供了etcd安装教程,包括单机版和集群版的安装步骤。对于集群版,还详细说明了如何添加成员、删除成员以及启动已存在的etcd集群等操作。接下来列举了一些常用的etcd客户端命令,并给出了选项说明。

最后,针对性能调优方面,提供了时间参数调优、快照调优、磁盘调优、网络调优和中央处理器设置等建议。

希望这篇文章能够帮助您理解并使用etcd分布式键值存储系统。


一、简介

1. 简介

etcd是一个分布式键值存储系统,用于存储分布式系统中最关键的数据,由CoreOS开发并作为开源项目进行维护。它使用Raft一致性算法来实现高可用性和数据一致性,并提供了简单的HTTP
API用于读取、写入和观察存储在其上的键值对。

2. 特点

  1. 分布式:etcd被设计为一个分布式系统,可以运行在多台机器上组成集群。通过将数据复制到不同节点上,并使用Raft协议确保数据副本之间的强一致性,从而实现高可靠性和容错能力。

  2. 键值存储:etcd以类似字典(key-value)形式保存数据。每个key都与一个value相关联,并且可以根据key进行读取、写入或删除操作。

  3. 强一致性:通过Raft算法提供强一致性保证,在集群中所有节点之间达成共识以确保数据副本之间始终保持同步状态。

  4. 高可用:由于采用了分布式架构,当某些节点失效时,其他健康节点仍然能够正常工作并提供服务。这使得应用程序能够持续访问和更新存储在etcd中的信息。

  5. 监视功能:除了基本CRUD操作外,etcd还提供了监视功能,允许应用程序监听特定键的更改事件。这使得应用程序能够实时感知数据变化并做出相应的响应。

  6. 安全性:etcd支持基于TLS(传输层安全)的加密通信,并提供身份验证和授权机制来保护数据的安全性。

3. 端口介绍

  1. 端口 2379 是 etcd 的客户端监听端口。当你想要与 etcd 进行交互时(例如读取或写入键值对),需要使用这个端口来连接到 etcd 实例。
  2. 端口 2380 是 etcd 的对等节点通信监听端口。etcd 集群中的各个节点之间通过这个端口进行通信和同步数据。

二、etcd安装教程(单机版)

开始安装之前检查节点是否可以访问到github,若不能访问,解决方法如下:

此shell脚本执行后会自动安装并启动 etcd。

1. 复制脚本

首先,将以下脚本内容复制并保存为/tmp/install_etcd.sh文件。

#!/bin/bash

ETCD_VERSION='3.5.4'
ETCD_INSTALLDIR='/opt/module/etcd'

install_etcd() {
  local etcd_name="etcd-v${1}-linux-amd64"
  local etcd_url="https://github.com/etcd-io/etcd/releases/download/v${1}/etcd-v${1}-linux-amd64.tar.gz"
  if [ -z "$(command -v etcd)" ]; then
    if [ ! -d "${2}" ]; then
      mkdir -p "${2}"
    fi
    if [ ! -f /tmp/"${etcd_name}".tar.gz ]; then
      wget "$etcd_url" -P /tmp
      if [ $? -ne 0 ]; then
        echo "${etcd_name}.tar.gz下载失败,请重试或手动下载到/tmp目录下再次执行"
        echo "下载地址:$etcd_url"
        exit 1
      fi
    fi
    if [ -d "${2}/${etcd_name}" ]; then
      rm -rf "${2}/${etcd_name}"
    fi
    tar -zxvf /tmp/etcd-v"${1}"-linux-amd64.tar.gz -C "${2}"
    sudo cp -a "${2}"/etcd-v"${1}"-linux-amd64/etcd "${2}"/etcd-v"${1}"-linux-amd64/etcdctl /usr/bin/
    nohup "${2}"/etcd-v"${1}"-linux-amd64/etcd >/tmp/etcd.log 2>&1 &
  fi
}

install_etcd $ETCD_VERSION $ETCD_INSTALLDIR

exit 0

2. 增加执行权限

在终端中执行以下命令,为脚本添加执行权限。

chmod a+x /tmp/install_etcd.sh

3. 执行脚本

执行以下命令,运行脚本开始下载、安装和配置Apisix。

/tmp/install_etcd.sh

请等待安装完成,如有异常会有提示。

4. 查看启动状态

etcdctl member list

返回结果如下所示,started表示已启动。

[root@hadoop103 ~]# etcdctl member list
8e9e05c52164694d, started, default, http://localhost:2380, http://localhost:2379, false

5. 卸载etcd

删除对应文件和目录即可。

rm -rf /root/default.etcd
rm -rf /root/etcd01.etcd
rm -rf /usr/bin/etcd
rm -rf /usr/bin/etcdctl
rm -rf /usr/lib/firewalld/services/etcd-client.xml
rm -rf /usr/lib/firewalld/services/etcd-server.xml
rm -rf /opt/module/etcd

三、etcd安装教程(集群版)

集群版安装之前,先准备好三个节点。并已经设置好集群免密登录。

在这里,准备的集群节点为:192.168.145.103192.168.145.104192.168.145.105

1. 复制脚本

首先,在192.168.145.103节点将以下脚本内容复制并保存为/tmp/install_etcd.sh文件。

#!/bin/bash

ETCD_VERSION='3.5.4'
ETCD_INSTALLDIR='/opt/module/etcd'

install_etcd() {
  local etcd_name="etcd-v${1}-linux-amd64"
  local etcd_url="https://github.com/etcd-io/etcd/releases/download/v${1}/etcd-v${1}-linux-amd64.tar.gz"
  if [ -z "$(command -v etcd)" ]; then
    if [ ! -d "${2}" ]; then
      mkdir -p "${2}"
    fi
    if [ ! -f /tmp/"${etcd_name}".tar.gz ]; then
      wget "$etcd_url" -P /tmp
      if [ $? -ne 0 ]; then
        echo "${etcd_name}.tar.gz下载失败,请重试或手动下载到/tmp目录下再次执行"
        echo "下载地址:$etcd_url"
        exit 1
      fi
    fi
    if [ -d "${2}/${etcd_name}" ]; then
      rm -rf "${2}/${etcd_name}"
    fi
    tar -zxvf /tmp/etcd-v"${1}"-linux-amd64.tar.gz -C "${2}"
    sudo cp -a "${2}"/etcd-v"${1}"-linux-amd64/etcd "${2}"/etcd-v"${1}"-linux-amd64/etcdctl /usr/bin/
    # nohup "${2}"/etcd-v"${1}"-linux-amd64/etcd >/tmp/etcd.log 2>&1 &
  fi
}

install_etcd $ETCD_VERSION $ETCD_INSTALLDIR

exit 0

2. 增加执行权限

在终端中执行以下命令,为脚本添加执行权限。

chmod a+x /tmp/install_etcd.sh

3. 分发脚本

使用scp命令把脚本分发到192.168.145.104192.168.145.105节点。

scp /tmp/install_etcd.sh 192.168.145.104:/tmp/
scp /tmp/install_etcd.sh 192.168.145.105:/tmp/

4. 执行脚本

192.168.145.103节点执行以下命令,开始在三个节点分别运行脚本,开始下载和安装etcd。

/tmp/install_etcd.sh
ssh 192.168.145.104 /tmp/install_etcd.sh
ssh 192.168.145.105 /tmp/install_etcd.sh

请等待安装完成,如有异常会有提示。

5. 启动etcd新集群

5.1 复制脚本

将以下脚本内容复制并保存为/tmp/etcd_start_info.sh文件。
需要把etcd集群节点更换为自己的集群节点。

#!/bin/bash

# etcd集群节点
node1=192.168.145.103
node2=192.168.145.104
node3=192.168.145.105

# etcd版本
ETCD_VERSION='3.5.4'
# etcd安装目录
ETCD_INSTALLDIR='/opt/module/etcd'

nodes=($node1 $node2 $node3)

for node in "${nodes[@]}"
do
  echo "复制下面脚本到 $node 执行启动etcd"
  echo "nohup \\
etcd --name etcd$(echo $node | awk -F '.' '{print $NF}') --initial-advertise-peer-urls http://$node:2380 \\
  --listen-peer-urls http://$node:2380 \\
  --listen-client-urls http://$node:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls http://$node:2379 \\
  --data-dir $ETCD_INSTALLDIR/etcd-v$ETCD_VERSION-linux-amd64/data \\
  --initial-cluster-token etcd-cluster-1 \\
  --initial-cluster etcd$(echo $node1 | awk -F '.' '{print $NF}')=http://$node1:2380,etcd$(echo $node2 | awk -F '.' '{print $NF}')=http://$node2:2380,etcd$(echo $node3 | awk -F '.' '{print $NF}')=http://$node3:2380 \\
  --initial-cluster-state new \\
  --auto-tls \\
  --peer-auto-tls \\
  > /tmp/etcd.log 2>&1 &"
  echo "-----------------------------------------------------------------------"
done

exit 0

5.2 增加执行权限

在终端中执行以下命令,为脚本添加执行权限。

chmod a+x /tmp/etcd_start_info.sh

5.3 执行脚本

执行此脚本后会打印集群的启动命令,然后根据打印的启动命令,分别复制到三个节点执行启动etcd集群。

/tmp/etcd_start_info.sh

执行后结果如下图所示:

etcd自动化安装配置教程-LMLPHP

5.4 查看启动状态

etcdctl member list

返回结果如下所示,started表示已启动。

[root@hadoop103 ~]# etcdctl member list
d1ba583667016d5, started, etcd103, http://192.168.145.103:2380, http://192.168.145.103:2379, false
1fdc35df8ab0c538, started, etcd105, http://192.168.145.105:2380, http://192.168.145.105:2379, false
68d20b112ee2f6c4, started, etcd104, http://192.168.145.104:2380, http://192.168.145.104:2379, false

6. 启动已存在的etcd集群

6.1 复制脚本

将以下脚本内容复制并保存为/tmp/etcd_start_info.sh文件。
需要把etcd集群节点更换为自己的集群节点。
与上面一个脚本不同的是--initial-cluster-state existing,这里的初始化集群状态是已存在。

#!/bin/bash

# etcd集群节点
node1=192.168.145.103
node2=192.168.145.104
node3=192.168.145.105

# etcd版本
ETCD_VERSION='3.5.4'
# etcd安装目录
ETCD_INSTALLDIR='/opt/module/etcd'

nodes=($node1 $node2 $node3)

for node in "${nodes[@]}"
do
  echo "复制下面脚本到 $node 执行启动etcd"
  echo "nohup \\
etcd --name etcd$(echo $node | awk -F '.' '{print $NF}') --initial-advertise-peer-urls http://$node:2380 \\
  --listen-peer-urls http://$node:2380 \\
  --listen-client-urls http://$node:2379,http://127.0.0.1:2379 \\
  --advertise-client-urls http://$node:2379 \\
  --data-dir $ETCD_INSTALLDIR/etcd-v$ETCD_VERSION-linux-amd64/data \\
  --initial-cluster-token etcd-cluster-1 \\
  --initial-cluster etcd$(echo $node1 | awk -F '.' '{print $NF}')=http://$node1:2380,etcd$(echo $node2 | awk -F '.' '{print $NF}')=http://$node2:2380,etcd$(echo $node3 | awk -F '.' '{print $NF}')=http://$node3:2380 \\
  --initial-cluster-state existing \\
  --auto-tls \\
  --peer-auto-tls \\
  > /tmp/etcd.log 2>&1 &"
  echo "-----------------------------------------------------------------------"
done

exit 0

6.2 增加执行权限

在终端中执行以下命令,为脚本添加执行权限。

chmod a+x /tmp/etcd_start_info.sh

6.3 执行脚本

执行此脚本后会打印集群的启动命令,然后根据打印的启动命令,分别复制到三个节点执行启动etcd集群。

/tmp/etcd_start_info.sh

7. 停止集群

可以通过杀死集群节点对应的进程来停止。

kill -9 $(ps -ef | grep etcd | awk 'NR==1 {print $2}')

8. 卸载etcd

删除对应文件和目录即可。

rm -rf /root/default.etcd
rm -rf /root/etcd01.etcd
rm -rf /usr/bin/etcd
rm -rf /usr/bin/etcdctl
rm -rf /usr/lib/firewalld/services/etcd-client.xml
rm -rf /usr/lib/firewalld/services/etcd-server.xml
rm -rf /opt/module/etcd

四、etcd客户端命令

1. 语法

etcdctl [flags]

2. 命令

2.1 成员命令

2.1.1 查看成员列表
etcdctl member list

返回结果如下:
依次解释:成员ID、成员状态、成员名称、成员的节点通信端口、成员的客户端监听端口、是否是学习者(是否有投票权,学习者无投票权)。

[root@hadoop101 ~]# etcdctl member list
d1ba583667016d5, started, etcd01, http://192.168.145.103:2380, http://192.168.145.103:2379, false
1fdc35df8ab0c538, started, etcd03, http://192.168.145.105:2380, http://192.168.145.105:2379, false
68d20b112ee2f6c4, started, etcd02, http://192.168.145.104:2380, http://192.168.145.104:2379, false
2.1.2 更新成员
etcdctl member update <memberID> [options] [flags]

示例:修改成员ID为 d1ba583667016d5 的 peerURLs 值

etcdctl member update d1ba583667016d5 --peer-urls=http://hadoop101:2380
2.1.3 删除成员

删除成员后,目标成员将自动停止。删除领导者是安全的,但是在选举新领导者时,集群将处于非活动状态。此持续时间通常是选举超时时间加上投票过程时间。

etcdctl member remove <memberID> [flags]

示例:删除ID为 1fdc35df8ab0c538 的成员

etcdctl member remove 1fdc35df8ab0c538
2.1.4 添加成员

添加的成员默认是未启动状态。如果添加多个成员,最佳做法是一次配置一个成员,并在添加更多新成员之前验证它是否正确启动。

etcdctl member add <memberName> [options] [flags]

示例:将192.168.145.105添加为成员

etcdctl member add etcd03 --peer-urls=http://192.168.145.105:2380

返回结果如下,添加之后,etcdctl会将新成员通知集群,并打印出成功启动该成员所需的环境变量。

[root@hadoop101 ~]# etcdctl member add etcd03 --peer-urls=http://192.168.145.105:2380
Member 5c48c1ac9bc63420 added to cluster a479f5112595b52a

ETCD_NAME="etcd03"
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.145.103:2380,etcd03=http://192.168.145.105:2380,etcd02=http://192.168.145.104:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.145.105:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"

然后使用提示的环境变量来启动成员。etcd默认的数据目录是 /var/lib/etcd。

export ETCD_NAME="etcd03"
export ETCD_INITIAL_CLUSTER="etcd01=http://192.168.145.103:2380,etcd03=http://192.168.145.105:2380,etcd02=http://192.168.145.104:2380"
export ETCD_INITIAL_CLUSTER_STATE="existing"
etcd --listen-client-urls http://192.168.145.105:2379 --advertise-client-urls http://192.168.145.105:2379 --listen-peer-urls http://192.168.145.105:2380 --initial-advertise-peer-urls http://192.168.145.105:2380 --data-dir /opt/module/etcd/etcd-v3.5.4-linux-amd64/data
2.1.5 添加成员为学习者

示例:将192.168.145.105添加为学习者(无投票权)

etcdctl member add etcd03 --peer-urls=http://192.168.145.105:2380 --learner

返回结果如下:

[root@hadoop101 ~]# etcdctl member add etcd03 --peer-urls=http://192.168.145.105:2380 --learner
Member ee78e1bfdc50b692 added to cluster a479f5112595b52a

ETCD_NAME="etcd03"
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.145.103:2380,etcd02=http://192.168.145.104:2380,etcd03=http://192.168.145.105:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.145.105:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"

然后使用提示的环境变量来启动成员。

export ETCD_NAME="etcd03"
export ETCD_INITIAL_CLUSTER="etcd01=http://192.168.145.103:2380,etcd03=http://192.168.145.105:2380,etcd02=http://192.168.145.104:2380"
export ETCD_INITIAL_CLUSTER_STATE="existing"
etcd --listen-client-urls http://192.168.145.105:2379 --advertise-client-urls http://192.168.145.105:2379 --listen-peer-urls http://192.168.145.105:2380 --initial-advertise-peer-urls http://192.168.145.105:2380 --data-dir /opt/module/etcd/etcd-v3.5.4-linux-amd64/data

将学习者提升为投票成员。

etcdctl member promote 1c9175de16617613

2.2 警报命令

2.3 认证命令

2.4 检查命令

2.5 节点检查命令

2.5.1 查看当前节点的健康状况
etcdctl endpoint health

返回结果如下:

[root@hadoop103 ~]# etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 9.168536ms
2.5.2 查看指定节点的健康状况
etcdctl --endpoints=192.168.145.103:2379 endpoint health

返回结果如下:

[root@hadoop103 ~]# etcdctl --endpoints=192.168.145.103:2379 endpoint health
192.168.145.103:2379 is healthy: successfully committed proposal: took = 25.982594ms
2.5.3 查看指定节点的状态信息
etcdctl --endpoints=192.168.145.103:2379 endpoint status

返回结果如下:

[root@hadoop103 ~]# etcdctl --endpoints=192.168.145.103:2379 endpoint status
192.168.145.103:2379, d1ba583667016d5, 3.5.4, 78 kB, false, false, 17, 269, 269, 

2.6 租赁命令

2.7 角色命令

2.8 快照命令

2.9 用户命令

2.10 其他命令

3. 选项


五、etcd调优

1. 时间参数调优

etcd依赖于两个独立的时间参数,分别是心跳间隔(heartbeat-interval,默认100ms)和选举超时时间(
election-timeout,默认1000ms)。 对于一个集群,心跳间隔和选举超时值应相同。为 etcd 成员设置不同的值可能会破坏集群稳定性。

etcd --heartbeat-interval=100 --election-timeout=500

ETCD_HEARTBEAT_INTERVAL=100 ETCD_ELECTION_TIMEOUT=500 etcd

2. 快照调优

etcd 会将所有关键更改附加到日志文件中。日志将会无限增长,并且是对密钥所做的每次更改的完整线性历史记录。完整的历史记录适用于使用较少的集群,但使用频繁的集群会携带大量日志。
为了避免产生大量的日志,etcd 会定期制作快照。这些快照为 etcd 提供了一种通过保存系统当前状态和删除旧日志来压缩日志的方法。
snapshot-count:更改次数,默认10000次。 如果 etcd 的内存使用率和磁盘使用率过高,可以通过设置snapshot-count参数来降低快照阈值:

etcd --snapshot-count=5000

ETCD_SNAPSHOT_COUNT=5000 etcd

3. 磁盘调优

etcd 集群对磁盘延迟非常敏感,可以对etcd设置线程高优先级。

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

4. 网络调优

如果 etcd leader 处理大量并发客户端请求,可能会因网络拥塞而延迟处理 follower peer 请求。这表现为在从属节点上发送缓冲区错误消息:

dropped MsgProp to 247ae21ff9436b2d since streamMsg's sending buffer is full
dropped MsgAppResp to 247ae21ff9436b2d since streamMsg's sending buffer is full

这些错误可以通过将 etcd 的对等流量优先于其客户端流量来解决。使用流量控制机制对对等流量进行优先级排序:

tc qdisc add dev eth0 root handle 1: prio bands 3
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip sport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 match ip dport 2380 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip sport 2379 0xffff flowid 1:1
tc filter add dev eth0 parent 1: protocol ip prio 2 u32 match ip dport 2379 0xffff flowid 1:1

要取消 ,请执行:

tc qdisc del dev eth0 root

5. CPU调优

由于 etcd 对延迟非常敏感,因此可以通过将 CPU 调控器设置为性能或保守模式来进一步优化 Linux 系统的性能。

echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor

总结

在本文中我们学习到:

  • etcd是一个分布式键值存储系统,具有高可用性和数据一致性。
  • etcd支持通过Raft算法实现强一致性保证。
  • etcd具有分布式架构,在节点失效时仍然可以正常工作并提供服务。
  • etchd除基本CRUD操作外还支持监视功能来实时感知数据变化。
  • 安全方面,etchd支持加密通信,并提供身份验证和授权机制保护数据安全。

同时我们也学习到如何在单机环境或者多节点环境下安装etcd,并了解了一些常用的etcd客户端命令和选项。

最后,我们还提供了一些性能调优建议,包括时间参数调优、快照调优、磁盘调优、网络调优和中央处理器设置等方面的建议。

希望本教程对您有所帮助!如有任何疑问或问题,请随时在评论区留言。感谢阅读!

参考链接:

02-01 06:40