前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >etcdv3 集群的搭建和使用

etcdv3 集群的搭建和使用

作者头像
lpxxn
发布2018-08-01 10:10:48
1K0
发布2018-08-01 10:10:48
举报
文章被收录于专栏:技术之路技术之路

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

代码语言:javascript
复制
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/

代码语言:javascript
复制
cd /tmp/etcd-download-test
sudo cp etcd* /usr/local/bin/

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

代码语言:javascript
复制
sudo mkdir -p /data/etcd
sudo chown -R root:$(whoami) /data/etcd
sudo chmod -R a+rw /data/etcd

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

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

代码语言:javascript
复制
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
代码语言:javascript
复制
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
代码语言:javascript
复制
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

  启用服务

代码语言:javascript
复制
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:

代码语言:javascript
复制
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

暂停

代码语言:javascript
复制
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 

 如:查看集群成员

代码语言:javascript
复制
ETCDCTL_API=3 etcdctl member list

  可以看到有3个节点在线

集群状态

代码语言:javascript
复制
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删除数据

根据前缀查询

代码语言:javascript
复制
 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

查询所有数据

代码语言:javascript
复制
ETCDCTL_API=3 etcdctl get --from-key ""

 watch 监听

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

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

代码语言:javascript
复制
ETCDCTL_API=3 etcdctl watch test
代码语言:javascript
复制
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命令后加锁名称 做分布式锁,如果没有显示释放锁,其他地方只能等待。

代码语言:javascript
复制
etcdctl --endpoints=$ENDPOINTS lock mutex1

# 在另一个终端输入
etcdctl --endpoints=$ENDPOINTS lock mutex1
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-07-06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 集群的节点个数和容错
  • 安装集群 
  •  使用etcd
  • 操作数据
  • 根据前缀查询
  • 查询所有数据
  •  watch 监听
  • lead 租约
  • 分布式锁
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档