文章目录
- 前言
- 一、简介
- 1. 简介
- 2. 特点
- 3. 端口介绍
- 二、etcd安装教程(单机版)
- 1. 复制脚本
- 2. 增加执行权限
- 3. 执行脚本
- 4. 查看启动状态
- 5. 卸载etcd
- 三、etcd安装教程(集群版)
- 1. 复制脚本
- 2. 增加执行权限
- 3. 分发脚本
- 4. 执行脚本
- 5. 启动etcd新集群
- 5.1 复制脚本
- 5.2 增加执行权限
- 5.3 执行脚本
- 5.4 查看启动状态
- 6. 启动已存在的etcd集群
- 6.1 复制脚本
- 6.2 增加执行权限
- 6.3 执行脚本
- 7. 停止集群
- 8. 卸载etcd
- 四、etcd客户端命令
- 1. 语法
- 2. 命令
- 2.1 成员命令
- 2.1.1 查看成员列表
- 2.1.2 更新成员
- 2.1.3 删除成员
- 2.1.4 添加成员
- 2.1.5 添加成员为学习者
- 2.2 警报命令
- 2.3 认证命令
- 2.4 检查命令
- 2.5 节点检查命令
- 2.5.1 查看当前节点的健康状况
- 2.5.2 查看指定节点的健康状况
- 2.5.3 查看指定节点的状态信息
- 2.6 租赁命令
- 2.7 角色命令
- 2.8 快照命令
- 2.9 用户命令
- 2.10 其他命令
- 3. 选项
- 五、etcd调优
- 1. 时间参数调优
- 2. 快照调优
- 3. 磁盘调优
- 4. 网络调优
- 5. CPU调优
- 总结
前言
本文介绍了etcd的基本概念、特点和端口介绍。然后提供了etcd安装教程,包括单机版和集群版的安装步骤。对于集群版,还详细说明了如何添加成员、删除成员以及启动已存在的etcd集群等操作。接下来列举了一些常用的etcd客户端命令,并给出了选项说明。
最后,针对性能调优方面,提供了时间参数调优、快照调优、磁盘调优、网络调优和中央处理器设置等建议。
希望这篇文章能够帮助您理解并使用etcd分布式键值存储系统。
一、简介
1. 简介
etcd是一个分布式键值存储系统,用于存储分布式系统中最关键的数据,由CoreOS开发并作为开源项目进行维护。它使用Raft一致性算法来实现高可用性和数据一致性,并提供了简单的HTTP
API用于读取、写入和观察存储在其上的键值对。
2. 特点
-
分布式:etcd被设计为一个分布式系统,可以运行在多台机器上组成集群。通过将数据复制到不同节点上,并使用Raft协议确保数据副本之间的强一致性,从而实现高可靠性和容错能力。
-
键值存储:etcd以类似字典(key-value)形式保存数据。每个key都与一个value相关联,并且可以根据key进行读取、写入或删除操作。
-
强一致性:通过Raft算法提供强一致性保证,在集群中所有节点之间达成共识以确保数据副本之间始终保持同步状态。
-
高可用:由于采用了分布式架构,当某些节点失效时,其他健康节点仍然能够正常工作并提供服务。这使得应用程序能够持续访问和更新存储在etcd中的信息。
-
监视功能:除了基本CRUD操作外,etcd还提供了监视功能,允许应用程序监听特定键的更改事件。这使得应用程序能够实时感知数据变化并做出相应的响应。
-
安全性:etcd支持基于TLS(传输层安全)的加密通信,并提供身份验证和授权机制来保护数据的安全性。
3. 端口介绍
- 端口 2379 是 etcd 的客户端监听端口。当你想要与 etcd 进行交互时(例如读取或写入键值对),需要使用这个端口来连接到 etcd 实例。
- 端口 2380 是 etcd 的对等节点通信监听端口。etcd 集群中的各个节点之间通过这个端口进行通信和同步数据。
二、etcd安装教程(单机版)
开始安装之前检查节点是否可以访问到github,若不能访问,解决方法如下:
- Windows和Linux访问不了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.103
、192.168.145.104
、192.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.104
和192.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
执行后结果如下图所示:
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 成员命令
作用 | 命令 |
---|---|
在目标etcd集群上创建镜像 | etcdctl make-mirror |
向集群中添加成员 | etcdctl member add |
列出集群中的所有成员 | etcdctl member list |
提升集群中无投票权的成员 | etcdctl member promote |
从集群中移除成员 | etcdctl member remove |
更新集群中的成员 | etcdctl member update |
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 警报命令
作用 | 命令 |
---|---|
解除所有警报 | etcdctl alarm disarm |
列出所有告警 | etcdctl alarm list |
2.3 认证命令
作用 | 命令 |
---|---|
禁用验证 | etcdctl auth disable |
支持身份验证 | etcdctl auth enable |
返回认证状态 | etcdctl auth status |
2.4 检查命令
作用 | 命令 |
---|---|
检查给定服务器端点上不同工作负载保存数据的内存使用情况 | etcdctl check datascale |
检查etcd集群性能 | etcdctl check perf |
2.5 节点检查命令
作用 | 命令 |
---|---|
打印–endpoints中每个端点的KV历史散列 | etcdctl endpoint hashkv |
检查`–endpoint`标志中指定的端点的健康状况 | etcdctl endpoint health |
输出`–endpoint`标志中指定的端点的状态 | etcdctl endpoint status |
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
或
etcdctl --endpoints=192.168.145.103:2379,192.168.145.104:2379,192.168.145.105: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 = 6.77289ms
[root@hadoop103 ~]# etcdctl --endpoints=192.168.145.103:2379,192.168.145.104:2379,192.168.145.105:2379 endpoint health
192.168.145.103:2379 is healthy: successfully committed proposal: took = 14.523788ms
192.168.145.105:2379 is healthy: successfully committed proposal: took = 14.921994ms
192.168.145.104:2379 is healthy: successfully committed proposal: took = 23.501004ms
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 租赁命令
作用 | 命令 |
---|---|
创建租赁 | etcdctl lease grant |
保持租约有效(续期) | etcdctl lease keep-alive |
列出所有有效租约 | etcdctl lease list |
撤销租赁 | etcdctl lease revoke |
获取租赁信息 | etcdctl lease timetolive |
2.7 角色命令
作用 | 命令 |
---|---|
添加新角色 | etcdctl role add |
删除角色 | etcdctl role delete |
获取角色的详细信息 | etcdctl role get |
向角色授予密钥 | etcdctl role grant-permission |
列出所有角色 | etcdctl role list |
从角色中撤销密钥 | etcdctl role revoke-permission |
2.8 快照命令
作用 | 命令 |
---|---|
将etcd成员快照恢复到etcd目录 | etcdctl snapshot restore |
将etcd节点后端快照存储到给定文件 | etcdctl snapshot save |
获取给定文件的后端快照状态 | etcdctl snapshot status |
2.9 用户命令
作用 | 命令 |
---|---|
添加新用户 | etcdctl user add |
删除用户 | etcdctl user delete |
获取用户的详细信息 | etcdctl user get |
将角色授予用户 | etcdctl user grant-role |
列出所有用户 | etcdctl user list |
修改用户密码 | etcdctl user passwd |
从用户中撤销角色 | etcdctl user revoke-role |
2.10 其他命令
作用 | 命令 |
---|---|
在etc中压缩事件历史 | etcdctl compaction |
对具有给定端点的etcd成员的存储进行碎片整理 | etcdctl defrag |
删除指定的键或键的范围[key, range_end] | etcdctl del |
观察并参与领导选举 | etcdctl elect |
获取键或键的范围 | etcdctl get |
关于任何命令的帮助 | etcdctl help |
获取命名锁 | etcdctl lock |
将领导权转移到另一个etcd集群成员。 | etcdctl move-leader |
将给定的键放入存储中 | etcdctl put |
Txn在一个事务中处理所有请求 | etcdctl txn |
打印etcdctl的版本 | etcdctl version |
监视键或前缀上的事件流 | etcdctl watch |
3. 选项
作用 | 选项 |
---|---|
使用此CA包验证启用tls的安全服务器的证书 | –cacert=“” |
使用此TLS证书文件识别安全客户端 | –cert=“” |
短命令超时(不包括拨号超时) | –command-timeout=5s |
启用客户端调试日志 | –debug[=false] |
为客户端连接拨超时 | –dial-timeout=2s |
查询描述集群端点的SRV记录 | -d, --discovery-srv=“” |
使用DNS发现时要查询的服务名称 | –discovery-srv-name=“” |
gRPC端点 | –endpoints=[127.0.0.1:2379] |
帮助etcdctl | -h, --help[=false] |
将字节字符串打印为十六进制编码字符串 | –hex[=false] |
接受描述集群端点的不安全SRV记录 | –insecure-discovery[=true] |
跳过服务器证书验证(注意:此选项应仅用于测试目的) | –insecure-skip-tls-verify[=false] |
禁用客户端连接的传输安全性 | –insecure-transport[=true] |
客户端连接的保持连接时间 | –keepalive-time=2s |
客户端连接的Keepalive超时 | –keepalive-timeout=6s |
使用此TLS密钥文件识别安全客户端 | –key=“” |
身份验证的密码(如果使用了这个选项,——user选项不应该包含Password) | –password=“” |
用户名[:密码]用于身份验证(如果未提供密码则提示) | –user=“” |
设置输出格式(fields, json, protobuf, simple, table) | -w, --write-out=“simple” |
五、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客户端命令和选项。
最后,我们还提供了一些性能调优建议,包括时间参数调优、快照调优、磁盘调优、网络调优和中央处理器设置等方面的建议。
希望本教程对您有所帮助!如有任何疑问或问题,请随时在评论区留言。感谢阅读!
参考链接:
- etcd集群部署
- etcd配置选项
- etcd官方文档