etcd集群搭建和使用中常见的报错信息(热key探测系列教程)

2020-07-08 09:39:32 浏览数 (1)

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

0 人点赞