![](/contact/xiaochengxu.jpg)
![](/contact/xiaohongshu.jpg)
etcd 集群配置
在每个 etcd 节点上,指定集群成员:
TOKEN=token-01
CLUSTER_STATE=new
NAME_1=machine-1
NAME_2=machine-2
NAME_3=machine-3
HOST_1=10.240.0.17
HOST_2=10.240.0.18
HOST_3=10.240.0.19
CLUSTER=${NAME_1}=http://${HOST_1}:2380,${NAME_2}=http://${HOST_2}:2380,${NAME_3}=http://${HOST_3}:2380
在每台计算机上运行以下命令:
# For machine 1
THIS_NAME=${NAME_1}
THIS_IP=${HOST_1}
etcd --data-dir=data.etcd
--name ${THIS_NAME} \
--initial-advertise-peer-urls http://${THIS_IP}:2380 \
--advertise-client-urls http://${THIS_IP}:2379 \
--listen-client-urls http://${THIS_IP}:2379 \
--listen-peer-urls http://${THIS_IP}:2380 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} \
--initial-cluster-token ${TOKEN}
# For machine 2
THIS_NAME=${NAME_2}
THIS_IP=${HOST_2}
etcd --data-dir=data.etcd \
--name ${THIS_NAME} \
--initial-advertise-peer-urls http://${THIS_IP}:2380 \
--advertise-client-urls http://${THIS_IP}:2379 \
--listen-client-urls http://${THIS_IP}:2379 \
--listen-peer-urls http://${THIS_IP}:2380 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} \
--initial-cluster-token ${TOKEN}
# For machine 3
THIS_NAME=${NAME_3}
THIS_IP=${HOST_3}
etcd --data-dir=data.etcd \
--name ${THIS_NAME} \
--initial-advertise-peer-urls http://${THIS_IP}:2380
--advertise-client-urls http://${THIS_IP}:2379
--listen-client-urls http://${THIS_IP}:2379 \
--listen-peer-urls http://${THIS_IP}:2380 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} \
--initial-cluster-token ${TOKEN}
参数说明:
listen-client-urls
并 listen-peer-urls
指定 etcd 服务器绑定到的本地地址以接受传入连接。要侦听所有接口的端口,请指定 0.0.0.0
为侦听 IP 地址。
advertise-client-urls
并 initial-advertise-peer-urls
指定 etcd 客户端或其他 etcd 成员用于联系 etcd 服务器的地址。播发地址必须可从远程计算机访问。不要公布生产设置的地址, localhost
0.0.0.0
因为这些地址无法从远程计算机访问。
连接etcd
要使用 etcdctl 连接到 etcd:
export ETCDCTL_API=3
HOST_1=10.240.0.17
HOST_2=10.240.0.18
HOST_3=10.240.0.19
ENDPOINTS=$HOST_1:2379,$HOST_2:2379,$HOST_3:2379
etcdctl --endpoints=$ENDPOINTS member list
如何访问 etcd
访问 etcd 集群指南
put
要写入的命令:
etcdctl --endpoints=$ENDPOINTS put foo "Hello World!"
get
要从 etcd 中读取:
etcdctl --endpoints=$ENDPOINTS get foo
etcdctl --endpoints=$ENDPOINTS --write-out="json" get foo
如何模糊查询(按前缀获取值)
按前缀提取 etcd 键的指南
etcdctl --endpoints=$ENDPOINTS put web1 value1
etcdctl --endpoints=$ENDPOINTS put web2 value2
etcdctl --endpoints=$ENDPOINTS put web3 value3
etcdctl --endpoints=$ENDPOINTS get web --prefix
我们只需要在查询的关键字后面加上 --prefix
参数即可
删除key
删除 etcd 密钥的方法
etcdctl --endpoints=$ENDPOINTS put key myvalue
etcdctl --endpoints=$ENDPOINTS del key
etcdctl --endpoints=$ENDPOINTS put k1 value1
etcdctl --endpoints=$ENDPOINTS put k2 value2
etcdctl --endpoints=$ENDPOINTS del k --prefix
查看返回的结果 4,也就是我们删除了 4 个相关的 key
我们在来查看下:
❯ etcdctl --endpoints=$ENDPOINTS get web --prefix
❯
结果为空,也就是我们完全删除了相关的 key
事务中进行多次写入
事务性写入方法:
txn
要将多个请求包装到一个事务中,请执行以下操作:
etcdctl --endpoints=$ENDPOINTS put user1 bad
etcdctl --endpoints=$ENDPOINTS txn --interactive
compares:
value("user1") = "bad"
success requests (get, put, delete):
del user1
failure requests (get, put, delete):
put user1 good
事务解析:
启动事务:etcdctl --endpoints=$ENDPOINTS txn --interactive
输入条件:value("user1") = "bad"
如果条件满足:执行 success 下面的命令,del user1
删除 user1
如果条件不满足:执行 failure 的条件, 设置 put user1 good
user1 的值为 good
监听 key 值
使用 watch
获得未来变更的通知:
etcdctl --endpoints=$ENDPOINTS watch stock1
etcdctl --endpoints=$ENDPOINTS put stock1 1000
etcdctl --endpoints=$ENDPOINTS watch stock --prefix
etcdctl --endpoints=$ENDPOINTS put stock1 10
etcdctl --endpoints=$ENDPOINTS put stock2 20
如何创建租约
在 etcd
中创建租约的指南, 那什么是 etcd
的租约?
在 etcd
的lease
中 client
和 etcd server
之间存在一个约定,内容是 etcd server
保证在约定的有效期内(TTL),不会删除你关联到此 Lease
上的 key-value
。
若你未在有效期内续租,那么 etcd server
就会删除 Lease
和其关联的 key-value
。
# 生成一个 300s 的 lease 租约
etcdctl --endpoints=$ENDPOINTS lease grant 300
# lease 2be7547fbc6a5afa granted with TTL(300s)
# 给sample绑定租约
etcdctl --endpoints=$ENDPOINTS put sample value --lease=2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS get sample
# 给 2be7547fbc6a5afa 相关联的 key 续租
etcdctl --endpoints=$ENDPOINTS lease keep-alive 2be7547fbc6a5afa
# 删除租约 2be7547fbc6a5afa
etcdctl --endpoints=$ENDPOINTS lease revoke 2be7547fbc6a5afa
# 300s 后我们在获取 sample 查看他的值
etcdctl --endpoints=$ENDPOINTS get sample
etcd 如何创建锁
在etcd中创建分布式锁
lock
对于分布式锁:
etcdctl --endpoints=$ENDPOINTS lock mutex1
# 在另外一个terminal 执行获取锁的命令,则发生阻塞,知道其他客户端释放锁
etcdctl --endpoints=$ENDPOINTS lock mutex1
如何在 etcd 集群中进行 leader 选举
在 etcd 集群中进行 leader 选举的指南
elect
for leader election:
etcdctl --endpoints=$ENDPOINTS elect one p1
# 在另外的一个 terminal 中执行下面相同的命令,会发生阻塞
etcdctl --endpoints=$ENDPOINTS elect one p2
ps:为什么会阻塞?出于什么原因考虑?选举究竟是个什么意思?需要思考!!!
如何检查集群状态
etcd 集群状态检查指南
为每台计算机指定初始群集配置:
etcdctl --write-out=table --endpoints**=$ENDPOINTS endpoint status
+——————–+——————+———+———+———–+————+———–+————+——————–+——–+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +——————–+——————+———+———+———–+————+———–+————+——————–+——–+ | 192.168.2.128:2379 | 40ac7c5d0c1eee16 | 3.5.0 | 33 kB | true | false | 6 | 64 | 64 | | | 192.168.2.129:2379 | b13e39e86b04f6e7 | 3.5.0 | 25 kB | false | false | 6 | 64 | 64 | | | 192.168.2.130:2379 | 8e9d8b8febceee50 | 3.5.0 | 29 kB | false | false | 6 | 64 | 64 | | +——————–+——————+———+———+———–+————+———–+————+——————–+——–+
如何保存数据库
snapshot
要保存 etcd 数据库的时间点快照:
快照只能从一个 etcd 节点请求,因此 --endpoints
flag 应该只包含一个端点。
ENDPOINTS=$HOST_1:2379
etcdctl --endpoints=$ENDPOINTS snapshot save my.db
Snapshot saved at my.db
使用etcdctl --endpoints=192.168.2.128 snapshot status my.db --write-out=table
查看快照的状态
+---------+----------+------------+------------+
| HASH | REVISION | TOTAL KEYS | TOTAL SIZE |
+---------+----------+------------+------------+
| c55e8b8 | 9 | 13 | 25 kB |
+---------+----------+------------+------------+
如何添加和删除成员
member
要添加、删除、更新成员资格:
NAME_4=etcd-node-4
HOST_4=10.240.0.16 # new member
etcdctl --endpoints=${HOST_1}:2379,${HOST_2}:2379 \
member add ${NAME_4} \
--peer-urls=http://${HOST_4}:2380
在新节点的机器执行
THIS_NAME=${NAME_4}
THIS_IP=${HOST_4}
etcd --data-dir=data.etcd --name ${THIS_NAME} \
--initial-advertise-peer-urls http://${THIS_IP}:2380 \
--listen-peer-urls http://${THIS_IP}:2380 \
--advertise-client-urls http://${THIS_IP}:2379 \
--listen-client-urls http://${THIS_IP}:2379 \
--initial-cluster ${CLUSTER} \
--initial-cluster-state ${CLUSTER_STATE} \
--initial-cluster-token ${TOKEN}
https://etcd.io/docs/v3.5/tutorials/how-to-deal-with-membership/
ETCD 常见问题
- [ETCD 常见问题有哪些🤔?如何处理这些问题?](./ETCD 常见问题有哪些🤔?如何处理这些问题?)
这个系列的帖子
类似的帖子
![](/contact/xiaochengxu.jpg)
![](/contact/xiaohongshu.jpg)