什么是etcd?
etcd是CoreOS团队于2013年6月发起的开源项目,它的目标是构建一个高可用的分布式键值数据库,基于Go语言实现。主要解决分布式系统中各种服务的配置信息的管理分享,服务的发现。
一、Etcd三节点集群配置:
10.100.50.123
10.100.50.124
10.100.50.125
https://github.com/coreos/etcd/releases/下载
1、解压缩、运行etcd
[root@Etcd01 /]# tar -zvxf etcd-v3.2.4-linux-amd64.tar.gz
[root@Etcd01 /]# mv etcd-v3.2.4-linux-amd64 etcd
[root@Etcd01 /]# cd etcd
[root@Etcd01 etcd]# ls
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
[root@Etcd01 etcd]# ./etcd
2、添加环境变量
在"/etc/profile" 中添加环境变量
Etcd
export PATH="$PATH:/etcd"
export ETCDCTL_API=3
3、添加systemctl的服务
[root@Etcd01 etcd]# vi /etc/systemd/system/etcd.service
[Unit]
Description=etcd
[Service]
ExecStart=/etcd/etcd
[Install]
WantedBy=multi-user.target
4、关闭防火墙
[root@Etcd01 etcd]# systemctl stop firewalld
[root@Etcd01 etcd]# systemctl disable firewalld
关闭SElinux
[root@Etcd01 etcd]#sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
以上三步在其他两个节点重复操作。
5、运行脚本
etcd --name infra0 --initial-advertise-peer-urls http://10.100.50.123:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.100.50.123:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.100.50.123:2380,infra1=http://10.100.50.124:2380,infra2=http://10.100.50.125:2380 \
--initial-cluster-state new
etcd --name infra1 --initial-advertise-peer-urls http://10.100.50.124:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.100.50.124:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.100.50.123:2380,infra1=http://10.100.50.124:2380,infra2=http://10.100.50.125:2380 \
--initial-cluster-state new
etcd --name infra2 --initial-advertise-peer-urls http://10.100.50.125:2380 \
--listen-peer-urls http://0.0.0.0:2380 \
--listen-client-urls http://0.0.0.0:2379 \
--advertise-client-urls http://10.100.50.125:2379 \
--initial-cluster-token etcd-cluster-1 \
--initial-cluster infra0=http://10.100.50.123:2380,infra1=http://10.100.50.124:2380,infra2=http://10.100.50.125:2380 \
--initial-cluster-state new
后台运行: nohup /path/to/start_etcd.sh &
6、命令参数解释
https://coreos.com/etcd/docs/latest/op-guide/configuration.html官网解释
etcd --name infra0节点名称
--initial-advertise-peer-urls http://HOST-IP:2380 通知其他Etcd实例地址
--listen-peer-urls http://0.0.0.0:2380 监听其他Etcd实例地址
--listen-client-urls http://0.0.0.0:2379 监听客户端地址
--advertise-client-urls http://HOST-IP:2379 通知客户端地址
--initial-cluster-token etcd-cluster-1 初始化集群Token,同一个集群Token必须相同。
--initial-cluster infra0=http://HOST-IP:2380,infra1=http://HOST-IP:2380,infra2=http://HOST-IP:2380 初始化集群节点地址
--initial-cluster-state new新建集群,如果是已经存在的集群将new更改为existing
二、使用etcdctl命令操作数据库
set指定某个键的值
格式:set --
OPTIONS:
--ttl value key time-to-live in seconds (default: 0)
--swap-with-value value previous value
--swap-with-index value previous index (default: 0)
例1:设置键值
[root@Etcd01 ~]# etcdctl set key1 value1
value1
[root@Etcd01 ~]# etcdctl get key1
value1
[root@Etcd01 ~]#
例2:设置键值的超时时间
[root@Etcd01 ~]# etcdctl set --ttl 10 key2 value2
value2
[root@Etcd01 ~]# etcdctl get key2
Error: 100: Key not found (/key2) [10]
[root@Etcd01 ~]#
例3:若该键现在的值是 value,则进行设置操作
[root@Etcd01 ~]# etcdctl set key1 value1
value1
[root@Etcd01 ~]# etcdctl get key1
value1
[root@Etcd01 ~]# etcdctl set key1 "value2" --swap-with-value "value1" 如果value=value1则 ,把key1的键值改为value2。
value2
[root@Etcd01 ~]#
get获取键值
格式: get
选项:
--sort 对结果进行排序
--consistent 将请求发给主节点,保证获取内容的一致性
例1:获取键值
[root@Etcd01 ~]# etcdctl set key1 value1
value1
[root@Etcd01 ~]# etcdctl get key1
value1
update更新键值
格式:etcdctl update
选项:
--ttl ‘0’ 超时时间默认为0,永不超时。
[root@Etcd01 ~]# etcdctl set key1 value1
value1
[root@Etcd01 ~]# etcdctl update --ttl '5' key1 value2 更新key1的键值为value2,并设置5秒超时时间。
value2
[root@Etcd01 ~]# etcdctl get key1
value2
[root@Etcd01 ~]# etcdctl get key1 超过5秒钟后键值自动删除。
Error: 100: Key not found (/key1) [22]
[root@Etcd01 ~]#
rm删除某个键值
格式:etcdctl rm
选项:
--dir 如果键是个空目录或者键值对则删除
--recursive 删除目录和所有子键
--with-value 检查现有的值是否匹配
--with-index '0' 检查现有的 index 是否匹配
例1:删除键值
[root@Etcd01 ~]# etcdctl set key1 value
value
[root@Etcd01 ~]# etcdctl rm key1
PrevNode.Value: value
[root@Etcd01 ~]# etcdctl get key1
Error: 100: Key not found (/key1) [24]
[root@Etcd01 ~]#
mk如果给定的键不存在,则创建一个新的键值
格式: etcdctl mk
选项:
--ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时
例:当键值不存在时
[root@Etcd01 ~]# etcdctl mk key2 value1
value1
[root@Etcd01 ~]# etcdctl get key2
value1
例:当键值存在时会报错
[root@Etcd01 ~]# etcdctl mk key1 value2
Error: 105: Key already exists (/key1) [25]
mkdir如果给定的目录不存在,则创建一个新的键目录
格式:etcdctl mkdir
选项:
--ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时
例:
[root@Etcd01 ~]# etcdctl mkdir keydir 创建一个mkdir的目录
[root@Etcd01 ~]# etcdctl set mkdir/key1 value1 在mkdir目录下创建一个key1的键且值为value1
value1
[root@Etcd01 ~]# etcdctl ls /mkdir 使用ls命令查看mkdir下的键
/mkdir/key1
setdir创建一个目录,无论存在与否
格式:etcdctl setdir
--ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时
例:
[root@Etcd01 ~]# etcdctl setdir keydir2
[root@Etcd01 ~]# etcdctl ls
/keydir1
/keydir2
updatedir更新一个已经存在的目录(仅在目录中设置了TTL或生存时间时才有用)
格式: etcdctl updatedir
选项:
--ttl '0' 超时时间(单位为秒),不配置(默认为 0)则永不超时
例:设置TTL时间表示keydir的存活时间。
[root@Docker01 ~]# etcdctl ls
/keydir
[root@Docker01 ~]# etcdctl updatedir keydir --ttl '10' 设置超时时间为10秒
[root@Docker01 ~]# etcdctl ls
/keydir
[root@Docker01 ~]# etcdctl ls 十秒中后目录自动删除,如果为0则永不超时。
[root@Docker01 ~]#
rmdir删除一个目录,或者键值对
格式:etcdctl rmdir 或
例1:删除目录
[root@Docker01 ~]# etcdctl ls
/keydir
[root@Docker01 ~]# etcdctl rmdir /keydir
[root@Docker01 ~]# etcdctl ls
[root@Docker01 ~]#
例2:删除键值对
[root@Docker01 ~]# etcdctl set key1 value1
value1
[root@Docker01 ~]# etcdctl rmdir key1 删除键值对,格式可以是etcdctl rmdir 而不用加键对应的值。
PrevNode.Value: value1
[root@Docker01 ~]# etcdctl get key1
Error: 100: Key not found (/key1) [22]
[root@Docker01 ~]# etcdctl ls
[root@Docker01 ~]#
ls 列出目录(默认为根目录)下的键或者子目录,默认不显示子目录中的内容
格式:etcdctl ls
例:
[root@Docker01 ~]# etcdctl mkdir /keydir1/key1 value1
[root@Docker01 ~]# etcdctl mkdir /keydir2/
[root@Docker01 ~]# etcdctl ls
/keydir1
/keydir2
[root@Docker01 ~]#
三、非数据库操作
backup备份 etcd 的数据。
选项
--data-dir etcd 的数据目录
--backup-dir 备份到指定路径
watch检测一个键值的变化
格式:etcdctl watch
--forever 一直监测,直到用户按 CTRL+C
退出
--after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值
exec-watch检测一个键值的变化,一旦键值发生更新,就执行给定命令
格式:etcdctl exec-watch --
选项:
--after-index '0' 在指定 index 之前一直监测
--recursive 返回所有的键值和子键值
member通过list、add、remove命令列出、添加、删除etcd实例到etcd集群中。
[root@Docker01 ~]# etcdctl member list
8e9e05c52164694d: name=default peerURLs=http://localhost:2380 clientURLs=http://localhost:2379 isLeader=true
[root@Docker01 ~]#
四、命令选项:
--debug 输出 cURL 命令,显示执行命令的时候发起的请求
--no-sync 发出请求之前不同步集群信息
--output, -o 'simple' 输出内容的格式 (simple 为原始信息,json 为进行json格式解码,易读性好一些)
--peers, -C 指定集群中的同伴信息,用逗号隔开 (默认为: "127.0.0.1:4001")
--cert-file HTTPS 下客户端使用的 SSL 证书文件
--key-file HTTPS 下客户端使用的 SSL 密钥文件
--ca-file 服务端使用 HTTPS 时,使用 CA 文件进行验证
--help, -h 显示帮助命令信息
--version, -v 打印版本信息
https://yeasy.gitbooks.io/docker_practice/content/etcd/intro.html资料: