`
langwangff
  • 浏览: 20471 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

lightcloud、hash_ring分析

阅读更多

最近看了lightcloud和hash ring的实现,基于TokyoTyrant,以下是原理图

 

下面结合原理图分析其实现:

     lightcloud采用了两个环,一个用于存储真正的数据,一个用于寻找(存储key对应的在storage上的存储节点)。环上的每个节点都可能有多台服务器(一般为两台,互为备份,这也是利用了TT本身的优势,解决consistent问题),这样比amazon的实现简单了很多很多。

    下面一个实例为例来说明具体的原理:


  require 'rubygems'
  require 'lightcloud'

  LIGHT_CLOUD = {
    'lookup1_A' => ['127.0.0.1:41401', '127.0.0.1:41402'],  #寻找环(lookup ring),这上名有一个节点,
    'storage1_A' => ['192.168.0.2:51401', '192.168.0.2:51402']
  }

  lookup_nodes, storage_nodes = LightCloud.generate_nodes(LIGHT_CLOUD)
  cloud = LightCloud.new(lookup_nodes, storage_nodes)

  cloud.set("hello", "world")
  print cloud.get("hello") # => world
  cloud.delete("hello")


首先:

'lookup1_A' => ['127.0.0.1:41401', '127.0.0.1:41402'],     表示寻找环(lookup ring)上有一个节点,而且这个节点上有两个TT数据库,互为备份,所以 当需要 有多个 节点时,应该再增加类似的指定,如:'lookup1_A' => ['127.0.0.1:41401', '127.0.0.1:41402'],'lookup1_B' => ['127.0.0.1:41403', '127.0.0.1:41404'],这样 这个环上就有两个节点A,B

同理storage环也是一样。

lookup_nodes, storage_nodes = LightCloud.generate_nodes(LIGHT_CLOUD),这是生成lookup和storage两组节点,只是归类了下,通过'lookup'和'storage'两个前缀匹配,所以指定时一定要有这两个关键字,不能随便取名。


cloud = LightCloud.new(lookup_nodes, storage_nodes),这条语句按照两组节点,生成两个环,并且记录,每个节点上名字对应的TT服务


cloud.set("hello", "world"),这条语句怎么执行的吗?原理很关键哦

首先,cloud找到lookup_ring,通过lookup_ring,找到对应的存储节点,如果没找到,则初始化存储节点,即把'hello'这个key通过hash算法设置到相应的节点,并存储,同时在lookup_ring上也通过同样的hash算法,找到相应的节点,记录这个key对应的storage_ring上的存储节点。还有一点,在存储的时候,前面提到,一个节点一般有两个TT,因此,他这里又 用类似的hash算法,通过'hello'这个key计算出一个hash值,找到相应的TT,存储进去,因此,在存储的时候,节点上的TT都可能用到,同时存储后TT再自动进行备份。这样整个写入过程就OK拉。


cloud.get("hello"),这条语句又是怎么执行的呢?

首先,直接到storage_ring上去找这个key的存储节点,如果找到,那就返回,OK结束,但是,如果没找到(这种情况,在增加节点,删除节点后就会发生),那么就先到lookup_ring上通过这个key找到所有可能的节点,再从第1-3个节点(即如果第一个节点上没有这个key对应的值,就按顺时针继续找下一个节点,直到找到第3个为止。) 找到对应的存储节点,最后在存储节点上找到key对应的值并返回。


下面说说,增加storage_ring上的节点,和lookup_ring上的节点的情况

当在storage_ring上增加一个节点后,如'hello'原来通过hash算法后是在节点B上的,当增加节点A后,'hello'通过hash算法后在节点A上,那么在get的时候,就会找不到,所以要到lookup_ring去先得到'hello'的存储节点(B),然后在到存储节点(B)上去找到'hello'对应的值,其实lookup_ring充当了记录的角色。

那么当 lookup_ring上增加了一个节点呢?如'hello'原来通过hash算法后是在lookup_ring上的节点B上的,当在lookup_ring上增加了节点A后,'hello'通过hash算法后也在节点A上,那么当在lookup_ring上找'hello'的存储节点时,A上面是没有记录'hello'对应的存储节点的,所以要找下一个(B),这时就找到了'hello'的存储节点,然后到存储节点上取得'hello'对应的值。在hash_ring上,其实是把'hello'所有可能的节点都通过hash算法按照顺序找出来,然后从第一个开始找直到找到存储节点,或找了3个以后还没有找到就返回NIL,当不在第一个上找到时,会把'hello'这个key和对应的存储节点记录到第一个节点,并将找到的那个节点上的这个key删除,这样下次找的时候在第一个节点上就能找到。

 

这样lightcloud通过两个hash环解决了节点的增加,而且在两个hash环上都可以增加节点,同时,删除节点也只影响删除的节点上的key,其他节点上都不影响。

分享到:
评论
1 楼 totothink 2010-07-05  
不错的文章。LightCloud作为Plurk团队开源的轻量级云存储项目,实现非常简单实用。 它底层采用的是TokyoCabinet和TokyoTyrant,TC和TT是日本最大社交网站mixi的开源项目。 LightCloud利用TT本身的主主复制解决单点故障的问题,利用hash_ring实现分布式调度。  应该说LightCloud用简单的方法解决复杂的问题,非常不错的思路。

相关推荐

    NoSQL数据库笔谈

    LightCloud HamsterDB Flare 最终一致性Key Value存储 Amazon之Dynamo 功能特色 架构特色 BeansDB 简介 更新 特性 性能 Nuclear 两个设计上的T ips Voldemort Dynomite Kai 未分类 Skynet Drizzle 比较 可扩展性 ...

    NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    现有Nosql DB 产品: Redis/MongoDB/Memcached/Hbase/Cassandra/ Tokyo Cabinet/Voldemort/Dynomite/Riak/ CouchDB/Hypertable/Flare/Tin/Lightcloud/ KiokuDB/Scalaris/Kai/ThruDB, 等等~~~ 为什么需要NoSQL非关系...

    大数据云计算技术系列 NoSQL数据库学习教程(共71页).pdf

    4 LightCloud 4 HamsterDB 4 Flare 4 最终一致性Key Value存储 4 Amazon之Dynamo 4 功能特色 4 架构特色 4 BeansDB 4 简介 4 更新 4 特性 4 性能 4 Nuclear 4 两个设计上的Tips 4 Voldemort 4 Dynomite 4 Kai 4 未...

    infrared-remote-candroid studiodemo

    android studio下载

    【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx

    【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx

    基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar

    基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar

    node-v8.10.0-linux-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于Yolov5目标检测和deepsort目标跟踪无人机跟踪.zip

    无人机最强算法源码,易于部署和学习交流使用

    数据库课程设计实战.zip

    数据库课程设计后端 使用Springboot + Mybatis + Redis + Maven 数据库课程设计实战.zip,使用到了所有的相关SQL 的操作,如增删改查等,让你可以在一个项目里面,锻炼到所有的数据库相关的知识。项目亲测可以运行,里面含有运行相关的文档,不会的可以丝我请求帮助。 数据库课程设计后端 使用Springboot + Mybatis + Redis + Maven 具体的表和相关的数据如下: 用户(电话号码,密码,身份证号,邮箱,真实姓名,用户类型,性别,地址) 乘客(用户电话号码,乘客身份证号,乘客真实姓名,乘客电话号码,乘客类型,地址) 列车信息(列车编号,车次,列车类型,列车车厢数,列车始发站,列车终点站,列车开车时间,列车到达时间,列车到达日期,列车运行时间,列车状态) 列车座位信息(列车编号,车厢号,座位类型,座位数) 列车经停信息(列车编号,车次,车站编号,车站名,到达时间,总运行时间,开车时间) 订单信息(订单编号,用户电话号码,乘客身份证号码,列车编号,出发站编号,到达站编号,车厢号,座位编号,订单创建时间,订单状态,开车时间)

    咨询的分析方法gl.ppt

    咨询的分析方法gl.ppt

    node-v10.14.0-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    2019年电赛无人机题目(B题)OpenMV相关代码

    These're the OpenMV codes written by microPython in 2019 NUEDC. 2019年电赛无人机题目(B题)OpenMV相关代码(原创).zip

    无人机降落TRT版本.zip

    无人机最强算法源码,易于部署和学习交流使用

    熊出没.zip

    熊出没.zip

    基于SpringBoot和Vue的家教信息平台设计与实现.zip

    基于SpringBoot和Vue的家教信息平台设计与实现.zip 有完整的部署指导文档,源码也是完整的,可以直接运行,里面包含了所有的相关步骤。 本文旨在设计和实现一套基于Java技术的家教信息系统,采用Spring Boot框架构建后端服务,MySQL数据库存储数据,Vue.js作为前端框架实现用户界面。该系统旨在解决家教信息管理的问题,包括家教师资信息管理、用户信息管理以及家教入驻等功能。通过综合运用Java、Spring Boot、MySQL和Vue等技术,实现了系统的高效运行和良好的用户体验。系统提供了用户注册、登录、信息查看和编辑等功能,同时支持家教的发布和查看,用户信息的管理以及家教审核的后台管理。家长可以方便地寻找合适的家教老师,家教老师也能够更便捷地管理自己的信息和相关资料。通过本设计,展示了Java技术在现代化家教信息系统中的应用,为家教行业的信息化管理提供了一种有效的解决方案。该系统的设计与实现将为家长、家教老师和用户提供便利,促进家教行业的发展与进步。 关键词:SpringBoot; MySQL; 系统设计; 家教

    利用CNN进行无人售货机的商品识别.zip

    无人机最强算法源码,易于部署和学习交流使用

    node-v11.10.1-linux-armv6l.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    (R语言)-6-箱线图的绘制

    (R语言)-6-箱线图的绘制

    麦肯锡-xx联通固定市场举措gl.ppt

    麦肯锡-xx联通固定市场举措gl.ppt

Global site tag (gtag.js) - Google Analytics