最近看了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,其他节点上都不影响。
分享到:
相关推荐
LightCloud HamsterDB Flare 最终一致性Key Value存储 Amazon之Dynamo 功能特色 架构特色 BeansDB 简介 更新 特性 性能 Nuclear 两个设计上的T ips Voldemort Dynomite Kai 未分类 Skynet Drizzle 比较 可扩展性 ...
现有Nosql DB 产品: Redis/MongoDB/Memcached/Hbase/Cassandra/ Tokyo Cabinet/Voldemort/Dynomite/Riak/ CouchDB/Hypertable/Flare/Tin/Lightcloud/ KiokuDB/Scalaris/Kai/ThruDB, 等等~~~ 为什么需要NoSQL非关系...
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 未...
android studio下载
【新质生产力】新质生产力赋能智能制造数字化解决方案.pptx
基于matlab实现的用于应用布格重力异常数据反演地下异常密度体.rar
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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
无人机最强算法源码,易于部署和学习交流使用
数据库课程设计后端 使用Springboot + Mybatis + Redis + Maven 数据库课程设计实战.zip,使用到了所有的相关SQL 的操作,如增删改查等,让你可以在一个项目里面,锻炼到所有的数据库相关的知识。项目亲测可以运行,里面含有运行相关的文档,不会的可以丝我请求帮助。 数据库课程设计后端 使用Springboot + Mybatis + Redis + Maven 具体的表和相关的数据如下: 用户(电话号码,密码,身份证号,邮箱,真实姓名,用户类型,性别,地址) 乘客(用户电话号码,乘客身份证号,乘客真实姓名,乘客电话号码,乘客类型,地址) 列车信息(列车编号,车次,列车类型,列车车厢数,列车始发站,列车终点站,列车开车时间,列车到达时间,列车到达日期,列车运行时间,列车状态) 列车座位信息(列车编号,车厢号,座位类型,座位数) 列车经停信息(列车编号,车次,车站编号,车站名,到达时间,总运行时间,开车时间) 订单信息(订单编号,用户电话号码,乘客身份证号码,列车编号,出发站编号,到达站编号,车厢号,座位编号,订单创建时间,订单状态,开车时间)
咨询的分析方法gl.ppt
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提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
These're the OpenMV codes written by microPython in 2019 NUEDC. 2019年电赛无人机题目(B题)OpenMV相关代码(原创).zip
无人机最强算法源码,易于部署和学习交流使用
熊出没.zip
基于SpringBoot和Vue的家教信息平台设计与实现.zip 有完整的部署指导文档,源码也是完整的,可以直接运行,里面包含了所有的相关步骤。 本文旨在设计和实现一套基于Java技术的家教信息系统,采用Spring Boot框架构建后端服务,MySQL数据库存储数据,Vue.js作为前端框架实现用户界面。该系统旨在解决家教信息管理的问题,包括家教师资信息管理、用户信息管理以及家教入驻等功能。通过综合运用Java、Spring Boot、MySQL和Vue等技术,实现了系统的高效运行和良好的用户体验。系统提供了用户注册、登录、信息查看和编辑等功能,同时支持家教的发布和查看,用户信息的管理以及家教审核的后台管理。家长可以方便地寻找合适的家教老师,家教老师也能够更便捷地管理自己的信息和相关资料。通过本设计,展示了Java技术在现代化家教信息系统中的应用,为家教行业的信息化管理提供了一种有效的解决方案。该系统的设计与实现将为家长、家教老师和用户提供便利,促进家教行业的发展与进步。 关键词:SpringBoot; MySQL; 系统设计; 家教
无人机最强算法源码,易于部署和学习交流使用
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-箱线图的绘制
麦肯锡-xx联通固定市场举措gl.ppt