1. etcd 数据存储
etcd 的存储分为 内存存储 和 持久化(硬盘)存储 两部分。
内存中的存储除了顺序化的记录下所有用户对节点数据变更的记录外,还会对用户数据进行索引、建堆等方便查询的操作。 而持久化则使用预写式日志(WAL:Write Ahead Log)进行记录存储。
在 WAL 的体系中,所有的数据在提交之前都会进行日志记录。在 etcd 的持久化存储目录中,有两个子目录。一个是 WAL,存储着所有事务的变化记 录;另一个则是 snapshot,用于存储某一个时刻 etcd 所有目录的数据。通过 WAL 和 snapshot 相结合的方式,etcd 可以有效的进行数据存储和节点故障恢复等操作。
既然有了 WAL 实时存储了所有的变更,为什么还需要 snapshot 呢?随着使用量的增加,WAL 存储的数据会暴增,为了防止磁盘很快就爆满,etcd 默认每 10000 条记录做一次 snapshot,经过 snapshot 以后的 WAL 文件就可以删除。而通过 API 可以查询的历史 etcd 操作默认为 1000 条。
首次启动时,etcd 会把启动的配置信息存储到data-dir参数指定的数据目录中。配置信息包括本地节点的 ID、集群 ID 和初始时集群信息。用户需要避免 etcd 从一个过期的数据目录中重新启动,因为使用过期的数据目录启动的节点会与集群中的其他节点产生不一致(如: 之前已经记录并同意 Leader 节点存储某个信息,重启后又向 Leader 节点申请这个信息)。所以,为了最大化集群的安全性,一旦有任何数据损坏或丢失 的可能性,你就应该把这个节点从集群中移除,然后加入一个不带数据目录的新节点。
2. @ etcd在磁盘中存储snapshot和WAL
[root@c7-Host ~]# tree /var/lib/etcd/infra11.etcd/
/var/lib/etcd/infra11.etcd/
└── member
├── snap
│ ├── 00000000000002db-000000000021447a.snap
│ ├── 00000000000002db-0000000000216b8b.snap
│ ├── 00000000000002db-000000000021929c.snap
│ ├── 00000000000002db-000000000021b9ad.snap
│ ├── 00000000000002db-000000000021e0be.snap
│ └── db
└── wal
├── 0000000000000000-0000000000000000.wal
├── 0000000000000001-000000000007ab55.wal
├── 0000000000000002-00000000000f53fd.wal
├── 0000000000000003-000000000016fc8c.wal
├── 0000000000000004-00000000001ea52c.wal
└── 0.tmp
3 directories, 12 files