Concepts¶
- Riak是什么?(What is Riak?)
- Riak是:
A Database
A key/value store
A “NoSQL” database
Scalable
Writen in Erlang and C primaryly with a small amount of JavaScript. Riak有两种版本:开源版本和企业版本,其中企业版本是开源版本的超集,它支持SNMP, inter-datacenter replication, web-based administration interface, and top-tier support
- 语言支持库(language support libary)
Erlang
JavaScript
Java
PHP
Python
Ruby
- 数据存储(Data Storage)
- Buckets and keys
Buckets and keys是Riak中组织数据的唯一方式,用户数据以bucket/key对的形式存储。
- Links and Metadata
Bucket/key entries(这儿作为Riak object),可以指向other entries的links。这links可以直接通过Riak’s HTTP 接口或作为map/reduce job的一部分。Riak objects and buckets可以把用户自定义的metadata附加上。这个metadata在HTTP interface作为http headers或者在map/reduce中相关数组。
- Local Disk Storage
0.12 release版本来说,Bitcast是Riak默认后端存储。Bitcast是一种简单但功能很强的k/v存储,来作为Riak低延迟,高吞吐存储。
- Pluggable Backends
Riak用API来和storage subsystem进行交互,The API允许Riak在需要的时候支持嵌入多个后端。目前Riak支持的后端有:Bitcast, dets, ets,Erlang平衡树(gb_trees)或者直接写入文件中。Riak也支持per-bucket backends(一个Bucket一种后端)。想了解更多请查看 配置文件
- 其他后端(other backends)
Basho也开发了一个基于嵌入式
InnoDB
版本,名为Innostore
的后端,由于版本许可限制,Innostore需要单独提供,想要察看更多配置innerStore的信息,请参看 Innostore
- The Riak Cluster
任何一个Riak cluster都有一个160-bit的integer space,并会被平均分区. 一个物理服务器运行N个虚拟结点(vnode),每个vnode都会在下图的ring中声明一块分区.active vnode的数量由这个ring被划分的分区数决定.这些数量在ring初使化时就决定的了。 每个在cluster中的每个node被分配ring的1/(physical nodes总数量),你可以知道每个node中vnode的数量(通过如下计算(partition的数量/node的数量)). 举个例子,一个ring有32个partition,由4上物理node组成,那么我们就知道每个node有8个vnode,如下图:
- Data Replication
在riak中replication是基本功能并自动实现,保证数据的安全性,只要你一个node活着,数据就不会丢失。 下图就是一个实例,n_val=3(这是默认设置),当存储数据时,这个数据会被复制到ring的3个地方。
- 读数据(Reading Data)
- 读取(fetching)
Riak objects如果知道bucket和key,就可以直接读取。这Riak得到数据最快的形式!
R Value
读容错(Reading failure tolerance)
Linking walking
- 写(更新)数据(Writing and Updating Data)
- 向量时钟(Vector clock)
Vector clock会跟踪每次更新, 决定Riak的顺序,探测分布式系统中的冲突!
- 冲突解决(Conflict resolution)
有两种方法,一种是默认最后一次更新为正确,另一种是Riak可以把这个对象的版本都返给客户端,让客户端自己处理
W Value
写容错(Writing failure tolerance)
- MapReduce
Riak中的MapReduce并行化的操作你的数据,最大化的利用你整个Cluster的硬件资源。MapReduce用一系列含有inputs, phases和timeout of a job信息的JSON来描绘。A job含有任意数量的Map和Reduce phases。所以Riak中的MapReduce可以被认为是实时的迷你Hadoop(real-time “mini-Hadoop”). A job通过HTTP提交返回JSON格式编码(也支持Protocol Buffer接口).
输入(inputs)
Phases
Map Phase
Link Phase
Reduce Phase
- Query Languages
可以用Erlang或JavaScript来写,
Erlang
- JavaScript
Mozilla’s Spidermonkey引擎提供运行环境,预定义的JavaScript函数像erlang函数运行的一样快。JavaScript函数当前只允许对Riak读。
- Secondary Indexes
Version 1.0增加对Riak Secondary Indexes的支持。这个属性让应用tag a Riak object with one or more field/value pairs. The object is indexed under these field/value pairs, and the application can later query the index to retrieve a list of matching keys.
Schema Free
Real-Time and Atomic
Query via HTTP, Protocol Buffers, or MapReduce
- The Riak API
Riak(由于Erlang REST framework Webmachine)用REST作为他们的API,存储操作用HTTP PUTs和POST,查询操作用HTTP GETs。存储操作用预定义的URL(默认是’/riak’)来提交。 Client可以为Riak設定Content-Type header。Riak will replay the header when the object is fetched. This is nice since it allows Riak to be content agnostic. 深入了解Riak API请点击 这儿