etcdv3 集群的搭建和使用

简介:

  etcd是一个开源的分布式键值对数据库,他的每一个节点都有一份数据的copy,当有节点故障时保证了高可用性。etcd使用Raft算法来保证一致性。

  第一次接触etcd是在学习k8s时。k8s用etcd做的服务发现。后来在开发一个分布式系统时需要用到服务发现,就想试一下用etcd做服务发现。效果还是很不错的。

  这篇讲一下etcd集群的搭建和使用。

集群的节点个数和容错

  官方推荐的集群个数为奇数个,如图当节点为3个和为4个时的容错都是1, 节点5个和6个时,容错为2...

  集群的节点越多,容错性会越强,但是数据的同步份数也会越多,写性能会变差一些。合理的集群大小,就是平衡容错性和可写性。

 

安装集群 

  准备三台服务器  

服务器信息
172.31.43.166
etcd0
172.31.43.114
etcd1
172.31.34.237
etcd2

 

 

 

 

 

 

  分别在三台服务器上下载etcd。这里下载的是版本3.3.8

复制代码
ETCD_VER=v3.3.8

GITHUB_URL=https://github.com/coreos/etcd/releases/download
DOWNLOAD_URL=${GITHUB_URL}

rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
rm -rf /tmp/etcd-download-test && mkdir -p /tmp/etcd-download-test

curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz
tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/etcd-download-test --strip-components=1
rm -f /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz

/tmp/etcd-download-test/etcd --version
ETCDCTL_API=3 /tmp/etcd-download-test/etcdctl version
复制代码

   然后将两个文件都放到系统可执行目录 /usr/local/bin/ 或 /usr/bin/

cd /tmp/etcd-download-test
sudo cp etcd* /usr/local/bin/

   创建一个文件夹用来保存etcd的数据

sudo mkdir -p /data/etcd
sudo chown -R root:$(whoami) /data/etcd
sudo chmod -R a+rw /data/etcd

  在这里我使用static方式去搭建服务。

  编写systemd服务文件,分别在每台机器上编写服务文件:

复制代码

cat > /tmp/etcd0.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service
Conflicts=etcd2.service

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0

ExecStart=/usr/local/bin/etcd --name etcd0 \
--data-dir /data/etcd \
--initial-advertise-peer-urls http://172.31.43.166:2380 \
--listen-peer-urls http://172.31.43.166:2380 \
--listen-client-urls http://172.31.43.166:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://172.31.43.166:2379 \
--initial-cluster-token etcd-cluster-pro \
--initial-cluster etcd0=http://172.31.43.166:2380,etcd1=http://172.31.43.114:2380,etcd2=http://172.31.34.237:2380 \
--initial-cluster-state new

[Install]
WantedBy=multi-user.target
EOF
sudo mv /tmp/etcd0.service /etc/systemd/system/etcd0.service

复制代码

 

复制代码

cat > /tmp/etcd1.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service
Conflicts=etcd2.service

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0

ExecStart=/usr/local/bin/etcd --name etcd1 \
--data-dir /data/etcd \
--initial-advertise-peer-urls http://172.31.43.114:2380 \
--listen-peer-urls http://172.31.43.114:2380 \
--listen-client-urls http://172.31.43.114:2379,http://127.0.0.1:2379 \
--advertise-client-urls http://172.31.43.114:2379 \
--initial-cluster-token etcd-cluster-pro \
--initial-cluster etcd0=http://172.31.43.166:2380,etcd1=http://172.31.43.114:2380,etcd2=http://172.31.34.237:2380 \
--initial-cluster-state new

[Install]
WantedBy=multi-user.target
EOF
sudo mv /tmp/etcd1.service /etc/systemd/system/etcd1.service

复制代码

 

复制代码
cat > /tmp/etcd2.service <<EOF
[Unit]
Description=etcd
Documentation=https://github.com/coreos/etcd
Conflicts=etcd.service

[Service]
Type=notify
Restart=always
RestartSec=5s
LimitNOFILE=40000
TimeoutStartSec=0

ExecStart=/usr/local/bin/etcd -name etcd2 \
  --data-dir /data/etcd \
  --initial-advertise-peer-urls http://172.31.34.237:2380 \
  --listen-peer-urls http://172.31.34.237:2380 \
  --listen-client-urls http://172.31.34.237:2379,http://127.0.0.1:2379 \
  --advertise-client-urls http://172.31.34.237:2379 \
  --initial-cluster-token etcd-cluster-pro \
  --initial-cluster etcd0=http://172.31.43.166:2380,etcd1=http://172.31.43.114:2380,etcd2=http://172.31.34.237:2380 \
  --initial-cluster-state new

[Install]
WantedBy=multi-user.target
EOF
sudo mv /tmp/etcd2.service /etc/systemd/system/etcd2.service
复制代码

  

下面是一些常用配置选项的说明:

--name:方便理解的节点名称,默认为 default,在集群中应该保持唯一
--data-dir:服务运行数据保存的路径,默认为 ${name}.etcd
--snapshot-count:指定有多少事务(transaction)被提交时,触发截取快照保存到磁盘
--heartbeat-interval:leader 多久发送一次心跳到 followers。默认值是 100ms
--eletion-timeout:重新投票的超时时间,如果follower在该时间间隔没有收到心跳包,会触发重新投票,默认为 1000 ms
--listen-peer-urls:和同伴通信的地址,比如 http://ip:2380,如果有多个,使用逗号分隔。需要所有节点都能够访问,所以不要使用 localhost
--advertise-client-urls:对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点
--listen-client-urls:对外提供服务的地址:比如 http://ip:2379,http://127.0.0.1:2379,客户端会连接到这里和etcd交互
--initial-advertise-peer-urls:该节点同伴监听地址,这个值会告诉集群中其他节点
--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;否则会导致多个集群之间的冲突,造成未知的错误

  所有以--init开头的配置都是在第一次启动etcd集群的时候才会用到,后续节点的重启会被忽略,如--initial-cluseter参数。所以当成功初始化了一个etcd集群以后,就不再需要这个参数或环境变量了。

  如果服务已经运行过就要把修改 --initial-cluster-state 为existing

  启用服务

复制代码
sudo systemctl daemon-reload
sudo systemctl enable etcd0.service
sudo systemctl start etcd0.service


sudo systemctl daemon-reload
sudo systemctl enable etcd1.service
sudo systemctl start etcd1.service

sudo systemctl daemon-reload
sudo systemctl enable etcd2.service
sudo systemctl start etcd2.service
复制代码

 

 查看 log:

复制代码
sudo systemctl status etcd0.service -l --no-pager
sudo journalctl -u etcd0.service -l --no-pager|less
sudo journalctl -f -u etcd0.service


sudo systemctl status etcd1.service -l --no-pager
sudo journalctl -u etcd1.service -l --no-pager|less
sudo journalctl -f -u etcd1service


sudo systemctl status etcd2.service -l --no-pager
sudo journalctl -u etcd2.service -l --no-pager|less
sudo journalctl -f -u etcd2.service
复制代码

 

暂停

复制代码
sudo systemctl stop etcd0.service
sudo systemctl disable etcd0.service

sudo systemctl stop etcd1.service
sudo systemctl disable etcd1.service

sudo systemctl stop etcd2.service
sudo systemctl disable etcd2.service
复制代码

 

 使用etcd

   我使用的etcd的api为v3版本。在使用命令时需要在前面加上ETCDCTL_API=3 

 如:查看集群成员

ETCDCTL_API=3 etcdctl member list

  可以看到有3个节点在线

集群状态

ETCDCTL_API=3  etcdctl   --endpoints 172.31.43.166:2379,172.31.34.237:2379,172.31.43.114:2379 endpoint status  --write-out="table"

 

 

操作数据

   使用put和get命令可以保存和得到数据.del删除数据

 

根据前缀查询

 ETCDCTL_API=3 etcdctl put test1 a
 ETCDCTL_API=3 etcdctl put test2 b
 ETCDCTL_API=3 etcdctl put test3 c
 ETCDCTL_API=3 etcdctl get --prefix test

 

查询所有数据

ETCDCTL_API=3 etcdctl get --from-key ""

 

 

 

 watch 监听

   watch 会监听key的变动 有变动时会在输出。这也正是服务发现需要使用的。

   我们监听 test键,然后对test执行修改和删除操作

ETCDCTL_API=3 etcdctl watch test

 

ETCDCTL_API=3 etcdctl put test abcde
ETCDCTL_API=3 etcdctl put test aaaa
 ETCDCTL_API=3 etcdctl del test

 

lead 租约

   etcd可以为key设置超时时间,但与redis不同,etcd需要先创建lease,然后使用put命令加上参数–lease=<lease ID>

 

ETCDCTL_API=3 lease grant  ttl    创建lease,返回lease ID ttl秒
ETCDCTL_API=3 lease revoke  leaseId  删除lease,并删除所有关联的key 
ETCDCTL_API=3 lease timetolive leaseId 取得lease的总时间和剩余时间 
ETCDCTL_API=3 lease keep-alive leaseId     keep-alive会不间断的刷新lease时间,从而保证lease不会过期。

分布式锁

 使用lock命令后加锁名称 做分布式锁,如果没有显示释放锁,其他地方只能等待。

 

etcdctl --endpoints=$ENDPOINTS lock mutex1

# 在另一个终端输入
etcdctl --endpoints=$ENDPOINTS lock mutex1

 

   

目录
相关文章
|
jenkins 持续交付
Jenkins配置角色权限和能够看到的jobs
Jenkins配置角色权限和能够看到的jobs
649 0
|
人工智能 自然语言处理 文字识别
DeepMind首发游戏AI智能体SIMA:开启虚拟世界的智能探索之旅
【4月更文挑战第3天】DeepMind推出了SIMA,一种能在多个3D环境中执行语言指令的智能体,标志着AI在理解和互动虚拟世界上的进步。SIMA通过多样化的训练数据学习导航、操作、决策等技能,并结合预训练模型处理高维度输入输出。尽管在复杂任务上仍有提升空间,SIMA展现了正向迁移能力和潜力,为AI研究和未来机器人技术铺平道路。然而,仍需解决鲁棒性、可控性、评估方法及道德安全问题。
630 4
DeepMind首发游戏AI智能体SIMA:开启虚拟世界的智能探索之旅
|
存储 Prometheus Kubernetes
OpenTelemetry 简析
OpenTelemetry 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方 vendor 无关的服务。 2021.02.10,OpenTelemetry 的 tracing spec 达到 1.0 版本 (link),基于这个里程碑,笔者对 OpenTelemetry 进行了探索,判断在可观测性领域带来的价值和发展前景。 下面给出笔者对 OpenTelemetry 的理解,抛砖引玉。由于笔者能力有限,理解不当的地方请大家指正。
OpenTelemetry 简析
|
5月前
|
机器学习/深度学习 监控 数据挖掘
基于YOLOv8的牛行为检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
本项目通过 YOLOv8 模型与 PyQt5 界面结合,实现了牛行为的高效识别与分类。5000张高质量标注数据保证了模型的准确性,多样化场景增强了泛化能力。系统简单易用,支持图片、视频、摄像头多种输入方式,为智能养殖和畜牧管理提供了高效工具。无论是科研实验还是实际牧场监控,本项目都可快速部署,开箱即用。
基于YOLOv8的牛行为检测识别项目|完整源码数据集+PyQt5界面+完整训练流程+开箱即用!
|
Java 测试技术 数据库连接
Spring Boot中的嵌入式数据库使用
Spring Boot中的嵌入式数据库使用
|
Java Spring
SpringBoot 项目打成 jar 后,如何加载外部的配置文件?
SpringBoot 项目打成 jar 后,如何加载外部的配置文件?
2398 0
|
Linux KVM 虚拟化
10-25|我只想可以修改容器内的时间而不影响外部时间怎么办啊
10-25|我只想可以修改容器内的时间而不影响外部时间怎么办啊
|
Ubuntu Shell Linux
9-16|libfaketime例子
9-16|libfaketime例子
|
存储 安全 Android开发
怎样找回删除的照片?照片恢复完整教程
不小心删除了重要的照片会让人头疼,幸运的是,很多时候我可以进行照片恢复。今天会给大家讨论一下删除照片恢复的概率,并且提供几个有效的照片恢复方法,帮助大家应对照片丢失问题。
怎样找回删除的照片?照片恢复完整教程
|
SQL 缓存 运维
使用篇丨链路追踪(Tracing)很简单:链路拓扑
使用篇丨链路追踪(Tracing)很简单:链路拓扑
32082 103