从零开始搭建etcd分布式存储系统+web管理界面

转载自:https://blog.csdn.net/qq_16059847/article/details/107030635

etcd是一个高可用的 Key/Value 存储系统,内部采用raft协议作为一致性算法。

一.安装

下载地址:https://github.com/etcd-io/etcd/releases

具体版本的下载地址:https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz

# 下载
cd /usr/local/src
wget https://github.com/etcd-io/etcd/releases/download/v3.5.7/etcd-v3.5.7-linux-amd64.tar.gz

# 解压安装
tar zxvf etcd-v3.5.7-linux-amd64.tar.gz
cd etcd-v3.5.7-linux-amd64

ll
总用量 52584
drwxr-xr-x 3 528287 89939       40 1月  20 18:16 Documentation
-rwxr-xr-x 1 528287 89939 22663168 1月  20 18:16 etcd
-rwxr-xr-x 1 528287 89939 17031168 1月  20 18:16 etcdctl
-rwxr-xr-x 1 528287 89939 14077952 1月  20 18:16 etcdutl
-rw-r--r-- 1 528287 89939    42066 1月  20 18:16 README-etcdctl.md
-rw-r--r-- 1 528287 89939     7359 1月  20 18:16 README-etcdutl.md
-rw-r--r-- 1 528287 89939     9394 1月  20 18:16 README.md
-rw-r--r-- 1 528287 89939     7896 1月  20 18:16 READMEv2-etcdctl.md

## 将启动文件和命令管理文件拷贝到 PATH找到的路径中,主要是这三个文件:etcd,etcdctl,etcdutl
cp etcd* /usr/local/bin

启动参数解释

--name: etcd集群中的节点名,这里可以随意,可区分且不重复就行  
--listen-peer-urls:监听的用于节点之间通信的url,可监听多个,集群内部将通过这些url进行数据交互(如选举,数据同步等)
--initial-advertise-peer-urls:建议用于节点之间通信的url,节点间将以该值进行通信。
--listen-client-urls:监听的用于客户端通信的url,同样可以监听多个。
--advertise-client-urls:建议使用的客户端通信url,该值用于etcd代理或etcd成员与etcd节点通信。
--initial-cluster-token etcd-cluster-1:节点的token值,设置该值后集群将生成唯一id,并为每个节点也生成唯一id,当使用相同配置文件再启动一个集群时,只要该token值不一样,etcd集群就不会相互影响。
--initial-cluster:也就是集群中所有的initial-advertise-peer-urls 的合集
--initial-cluster-state new:新建集群的标志

二.搭建单机版

直接启动

etcd

etcd默认监听的是localhost的2379端口,只监听了lo设备,这样会导致启动后集群中的其他机器无法访问,因此可以在启动的时候将默认的localhost改成0.0.0.0,确保etcd监听了所有网卡。

etcd --listen-client-urls="http://0.0.0.0:2379" --advertise-client-urls="http://0.0.0.0:2379"

注意:etcd有要求,如果--listen-client-urls被设置了,那么就必须同时设置--advertise-client-urls,所以即使设置和默认相同,也必须显式设置

我们来使用curl来测试一下,是否可以远程访问,这里安装etcd的机器IP是192.168.20.100,远程访问的机器IP是:192.168.20.200

# curl -L http://192.168.20.100:2379/version
{"etcdserver":"3.5.7","etcdcluster":"3.5.0"}

如果不想使用2379和2380端口,也可以

#etcd 启动 指定端口2280 2279
/usr/local/bin/etcd \
--data-dir=/etcd-data --name node1 \
--initial-advertise-peer-urls http://0.0.0.0:2280 --listen-peer-urls http://0.0.0.0:2280 \
--advertise-client-urls http://0.0.0.0:2279 --listen-client-urls http://0.0.0.0:2279 \
--initial-cluster node1=http://0.0.0.0:2280
 
#连接,因为只有etcd主机才有etcdctl命令,因此地址可以写etcd所在主机IP或者127.0.0.1
etcdctl --endpoints=http://127.0.0.1:2279 set cqh chenqionghe # set没有了,需要使用put
etcdctl --endpoints=http://127.0.0.1:2279 get cqh 

]# etcdctl --endpoints=http://192.168.20.100:2279 set cqh chenqionghe
Error: unknown command "set" for "etcdctl"
Did you mean this?
        get
        put
        del
        user

[root@wazuh-server ~]# etcdctl --endpoints=http://192.168.20.100:2279 put cqh chenqionghe   
OK
[root@wazuh-server ~]# etcdctl --endpoints=http://192.168.20.100:2279 get cqh
cqh #这是键
chenqionghe # 这是值
[root@wazuh-server ~]# 

当然,我们也可以通过docker运行,这里给出启动脚本

#!/usr/bin/env bash

ETCD_NAME="etcd"
ETCD_VERSION="v3.5.7"
ETCD_PORT_CLIENT=2379
ETCD_PORT_NODE=2380

docker run -d \
  -p ${ETCD_PORT_CLIENT}:2379 \
  -p ${ETCD_PORT_NODE}:2380 \
  --name ${ETCD_NAME} quay.io/coreos/etcd:${ETCD_VERSION} \
  /usr/local/bin/etcd \
  --data-dir=/etcd-data --name node1 \
  --initial-advertise-peer-urls http://0.0.0.0:2380 --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://0.0.0.0:2379 --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster node1=http://0.0.0.0:2380

官方单机版安装命令

ETCD_VER=v3.5.7

# choose either URL
GOOGLE_URL=https://storage.googleapis.com/etcd
GITHUB_URL=https://github.com/etcd-io/etcd/releases/download
DOWNLOAD_URL=${GOOGLE_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
/tmp/etcd-download-test/etcdctl version
/tmp/etcd-download-test/etcdutl version

# start a local etcd server
/tmp/etcd-download-test/etcd

# write,read to etcd
/tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 put foo bar
/tmp/etcd-download-test/etcdctl --endpoints=localhost:2379 get foo

官方docker命令

rm -rf /tmp/etcd-data.tmp && mkdir -p /tmp/etcd-data.tmp && \
  docker rmi gcr.io/etcd-development/etcd:v3.5.7 || true && \
  docker run \
  -p 2379:2379 \
  -p 2380:2380 \
  --mount type=bind,source=/tmp/etcd-data.tmp,destination=/etcd-data \
  --name etcd-gcr-v3.5.7 \
  gcr.io/etcd-development/etcd:v3.5.7 \
  /usr/local/bin/etcd \
  --name s1 \
  --data-dir /etcd-data \
  --listen-client-urls http://0.0.0.0:2379 \
  --advertise-client-urls http://0.0.0.0:2379 \
  --listen-peer-urls http://0.0.0.0:2380 \
  --initial-advertise-peer-urls http://0.0.0.0:2380 \
  --initial-cluster s1=http://0.0.0.0:2380 \
  --initial-cluster-token tkn \
  --initial-cluster-state new \
  --log-level info \
  --logger zap \
  --log-outputs stderr

docker exec etcd-gcr-v3.5.7 /usr/local/bin/etcd --version
docker exec etcd-gcr-v3.5.7 /usr/local/bin/etcdctl version
docker exec etcd-gcr-v3.5.7 /usr/local/bin/etcdutl version
docker exec etcd-gcr-v3.5.7 /usr/local/bin/etcdctl endpoint health
docker exec etcd-gcr-v3.5.7 /usr/local/bin/etcdctl put foo bar
docker exec etcd-gcr-v3.5.7 /usr/local/bin/etcdctl get foo

三.搭建集群版

Etcd构建自身高可用集群主要有三种形式:

  • 静态发现: 预先已知 Etcd 集群中有哪些节点,在启动时直接指定好Etcd的各个node节点地址
  • Etcd动态发现: 通过已有的Etcd集群作为数据交互点,然后在扩展新的集群时实现通过已有集群进行服务发现的机制
  • DNS动态发现: 通过DNS查询方式获取其他节点地址信息

这里采用静态发现方式,条件有限,准备一台机器,采用地址一样,端口号不同的方式,ip如下(都已经安装etcd)

node1 192.168.20.100  2379,2380
node2 192.168.20.100  2389,2390
node3 192.168.20.100  2399,2391

进入node1,创建并运行run.sh,脚本内容如下

#!/usr/bin/env bash

#节点名称
ETCD_NAME=node-1
#本机IP地址
LOCAL_IP=192.168.20.100
#ETCD存储目录
ETCD_DATA_DIR=/usr/local/etcd1/data
#初始化名称
INITIAL_CLUSTER_TOKEN=cqh-test-cluster
#初始化群集列表
INITIAL_CLUSTER="node-1=http://192.168.20.100:2380,node-2=http://192.168.20.100:2390,node-3=http://192.168.20.100:2391"
#初始化状态
INITIAL_CLUSTER_STATE=new
 
#开始运行
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}

进入node2,创建并运行run.sh

#!/usr/bin/env bash

#节点名称
ETCD_NAME=node-2
#本机IP地址
LOCAL_IP=192.168.20.100
#ETCD存储目录
ETCD_DATA_DIR=/usr/local/etcd2/data
#初始化名称
INITIAL_CLUSTER_TOKEN=cqh-test-cluster
#初始化群集列表
INITIAL_CLUSTER="node-1=http://192.168.20.100:2380,node-2=http://192.168.20.100:2390,node-3=http://192.168.20.100:2391"
#初始化状态
INITIAL_CLUSTER_STATE=new
 
#开始运行
etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} \
    --initial-advertise-peer-urls http://${LOCAL_IP}:2390 \
    --listen-peer-urls http://${LOCAL_IP}:2390 \
    --listen-client-urls http://${LOCAL_IP}:2389,http://127.0.0.1:2389 \
    --advertise-client-urls http://${LOCAL_IP}:2389 \
    --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} \
    --initial-cluster ${INITIAL_CLUSTER} \
    --initial-cluster-state ${INITIAL_CLUSTER_STATE}
[root@wazuh-server ~]# 

进入node3,创建并运行run.sh

#!/usr/bin/env bash

#节点名称
ETCD_NAME=node-3
#本机IP地址
LOCAL_IP=192.168.20.100
#ETCD存储目录
ETCD_DATA_DIR=/usr/local/etcd3/data
#初始化名称
INITIAL_CLUSTER_TOKEN=cqh-test-cluster
#初始化群集列表
INITIAL_CLUSTER="node-1=http://192.168.20.100:2380,node-2=http://192.168.20.100:2390,node-3=http://192.168.20.100:2391"
#初始化状态
INITIAL_CLUSTER_STATE=new
 
#开始运行
etcd --name ${ETCD_NAME} --data-dir ${ETCD_DATA_DIR} \
    --initial-advertise-peer-urls http://${LOCAL_IP}:2391 \
    --listen-peer-urls http://${LOCAL_IP}:2391 \
    --listen-client-urls http://${LOCAL_IP}:2399,http://127.0.0.1:2399 \
    --advertise-client-urls http://${LOCAL_IP}:2399 \
    --initial-cluster-token ${INITIAL_CLUSTER_TOKEN} \
    --initial-cluster ${INITIAL_CLUSTER} \
    --initial-cluster-state ${INITIAL_CLUSTER_STATE}

看到3台都启动成功了

然后在node2上面执行操作

# etcdctl member list
2751266be291a08e, started, node-2, http://192.168.20.100:2390, http://192.168.20.100:2389, false
72befbf1dd80bcfb, started, node-3, http://192.168.20.100:2391, http://192.168.20.100:2399, false
a751dd96e31111eb, started, node-1, http://192.168.20.100:2380, http://192.168.20.100:2379, false

可以看到集群已经生效了,再来测试一下,在ndoe2上执行操作,看看node1和node3是否能保持数据一致

[root@wazuh-server ~]# etcdctl put /cqh muscle
OK
[root@wazuh-server ~]# etcdctl get /cqh
/cqh
muscle

可以看到在node1和node3中都能能够正确的获取/cqh的值

四.监听功能-watch

  • etcdctl watch key:观察一个值的变化,观察到变化后,打印值并watch退出
  • etcdctl watch key -f:永久观察值的变化,观察到变化后,打印直到Ctrl+C退出
  • etcdctl exec-watch key -- sh -c 'pwd':监听到值有变化,就执行指定的命令(且不退出执行的可以是shell命令)

五.使用rest api (未验证)

  • 创建目录
# curl http://192.168.20.100:2379/v2/keys/gym -XPUT -d dir=true
  • 创建键值
# curl http://192.168.20.100:2379/v2/keys/cqh -XPUT -d value="陈琼和1"
  • 获取键值
# curl http://10.211.55.25:2379/v2/keys/cqh
  • 创建键值带ttl
# curl http://10.211.55.25:2379/v2/keys/hero -XPUT -d value="超人" -d ttl=5
  • 创建有序键值
# curl http://192.168.20.100:2379/v2/keys/fitness -XPOST -d value="bench_press"
# curl http://192.168.20.100:2379/v2/keys/fitness -XPOST -d value="dead_lift"
# curl http://192.168.20.100:2379/v2/keys/fitness -XPOST -d value="deep_squat"

获取刚创建的fitness

# curl http://192.168.20.100:2379/v2/keys/fitness
  • 删除键
# curl http://192.168.20.100:2379/v2/keys/cqh -XDELETE
  • 列出所有集群成员
# curl http://192.168.20.100:2379/v2/members
  • 统计信息-查看leader
# curl http://192.168.20.100:2379/v2/stats/leader
  • 节点自身信息
# curl http://192.168.20.100:2379/v2/stats/self
  • 查看集群运行状态
# curl http://192.168.20.100:2379/v2/stats/store

六.可视化界面

etcdkeeper支持v3的api

docker run -it -d --name etcdkeeper \
  -p 8080:8080 \
  jim3ma/etcdkeeper3:latest

访问http://192.168.20.100:8080,输入etcd的地址,看到如下界面



使用docker安装的etcdkeeper功能有限,可以使用二进制的安装形式

具体查看文档:https://www.cnblogs.com/hahaha111122222/p/17268193.html

posted @ 2023-03-28 17:17  哈喽哈喽111111  阅读(414)  评论(0编辑  收藏  举报