背景
周末接到社区伙伴的电话,说 pd 拉不起来了。报错 Error: etcdserver: mvcc: database space exceeded
找到相关 FAQ:https://docs.pingcap.com/zh/tidb/stable/ticdc-faq
处理方式
因为当时 PD 拉不起来报错,因此进行 etcd 碎片整理处理,操作如下:
- 设置环境变量
ETCDCTL_API
的值为3
,表示使用 etcdctl v3 AP
export ETCDCTL_API=3
- 停止 PD 服务,需要登录对应服务器
systemctl stop pd-2379
因为 TiDB 集群每个节点都是有自己的守护进程,如果启动命令有执行过,虽然没有启动成功,但守护进程会不断尝试启动。为了避免干扰,推荐手动关闭守护进程。
这一步可以一次性关闭:
tiup cluster stop cluster_name -y
- 对 etcd 的数据目录进行碎片整理(defragmentation)
etcdctl defrag --data-dir /data2/tiup/tidb-data/pd-2379
A. 这里 etcdctl 工具可以从 tiup 服务器获取,scp 到 pd 服务器上使用。tiup 一般在管理用户家目录下,路径一般为:
find .tiup -name etcdctl
.tiup/components/ctl/v6.1.3/etcdctl
B. 路径使用 pd data 目录即可,获取方式:
tiup cluster display cluster_name
结果中找到 pd 对应 Data Dir 列的路径即可。
- 将
db
文件的所有者和组设置为tidb
chown tidb.tidb db
db
文件是 etcd 存储数据的核心文件,位于data-dir/member/snap
目录下。- 如果文件权限不正确,可能导致 etcd 无法正常启动或运行。
如果 3 的操作不是使用 tidb 用户,但是 pd 启动用户是 tidb,那么会有权限问题。整理完成后,会看到 db 文件会从 8GB+ 大小降下来。
- 启动 pd
systemctl start pd-2379
- 查询 etcd 端点的状态,并以表格形式输出
etcdctl endpoint status --write-out=table
确定可以正常访问
- 列出当前 etcd 集群中的所有告警
- etcd 在检测到异常情况(如节点失联、存储空间不足等)时会触发告警。
尽管我们已经进行了空间压缩,但 etcd 空间不足的告警可能仍然存在,这会导致 PD 无法启动.
- 解除 etcd 集群中的所有告警
ETCDCTL_API=3 etcdctl alarm disarm
- 在解决告警问题后,需要手动解除告警,否则告警会持续存在。
可以观察 pd 应该可以正常启动。或者重启一下 pd
问题原因
- PD etcd 在新版本,存储空间配置为 8GB,这个不推荐调整过大。
- TiDB cdc 在低版本会将 metaData ,包括表的状态信息,调度信息,都是存在 etcd 里面。另外如果执行了比较多的 ddl ,会导致这些信息短时间内增长较大。etcd 在没有及时整理的情况下,就有可能空间使用超过 8GB。
- 这个问题在 5.4 有相关优化代码,但是在 6.0 版本后才默认打开相关优化代码。
推荐使用 cdc 的话,tidb 集群在 v6.5+。
其他更低版本推荐使用 tidb binlog。