第一部分 基础篇 2
第1章 分布式系统与一致性协议 2
1.1 CAP原理 3
1.2 一致性 5
1.2.1 一致性模型 7
1.2.2 一致性模型分述 9
1.2.3 复制状态机 16
1.2.4 拜占庭将军问题 18
1.2.5 FLP不可能性 19
1.2.6 小结 21
1.3 Paxos协议 22
1.4 Raft协议:为可理解性而生 24
1.4.1 Raft一致性算法 26
1.4.2 可用性与时序 45
1.4.3 异常情况 46
1.4.4 日志压缩与快照 52
1.4.5 Raft算法性能评估 56
1.4.6 小结 58
第二部分 实战篇 62
第2章 为什么使用etcd 62
2.1 etcd是什么 64
2.2 etcd架构简介 66
2.2.1 etcd数据通道 69
2.2.2 etcd架构 71
2.3 etcd典型应用场景举例 72
2.3.1 服务注册与发现 72
2.3.2 消息发布和订阅 75
2.3.3 负载均衡 76
2.3.4 分布式通知与协调 77
2.3.5 分布式锁 78
2.3.6 分布式队列 80
2.3.7 集群监控与Leader竞选 81
2.3.8 小结 82
2.4 etcd性能测试 82
2.4.1 etcd读性能 82
2.4.2 etcd写性能 83
2.5 etcd与其他键值存储系统的对比 84
2.5.1 ZooKeeper VS etcd 85
2.5.2 Consul VS etcd 88
2.5.3 NewSQL(Cloud Spanner CockroachDB、TiDB)VS etcd 88
2.5.4 使用etcd做分布式协同 89
2.5.5 小结 90
2.6 使用etcd的项目 90
2.7 etcd概念词汇表 91
2.8 etcd发展里程碑 92
2.8.1 etcd 0.4 版本 93
2.8.2 etcd 2.0版本 93
2.8.3 etcd 3.0版本 93
第3章 etcd初体验 95
3.1 单机部署 95
3.1.1 单实例etcd 95
3.1.2 多实例etcd 98
3.2 多节点集群化部署 100
3.2.1 静态配置 101
3.2.2 服务发现 104
3.3 etcdctl常用命令行 107
3.3.1 key的常规操作 107
3.3.2 key的历史与watch 112
3.3.3 租约 115
3.4 etcd常用配置参数 117
3.4.1 member相关参数项 117
3.4.2 cluster相关参数项 118
3.4.3 proxy相关参数项 120
3.4.4 安全相关参数项 120
3.4.5 日志相关参数项 121
3.4.6 不安全参数项 121
3.4.7 统计相关参数项 122
3.4.8 认证相关参数项 122
第4章 etcd开放API之v2 123
4.1 API保证 124
4.2 etcd v2 API 126
4.2.1 集群管理API 126
4.2.2 键值API 126
4.2.3 键的TTL 130
4.2.4 等待变化通知:watch 134
4.2.5 自动创建有序key 146
4.2.6 目录TTL 148
4.2.7 原子的CAS 149
4.2.8 原子的CAD 151
4.2.9 创建目录 153
4.2.10 罗列目录 154
4.2.11 删除目录 156
4.2.12 获取一个隐藏节点 157
4.2.13 通过文件设置key 158
4.2.14 线性读 158
4.3 统计数据 158
4.3.1 Leader数据 159
4.3.2 节点自身的数据 160
4.3.3 更多统计数据 161
4.4 member API 162
4.4.1 List member 162
4.4.2 加入一个member 163
4.4.3 删除一个member 163
4.4.4 修改member的peer URL 164
第5章 etcd开放API之v3 165
5.1 从etcd v2到etcd v3 166
5.1.1 gRPC 167
5.1.2 序列化和反序列化优化 167
5.1.3 减少TCP连接 167
5.1.4 租约机制 167
5.1.5 etcd v3的观察者模式 168
5.1.6 etcd v3的数据存储模型 169
5.1.7 etcd v3的迷你事务 170
5.1.8 快照 171
5.1.9 大规模watch 171
5.2 gRPC服务 172
5.3 请求和响应 174
5.4 KV API 176
5.4.1 键值对 176
5.4.2 revision 177
5.4.3 键区间 178
5.4.4 Range API 178
5.4.5 PUT调用 181
5.4.6 事务 182
5.4.7 Compact调用 186
5.5 watch API 186
5.5.1 Event 187
5.5.2 流式watch 187
5.6 Lease API 190
5.6.1 获得租约 190
5.6.2 Keep Alives 192
5.7 API使用示例 192
第6章 etcd集群运维与稳定性 195
6.1 etcd升级 195
6.1.1 etcd从2.3 升级到3.0 195
6.1.2 etcd从3.0升级到3.1 199
6.2 从etcd v2切换到v3 202
6.2.1 切换客户端代码 202
6.2.2 数据迁移 203
6.3 运行时重配置 204
6.3.1 两阶段配置更新保证集群安全 205
6.3.2 永久性失去半数以上member 206
6.4 参数调优 207
6.4.1 时间参数 207
6.4.2 快照 208
6.4.3 磁盘 209
6.4.4 网络 209
6.5 监控 209
6.6 维护 210
6.6.1 压缩历史版本 210
6.6.2 消除碎片化 211
6.6.3 存储配额 211
6.6.4 快照备份 213
6.7 灾难恢复 213
6.7.1 快照 214
6.7.2 恢复集群 214
6.8 etcd网关 215
6.8.1 什么时候使用etcd网关 216
6.8.2 什么时候不该使用etcd网关 216
6.8.3 启动etcd网关 217
6.9 gR PC代理 217
6.9.1 可扩展的watch API 218
6.9.2 限制 219
6.9.3 可扩展的带租约的API 219
6.9.4 服务端保护 220
6.9.5 启动gRPC代理 220
6.9.6 客户端节点同步和域名解析 221
6.9.7 名字空间 222
6.10 故障恢复 223
6.10.1 小部分从节点故障 223
6.10.2 主节点故障 224
6.10.3 大部分节点故障 224
6.10.4 网络分区 224
6.10.5 集群启动异常 225
6.11 硬件 225
第7章 etcd安全 231
7.1 访问安全 231
7.1.1 权限资源 232
7.1.2 键值资源 234
7.1.3 配置资源 234
7.2 etcd访问控制实践 235
7.2.1 User相关命令 235
7.2.2 Role相关命令 236
7.2.3 启用用户权限功能 237
7.3 传输安全 238
7.3.1 TLS/SSL工作原理 239
7.3.2 使用TLS加密etcd通信 241
7.3.3 etcd安全配置详解 247
第三部分 高级篇 252
第8章 多版本并发控制 252
8.1 为什么选择MVCC 253
8.2 etcd v2存储机制实现 255
8.3 etcd v3数据模型 255
8.3.1 逻辑视图 256
8.3.2 物理视图 259
8.4 etcd v3的MVCC的实现 259
8.5 etcd v3 MVCC源码分析 261
8.5.1 revision 262
8.5.2 key到revision之间的映射关系 263
8.5.3 从BoltDB中读取key的value值 264
8.5.4 压缩历史版本 266
8.6 为什么选择BoltDB作为底层的存储引擎 267
第9章 eted的日志和快照管理 269
9.1 数据的持久化和复制 271
9.2 etcd的日志管理 272
9.2.1 WAL数据结构 272
9.2.2 WAL文件物理格式 273
9.2.3 WAL文件的初始化 274
9.2.4 WAL追加日志项 276
9.2.5 WAL日志回放 277
9.2.6 Master向Slave推送日志 278
9.2.7 Follower日志追加 280
9.3 etcd v2的快照管理 280
9.3.1 快照数据结构 281
9.3.2 创建快照 281
9.3.3 快照复制 284
9.3.4 快照之后的日志回收 286
第10章 etcd v3的事务和隔离 288
10.1 事务ACID 288
10.2 事务的隔离性 289
10.2.1 Read uncommitted(读未提交) 290
10.2.2 Read committed(读提交) 290
10.2.3 Repeatable read(重复读) 290
10.3 etcd的事务 291
10.3.1 Serializability的重要性 291
10.3.2 etcd v3的事务实现 293
10.3.3 软件事务内存 295
10.3.4 etcd v3 STM实现 296
第11章 etcd watch机制详解 300
11.1 etcd v2的watch机制详解 300
11.1.1 客户端的watch请求 300
11.1.2 key发生变更时通知客户端 303
11.1.3 带版本号的watch 303
11.1.4 etcd v2 watch的限制 304
11.2 etcd v3的watch实现机制 306