<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Tim[后端技术] &#187; key value store</title>
	<atom:link href="http://timyang.net/tag/key-value-store/feed/" rel="self" type="application/rss+xml" />
	<link>http://timyang.net</link>
	<description>Tim&#039;s blog, 关于后端架构、互联网技术、分布式、大型网络应用、NoSQL、Key Value等</description>
	<lastBuildDate>Mon, 02 Aug 2010 15:34:40 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Twitter停用Cassandra原因分析</title>
		<link>http://timyang.net/data/twitter-cassandra/</link>
		<comments>http://timyang.net/data/twitter-cassandra/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 16:29:41 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[cassandra]]></category>
		<category><![CDATA[key value store]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=623</guid>
		<description><![CDATA[Twitter在其7.9一篇官方技术博客Cassandra at Twitter Today提到暂停使用Cassandra来代替MySQL存储feed的计划，这是Twitter一个重要的架构策略调整，因为之前Twitter一直是业界Cassandra方向的领头羊。
For now, we&#8217;re not working on using Cassandra as a store for Tweets. This is a change in strategy. Instead we&#8217;re going to continue to maintain our existing Mysql-based storage. We believe that this isn&#8217;t the time to make large scale migration to a new technology. We will focus our Cassandra work [...]]]></description>
			<content:encoded><![CDATA[<p>Twitter在其7.9一篇官方技术博客<a href="http://engineering.twitter.com/2010/07/cassandra-at-twitter-today.html">Cassandra at Twitter Today</a>提到暂停使用Cassandra来代替MySQL存储feed的计划，这是Twitter一个重要的架构策略调整，因为之前Twitter一直是业界Cassandra方向的领头羊。</p>
<blockquote><p>For now, we&#8217;re not working on using Cassandra as a store for Tweets. This is a change in strategy. Instead we&#8217;re going to continue to maintain our existing Mysql-based storage. We believe that this isn&#8217;t the time to make large scale migration to a new technology. We will focus our Cassandra work on new projects that we wouldn&#8217;t be able to ship without a large-scale data store.</p></blockquote>
<h3>Twitter为什么要停用Cassandra</h3>
<p>我们来分析一下Twitter停止使用Cassandra的原因<br />
1. Cassandra仍然缺少大并发海量数据访问的案例及经验，Cassandra来源自Facebook，但是在Facebook内部Cassandra目前只用在inbox search产品上，容量大约有100-200T。且Inbox Search在Facebook的基础架构中也并非核心应用。并且还传出不少rumors说facebook已经放弃Cassandra。</p>
<p>2. 新产品需要一定稳定期，Cassandra代码或许还存在不少问题，但是Twitter如果投入大量的精力来改进Cassandra和比较优化MySQL的投入来看有点得不偿失。在QCon Beijing上@<a href="http://twitter.com/nk">nk</a>也提到Cassandra在Twitter的内部测试中曾经暴露出不少严重的问题。</p>
<h3>Twitter为什么之前选用Cassandra</h3>
<p>此问题曾经在QCon Beijing 2010做过介绍，在去年的第一期广州技术沙龙也有过交流，类似Twitter这样的网站使用Cassandra的主要原因有<br />
1. 数据增长规模需要不断增加新服务器，传统的切分方案在面临增删硬件时候需要手工维护，当数据规模速度增快，业务又不运行停机维护，手工维护的成本增加造成系统运维不堪重负。<br />
2. 不能简单增加服务器解决请求量增长的问题，需要数据架构师精细的规划。<br />
3. 每一个新的特性都需要重复评估数据拆分及访问优化的问题，架构师需要投入大量精力review几乎相同的业务场景。</p>
<p>Twitter的调整对于MySQL业界来说或许是一大利好，MySQL虽然受近期Oracle收购阴影的影响，但是对于目前大多数拥有海量数据访问的网站依然是他们第一选择。MySQL简单，可靠，安全，配套工具完善，运维成熟。业界碰到的大部分可扩展性方面的问题在MySQL中其实都有清晰明确的解决方法。虽然重复sharding的问题很烦，增删机器相关的运维工作也很繁琐，但是这些工作量还是在可以接受的范围内。</p>
<p>究竟Twitter这次策略改变是NoSQL运动的一次挫折还是前进中的一段小插曲？我们拭目以待。目前另外一大Web 2.0巨头Digg仍然在使用Cassandra。</p>
Similar Posts:<ul><li><a href="http://timyang.net/architecture/2010-tech-predictions/" rel="bookmark" title="December 31, 2009">2010年的技术架构建议</a></li>

<li><a href="http://timyang.net/sns/web20-forum/" rel="bookmark" title="June 6, 2010">Web 2.0技术沙龙设想</a></li>

<li><a href="http://timyang.net/sns/facebook-f8-0/" rel="bookmark" title="July 1, 2009">Facebook平台设计(二)</a></li>

<li><a href="http://timyang.net/architecture/twitter-cache-architecture/" rel="bookmark" title="October 28, 2009">Twitter架构图(cache篇)</a></li>

<li><a href="http://timyang.net/architecture/farmville/" rel="bookmark" title="March 8, 2010">FarmVille(美版开心农场)谈架构:所有模块都是一个可降级的服务</a></li>
</ul><!-- Similar Posts took 10.471 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/data/twitter-cassandra/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Dynamo一个缺陷的架构设计(译)</title>
		<link>http://timyang.net/data/dynamo-flawed-architecture-chinese/</link>
		<comments>http://timyang.net/data/dynamo-flawed-architecture-chinese/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 13:46:14 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[dynamo]]></category>
		<category><![CDATA[key value store]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=557</guid>
		<description><![CDATA[在云计算的时代，Dynamo可以说是一本实现分布式存储的红宝书，借鉴Dynamo实现的产品如雨后春笋般冒出。前段时间本人曾在Twitter上戏称
这年头，如果一个号称有“海量数据”的互联网公司，不做一个自己的Dynamo, 出去都不好意思跟人打招呼
(http://twitter.com/xmpp/status/8023241449)
另外一方面对于Dynamo设计思想也有不少反对的声音，比如2009/11/1在Hacker News上链接的一篇文章Dynamo: A flawed architecture引起不少争议，最后竟引起Amazon CTO Werner Vogels在Twitter上回应
Darn, someone figured out that Dynamo is a flawed architecture. Luckily its only use is storing hundreds of millions of shopping carts 
(http://twitter.com/Werner/statuses/5345892061)
汗，有人发现Dynamo是一个缺陷的架构，幸运的是，我们只用它来存储了成百上亿的购物篮数据。:-)
以下是这篇批判Dynamo文章大部分中心观点，所翻译的观点并不代表Tim立场。
&#8211;译文开始&#8211;
Dynamo: A flawed architecture 
在发表此文章之前，我也争论过Dynamo是否适合我们的系统。但是我很清楚这篇论文充满缺陷，它将错误的引导了读者让大家相信其设计，它的很多设计前后自相矛盾。下文会详细介绍这些缺陷。
Dynamo的最终一致性
首先，最终一致性对开发者意味什么呢？

写入的数据不能在后续的读操作中获取到。
写入的数据也有可能在后续的读操作中获取到，但读到后可能下一次又读不到。
因此对写操作后面的读取没有SLA(Service Level Agreement)保证。

举例说明，由于Dynamo是一个key value存储，我们假设value中存储的是一个list, 当list写入数据之后另外一个client却未读取到，这时候它需要写入数据的话只能重新构建一个新的list，添加要存的值并将新list存入，这就会导致老的list数据丢失。
(Update: 论坛上一些人指出，由于Vector Clock机制，数据丢失的场景不可能出现，我同意，不过我再提出几个其他问题。)

Cassandra未用vector clock, 而只用client timestamps也达到了同样效果。
Dynamo依赖合并冲突来解决此问题，一些场合下冲突很难解决。比如从list中错误的截取操作。(if deletion from the list is a valid operation &#8211; then how [...]]]></description>
			<content:encoded><![CDATA[<p>在云计算的时代，Dynamo可以说是一本实现分布式存储的红宝书，借鉴Dynamo实现的产品如雨后春笋般冒出。前段时间本人曾在Twitter上戏称</p>
<blockquote><p>这年头，如果一个号称有“海量数据”的互联网公司，不做一个自己的Dynamo, 出去都不好意思跟人打招呼<br />
(<a href="http://twitter.com/xmpp/status/8023241449">http://twitter.com/xmpp/status/8023241449</a>)</p></blockquote>
<p>另外一方面对于Dynamo设计思想也有不少反对的声音，比如2009/11/1在<a href="http://news.ycombinator.com/">Hacker News</a>上链接的一篇文章<a href="http://jsensarma.com/blog/2009/11/dynamo-a-flawed-architecture-part-i/">Dynamo: A flawed architecture</a>引起不少争议，最后竟引起Amazon CTO Werner Vogels在Twitter上回应</p>
<blockquote><p>Darn, someone figured out that Dynamo is a flawed architecture. Luckily its only use is storing hundreds of millions of shopping carts <img src='http://timyang.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /><br />
(<a href="http://twitter.com/Werner/statuses/5345892061">http://twitter.com/Werner/statuses/5345892061</a>)<br />
汗，有人发现Dynamo是一个缺陷的架构，幸运的是，我们只用它来存储了成百上亿的购物篮数据。:-)</p></blockquote>
<p>以下是这篇批判Dynamo文章大部分中心观点，所翻译的观点并不代表Tim立场。</p>
<p><strong>&#8211;译文开始&#8211;</strong></p>
<h2>Dynamo: A flawed architecture </h2>
<p>在发表此文章之前，我也争论过Dynamo是否适合我们的系统。但是我很清楚这篇论文充满缺陷，它将错误的引导了读者让大家相信其设计，它的很多设计前后自相矛盾。下文会详细介绍这些缺陷。</p>
<h3>Dynamo的最终一致性</h3>
<p>首先，最终一致性对开发者意味什么呢？</p>
<ol>
<li>写入的数据不能在后续的读操作中获取到。</li>
<li>写入的数据也有可能在后续的读操作中获取到，但读到后可能下一次又读不到。</li>
<li>因此对写操作后面的读取没有SLA(Service Level Agreement)保证。</li>
</ol>
<p>举例说明，由于Dynamo是一个key value存储，我们假设value中存储的是一个list, 当list写入数据之后另外一个client却未读取到，这时候它需要写入数据的话只能重新构建一个新的list，添加要存的值并将新list存入，这就会导致老的list数据丢失。</p>
<p>(Update: 论坛上一些人指出，由于Vector Clock机制，数据丢失的场景不可能出现，我同意，不过我再提出几个其他问题。)</p>
<ol>
<li>Cassandra未用vector clock, 而只用client timestamps也达到了同样效果。</li>
<li>Dynamo依赖合并冲突来解决此问题，一些场合下冲突很难解决。比如从list中错误的截取操作。(if deletion from the list is a valid operation &#8211; then how would one reconcile after mistaken truncation?)</li>
<li>另外一个场景，读取到脏数据后可能会影响后续的写入。(a stale read may end up affecting writes to other keys)</li>
</ol>
<p>一般的常识是读取脏数据是需要避免的，但是Dynamo中无任何措施来避免读取脏数据以及避免读取脏数据的客户端再次写入，这个在单IDC环境其实是完全可以避免的。</p>
<h3>Quorum一致性</h3>
<p>(译者注：Quorum是Dynamo的一个核心特性，主要思想是 写最小节点数W + 读最小节点数R &gt; 所有节点数N)<br />
Dynamo开始就提到系统按最终一致性设计，但是在4.5中却提出用Quorum的方法来实现一定程度的一致性，意思是如果R+W&gt;N, 则读操作就具备(强)一致性了。明显是误导。由于节点会出现不可用的情况，尤其在跨IDC情况下，任一节点随时都有可能离开quorum组，当它离开再加入的时候，R个节点返回的数据就是不一致的，因为故障节点的数据只具备“最终一致性”，而在当时返回的只能是脏数据。</p>
<p>这就带来一个明显的问题，为什么要让未同步到最新数据的节点加入组？答案是Dynamo中无任何方法来判断一个节点是否数据同步，也无法判断有哪些数据不同步。因此只能做一个完全数据比较才能判断，Dynamo中用一种叫Merkle Tree的方法来实现，这个当然是一个代价昂贵且不灵活的操作，因为为了不影响Dynamo正常的读写业务，同步需要在后台执行。</p>
<p>实现强一致性也可以用读取所有节点(R=N)的方式来达到，不过有2个问题。</p>
<ol>
<li> 一旦有一个节点未同步，读取就会失败。</li>
<li>读取的代价极高。</li>
</ol>
<p>我并不是第一个发现这些问题的人，比如另一知名的Cassandra产品<a href="https://issues.apache.org/jira/browse/CASSANDRA-225">Cassandra-225</a>中就提到用一个中心commit log的方法来解决此问题。</p>
<h3>WAN considerations 跨IDC的问题</h3>
<p>值得指出的是，如果将Dynamo部署到多个机房，节点的断续情况会很容易发生。当一个节点连接不到，Dynamo的&#8221;hinted handoff&#8221;策略会使用一致性哈希算法将数据放入下一个节点。在多IDC环境下，下一节点通常在另一机房，因此会造成异地数据传输增加。当异地整个IDC都连不上网络分裂情况发生时，数据需要很长时间才能完全恢复。</p>
<h3>Disaster Recovery 灾难恢复</h3>
<p>Dynamo最终一致性及同步的设计对于是节点故障是有价值的，但是却无法估算有多少数据未同步。如果改用常规的commit log方式的话，很容易就能实现故障恢复并且计算未同步的数据量。</p>
<p>未使用<strong>时间一致性</strong>(译者：基于timestamp的合并？)在某些场合下很难合并冲突。</p>
<h3>一致性还是可用性 Consistency versus Availability</h3>
<p>一般认为Dynamo选择了CAP理论中的AP，而BigTable选择了CA。不幸的是，Dynamo并没有搞清什么是A(availability)和P(Partition Tolerance)。读者被误导只能在C和P中做一个取舍，这个当然是错的。我们很容易在单IDC实现一致性及高可用性。大部分商业数据库就是如此，HBase/HDFS也是如此。</p>
<p>很多人误以为即使在单IDC架构中，Dynamo方式比BigTable/GFS架构更合理。但Dynamo的优势其实是在多IDC。</p>
<h3>中心化还是去中心化</h3>
<p>Dynamo中提到</p>
<blockquote><p>In the past, centralized control has resulted in outages and the goal is to avoid it as much as possible. This leads to a simpler, more scalable, and more available system.<br />
过去，中心化设计导致了很多灾难，我们意识到要远离中心化。去中心化后，系统会更简洁，更具有可扩展性及高可用性。</p></blockquote>
<p>中心化确实会形成瓶颈，但是没有证据说明中心化就低可用性。大部分专业的存储系统通过双机热备的方式都具备高可用性。简单的说，只需要所有中心模块(电源，主板，RAID，交换机等)都按双份的方式来设计，只需要额外增加一点硬件成本，这些系统基本可以达到5个9的可用性。</p>
<p>值得讽刺的是Dynamo其实在部分情况下还是一个中心化的体系，如交换机故障发生了网络分片，服务器分成2个独立的小网，这时候Dynamo对客户端是不可用的，尽管客户端可以连接上Dynamo。</p>
<p>更讽刺的是我们看到Dynamo很多一致性问题都是去中心化设计所导致。</p>
<p><strong>&#8211;译文完&#8211;</strong></p>
<p>此文的讨论也非常精彩，对于想深入了解Dynamo的朋友是不可多得的资料。可参看 <a href="http://news.ycombinator.com/item?id=915212">http://news.ycombinator.com/item?id=915212</a></p>
Similar Posts:<ul><li><a href="http://timyang.net/data/multi-idc-design/" rel="bookmark" title="March 25, 2010">多IDC的数据分布设计(二)</a></li>

<li><a href="http://timyang.net/architecture/yahoo-pnuts/" rel="bookmark" title="June 21, 2009">Yahoo!的分布式数据平台PNUTS简介及感悟</a></li>

<li><a href="http://timyang.net/distributed/multi-idc-consensus/" rel="bookmark" title="February 2, 2010">多IDC的数据分布设计(一)</a></li>

<li><a href="http://timyang.net/architecture/consistent-hashing-practice/" rel="bookmark" title="September 6, 2009">某分布式应用实践一致性哈希的一些问题</a></li>

<li><a href="http://timyang.net/distributed/paxos-scenarios/" rel="bookmark" title="September 23, 2009">Paxos在大型系统中常见的应用场景</a></li>
</ul><!-- Similar Posts took 17.969 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/data/dynamo-flawed-architecture-chinese/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>2010年的技术架构建议</title>
		<link>http://timyang.net/architecture/2010-tech-predictions/</link>
		<comments>http://timyang.net/architecture/2010-tech-predictions/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 09:15:21 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[架构]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[app engine]]></category>
		<category><![CDATA[key value store]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=520</guid>
		<description><![CDATA[在 2009年最后一天，根据自己小小的视角提出一些技术建议，供同行参考。
编程语言
首先要能跳出语言之争及语言偏见，架构师需要在中立的角度选择最合适团队的语言，避免在技术决策中加入过多个人喜好。在系统语言层面，主要可关注以下几种
Erlang, 会继续在小圈子内流行，业界应用Erlang技术最大的障碍不是Erlang技术本身，而在于缺乏这方面专业人才。
Scala, 和Erlang不同，Scala有成熟JVM及丰富的周边library，在异构系统中集成也很容易，新项目使用Scala风险很小，所以Scala在新语言中应该有较大的提升优势。
Go, 由于刚开始推出，不适合正式项目使用，2010年会稳步上升，可适当关注。
其他语言基本保持现状。
架构
LAMP中的Linux, Apache, MySQL会受到云计算中的App Engine模式的冲击，因为App Engine在分布式处理，可扩展性，稳定性方面都有很大的优势。 在App Engine模式中，MySQL作用会降低，退化成一种存储服务。而且App Engine的存储服务含义会更广泛，传统架构中的MySQL, Memcached, 及key value store在App Engine框架下都会以底层的服务方式提供。存储不再是软件，而是一种可靠服务，因此也会带来分布式存储相关技术的繁荣。
Web 2.0的设计中，Cache会成为一个中心元素。传统的web应用cache只是一个可选的锦上添花层，即使去掉，PHP + MySQL这种模式也可正常运行。但随着未来应用social化及realtime的趋势，从facebook及twitter的设计来看，cache已经从可选层成为核心层。cache设计的好坏直接决定架构的成败。
由于web发展的趋势会使应用更realtime化，体现到技术层面是HTML5(websockets)及类似技术具有更高的价值。但由于阻碍生产力的IE存在，HTML5无法一步到位。建议关注能解决HTML5及旧ajax自适应的框架。
网络模型方面，由于多核的硬件环境，轻量级的进程模型值得采用。如传统的C++ boost的asio, 各公司自己实现的coroutine, Erlang的process, go的goroutines, Java/Scala的Netty/Mina框架等。但C++框架的代码优雅性可维护性欠佳，性能也没有突出的优势，可关注后面几种方案。
分布式方面，Dynamo及Chubby的思想会逐渐在国内的项目等到更广泛的应用，架构师会逐步丢弃双写，双机心跳等山寨式的容错设计思想，可靠的分布式设计思想会更普及。
存储
2009是key value/nosql产品百花齐放的年代。到2010年，它们之中优秀的会脱颖而出逐步主流化，主流化的产品周边的工具会更丰富，运维相关经验也会更成熟。目前阻碍很多key value产品推广很大一个障碍是运维的顾虑，而不是它们本身的性能。究竟会是Memcachedb/Tokyo Cabinet/Redis这样的小巧软件走向主流，还是Cassandra这样的巨无霸更受欢迎，我们拭目以待。
Similar Posts:Web 2.0技术沙龙设想

2010年技术实践计划

分布式key/value store演讲草稿(一)

Twitter架构图(cache篇)

构建可扩展的微博架构(qcon beijing 2010演讲)
]]></description>
			<content:encoded><![CDATA[<p>在 2009年最后一天，根据自己小小的视角提出一些技术建议，供同行参考。</p>
<h2>编程语言</h2>
<p>首先要能跳出语言之争及语言偏见，架构师需要在中立的角度选择最合适团队的语言，避免在技术决策中加入过多个人喜好。在系统语言层面，主要可关注以下几种<br />
Erlang, 会继续在小圈子内流行，业界应用Erlang技术最大的障碍不是Erlang技术本身，而在于缺乏这方面专业人才。<br />
Scala, 和Erlang不同，Scala有成熟JVM及丰富的周边library，在异构系统中集成也很容易，新项目使用Scala风险很小，所以Scala在新语言中应该有较大的提升优势。<br />
Go, 由于刚开始推出，不适合正式项目使用，2010年会稳步上升，可适当关注。<br />
其他语言基本保持现状。</p>
<h2>架构</h2>
<p>LAMP中的Linux, Apache, MySQL会受到云计算中的App Engine模式的冲击，因为App Engine在分布式处理，可扩展性，稳定性方面都有很大的优势。 在App Engine模式中，MySQL作用会降低，退化成一种存储服务。而且App Engine的存储服务含义会更广泛，传统架构中的MySQL, Memcached, 及key value store在App Engine框架下都会以底层的服务方式提供。存储不再是软件，而是一种可靠服务，因此也会带来分布式存储相关技术的繁荣。</p>
<p>Web 2.0的设计中，Cache会成为一个中心元素。传统的web应用cache只是一个可选的锦上添花层，即使去掉，PHP + MySQL这种模式也可正常运行。但随着未来应用social化及realtime的趋势，从facebook及twitter的设计来看，cache已经从可选层成为核心层。cache设计的好坏直接决定架构的成败。</p>
<p>由于web发展的趋势会使应用更realtime化，体现到技术层面是HTML5(websockets)及类似技术具有更高的价值。但由于阻碍生产力的IE存在，HTML5无法一步到位。建议关注能解决HTML5及旧ajax自适应的框架。</p>
<p>网络模型方面，由于多核的硬件环境，轻量级的进程模型值得采用。如传统的C++ boost的asio, 各公司自己实现的coroutine, Erlang的process, go的goroutines, Java/Scala的Netty/Mina框架等。但C++框架的代码优雅性可维护性欠佳，性能也没有突出的优势，可关注后面几种方案。</p>
<p>分布式方面，Dynamo及Chubby的思想会逐渐在国内的项目等到更广泛的应用，架构师会逐步丢弃双写，双机心跳等山寨式的容错设计思想，可靠的分布式设计思想会更普及。</p>
<h2>存储</h2>
<p>2009是key value/nosql产品百花齐放的年代。到2010年，它们之中优秀的会脱颖而出逐步主流化，主流化的产品周边的工具会更丰富，运维相关经验也会更成熟。目前阻碍很多key value产品推广很大一个障碍是运维的顾虑，而不是它们本身的性能。究竟会是Memcachedb/Tokyo Cabinet/Redis这样的小巧软件走向主流，还是Cassandra这样的巨无霸更受欢迎，我们拭目以待。</p>
Similar Posts:<ul><li><a href="http://timyang.net/sns/web20-forum/" rel="bookmark" title="June 6, 2010">Web 2.0技术沙龙设想</a></li>

<li><a href="http://timyang.net/misc/2010-tech-plan/" rel="bookmark" title="December 28, 2009">2010年技术实践计划</a></li>

<li><a href="http://timyang.net/tech/key-value-store-draft/" rel="bookmark" title="July 27, 2009">分布式key/value store演讲草稿(一)</a></li>

<li><a href="http://timyang.net/architecture/twitter-cache-architecture/" rel="bookmark" title="October 28, 2009">Twitter架构图(cache篇)</a></li>

<li><a href="http://timyang.net/architecture/microblog-design-qcon-beijing/" rel="bookmark" title="May 11, 2010">构建可扩展的微博架构(qcon beijing 2010演讲)</a></li>
</ul><!-- Similar Posts took 8.596 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/architecture/2010-tech-predictions/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Friendfeed的MySQL key/value存储</title>
		<link>http://timyang.net/data/friendfeed-mysql-schema-less/</link>
		<comments>http://timyang.net/data/friendfeed-mysql-schema-less/#comments</comments>
		<pubDate>Thu, 29 Oct 2009 05:59:06 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[data]]></category>
		<category><![CDATA[friendfeed]]></category>
		<category><![CDATA[key value store]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=447</guid>
		<description><![CDATA[这是一篇2009年初的资料How FriendFeed uses MySQL to store schema-less data,相信大部分人已经看过了。如Fenng的中文介绍FriendFeed 使用 MySQL 的经验。本文从不同的角度再补充下。作者几个月前也曾经在广州技术沙龙作过一次Key value store漫谈的演讲，许多参会人员对key value方向存在强烈的使用意愿，但同时也对完全抛弃MySQL存在疑虑，本文介绍的方案也可以给这些人员一些架构参考。
需求
250M entities, entities表共有2.5亿条记录，当然是分库的。
典型解决方案:RDBMS
问题：由于业务需要不定期更改表结构，但是在2.5亿记录的表上增删字段、修改索引需要锁表，最长需要1小时到1天以上。
Key value方案
评估Document类型数据库，如CouchDB
CouchDB问题： Performance？ 广泛使用？ 稳定性？ 抗压性？
MySQL方案
MySQL相比Document store优点：

 不用担心丢数据或数据损坏
 Replication
 非常熟悉它的特性及不足，知道如何解决

结论
综合取舍，使用MySQL来存储key/value(schema-less)数据,value中可以放：
Python dict
JSON object
实际friendfeed存放的是zlib压缩的Python dict数据，当然这种绑定一种语言的做法具有争议性。
表结构及Index设计模式
feed数据基本上都存在entities表中，它的结构为
mysql&#62; desc entities;
+----------+------------+------+-----+-------------------+----------------+
&#124; Field    &#124; Type       &#124; Null &#124; Key &#124; Default           &#124; Extra          &#124;
+----------+------------+------+-----+-------------------+----------------+
&#124; added_id &#124; int(11)    &#124; NO   &#124; PRI &#124; NULL              &#124; auto_increment &#124;
&#124; id       [...]]]></description>
			<content:encoded><![CDATA[<p>这是一篇2009年初的资料<a href="http://bret.appspot.com/entry/how-friendfeed-uses-mysql">How FriendFeed uses MySQL to store schema-less data</a>,相信大部分人已经看过了。如Fenng的中文介绍<a href="http://www.dbanotes.net/arch/friendfeed_mysql.html">FriendFeed 使用 MySQL 的经验</a>。本文从不同的角度再补充下。作者几个月前也曾经在广州技术沙龙作过一次<a href="http://www.slideshare.net/iso1600/key-value-store">Key value store漫谈</a>的演讲，许多参会人员对key value方向存在强烈的使用意愿，但同时也对完全抛弃MySQL存在疑虑，本文介绍的方案也可以给这些人员一些架构参考。</p>
<h3>需求</h3>
<p><strong>250M entities</strong>, entities表共有2.5亿条记录，当然是分库的。</p>
<h3>典型解决方案:RDBMS</h3>
<p>问题：由于业务需要不定期更改表结构，但是在2.5亿记录的表上增删字段、修改索引需要锁表，最长需要1小时到1天以上。</p>
<h3>Key value方案</h3>
<p>评估Document类型数据库，如CouchDB<br />
CouchDB问题： <strong>Performance？ 广泛使用？ 稳定性？ 抗压性？</strong></p>
<h3>MySQL方案</h3>
<p>MySQL相比Document store优点：</p>
<ul>
<li> 不用担心丢数据或数据损坏</li>
<li> Replication</li>
<li> 非常熟悉它的特性及不足，知道如何解决</li>
</ul>
<h3>结论</h3>
<p>综合取舍，使用MySQL来存储key/value(schema-less)数据,value中可以放：<br />
Python dict<br />
JSON object</p>
<p>实际friendfeed存放的是zlib压缩的Python dict数据，当然这种绑定一种语言的做法具有争议性。</p>
<h3>表结构及Index设计模式</h3>
<p>feed数据基本上都存在entities表中，它的结构为</p>
<pre>mysql&gt; desc entities;
+----------+------------+------+-----+-------------------+----------------+
| Field    | Type       | Null | Key | Default           | Extra          |
+----------+------------+------+-----+-------------------+----------------+
| added_id | int(11)    | NO   | PRI | NULL              | auto_increment |
| id       | binary(16) | NO   | UNI |                   |                |
| updated  | timestamp  | YES  | MUL | CURRENT_TIMESTAMP |                |
| body     | mediumblob | YES  |     | NULL              |                |
+----------+------------+------+-----+-------------------+----------------+</pre>
<p>假如里面存的数据如下</p>
<pre>{
"id": "71f0c4d2291844cca2df6f486e96e37c",
"user_id": "f48b0440ca0c4f66991c4d5f6a078eaf",
"feed_id": "f48b0440ca0c4f66991c4d5f6a078eaf",
"title": "We just launched a new backend system for FriendFeed!",
"link": "http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c",
"published": 1235697046,
"updated": 1235697046,
}</pre>
<p>如果要对link字段进行索引，则用另外一个表来存储。</p>
<pre>mysql&gt; desc index_link;
+-----------+--------------+------+-----+---------+-------+
| Field     | Type         | Null | Key | Default | Extra |
+-----------+--------------+------+-----+---------+-------+
| link      | varchar(255) | NO   | PRI |         |       |
| entity_id | binary(16)   | NO   | PRI |         |       |
+-----------+--------------+------+-----+---------+-------+
2 rows in set (0.00 sec)</pre>
<p>优点是</p>
<ul>
<li> 增加索引时候只需要 1. CREATE TABLE，2.更新程序</li>
<li> 删除索引时候只需要 1. 程序停止写索引表(实际就是一个普通表)，2. DROP TABLE 索引表</li>
</ul>
<p>这种索引方式也是一种值得借鉴的设计模式，特别是key value类型的数据需要索引其中的内容时。</p>
Similar Posts:<ul><li><a href="http://timyang.net/architecture/friendfeed-like-aggregator/" rel="bookmark" title="April 3, 2009">Ideas for creating a friendfeed like feed aggregator system</a></li>

<li><a href="http://timyang.net/tech/key-value-store-draft/" rel="bookmark" title="July 27, 2009">分布式key/value store演讲草稿(一)</a></li>

<li><a href="http://timyang.net/tech/gz-salon-slide/" rel="bookmark" title="August 10, 2009">第一期广州技术沙龙演讲稿及视频</a></li>

<li><a href="http://timyang.net/programming/memcache-mutex/" rel="bookmark" title="July 26, 2010">Memcache mutex设计模式</a></li>

<li><a href="http://timyang.net/web/nginx-module/" rel="bookmark" title="March 17, 2009">如何写nginx module</a></li>
</ul><!-- Similar Posts took 17.407 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/data/friendfeed-mysql-schema-less/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>第一期广州技术沙龙演讲稿及视频</title>
		<link>http://timyang.net/tech/gz-salon-slide/</link>
		<comments>http://timyang.net/tech/gz-salon-slide/#comments</comments>
		<pubDate>Mon, 10 Aug 2009 02:28:54 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[dynamo]]></category>
		<category><![CDATA[key value store]]></category>
		<category><![CDATA[redis]]></category>
		<category><![CDATA[tokyo tyrant]]></category>
		<category><![CDATA[广州技术沙龙]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=353</guid>
		<description><![CDATA[Topic 1: 选好业务与技术，单枪匹马做游戏 (赖勇浩)
选好业务与技术，单枪匹马做游戏
View more presentations from laiyonghao.


Topic 2: 分布式 Key Value Store 漫谈 (Tim Yang)
分布式Key Value Store漫谈
View more documents from Tim Y.

视频(上)

视频(下)

Similar Posts:第一期广州技术沙龙预告

广州技术沙龙安排

广州技术沙龙设想

分布式key/value store演讲草稿(一)

第一期广州技术沙龙活动总结
]]></description>
			<content:encoded><![CDATA[<p>Topic 1: 选好业务与技术，单枪匹马做游戏 (<a href="http://www.laiyonghao.com/">赖勇浩)</a></p>
<div id="__ss_1834209" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="选好业务与技术，单枪匹马做游戏" href="http://www.slideshare.net/laiyonghao/ss-1834209">选好业务与技术，单枪匹马做游戏</a><object width="425" height="355" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=snsgame-090809211014-phpapp01&amp;stripped_title=ss-1834209" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=snsgame-090809211014-phpapp01&amp;stripped_title=ss-1834209" /><param name="allowfullscreen" value="true" /></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">presentations</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/laiyonghao">laiyonghao</a>.</div>
</div>
<div><object id="ssss" width="480" height="370" ><param name="allowScriptAccess" value="always" /><embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&#038;vid=26322138&#038;uid=1542244154" type="application/x-shockwave-flash" name="ssss" allowFullScreen="true" allowScriptAccess="always" width="480" height="370"></embed></object></div>
<p>Topic 2: 分布式 Key Value Store 漫谈 (Tim Yang)</p>
<div id="__ss_1834220" style="width: 425px; text-align: left;"><a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="分布式Key Value Store漫谈" href="http://www.slideshare.net/iso1600/key-value-store">分布式Key Value Store漫谈</a><object width="425" height="355" data="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=keyvaluestore-090809211516-phpapp02&amp;stripped_title=key-value-store" type="application/x-shockwave-flash"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=keyvaluestore-090809211516-phpapp02&amp;stripped_title=key-value-store" /><param name="allowfullscreen" value="true" /></object></p>
<div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;">View more <a style="text-decoration:underline;" href="http://www.slideshare.net/">documents</a> from <a style="text-decoration:underline;" href="http://www.slideshare.net/iso1600">Tim Y</a>.</div>
</div>
<p>视频(上)</p>
<div><object id="ssss" width="480" height="370" ><param name="allowScriptAccess" value="always" /><embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&#038;vid=26319051&#038;uid=1542244154" type="application/x-shockwave-flash" name="ssss" allowFullScreen="true" allowScriptAccess="always" width="480" height="370"></embed></object></div>
<p>视频(下)</p>
<div><object id="ssss" width="480" height="370" ><param name="allowScriptAccess" value="always" /><embed pluginspage="http://www.macromedia.com/go/getflashplayer" src="http://p.you.video.sina.com.cn/player/outer_player.swf?auto=1&#038;vid=23557672&#038;uid=1542244154" type="application/x-shockwave-flash" name="ssss" allowFullScreen="true" allowScriptAccess="always" width="480" height="370"></embed></object></div>
Similar Posts:<ul><li><a href="http://timyang.net/tech/guangzhou-salon-guid/" rel="bookmark" title="August 3, 2009">第一期广州技术沙龙预告</a></li>

<li><a href="http://timyang.net/tech/guangzhou-salon-090808/" rel="bookmark" title="July 24, 2009">广州技术沙龙安排</a></li>

<li><a href="http://timyang.net/tech/guangzhou-salon/" rel="bookmark" title="July 15, 2009">广州技术沙龙设想</a></li>

<li><a href="http://timyang.net/tech/key-value-store-draft/" rel="bookmark" title="July 27, 2009">分布式key/value store演讲草稿(一)</a></li>

<li><a href="http://timyang.net/tech/gz-salon-summary/" rel="bookmark" title="August 12, 2009">第一期广州技术沙龙活动总结</a></li>
</ul><!-- Similar Posts took 8.389 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/tech/gz-salon-slide/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>分布式key/value store演讲草稿(一)</title>
		<link>http://timyang.net/tech/key-value-store-draft/</link>
		<comments>http://timyang.net/tech/key-value-store-draft/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 14:10:39 +0000</pubDate>
		<dc:creator>Tim</dc:creator>
				<category><![CDATA[tech]]></category>
		<category><![CDATA[key value store]]></category>
		<category><![CDATA[广州技术沙龙]]></category>

		<guid isPermaLink="false">http://timyang.net/?p=335</guid>
		<description><![CDATA[今天初步考虑了一下，列了一些提纲，还需要进一步完善。也希望大家提出一些意见。
为什么大部分Web应用都应转向分布式的Key/Value store

Dynamo

Consistent Hashing
N,R,W
Virtual Node
Vector Clock

与传统key/value store的区别，软件还是需要服务
分布式应用可以从Dynamo等分布式实现可以借鉴的经验
Similar Posts:第一期广州技术沙龙演讲稿及视频

多IDC的数据分布设计(二)

2010年的技术架构建议

第一期广州技术沙龙预告

广州技术沙龙安排
]]></description>
			<content:encoded><![CDATA[<p>今天初步考虑了一下，列了一些提纲，还需要进一步完善。也希望大家提出一些意见。</p>
<p>为什么大部分Web应用都应转向分布式的Key/Value store</p>
<p><a title="k/v store by TimYang.net, on Flickr" href="http://www.flickr.com/photos/38692385@N03/3761318565/"><img src="http://farm3.static.flickr.com/2485/3761318565_ac561fd0d2.jpg" alt="k/v store" width="353" height="500" /></a></p>
<p>Dynamo</p>
<ul>
<li>Consistent Hashing</li>
<li>N,R,W</li>
<li>Virtual Node</li>
<li>Vector Clock</li>
</ul>
<p>与传统key/value store的区别，软件还是需要服务</p>
<p>分布式应用可以从Dynamo等分布式实现可以借鉴的经验</p>
Similar Posts:<ul><li><a href="http://timyang.net/tech/gz-salon-slide/" rel="bookmark" title="August 10, 2009">第一期广州技术沙龙演讲稿及视频</a></li>

<li><a href="http://timyang.net/data/multi-idc-design/" rel="bookmark" title="March 25, 2010">多IDC的数据分布设计(二)</a></li>

<li><a href="http://timyang.net/architecture/2010-tech-predictions/" rel="bookmark" title="December 31, 2009">2010年的技术架构建议</a></li>

<li><a href="http://timyang.net/tech/guangzhou-salon-guid/" rel="bookmark" title="August 3, 2009">第一期广州技术沙龙预告</a></li>

<li><a href="http://timyang.net/tech/guangzhou-salon-090808/" rel="bookmark" title="July 24, 2009">广州技术沙龙安排</a></li>
</ul><!-- Similar Posts took 26.765 ms -->]]></content:encoded>
			<wfw:commentRss>http://timyang.net/tech/key-value-store-draft/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
