5.1.5 读写流程
Dynamo的读写流程如图5-3和图5-4所示。
图 5-3 Dynamo写入流程
图 5-4 Dynamo读取流程
Dynamo写入数据时,首先,根据一致性哈希算法计算出每个数据副本所在的存储节点,其中一个副本作为本次写操作的协调者。接着,协调者并发地往所有其他副本发送写请求,每个副本将接收到的数据写入本地,协调者也将数据写入本地。当某个副本写入成功后,回复协调者。如果发给某个副本的写请求失败,协调者会将它加入重试列表不断重试。等到W-1个副本回复写入成功后(即加上协调者共W个副本写入成功),协调者可以回复客户端写入成功。协调者回复客户端成功后,还会继续等待或者重试,直到所有的副本都写入成功。
Dynamo读取数据时,首先,根据一致性哈希算法计算出每个副本所在的存储节点,其中一个副本作为本次读操作的协调者。接着,协调者根据负载策略选择R个副本,并发地向它们发送读请求。每个副本读取本地数据,协调者也读取本地数据。当某个副本读取成功后,回复协调者读取结果。等到R-1个副本回复读取成功后(即加上协调者共R个副本读取成功),协调者可以回复客户端。这里分为两种情况:如果R个副本返回的数据完全一致,将某个副本的读取结果回复客户端;否则,需要根据冲突处理规则合并多个副本的读取结果。Dynamo系统默认的策略是根据修改时间戳选择最新的数据,当然用户也可以自定义冲突处理方法。读取过程中如果发现某些副本上的数据版本太旧,Dynamo内部会异步发起一次读取修复操作,使用冲突解决后的结果修正错误的副本。