Riak

Posted on May 24, 2016

理论和概念

特点

  • 键值对NoSql
  • Masterless: 各节点都可以独自响应客户端的请求
  • 重视高可用

概念

  • Riak 节点

    在生产环境, 一台服务器就是一个节点, 开发测试时可以在单机上起多个节点

    对等节点, 没有区别, 不分主从

    一个节点负责多个分区

  • 集群

    节点集合, 组成一个哈希环, 一个集群对应一个哈希环

  • 一致性哈希环

    • 哈希节点: 0~2^160
    • 虚拟节点: vnode, 将哈希节点等分; 集群节点负责若干vnode
    • 分区: 分区和vnode基本等同, 连续的哈希节点; 是数据存储的逻辑区分空间.
    • 提示移交: 在某节点失效时, 顺序临近节点将替代失效的节点
  • Bucket

    虚拟的键空间

    bucket 会继承默认设置,经过修改的设置会广播到整个环

    在集群中, 数据的key是bucketkey的组合

    不用主动创建 bucket,把键存入时 bucket 就自动创建了,如果把 bucket 中的所有键都删掉了,bucket 也就不存在了

    配置:

    • n_val 数据副本, 默认是3, 生产环境中, 为了能真正创建 3 个副本,集群中至少要有 3 个物理节点
  • 副本

    N值默认为3

    N=3 就是说每个数据都会在集群中存有 3 个副本,即 3 个不同的分区(虚拟节点)中会各保存一个数据的副本。但无法保证这 3 个副本会分别存入 3 个物理节点中。不过,内建的函数会尝试尽量均匀的分布数据

    每个对象会复制三次。当对象的值映射到某个分区上时,Riak 不会就此打住,它会自动复制数据,将其保存在随后的两个分区中

  • R 值

    读取失败容错

    N 减去 R 得到的值就是 Riak 集群在无法提供读能力之前容许出现的节点下线和延迟数量

  • W 值

    写入失败容忍


查询

  • GET /riak/BUCKET/KEY

    可以设置参数r 指定R值

  • PUT /riak/BUCKET/KEY

    为了兼容,也可以使用 POST

    必要HEADER

    • Content-Type
    • X-Riak-Vclock 如果修改已存在的key, 新建可以省略

    可选HEADER

    • X-Riak-Meta-YOUR-HEADER
    • Link

    可选参数

    • r(默认值为 2):写入之前,要取出多少个已存对象的副本 [TODO]
    • w(默认值为 2):返回成功的响应之前要写入多少个副本
    • dw(默认值为 0):返回成功的响应之前要提交多少个副本到“持久存储”(durable storage)[TODO]
    • returnbody (布尔值,默认为 false):是否返回存储对象的内容
  • POST /riak/BUCKET

    不带key的POST, 将使用随机key

  • DELETE /riak/BUCKET/KEY

    删除


异常处理

Hinted Handoff

节点失效转移的高可用方案

版本冲突

使用向量时钟实现最终一致性

读取修复

在异常情况下读写数据

参考资料