5.1.6 单机实现
Dynamo的存储节点包含三个组件:请求协调、成员和故障检测、存储引擎。
Dynamo设计支持可插拔的存储引擎,比如Berkerly DB(BDB),MySQL InnoDB等。存储的需求很多,设计成可插拔的形式允许用户根据应用特点选择合适的存储引擎,比如BDB存储的对象大小一般在几十KB之内,而MySQL可以处理更大的对象。用户会根据应用对象大小选择存储引擎,默认为BDB。
请求协调组件采用基于事件驱动的设计,每个客户端的读写请求对应一个状态机,系统根据发生的事件及状态机中的状态决定下一步的操作。比如读取操作对应的状态包括:
●协调者发送读请求到其他节点;
●等待其他节点返回读取结果,最少需要R-1个;
●如果请求其他节点返回失败,需要按照一定的策略重试;
●如果到达时间限制成功的节点仍然小于R-1个,返回客户端请求超时;
●合并协调者及其他R-1个节点的读取结果,并返回客户端,合并的结果可能包含多个冲突版本;如果设置了冲突解决方法,协调者还需要解决冲突。
读操作成功返回客户端以后对应的状态机不会立即被销毁,而是等待一小段时间,这段时间内可能还有一些节点会返回过期的数据,协调者将更新这些节点的数据到最新版本,这个过程称为读取修复。