`
nkadun
  • 浏览: 55305 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

<第一周>key-value数据库集群的发现与思考(兼锻炼坚持能力)

阅读更多
1. 目标是找到一种如下的key-value数据库集群方案:
- 具备高性能的读写,支持亿级PV
- 具备灵活的可扩展性,同时也是支持上一条的基础
- 数据自动切分,即不依赖于业务逻辑
- 具备分布式事务功能以及不同隔离级别
- 具备数据的一致性或局部一致,最终全部一致
- 可独立提供网络层服务,以支持N(数据库集群)*M(WEB集群)结构,并支持二进制的网络协议
- 方便的客户端API

2. 我最初的思路
- 使用Memcachedb,由客户端API(改造spymemcached)实现分布式事务和隔离
- 由客户端API使用Consistent Hashing进行数据切分

3. 关于自己思路的发现
- 读写性能不错
- 不具备良好的可扩展性,由于Consistent Hashing,由于负载过高需要增加一倍的节点时,数据转移量是巨大的(5星级问题)
- 数据可以自动切分
- 分布式事务和隔离的实现只交由客户端API非常困难(5星级问题)
- 一致性满足
- 有独立的网络层服务,可以实现N*M架构,但不支持二进制协议(2星级问题)
- 客户端API相对方便,如spymemcached

4. 继续发现
由于自己是初学者,在这方面没有太多的经验,无法想出一个解决方案。于是我首先做的是去找其他已有的框架,并做粗浅的了解。
根据"菜鸟"和Robbin以及Google的提示,做了下大概的了解,除了上述提到的Memcachedb外,还包括:
- Cassandra,看看它能否解决我3中出现的三个问题,通过了解发现,它的扩展性是很好的,但没有分布式事务处理。
- Voldemort,面临跟Cassandra一样的问题,所以也让人纠结。
- Redis,主张以内存为主的存储,感觉用于生产会有问题。同时也不能解决分布式事务。
- JBossCache,提供了BDB Loader,但没有独立的网络层,需要与APP SERVER(如JBoss等)配合提供服务,有锁机制,由于配置复杂,也因为下面的Scalaris,我没有做进一步的了解。
- Scalaris,让我激动的框架,因为它支持分布式事务和隔离级别,并且以TC作为底层存储,目前正在研究它的扩展性和使用。由于不懂Erlang,这个过程比较费劲,但我仿佛看到一点光亮……

由于是这方面的初学者,加上基础不足,有些见解可能是错误的或不足的,敬请各位大侠指正,谢谢!
分享到:
评论
16 楼 javaeyebird 2010-01-21  
nkadun 写道

嗯~~感谢回复,我刚看了一下Tangosol(现在叫Coherence),按它的说明看来非常适合我的需求和目标,由于暂时不能下载试用,不知道它的持久化存储是怎么实现的。另一个比较郁闷的是它不是开源的了……

哦,Coherence没有提供独立的网络层,有与WebLogic集成的例子。

BTW:我开始怀疑我的理解了,Cache还是Cache Server的问题……Cache Server意味着我可以N*M,而Cache将是M*M,有人告诉我吗?


听说过java的一个分布式缓存的东西Terracotta
15 楼 nkadun 2010-01-21  
mwmw 写道
如果你对事物要求很高,同时还对扩展性要求很高,现在这种东西是有的,但是一般都是些大型的东西,例如亚马逊的dynamo, 一般的key-value数据库,除了这些富贵型的东西,现在没有多少哦可以解决事物,可用性都并存的问题。

根据我的了解,现在的key-value数据库在一致性性方面没有很好的表现,开发者大都需要自己去实现eventually consistency才能达到好的使用 (可以去做分布式事务等方法), 关于这方面亚马逊的那篇论文还是很有指导意义的。

Key-value数据库发展很快(NOSQL解决方案), 但是NOSQL的解决方案都很好的解决了可用性(availability), 并且建议如果要对事物要求很高的话,不要使用。

Memcachedb虽然已经开始商用(Digg貌似在用),但是用法也是很单一,它仅仅适用于小数据量,高访问量的数据。


嗯,基本上通过我的了解也得到了这个结论,BTW:亚马逊的那篇论文在哪里可以看到?
14 楼 nkadun 2010-01-21  
intih 写道
Tokyo Tyrant + Tokyo cabinet 应该可以满足你说的大部分要求,另外按我的理解对于键值数据库,你不应该在事物上对其有过多的要求,不知道对不对呵呵。


通过这几天的发现,确实key-value数据库(确切的说应该是key-value cache集群方案)都没有好的强的事务支持。所以我也在怀疑我的出发点是不是错了
13 楼 baseworld 2010-01-21  
应用场景一般不需要很强的一致性,一般的实现都是弱一致性。
12 楼 zozoh 2010-01-21  
如果用 JAVA 的话, H2 挺不错的: http://www.h2database.com
11 楼 mwmw 2010-01-21  
如果你对事物要求很高,同时还对扩展性要求很高,现在这种东西是有的,但是一般都是些大型的东西,例如亚马逊的dynamo, 一般的key-value数据库,除了这些富贵型的东西,现在没有多少哦可以解决事物,可用性都并存的问题。

根据我的了解,现在的key-value数据库在一致性性方面没有很好的表现,开发者大都需要自己去实现eventually consistency才能达到好的使用 (可以去做分布式事务等方法), 关于这方面亚马逊的那篇论文还是很有指导意义的。

Key-value数据库发展很快(NOSQL解决方案), 但是NOSQL的解决方案都很好的解决了可用性(availability), 并且建议如果要对事物要求很高的话,不要使用。

Memcachedb虽然已经开始商用(Digg貌似在用),但是用法也是很单一,它仅仅适用于小数据量,高访问量的数据。



10 楼 抛出异常的爱 2010-01-21  
nkadun 写道
1. 目标是找到一种如下的key-value数据库集群方案:
- 具备高性能的读写,支持亿级PV
- 具备灵活的可扩展性,同时也是支持上一条的基础
- 数据自动切分,即不依赖于业务逻辑
- 具备分布式事务功能以及不同隔离级别
- 具备数据的一致性或局部一致,最终全部一致
- 可独立提供网络层服务,以支持N(数据库集群)*M(WEB集群)结构,并支持二进制的网络协议
- 方便的客户端API

2. 我最初的思路
- 使用Memcachedb,由客户端API(改造spymemcached)实现分布式事务和隔离
- 由客户端API使用Consistent Hashing进行数据切分

3. 关于自己思路的发现
- 读写性能不错
- 不具备良好的可扩展性,由于Consistent Hashing,由于负载过高需要增加一倍的节点时,数据转移量是巨大的(5星级问题)
- 数据可以自动切分
- 分布式事务和隔离的实现只交由客户端API非常困难(5星级问题)
- 一致性满足
- 有独立的网络层服务,可以实现N*M架构,但不支持二进制协议(2星级问题)
- 客户端API相对方便,如spymemcached

4. 继续发现
由于自己是初学者,在这方面没有太多的经验,无法想出一个解决方案。于是我首先做的是去找其他已有的框架,并做粗浅的了解。
根据"菜鸟"和Robbin以及Google的提示,做了下大概的了解,除了上述提到的Memcachedb外,还包括:
- Cassandra,看看它能否解决我3中出现的三个问题,通过了解发现,它的扩展性是很好的,但没有分布式事务处理。
- Voldemort,面临跟Cassandra一样的问题,所以也让人纠结。
- Redis,主张以内存为主的存储,感觉用于生产会有问题。同时也不能解决分布式事务。
- JBossCache,提供了BDB Loader,但没有独立的网络层,需要与APP SERVER(如JBoss等)配合提供服务,有锁机制,由于配置复杂,也因为下面的Scalaris,我没有做进一步的了解。
- Scalaris,让我激动的框架,因为它支持分布式事务和隔离级别,并且以TC作为底层存储,目前正在研究它的扩展性和使用。由于不懂Erlang,这个过程比较费劲,但我仿佛看到一点光亮……

由于是这方面的初学者,加上基础不足,有些见解可能是错误的或不足的,敬请各位大侠指正,谢谢!

1.重写client hash分布算法
当增加节点时可以进行两次hash从而增加节点
原:A-B-C
加过节点一次hash:A-虚B-C
加过节点二次hash:A-B-B1-C
可以减少数据迁移

2.你需要一个路由软件.
9 楼 Stero 2010-01-21  
Bigtable/HBase/Hypertable could meet your requirements, except they are column based with version control, heavier than simple key-value caused some overhead.

While Tokyo Tyrant/Tokyo Cabinet or MemcacheDB is more agile, but missing distribution functions.

So my idea is:
1. B tree instead of hashing should be used to keep keys ordered for sharding.
2. Key-value store node is be able to splite it self when data grows. Node should write logs in case if fails, data could be rebuild on other nodes.
3. Using the same master/slave architecture as Bigtable uses to manage key shards and shard server assignment. And also a meta0 and meta1 indexes for key shards. I think this task could be even abstracted as a standard open source project.

That's it.
8 楼 intih 2010-01-21  
<p>Tokyo Tyrant + Tokyo cabinet 应该可以满足你说的大部分要求,另外按我的理解对于键值数据库,你不应该在事物上对其有过多的要求,不知道对不对呵呵。</p>
<p> </p>
<p>楼上这位<span style="font-size: small;"><span style=""><strong> <span style="font-weight: normal;">jellyfish貌似是在US工作的呀。</span></strong></span></span></p>
7 楼 jellyfish 2010-01-21  
nkadun 写道
nkadun 写道
jellyfish 写道
about a year ago, I searched all open source cache implementations(your key value pair is basically a cache), didn't see anything close enough. Commerical software is tangosol, which was bought by oracle some time ago, can reach your range. I used it before and it's great, 80 millis to retrieve 250K complex objects in my test and I sense it's not linear when you go up. 80 millis is about the base.

It's not hard to come up with a distributed schema for keys. The hard part is the performance.


嗯~~感谢回复,我刚看了一下Tangosol(现在叫Coherence),按它的说明看来非常适合我的需求和目标,由于暂时不能下载试用,不知道它的持久化存储是怎么实现的。另一个比较郁闷的是它不是开源的了……


哦,Coherence没有提供独立的网络层,有与WebLogic集成的例子。

BTW:我开始怀疑我的理解了,Cache还是Cache Server的问题……Cache Server意味着我可以N*M,而Cache将是M*M,有人告诉我吗?

Not sure what you mean by N*M. Tangosol is a cache server, distributed and scalable. Tangosol/Coherence is independent of Weblogic, though it can be used with weblogic. It has java/.net/c/c++ api interfaces. It has its own network lib(jar) to work with udp/tcp. Quite a few large financial institutions on wall streets are using it, with size of ~100G of data. I talked to those tangosol folks before and I think they are quite smart to get things right, such as scale up to 5000 nodes(machines). We need that size to convince us it's good. 

The downside is that it's commercial, and quite expensive. But from my experience, it's quite worth it because of the optimization.

Another vendor is gemstone, I don't like them technically from the start(sales presentation to technical questionaire). So I chose tangosol for the company I worked for.

Their key calculation(which key goes to which node), how to replicate data, and serialization are all trade secret, I have no clue. I basically use it as a blackbox. Sorry.
6 楼 lsc20051426 2010-01-21  
推荐Hypertable+Hadoop:http://www.hypertable.org
Hypertable是键值的,基于列存储的分布式数据库
不知道能不能满足楼主的需求
5 楼 nkadun 2010-01-20  
nkadun 写道
jellyfish 写道
about a year ago, I searched all open source cache implementations(your key value pair is basically a cache), didn't see anything close enough. Commerical software is tangosol, which was bought by oracle some time ago, can reach your range. I used it before and it's great, 80 millis to retrieve 250K complex objects in my test and I sense it's not linear when you go up. 80 millis is about the base.

It's not hard to come up with a distributed schema for keys. The hard part is the performance.


嗯~~感谢回复,我刚看了一下Tangosol(现在叫Coherence),按它的说明看来非常适合我的需求和目标,由于暂时不能下载试用,不知道它的持久化存储是怎么实现的。另一个比较郁闷的是它不是开源的了……


哦,Coherence没有提供独立的网络层,有与WebLogic集成的例子。

BTW:我开始怀疑我的理解了,Cache还是Cache Server的问题……Cache Server意味着我可以N*M,而Cache将是M*M,有人告诉我吗?
4 楼 nkadun 2010-01-20  
jellyfish 写道
about a year ago, I searched all open source cache implementations(your key value pair is basically a cache), didn't see anything close enough. Commerical software is tangosol, which was bought by oracle some time ago, can reach your range. I used it before and it's great, 80 millis to retrieve 250K complex objects in my test and I sense it's not linear when you go up. 80 millis is about the base.

It's not hard to come up with a distributed schema for keys. The hard part is the performance.


嗯~~感谢回复,我刚看了一下Tangosol(现在叫Coherence),按它的说明看来非常适合我的需求和目标,由于暂时不能下载试用,不知道它的持久化存储是怎么实现的。另一个比较郁闷的是它不是开源的了……
3 楼 nkadun 2010-01-20  
javaeyebird 写道
Voldemort如何?


除了没有分布式事务,其余的能很好的满足!
2 楼 jellyfish 2010-01-20  
about a year ago, I searched all open source cache implementations(your key value pair is basically a cache), didn't see anything close enough. Commerical software is tangosol, which was bought by oracle some time ago, can reach your range. I used it before and it's great, 80 millis to retrieve 250K complex objects in my test and I sense it's not linear when you go up. 80 millis is about the base.

It's not hard to come up with a distributed schema for keys. The hard part is the performance.
1 楼 javaeyebird 2010-01-20  
Voldemort如何?

相关推荐

    Redis 是一个高性能的key-value数据库 它 的出现,很大程度补偿了memcached这类keyvalue存储的不足

    作为NoSQL数据库的一种,Redis提供了一个内存中的数据结构存储系统,可以当作数据库、缓存和消息中间件使用。 Redis与传统的键值存储系统如Memcached相比,有以下显著的优势: 1. **丰富的数据结构**:Redis支持...

    springboot集成redis集群,redis安装包配置

    集成SpringBoot与Redis集群的第一步是添加相应的依赖。在`pom.xml`或`build.gradle`文件中,你需要包含Spring Data Redis库和Spring Boot的Redis starter。对于Maven项目,可以在`pom.xml`中添加以下依赖: ```xml ...

    ehcache-spring

    &lt;key-template&gt; &lt;string-key-generator /&gt; &lt;/key-template&gt; &lt;resources&gt; &lt;heap unit="MB"&gt;5&lt;/heap&gt; &lt;disk persistent="false" path="./temp" unit="MB"&gt;10&lt;/disk&gt; &lt;/resources&gt; &lt;/cache&gt; &lt;/config&gt; ``` 3. ...

    memcache Java

    这样做的好处是可以实现session的分布式共享,对于负载均衡的Web集群,用户在集群中的任意一台服务器上的操作都可以在其他服务器上继续,无需重新登录或丢失状态。 为了在Java项目中集成Memcache,你需要添加对应的...

    redis数据库集群部署

    ### Redis数据库集群部署知识点详解 #### 一、Redis简介与特性 **Redis**(Remote Dictionary Server)是一款开源的键值(key-value)存储系统,它以其卓越的性能和灵活性,在众多NoSQL数据库中脱颖而出。Redis主要...

    redis,jedis,sentinel需要的两个jar包

    Redis是一款高性能的Key-Value数据库,它以内存存储为主,数据持久化到硬盘,支持丰富的数据类型,如字符串、哈希、列表、集合、有序集合等。在Java开发中,我们通常使用Jedis库来与Redis进行交互。Jedis是一个简单...

    Nosql非关系型数据库-Redis中常用命令.pptx

    - `LPOP key`:移除并返回列表的第一个元素 - `RPOP key`:移除并返回列表的最后一个元素 5. **集合(Set)操作命令** - `SADD key member [member ...]`:向集合添加元素 - `SMEMBERS key`:获取集合的所有...

    mongoDB 教程 视频+PDF

    - 插入文档:`db.&lt;collection&gt;.insert({&lt;field1&gt;:&lt;value1&gt;, &lt;field2&gt;:&lt;value2&gt;})` - 查询文档:`db.&lt;collection&gt;.find({&lt;query&gt;)` - 更新文档:`db.&lt;collection&gt;.update({&lt;query&gt;}, {&lt;update&gt;})` - 删除文档:`...

    jt07日常笔记

    - 当服务器收到请求后,会将返回的数据封装在一个函数调用中,例如`fn({“key”:”value”})`的形式。 - 客户端预先定义好这个函数,如`function fn(data) { alert(data.key); }`,当数据返回时,该函数会被调用并...

    NoSql数据库之Redis笔记

    - **键值(Key-Value)存储数据库**:如TokyoCabinet/Tyrant、Redis等,适合于内容缓存场景,数据模型为一系列键值对,优点在于快速查询,缺点是数据缺少结构化。 - **列存储数据库**:如Cassandra、HBase等,适用于...

    asf-cache中文guide

    - 如果需要分配不同的负载权重,可以使用`&lt;weights&gt;`标签,例如`&lt;weights&gt;3,7&lt;/weights&gt;`表示将30%的负载分配给第一个地址,70%给第二个地址。 **集群配置** 除了基础配置,还可以为高可用性设置集群配置。例如,...

    Memcached 内存分析、调优、集群

    与其他Key-Value存储系统相比,Memcached在集群部署、性能等方面表现出色。例如,在集群方面,Memcached支持通过一致性哈希进行数据分布;在性能方面,Memcached通常具有更快的响应时间和更低的延迟。 #### 6. ...

    美图-PHP笔试题.docx

    - 第一次调用`func($a)`时,全局变量`$a`被传递给`func()`,并在函数内输出并修改了`$a`的值,但因为是局部作用域,所以不会影响到全局变量`$a`的值。 - 第二次调用`func($obj-&gt;a)`时,对象属性`$a`被传递给`func...

    第二周第一天的学习笔记

    ### 第二周第一天的学习笔记 #### 一、Kubernetes (K8S) 中的 Deployment (部署) **Deployment** 是 Kubernetes 中用于管理应用实例的核心概念之一,它提供了声明式的更新功能,确保应用程序始终运行指定数量的...

    springboot-集成redis

    它集成了大量常用的第三方库配置,如 JDBC、MongoDB、JPA、RabbitMQ、Quartz 等,使得开发者能够快速地创建一个独立运行的、生产级别的基于 Spring 的应用。 Redis 是一个开源的、高性能的键值存储系统,常被用作...

    Redis入门 (脑图)

    * setrange key 起始位置 value:用 &lt;value&gt; 覆写 &lt;key&gt; 所储存的字符串值,从 &lt;起始位置&gt; 开始(索引从 0 开始),新值有几位,就替换掉几个字符。 List List 是列表,单键多值,Redis 的 List 是简单的字符串...

    HUE搭建说明文档

    &lt;value&gt;true&lt;/value&gt; &lt;/property&gt; ``` - **配置HUE访问HDFS的权限**: ```xml &lt;property&gt; &lt;name&gt;hadoop.proxyuser.hue.hosts&lt;/name&gt; &lt;value&gt;*&lt;/value&gt; &lt;/property&gt; &lt;property&gt; &lt;name&gt;hadoop.proxyuser.hue...

    现代数据库理论技术重点

    可分为键值(Key-Value)存储数据库、列存储数据库、文档型数据库和图形(Graph)数据库。 三、Memcache 的分布式实现 Memcache 的分布式实现可以通过客户端程序库来实现。标准的分布式方法对键的存储根据服务器台数的...

    redis java操作demo

    - 移除并返回第一个元素:`lpop(key)` - 移除并返回最后一个元素:`rpop(key)` - 删除指定值:`lrem(key, count, value)` 5. **集合(Set)操作** 集合中元素唯一,不重复。 - 添加元素:`sadd(key, member)`...

    Memcached客户端手册

    - `name`:与`&lt;client&gt;`中的`socketpool`属性关联。 - `failover`:是否启用故障转移。 - `initConn`:初始化连接数。 - `minConn`:最小连接数。 - `maxConn`:最大连接数。 - `maintSleep`:后台线程管理...

Global site tag (gtag.js) - Google Analytics