知识卡片
多层顺序保证共同支撑数据一致性
内容
Ceph要保证同一个对象的两次写请求按顺序被处理,靠的不是某一层单独的机制,而是多层各自负责一段:TCP层本身用序列号保证网络包不乱序;Ceph消息层在应用协议头部再叠加一层序列号校验,检测消息是否丢失或重传;OSD的PG层通过对PG加锁,保证同一PG内的请求处理是串行的,请求下发到存储后端才释放锁;到了ObjectStore层,还要通过单线程写journal、事务序列号排队等手段保证落盘顺序不乱。这四层各自解决的是不同层面可能出现乱序的原因(网络传输、消息层重试、并发处理、异步落盘),任何一层单独存在都不足以保证端到端的顺序性。发散:这是”顺序性保证需要在数据流经的每一层分别兜底”的典型案例——把顺序保证寄希望于某一层单点解决,一旦那一层被绕过或出现意外,整个系统的正确性假设就会崩塌,分层冗余的顺序保证虽然显得”重复劳动”,但恰恰是保证正确性的必要设计。
参考来源
《Linux开源存储全栈详解从Ceph到容器存储》第7章《分布式存储与Ceph》