etcd
Posted lshare
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了etcd相关的知识,希望对你有一定的参考价值。
etcd 是什么?(What is etcd)
etcd 是一个一致的分布式可靠的键值存储技术。可被用来做配置共享和服务发现。
- 开发语言:Go
- 共识算法:Raft
- 命名来源:表示分布式的
etc
目录,发音为/??tsi?di?/
。 - 使用的端口:2.0 后,使用 2379 作为外部客户端通信,使用 2380 作为内部服务间通信。
- 发起团队:CoreOS
安装
Linux 安装
curl -L https://github.com/coreos/etcd/releases/download/v3.3.1/etcd-v3.3.1-linux-amd64.tar.gz -o etcd-v3.3.1-linux-amd64.tar.gz
tar xzvf etcd-v3.3.1-linux-amd64.tar.gz
cd etcd-v3.3.1-linux-amd64
sudo cp etcd /usr/local/bin/
sudo cp etcdctl /usr/local/bin/
Mac 安装
# 安装
brew install etcd
# 验证安装
etcd -version
etcdctl -version
Docker 安装
参考 Running etcd under Docker - CoreOS 及 docker_practice/etcd/install :
# 使用 host IP
export ETCD_NODE1=127.0.0.1
# 安装 etcd
docker run --name etcd -p 2379:2379 -p 2380:2380 --volume=etcd-data:/etcd-data quay.io/coreos/etcd:latest /usr/local/bin/etcd --data-dir=/etcd-data --name node1 --initial-advertise-peer-urls http://$ETCD_NODE1:2380 --listen-peer-urls http://0.0.0.0:2380 --advertise-client-urls http://$ETCD_NODE1:2379 --listen-client-urls http://0.0.0.0:2379 --initial-cluster node1=http://$ETCD_NODE1:2380
# 进入etcd 命令行交互
docker exec -it etcd /bin/sh
# 验证安装
etcd -version
etcdctl -version
# 验证是否启动
curl http://127.0.0.1:2379/version
Docker Compose 快速部署
参考 Docker Compose 的使用说明,编辑 docker-compose.yml
文件如下:
version: "3.6"
services:
node1:
image: quay.io/coreos/etcd
volumes:
- node1-data:/etcd-data
expose:
- 2379
- 2380
networks:
cluster_net:
ipv4_address: 172.16.238.100
environment:
- ETCDCTL_API=3
command:
- /usr/local/bin/etcd
- --data-dir=/etcd-data
- --name
- node1
- --initial-advertise-peer-urls
- http://172.16.238.100:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --advertise-client-urls
- http://172.16.238.100:2379
- --listen-client-urls
- http://0.0.0.0:2379
- --initial-cluster
- node1=http://172.16.238.100:2380,node2=http://172.16.238.101:2380,node3=http://172.16.238.102:2380
- --initial-cluster-state
- new
- --initial-cluster-token
- docker-etcd
node2:
image: quay.io/coreos/etcd
volumes:
- node2-data:/etcd-data
networks:
cluster_net:
ipv4_address: 172.16.238.101
environment:
- ETCDCTL_API=3
expose:
- 2379
- 2380
command:
- /usr/local/bin/etcd
- --data-dir=/etcd-data
- --name
- node2
- --initial-advertise-peer-urls
- http://172.16.238.101:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --advertise-client-urls
- http://172.16.238.101:2379
- --listen-client-urls
- http://0.0.0.0:2379
- --initial-cluster
- node1=http://172.16.238.100:2380,node2=http://172.16.238.101:2380,node3=http://172.16.238.102:2380
- --initial-cluster-state
- new
- --initial-cluster-token
- docker-etcd
node3:
image: quay.io/coreos/etcd
volumes:
- node3-data:/etcd-data
networks:
cluster_net:
ipv4_address: 172.16.238.102
environment:
- ETCDCTL_API=3
expose:
- 2379
- 2380
command:
- /usr/local/bin/etcd
- --data-dir=/etcd-data
- --name
- node3
- --initial-advertise-peer-urls
- http://172.16.238.102:2380
- --listen-peer-urls
- http://0.0.0.0:2380
- --advertise-client-urls
- http://172.16.238.102:2379
- --listen-client-urls
- http://0.0.0.0:2379
- --initial-cluster
- node1=http://172.16.238.100:2380,node2=http://172.16.238.101:2380,node3=http://172.16.238.102:2380
- --initial-cluster-state
- new
- --initial-cluster-token
- docker-etcd
volumes:
node1-data:
node2-data:
node3-data:
networks:
cluster_net:
driver: bridge
ipam:
driver: default
config:
-
subnet: 172.16.238.0/24
etcdctl v3(主流)
Tip:可以通过
ETCDCTL_API=3 etcdctl -h
查看 v3 版本的命令行帮助页
(1)查看所有键值对
# 指定版本为 v3 且 key 前缀为空,也就是所有 key 了
ETCDCTL_API=3 etcdctl get --prefix=true ""
(2)put
ETCDCTL_API=3 etcdctl put /testdir/testkey "你好 etcd"
etcdctl v2(兼容)
Tip:可以通过
etcdctl -h
查看 v2 版本的命令行帮助页
(1)set
设置某个键的值,支持选项:
--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0)则永不超时
--swap-with-value value 若该键现在的值是 value,则进行设置操作
--swap-with-index '0' 若该键现在的索引值是指定索引,则进行设置操作
示例:
etcdctl set /testdir/testkey "Hello etcd"
(2)get
获取指定键的值,支持选项:
--sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性
示例:
etcdctl get /testdir/testkey
(3)update
更新某个键的值,支持选项:
--ttl '0' 该键值的超时时间(单位为秒),不配置(默认为 0)则永不超时
示例:
etcdctl update /testdir/testkey "你好 etcd"
(4)rm
删除某个键,支持选项:
--dir 删除空目录或键值对
--recursive, -r 删除当前键及其子键(当为目录时)
--with-value 当值匹配时删除
--with-index '0' 当索引匹配时删除
示例:
etcdctl rm /testdir/testkey --with-value "Hello etcd"
(5)ls
列出目录(默认为根目录 /
)下的键和子目录,默认不显示子目录中内容。支持选项:
--sort 将输出结果排序
--recursive 如果目录下有子目录,则递归输出其中的内容
-p 对于输出为目录,在最后添加 / 进行区分
示例:
etcdctl ls -r -p
集群操作
使用 member
命令进行 etcd 实例与集群的操作:
list
列出 etcd 集群中的所有实例add
添加 etcd 实例到集群中remove
从集群中删除 etcd 实例update
更新集群中的 etcd 实例
示例:
# v2
etcdctl member list
# v3
ETCDCTL_API=3 etcdctl member list
REST API (v2)
# 查看版本
curl http://127.0.0.1:2379/version
# get
curl http://127.0.0.1:2379/v2/keys/testdir/testkey
REST API (v3alpha)
HOST=http://ecp-etcd-7fbedb40ccf7b594.elb.us-east-1.amazonaws.com:2379
declare -A KV=(["config/http_server_port"]=8080 ["config/db_type"]="dynamo" ["config/aws_region"]="us-east-1" ["config/kafka_brokers"]="172.19.0.9:9092")
# show version
curl $HOST/version
# put key value
for k in $!KV[@]
do
key=$(echo -n $k | base64)
value=$(echo -n $KV[$k] | base64)
## delete key before
curl -L $HOST/v3alpha/kv/deleterange -X POST -d "\"key\": \"$key\""
## put new key and value
curl -L $HOST/v3alpha/kv/put -X POST -d "\"key\":\"$key\", \"value\": \"$value\""
done
# show all keys
curl -L $HOST/v3alpha/kv/range -X POST -d '"key": "AA==", "range_end": "AA=="'
#curl -X POST -d '"key": "L2FwcA==", "range_end": "L2I="' $HOST/v3alpha/kv/range
已知问题:
- 当 put 的 value 中包含字符 “-” 时会抛出
\"error\":\"invalid character ‘\\\\n‘ in string literal\",\"code\":3
。
参考(Reference)
以上是关于etcd的主要内容,如果未能解决你的问题,请参考以下文章