1. Cassandra
- Cassandra可以看作是Dynamo和Bigtable的结合体
2. ZooKeeper
-
开源分布式协调系统,Hadoop/HBase环境的一部分
-
目前广泛应用于分布式系统对于master节点的容错,使用多台机器运行master节点,一台为主,其余为备份,当主master出现故障,某台备份可以成为主master
-
多个ZooKeeper维护一组共同的数据状态,支持分布式的读和写操作
-
2f+1个ZooKeeper节点可以容忍f个节点故障,仍然正确
-
ZooKeeper 的数据模型: Data Tree
-
client连接Zookeeper的两种方式:1.Synchronous:同步,Client发一个请求,阻塞等待响应;再发下个请求,再阻塞等下个响应,当请求个数很多时,同步操作就很慢。 2. Asynchronous:异步:允许Client发送多个请求,不需要阻塞等待请求完成,提供Callback函数,当请求完成时,Callback被调用
-
ZooKeeper 系统结构:一个Leader,多个Follower
- 所有节点都在内存中维持相同的ZooKeeper树:外存有snapshot+log,来提供crash recovery
- 每个Client只连接到一台ZooKeeper服务器,所有的读操作都由这台服务器用其本地的状态来回复
-
ZooKeeper保证: Linearizable writes:1. 写操作串行化 2. 因为写操作是Leader带领Follower按照相同顺序完成的
-
ZooKeeper 保证: FIFO client order:每个Client自己的读写操作是按照FIFO的顺序发生的,但是,不同Client之间的读写顺序没有任何保证
-
ZAB两个主要工作模式:1. 正常Broadcast Leader向Follower广播新的写操作,Leader向Follower广播新的写操作 2. 异常Recovery:竞争新的Leader,新的Leader进行恢复
3. JSON数据
- 基础类型:string, number, true/false, null、Object、Array
- JSON的数据类型定义是完全动态的,一个JSON记录本身自定义了自己的类型,不需要事先声明schema
4. Google Protocol Buffers
- Google推出,最初用于实现网络协议,所以叫protocol buffers
- 可以用于表达程序设计语言中的结构和数组,
- Google提供了一套软件库,可以把Protocol buffers的记录压缩编码,和解压缩解码,用于网络传输和存储
- 要求先定义类型,然后才可以表达数据
5. JSON vs. Google Protocol Buffers
- 相同点:
- 都可以表达程序设计语言中的结构和数组
- 嵌套:JSON object, PB message/group
- 数组:JSON array, PB repeated
- 缺值的情况:JSON记录实际上没有规定一定要有什么域,PB optional
- 不同点:
- 数据类型:PB要求事先声明,JSON不需要
- JSON数据设计的初衷是文本的。PB从设计开始就是二进制编码的,用于编码协议
6. mongoDB
- 基本不支持Join,可以用lookup实现类似Left outer join
- 与RDBMS(例如MySQL) 非常相似,采用Operator Tree进行执行
- BSON:一种JSON二进制表示:行式,key都是字符串,value根据具体的类型存储二进制值
- 后端可选存储引擎:WiredTiger(默认)等
7. 分布式 MongoDB
- Sharding = horizontal partitioning
-
没有分布式Join操作,Lookup是本地的
-
选择、投影、分组统计等可以在多个Shard上分布式执行
-
如果过滤条件中包括shard key,mongos会选择符合条件的shard(s)执行
-
只保证单个document(记录)修改的一致性,没有transaction概念
8. Neo4j
-
采用自定义的结构在本地硬盘存储图,而不是存在数据库关系型表中
-
Neo4j存储:顶点:称为node,边:称为relationship,顶点和边上可以存储多个key‐value值:称为property
-
定义了transaction概念,在embedded Java中显式使用
-
采用类似snapshot isolation的机制,一个transaction的写先保存起来,直至transaction.finish()时,才真正尝试修改数据