diff --git a/README.md b/README.md index 6a0a930..3d3364a 100644 --- a/README.md +++ b/README.md @@ -228,7 +228,7 @@ Figure 3显示了 YMB 的`znode`数据分布的一部分。 每个 broker 域都 ## 4 ZooKeeper Implementation -ZooKeeper通过在组成服务的每台服务器上复制 ZooKeeper 数据来提供高可用性。 我们假设服务器因崩溃而失败,并且此类故障服务器稍后可能会恢复。 Figure 4显示了 ZooKeeper 服务的层次组件。 收到请求后,服务器会为执行做 prepare(request processor)。 如果这样的请求需要服务器之间的协调(是写请求),则它们使用 a greement protocol(原子广播的一种实现),最后服务器将更改提交到 ZooKeeper 数据库中,该更改已在整个集成服务器中完全复制。 对于读取请求,服务器仅从本地数据库读取状态并生成对该请求的响应。 +ZooKeeper通过在组成服务的每台服务器上复制 ZooKeeper 数据来提供高可用性。 我们假设服务器因崩溃而失败,并且此类故障服务器稍后可能会恢复。 Figure 4显示了 ZooKeeper 服务的层次组件。 收到请求后,服务器会为执行做 prepare(request processor)。 如果这样的请求需要服务器之间的协调(是写请求),则它们使用 agreement protocol(原子广播的一种实现),最后服务器将更改提交到 ZooKeeper 数据库中,该更改已在整个集成服务器中完全复制。 对于读取请求,服务器仅从本地数据库读取状态并生成对该请求的响应。 复制数据库是一个包含整个数据树的内存数据库。默认情况下,每个数据库中的 `znode` 最多存储 1MB 的数据,但是这个值是一个可配置的值,在特殊的情况下可以被更改。为了可恢复性,我们高效的把 log 更新在磁盘中,我们强制在写入内存数据库之前写入磁盘。实际上,与 Chubby 一样,我们对于提交的操作维护了一个重放日志 (在我们的例子中,是一个 write-ahead log),并周期性的为内存数据库生成快照。 @@ -266,7 +266,7 @@ ZooKeeper通过在组成服务的每台服务器上复制 ZooKeeper 数据来提 ### 4.4 Client-Server Interactions -当一个服务器处理写请求的时候,它也会发送通知并清楚和这个更新有关的 watch。服务器顺序处理 write,并且以非并行的方式处理读写。这严格保证了通信的顺序。请注意,服务器在本地处理通知。 仅客户端连接到的服务器跟踪并触发该客户端的通知。 +当一个服务器处理写请求的时候,它也会发送通知并清除和这个更新有关的 watch。服务器顺序处理 write,并且以非并行的方式处理读写。这严格保证了通信的顺序。请注意,服务器在本地处理通知。 仅客户端连接到的服务器跟踪并触发该客户端的通知。 读请求由每个服务器在本地处理,每个读取请求都经过处理并用 zxid 标记,该 zxid 对应于服务器看到的最后一个事务。 该 zxid 定义了读取请求相对于写入请求的偏序。 通过本地处理读取,我们获得了出色的读取性能,因为它只是本地服务器上的内存中操作,并且没有要运行的磁盘操作或者广播协议。 这种设计选择是我们获得读为主的负载中高性能的关键。