1、如何设计一个本地数据节点?
2、分布式环境中节点之间如何通讯?
3、如何从0到1设计一个RPC子系统?
4、如何使用数据一致性协议保证数据的高可用?
5、如何在数据一致性和系统性能之间做取舍?
6、为什么Zookeeper不适合存储大量数据?
1) 设计方面:ZooKeeper需要把所有的数据(它的data tree)加载到内存中。这就决定了ZooKeeper存储的数据量受内存的限制。这一点ZooKeeper和Redis比较像。一般的数据库系统例如MySQL(使用InnoDB存储引擎的话)可以存储大于内存的数据,这是因为InnoDB是基于B-Tree的存储引擎。B-tree存储引擎和LSM存储引擎都可以存储大于内存的数据量。
2)工程方面:ZooKeeper的设计目标是为协同服务提供数据存储,数据的高可用性和性能是最重要的系统指标,处理大数量不是ZooKeeper的首要目标。因此,ZooKeeper不会对大数量存储做太多工程上的优化。
7、 zookeeper 会话的作用是什么? 已经清楚zookeeper 会话啥时候建立,啥时候清除, ping心跳会话激活。但是会话这个机制的意义在哪里? 比如如果没有会话,客户端就用tcp机制连接server,然后发送消息,就不会主动关闭,也不设置超时时间。会有什么问题?
会话主要是为实现临时节点这个特性。临时节点在会话过期以后要被删除。
etcd就没有会话的机制,但是可以通过lease来实现类似的机制。
按照题目所说的那种方式,ZooKeeper节点不知道你的客户端是否还在正常运行。对于一个TCP连接,ZooKeeper节点没有办法区分是另一端已经失败还是另一端没有失败只是没有发送数据。TCP的keepalive机制可以探测TCP是否断掉,但是Keepalive time的时间很长。另外TCP的keepalive机制只能判断TCP层是否出错,没有办法知道客户端是否失败。