etcd的下载地址:https://github.com/etcd-io/etcd/releases
当前最新的v3.4.9,我之前用的时候包括目前京东热key线上都是用的3.4.6,下面主要是看一下如何搭建etcd集群。
如果是本地测试单点的话,就在上面链接下载对应的操作系统版本,打开后
直接启动etcd就算本地启动成功了,启动后就可以用etcdctl控制台进行操作,或者用代码操作etcd即可。
集群的话,以linux 3节点集群为例。
创建一个sh脚本,如下
代码语言:javascript复制#!/bin/bash
if [ -z $NAME ];then
NAME=my-etcd-1
fi
#if [ -z $DATADIR ];then
#DATADIR=/export/etcd_data
#fi
if [ -z $MYHOST ];then
MYHOST=http://127.0.0.1
fi
if [ -z $PORT ];then
PORT=2379
fi
if [ -z $CLUSTER_PORT ];then
CLUSTER_PORT=2380
fi
if [ -z $CLUSTER ];then
CLUSTER=my-etcd-1=http://localhost:2380,my-etcd-2=http://localhost:2382,my-etcd-3=http://localhost:2384
fi
if [ -z $CLUSTER_TOKEN ];then
CLUSTER_TOKEN=my-etcd-token
fi
if [ -z $CLUSTER_STATE ];then
CLUSTER_STATE=new
fi
ETCD_CMD="./etcd --name ${NAME} --data-dir ${DATADIR} --listen-client-urls ${MYHOST}:${PORT} --advertise-client-urls ${MYHOST}:${PORT} --listen-peer-urls ${MYHOST}:${CLUSTER_PORT}
--initial-advertise-peer-urls ${MYHOST}:${CLUSTER_PORT}
--initial-cluster $CLUSTER
--initial-cluster-token $CLUSTER_TOKEN
--initial-cluster-state ${CLUSTER_STATE}
--auto-compaction-retention=10
-–quota-backend-bytes=8589934592
$*"
echo -e "Running '$ETCD_CMD'nBEGIN ETCD OUTPUTn"
exec $ETCD_CMD
和etcd可执行文件放一起。
这个shell脚本里,大部分属性都是通过外传配置的,最好是通过环境变量配置。将这个文件夹(包含3个文件)复制三份,分别上传到3个主机或打包后放到docker里,用docker的话,需要再加一个dockerfile文件,dockerfile里就直接启动这个sh即可。
上传完毕后,就需要配置sh脚本里的各个参数属性了。
注意shell里面的配置项,里面有最大存储是8G,自动压缩间隔是10小时,可以自行调整。etcd如果磁盘写满(默认2G)后,就无法继续写入了,必须压缩 清理后才能继续写入。
譬如ip1、ip2、ip3 三个机器。各自的配置(主机环境变量,或docker环境变量)如下
这就是etcd1的配置,注意一下name,就是一个唯一的name,那么etcd2的name就是my-etcd-2
MYHOST就是自己的ip。
CLUSTER_STATE代表集群状态,如果是加入一个已有的集群,就是existing。如果是新组建集群,就是new。
CLIENT_URLS就还是自己的ip,再加上127.0.0.1 注意加上端口后。
CLUSTER就是集群内所有etcd的ip 端口。
就这样分别启动3个etcd就可以了。观察日志,看他们的联通状态。
常见异常: 1 节点启动后:tocommit(42081425) is out of range [lastIndex(0)]. Was the raft log corrupted, truncated, or lost
命令: cd /export/App/bin
查看所有member ./etcdctl member list 删除掉那个数据不对的: ./etcdctl member remove 8837e51603af62c2 重新添加进来: ./etcdctl member add my-etcd-2 --peer-urls=http://10.188.128.140:2380
2 ETCD数据库异常:mvcc: database space exceeded解决
参考:https://www.cnblogs.com/davygeek/p/8524477.html https://www.cnblogs.com/zjz20/p/12973817.html
使用API3 export ETCDCTL_API=3 # 查看告警信息,告警信息一般 memberID:8630161756594109333 alarm:NOSPACE etcdctl —endpoints=http://127.0.0.1:2379 alarm list
# 获取当前版本 rev=$(etcdctl —endpoints=http://127.0.0.1:2379 endpoint status —write-out=“json” | egrep -o ‘”revision”:[0-9]*’ | egrep -o ‘[0-9].*’) # 压缩掉所有旧版本 etcdctl —endpoints=http://127.0.0.1:2379 compact $rev # 整理多余的空间 etcdctl —endpoints=http://127.0.0.1:2379 defrag # 取消告警信息 etcdctl —endpoints=http://127.0.0.1:2379 alarm disarm