读写处理 集群正常提供服务时Member会处于Leader,Follower两种状态。
为了保证数据的强一致性,etcd集群中所有的数据流向都是一个方向,从Leader流向 Follower,也就是所有Follower的数据必须与Leader保持一致,如果不一致会被覆盖。
Leader可以响应客户端的读操作和写操作,Follower可以直接响应客户端的读操作。读操作不改变数据且所有实例的数据一致。但写操作会统一被转发到Leader进行处理。Leader需要等待其他Member实例确认这次写操作,只有超过半数的实例确认写操作才可以认为这次写操作成功。
etcd采用了wal预写式日志,即write ahead log。所有的数据库事务会先以日志的形式记录下来,再由其他进程负责写入持久稳定的db。etcd的写操作等待过半实例确认的过程就是等待过半实例已经将事务写入日志的过程。
快照 为了配合wal,etcd会定期生成数据库的快照snapshot。快照记录了某一时间节点的etcd数据库数据,这样wal就只需要保留该时间之后的所有日志,防止日志体积随时间的积累和过于庞大。快照也可以用于数据恢复,故障的实例只需要凭借快照并相应的wal日志执行操作就可以很快的同步数据。
$ tree /data/etcd/default.etcd/member/
/data/etcd/default.etcd/member/
├── snap
│ └── db
└── wal
├── 0000000000000000-0000000000000000.wal
└── 0.tmp
2 directories, 3 files