1 etcd key-value 存储结构
“A highly-available key value store for shared configuration and service discovery.”
Etcd是coreos开发的分布式服务系统,内部采用raft协议作为一致性算法
raft通过选举的方式来实现一致性,在Raft中,任何一个节点都可能成为Leader
Etcd是一个高可用的 Key/Value 存储系统,主要用于分享配置和服务发现。
● 简单:支持 curl 方式的用户 API (HTTP+JSON)
Etcd构建自身高可用集群主要有三种形式:
1)静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好Etcd的各个node节点地址
2)Etcd动态发现: 通过已有的Etcd集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
3)DNS动态发现: 通过DNS查询方式获取其他节点地址信息
2 下载地址
https://github.com/coreos/etcd/releases/
################### 演示etcd单机的使用
3. 安装(解压即可使用)
cd /usr/local/src/
wget https://github.com/coreos/etcd/releases/download/v3.2.5/etcd-v3.2.5-linux-amd64.tar.gz
tar xvf etcd-v3.2.5-linux-amd64.tar.gz
cp -r etcd-v3.2.5-linux-amd64 /usr/local/etcd #将软件放置到常用目录下
4.创建配置文件和数据目录
cd /usr/local/etcd/
touch etcd.conf
mkdir data
## 将启动文件和命令管理文件拷贝到 PATH找到的路径中
cp etcd /usr/local/bin
cp etcdctl /usr/local/bin
5. 编辑配置文件
name: ops-cuidehua001 data-dir: "/usr/local/etcd/data" #监听URL,用于与其他节点通讯 listen-peer-urls: "http://10.59.87.121:2380" # list of URLs to listen on for client traffic listen-client-urls: "http://10.59.87.121:2379,http://127.0.0.1:2379" #list of this member‘s client URLs to advertise to the public advertise-client-urls: "http://10.59.87.121:2379"
listen-peer-urls、listen-client-urls、advertise-client-urls的区别?
6、启动
etcd --config-file=/usr/local/etcd/etcd.conf &
7、检查是否启动
ps -ef |grep etcd
或者
[root@ops-cuidehua001 etcd]# etcdctl cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://10.59.87.121:2379
cluster is healthy
生成的了数据目录
[root@ops-cuidehua001 etcd]# ls data/member/
snap wal
8、常用命令操作
#查看版本
etcdctl -version 或者 etcd -version
[root@ops-cuidehua001 etcd]# etcdctl -v
etcdctl version: 3.2.5
API version: 2
(可以查看到命令的版本和api接口的版本)
#查看检查状况
etcdctl cluster-health
##etcd主要是做存储k-v的作用,所以经常对其数据进行操作(即etcd的操作 增删改查)
数据库操作围绕对键值和目录的 CRUD
(符合 REST 风格的一套操作:Create
)完整生命周期的管理。
etcd 在键的组织上采用了层次化的空间结构(类似于文件系统中目录的概念),用户指定的键可以为单独的名字,如 testkey
,此时实际上放在根目录 /
下面,也可以为指定目录结构,如 cluster1/node2/testkey
,则将创建相应的目录结构。
注:CRUD 即 Create, Read, Update, Delete,是符合 REST 风格的一套 API 操作。
#################### ##数据库操作 #################
##set 指定某个键的值
etcdctl set /testdir/testkey "Hello world"
会创建目录/testdir 和设定这个目录下的testkey的value值为"Hello world"
##查看目录结构,默认是查看根目录下
[root@ops-cuidehua001 etcd]# etcdctl ls
/testdir
[root@ops-cuidehua001 etcd]# etcdctl ls /testdir
/testdir/testkey
##get 获取某个key的value
[root@ops-cuidehua001 etcd]# etcdctl get /testdir/testkey
Hello world
#不支持则会报错,且key不支持通配符
[root@ops-cuidehua001 etcd]# etcdctl get /testdir/testkey2
Error: 100: Key not found (/testdir/testkey2) [5]
##update更新建的值,key不存在时会报错
etcdctl update /testdir/testkey "hello"
##rm删除某个键
etcdctl rm /testdir/testkey
[root@ops-cuidehua001 etcd]# etcdctl rm /testdir/testkey
PrevNode.Value: hello
[root@ops-cuidehua001 etcd]# etcdctl get /testdir/testkey
Error: 100: Key not found (/testdir/testkey) [7]
当删除某个目录时
etcdctl rm -h 查看命令帮助
etcdctl rm -r
[root@ops-cuidehua001 etcd]# etcdctl rm -r /testdir
## 创建目录mkdir setdir
etcdctl setdir /testdir
(mkdir 如果目录存在则会报错 setdir 也会报错,但是不一样? 待研究两者不同)
[root@ops-cuidehua001 etcd]# etcdctl setdir /testdir
Error: 102: Not a file (/testdir) [11]
###################### 非数据库操作 #################
# 备份etcd数据目录
[root@ops-cuidehua001 etcd]# du -sh data/
123Mdata/
[root@ops-cuidehua001 etcd]# etcdctl backup --data-dir=/usr/local/etcd/data/ --backup-dir=/tmp/data
[root@ops-cuidehua001 etcd]# du -sh /tmp/data/
62M/tmp/data/
(临时目录文件不会备份)
#watch 观察一个值的变化(只是针对key 不针对目录)
观察到变化后,打印值并watch退出
可以用选项: -f
forever watch a key until CTRL+C
#exce-wathc 监听到值有变化,就执行指定的命令(且不退出执行的可以是shell命令)
etcdctl exec-watch /testdir/testkey -- sh -c ‘pwd‘
#member 集群用途将其他成员添加到cluster中或者从cluster中删除
[root@ops-cuidehua001 etcd]# etcdctl member list
8e9e05c52164694d: name=ops-cuidehua001 peerURLs=http://localhost:2380 clientURLs=http://10.59.87.121:2379 isLeader=true
(因为是单点操作所以就一个节点)
#################### API 接口 ####
可以通过浏览器访问,或者通过curl命令增删改查
基本接口:
http://10.59.87.121:2379/v2/keys/
[root@ops-cuidehua001 etcd]# curl -s http://10.59.87.121:2379/v2/keys/ | jq "."
{ "node": { "nodes": [ { "createdIndex": 4, "modifiedIndex": 4, "dir": true, "key": "/testdir" } ], "dir": true }, "action": "get" }
可获取目录下的所有key-value和
[root@ops-cuizhiliang001 etcd]# curl -s http://10.59.87.121:2379/v2/keys/testdir | jq "."
{ "node": { "createdIndex": 4, "modifiedIndex": 4, "nodes": [ { "createdIndex": 4, "modifiedIndex": 12, "value": "yes3", "key": "/testdir/testkey" }, { "createdIndex": 10, "modifiedIndex": 10, "value": "yes3", "key": "/testdir/testkey2" } ], "dir": true, "key": "/testdir" }, "action": "get" }
## 删除指定的key,返回被删掉的内容(目录是不能删除的)
curl -s http://10.59.87.121:2379/v2/keys/testdir/testkey2 -XDELETE |jq "."
## set指定的值
curl -s http://10.59.87.121:2379/v2/keys/testdir/testkey3 -XPUT -d value="hello world" |jq "."
################### 配置集群 ###############
http://www.linuxidc.com/Linux/2017-01/139665.htm
可以在初始知道的时候就加入,还可在后面在加入
目前支持三种发现方式:Static,etcd Discovery,DNS Discovery。
● Static适用于有固定IP的主机节点
● etcd Discovery适用于DHCP环境
● DNS Discovery依赖DNS SRV记录
这里我们采用Static方式,创建etcd0脚本,方便配置etcd启动参数
方法1: (参考)
可以在知道有哪些作为集群的时候,使用
● –initial-cluster-token 集群的ID
● –initial-cluster 集群中所有节点
● –initial-cluster-state 集群状态,new为新创建集群,existing为已存在的集群
(以下 只是作为知识说明,在此文章中并未使用到)
#初始化名称
INITIAL_CLUSTER_TOKEN=etcd_cluster_1
#初始化群集列表
INITIAL_CLUSTER="node1=http://10.59.72.221:2380,node2=http://10.59.72.191:2380,node3=http://10.59.72.192:2380"
#初始化状态
INITIAL_CLUSTER_STATE=new
方法2:(这里举例使用了这种方法 演示)
后面add的节点(比如从一台机器的集群 变成多台的集群)
和第一个节点一样搭建了如下第二个节点。
这里要将 这个第二个节点加入到 上面的第一个节点中去。
[root@ops-rpmbuild001 etcd]# etcdctl member list
8e9e05c52164694d: name=etcd-node-002 peerURLs=http://localhost:2380 clientURLs=http://10.59.87.11:2379 isLeader=true
(记住 一定要在配置中补充) 补充脚本
#!/bin/bash # #初始化Etcd # #ETCD 名称 ETCD_NAME=ops-cuidehua001 #ETCD存储目录 ETCD_DATA_DIR=/usr/local/etcd/data #本机IP地址 LOCAL_IP=10.59.87.121 #初始化名称 INITIAL_CLUSTER_TOKEN=etcd_cluster_cuidehua #初始化群集列表 INITIAL_CLUSTER="ops-cuizhiliang001=http://10.59.87.121:2380,etcd-node-002=http://10.59.87.11:2380" #初始化状态 INITIAL_CLUSTER_STATE=new #初始化 M1(){ # [ -d ${ETCD_DATA_DIR} ] && /bin/rm -rf ${ETCD_DATA_DIR} >/dev/null 2>&1 # /bin/mkdir ${ETCD_DATA_DIR} >/dev/null 2>&1 /usr/local/etcd/etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} --initial-advertise-peer-urls http://${LOCAL_IP}:2380 --listen-peer-urls http://${LOCAL_IP}:2380 --listen-client-urls http://${LOCAL_IP}:2379,http://127.0.0.1:2379 --advertise-client-urls http://${LOCAL_IP}:2379 --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} --initial-cluster ${INITIAL_CLUSTER} --initial-cluster-state ${INITIAL_CLUSTER_STATE} } M2(){ /usr/local/etcd/etcd --config-file /usr/local/etcd/etcd.conf } M${1}
每台机器上执行
sh init.sh 1
sh init.sh 2 &>/dev/null &
查看:
# etcdctl member list
bfb265066811202: name=ops-cuidehua001 peerURLs=http://10.59.87.121:2380 clientURLs=http://10.59.87.121:2379 isLeader=false
4ee240ac8ec54efb: name=etcd-node-002 peerURLs=http://10.59.87.11:2380 clientURLs=http://10.59.87.11:2379 isLeader=true
## 集群成员操作(不管否是leader 都可以执行这个操作,执行完后,对方就从集群中踢出去了,在从新选举Leader)
etcdctl member remove bfb265066811202
增加成员时候,INITTAL_CLUSTER_STATE 一定要标记为
#初始化状态 INITIAL_CLUSTER_STATE=existing
本文出自 “残剑” 博客,请务必保留此出处http://cuidehua.blog.51cto.com/5449828/1957659
原文地址:http://cuidehua.blog.51cto.com/5449828/1957659