《Designing Data-Intensive Applications》读了第二遍,这次记录第五章和第六章的要点。
复制:单主、多主、无主
单主复制最简单,写全部走主节点,问题在于主节点故障后的切换。多主适合多区域写入,代价是冲突处理。无主复制(Dynamo 风格)用 quorum 读写,听起来灵活,实际运维复杂度最高。
一致性模型那里有个很实用的结论:「读到自己刚写的数据」是用户最容易感知的一致性,很多系统只需要保证这一点,不必追求线性一致。
分区:范围 vs 哈希
按 key 范围分区利于范围查询,但容易热点;哈希分区均匀,范围扫描就废了。实践里常见的是复合键:(用户ID, 时间戳) 这样既均匀又能做单用户的时间范围查询。
二级索引的代价
本地索引写入快、查询要 scatter/gather;全局索引查询快、写入要跨分区分发。选哪种取决于读写比例。
一句话总结
分布式的每一个"更好",都是用另一个维度的复杂度换来的。搞清楚自己在换什么,比记住名词重要得多。