背景
rgw写一个对象的时候需要更新文件内容,又要更新index pool中的索引,如何保证多个操作的一致性,也就是如何保证多个操作的事务性。有没可能只更新了文件内容而没更新index pool,有没可能并发操作下index pool和文件内容并不一致。
分析
这里其实有两个问题:
1) 原子性问题,也就是只更新了index 而没更新数据,或者说只更新了数据而没更新index。
答:这里实际用了最终一致性。也就是记录index的prepare日志,以是否更新了rados header对象为准来判断是否要更新index对象。当服务中断恢复后,可以通过prepare日志来查询是否更新了header对象,从而决定是否更新index索引。
2) 写写冲突问题。也就是两个客户端同时并发写入一个rgw对象,最终状态是A客户端更新了索引而B客户端更新了header对象,从而导致两边数据不一致。
答: 这里仍然采用了以header对象为准,更新完header对象会返回一个唯一时间戳,后更新的肯定时间戳较大,当去更新index的时候会比较时间戳,如果发现已经存在更大的时间戳则放弃更新index,从而避免了不一致的情况发生。
网友评论