`
robbin
  • 浏览: 4826444 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:137505
社区版块
存档分类
最新评论

memcache_engine + memcachedb = 高性能分布式内存数据库

    博客分类:
  • Tech
阅读更多
memcachedb是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面。

memcachedb给memcached添加了一些数据库才具备的特性,但是我们还不能说memcachedb已经是一个数据库了,这是因为memcached不支持内存对象的遍历操作,当然更加不能支持复杂的查询操作,只能支持根据已知的key去查询对应的value。因此如果想把memcachedb当成一个高性能的分布式内存数据库来使用的话,查询的问题就没有办法解决,只能在应用程序里面配合其他方案做一些折衷。

然而memcached的另外一个开源项目完美的填补了这一个缺陷,就是memcache_engine

memcache_engine是一个MySQL数据库的存储引擎,目前只支持MySQL5.1数据库,他能够把memcachedb作为MySQL数据库的一个存储引擎和MySQL集成起来,让用户通过标准的SQL查询语句访问memcachedb中存放的数据,请看如下示例:

CREATE TABLE `a` (
    `a` int(11) NOT NULL DEFAULT '0',
    `b` int(11) DEFAULT NULL,
    `c` int(11) DEFAULT NULL,
    PRIMARY KEY (`a`)
    ) ENGINE=MEMCACHE DEFAULT CHARSET=latin1
CONNECTION='localhost:6666\;localhost:6688';


创建表a,存放在分布式memcached server:localhost:6666和localhost:6688当中。然后我们就可以使用标准的SQL语句随意的进行CRUD操作去使用memcachedb了,这实在是太酷了!有了memcache_engine,我们就可以用SQL去访问memcached,有了memcachedb,我们就不必担心数据丢失问题,事务恢复问题了,简直是绝配,让memcached真正成为了一个高性能的分布式数据库系统了。目前memcache_engine项目还是早期试验阶段,让我们期待memcache_engine项目早日发布正式版本吧!

顺便多说几句:最近一年来,特别是最近一个月以来,围绕memcached的开源项目发展的非常非常活跃:

1、最近刚刚发布了memcached的新的高性能C客户端接口: libmemcached

2、由于有了libmemcached,该组织又发布了memcache_engine存储引擎,cool!

3、由于libmemcached的发布,不到一周时间,ruby的两个崭新的memcache client就问世了,他们是CaffeineNew memcache-client,让ruby访问memcached的速度大幅度提高,请看:libmemcached发布了,ruby访问memcached提速20倍

4、memcachedb发布了,这是中国的互联网公司贡献的开源项目

以上几个项目都是在2008年1月发布的,真的不是一般的繁荣阿。再加上之前发布的新的支持异步访问的Java Memcached API和C#接口,可以说除了Python,其他主流非主流编程语言都可以使用memcached了。其实即便是Python还没有公布出来的开源接口,我们也知道国内的web2.0网站豆瓣就是使用Python访问memcached,并且支持了极大的访问量,因此目前围绕memcached的开源项目发展的情况非常的繁荣。

memcached最近两年这么受欢迎,其实和互联网web2.0的流行有很大的关系,web2.0网站通常需要个性化页面,依赖于页面局部和数据细颗粒度的缓存来提升性能,并且web2.0网站流量都很大,因此memcached这种高性能分布式缓存服务器就大行其道了。

当然我觉得最具有革命意义的还是memcache_engine和memcachedb这两个项目的发布,他们能够让memcached的用途不仅仅限于缓存服务器而已,而是能够真正充当分布式数据库来使用了,这无异是诸多大流量web2.0网站和开发人员的福音阿。
分享到:
评论
20 楼 robbin 2008-01-24  
pi1ot 写道
robbin 写道
用MySQL的好处在于,通过MySQL的系统数据字典和表索引,给memcachedb里面的数据“创建了一份清楚的地图”,有了这份地图在手,我们就不必对memcachedb盲人摸象了。


不过原来的双向八车道也缩水成了半边断路施工的101国道?


这个一个很正常的trade off,如果这点trade off都没有,那你让Oracle/DB2们还混什么混?
19 楼 s00n 2008-01-24  
包括那个看上去很美的 wowcall
18 楼 s00n 2008-01-24  
难怪新浪的BLOG这么慢,今天才知道他们造了个这么个东西!!!
感觉新浪不是在玩技术,而是被技术玩了!
17 楼 pi1ot 2008-01-23  
robbin 写道
用MySQL的好处在于,通过MySQL的系统数据字典和表索引,给memcachedb里面的数据“创建了一份清楚的地图”,有了这份地图在手,我们就不必对memcachedb盲人摸象了。


不过原来的双向八车道也缩水成了半边断路施工的101国道?
16 楼 robbin 2008-01-23  
iunknown 写道
现在的问题是 memcache_engine 还未有具体的数据出来。
前面 robbin 提到的这个问题,在 memcache_engine 还不知道是怎么解决的。而且解决方案的性能还未知。
引用
memcached不支持内存对象的遍历操作,当然更加不能支持复杂的查询操作,只能支持根据已知的key去查询对应的value。因此如果想把memcachedb当成一个高性能的分布式内存数据库来使用的话,查询的问题就没有办法解决,


其实这到不难,MySQL有一个系统数据库叫做mysql,里面存放系统表,包含了MySQL数据库里面每个用户数据库里面的对象的meta信息,因此首先是把memcachedb映射到MySQL的相关表结构上。然后在具体的CRUD操作上面,MySQL会给每个数据库表创建索引,即便你没有创建用户索引,主键列也有索引,此外每条记录还有时间戳属性,这些信息都被保存到该表的索引列里面,具体来说会写在数据库的数据目录下面的索引文件。

当对memcachedb类型的表进行SQL查询的时候,首先是从系统表获取该表的meta信息,例如字段什么的,然后到索引里面去查找符合条件的记录,最后根据符合条件的记录的主键id去memcachedb里面get就行了。当然你会问,如果没有索引,导致全表扫描怎么办? 那我想,对该表的全表扫描也无非是根据一堆主键id对memcached发送multiget操作而已,还是比传统的读数据库表,引起硬盘IO来得快很多。

用MySQL的好处在于,通过MySQL的系统数据字典和表索引,给memcachedb里面的数据“创建了一份清楚的地图”,有了这份地图在手,我们就不必对memcachedb盲人摸象了。

15 楼 iunknown 2008-01-23  
现在的问题是 memcache_engine 还未有具体的数据出来。
前面 robbin 提到的这个问题,在 memcache_engine 还不知道是怎么解决的。而且解决方案的性能还未知。
引用
memcached不支持内存对象的遍历操作,当然更加不能支持复杂的查询操作,只能支持根据已知的key去查询对应的value。因此如果想把memcachedb当成一个高性能的分布式内存数据库来使用的话,查询的问题就没有办法解决,
14 楼 pufan 2008-01-23  
pufan 写道

而且更糟糕的是mysql cluster和mysql replication是两个不同的概念,还混为一谈:


抠字眼有意思吗,我说的是mysql集群,mysql cluster和mysql replication都是他的实现,搞java编程的,抽象和具体就这么难分清楚?
13 楼 pufan 2008-01-23  
robbin 写道

memcachedb是用来解决特定应用场景的特定问题的,而不是用来和传统的关系数据库PK玩的,两者的应用场景是不同的,所要解决的问题也不一样,硬扯在一起说XX也可以替代XX,那就是辩论收的纯辩论技巧了,不是在讨论技术了。

memcachedb自然就是cache+db了,当然要和db+cache的方案pk。要拿特定应用场景说事,那就比较一下两种方案的优劣,memcachedb得最大缺点就是管的太多,就像ejb2,有重量级容器的坏味道。
robbin 写道

memcachedb和mysql cluster又是两个应用于不同场景,解决不同问题的技术,你扯到一起来,硬要说mysql clustre可以替代memcachedb,他们还真没啥可比性,而且也无法替代,这个例子举得真糟糕,而且更糟糕的是mysql cluster和mysql replication是两个不同的概念,还混为一谈:

memcachedb是解决高性能读写问题的,比方说某些大型网站应用,每秒钟有超过1万次的写请求,10万次的读请求,那你就得用memcached来缓存数据了,这个时候你用mysql cluster或者mysql replication根本无济于事,,硬盘IO WAIT就把你所有的MySQL线程阻塞了,用memcachedb是为了能够解决数据库服务器的IO性能瓶颈的;

反过来说,某复杂的企业应用,每秒钟有超过3000次的SQL查询请求,这个时候memcachedb根本就用不上,因为memcachedb是不支持SQL查询的,那单台数据库服务器的CPU计算量也不足以支撑这么大的查询运算,所以replication或者cluster到n台计算器上面,去分担CPU负载,用mysql replication是为了能够解决数据库服务器的CPU性能瓶颈的。

一个是解决IO瓶颈的,一个是解决CPU瓶颈的,你怎么替代?

再说一遍,要比较的是cache+db而不是db,不要老是跑题,因此你写的这一大堆我就不一一回了。

集群有高可用和负载均衡等分类,难道这个还要讨论?
12 楼 robbin 2008-01-23  
pufan 写道

1.要和cache+db的方案比优势,而不是仅仅比较db。cache+db的好处在于分层逻辑清晰,cache是一层,db是一层,比方说,那天Berkeley DB不爽了,换mysql、postgresql都是可替代的选择,cache层更换也是一个道理。若要用楼主的方案,好了,没有cache层,绑死在数据库上了,你要换数据库,那cache层代码是不是还得新写。


memcachedb是用来解决特定应用场景的特定问题的,而不是用来和传统的关系数据库PK玩的,两者的应用场景是不同的,所要解决的问题也不一样,硬扯在一起说XX也可以替代XX,那就是辩论手的纯辩论技巧了。

pufan 写道

2.关于分布式方案,要选择,拿mysql来说,我肯定会选择mysql官方提供的集群方案,而不是一些非专业数据库开发人士提供的所谓的透明的高效率的分布式方案,真要用起来,怎么死的都不清楚。

就拿楼上的例子来说,用memcache集群+mysql集群(主从复制)一样满足需求,不但系统扩展性好,用的也放心。


memcachedb和mysql cluster又是两个应用于不同场景,解决不同问题的技术,硬要说mysql cluster可以替代memcachedb,他们还真没啥可比性,而且也无法替代,这个例子举得真糟糕,而且更糟糕的是mysql cluster和mysql replication是两个不同的概念,还混为一谈:

memcachedb是解决高性能读写问题的,比方说某些大型网站应用,每秒钟有超过1万次的写请求,10万次的读请求,那你就得用memcached来缓存数据了,这个时候你用mysql cluster或者mysql replication根本无济于事,,硬盘IO WAIT就把你所有的MySQL线程阻塞了,用memcachedb是为了能够解决数据库服务器的IO性能瓶颈的;

反过来说,某复杂的企业应用,每秒钟有超过3000次的SQL查询请求,这个时候memcachedb根本就用不上,因为memcachedb是不支持SQL查询的,那单台数据库服务器的CPU计算量也不足以支撑这么大的查询运算,所以replication或者cluster到n台计算器上面,去分担CPU负载,用mysql replication是为了能够解决数据库服务器的CPU性能瓶颈的。

一个是解决IO瓶颈的,一个是解决CPU瓶颈的,你怎么替代?
11 楼 pufan 2008-01-23  
robbin 写道
pufan 写道
不看好,和常见的cache集群+mysql集群(主从复制)比没看出好处在哪里,反倒是给人以大一统的感觉,照这个思路,把web server也容纳到memcache中去岂不是更好。


好处有两点:

1、远远超过数据库的高性能

其实这是废话,如果数据库IO性能够好的话,这个世界上就不会有DB Cache这种东西。比方说新浪博客每天上亿的点击量,而博客这东西很难动态页面静态化,你不上Cache Server试试看?

2、分布式

你见过Oracle Grid可以轻松的分布式的吗?他底层的数据库文件还是要单点存储的,但是memcachedb天然就是分布式的,你可以把他分布到几十台上百台服务器上面去。这个优势对于上亿的大负载网站的好处根本不用多说什么废话。


1.要和cache+db的方案比优势,而不是仅仅比较db。cache+db的好处在于分层逻辑清晰,cache是一层,db是一层,比方说,那天Berkeley DB不爽了,换mysql、postgresql都是可替代的选择,cache层更换也是一个道理。若要用楼主的方案,好了,没有cache层,绑死在数据库上了,你要换数据库,那cache层代码是不是还得新写。

2.关于分布式方案,要选择,拿mysql来说,我肯定会选择mysql官方提供的集群方案,而不是一些非专业数据库开发人士提供的所谓的透明的高效率的分布式方案,真要用起来,怎么死的都不清楚。

就拿楼上的例子来说,用memcache集群+mysql集群(主从复制)一样满足需求,不但系统扩展性好,用的也放心。
10 楼 pi1ot 2008-01-23  
应该说memcached赢在简单高效上,所以继续保持memcached的简单和高效是很重要地。
9 楼 robbin 2008-01-23  
pufan 写道
不看好,和常见的cache集群+mysql集群(主从复制)比没看出好处在哪里,反倒是给人以大一统的感觉,照这个思路,把web server也容纳到memcache中去岂不是更好。


好处有两点:

1、远远超过数据库的高性能

其实这是废话,如果数据库IO性能够好的话,这个世界上就不会有DB Cache这种东西。比方说新浪博客每天上亿的点击量,而博客这东西很难动态页面静态化,你不上Cache Server试试看?

2、分布式

你见过Oracle Grid可以轻松的分布式的吗?他底层的数据库文件还是要单点存储的,但是memcachedb天然就是分布式的,你可以把他分布到几十台上百台服务器上面去。这个优势对于上亿的大负载网站的好处根本不用多说什么废话。
8 楼 pufan 2008-01-23  
不看好,和常见的cache集群+mysql集群(主从复制)比没看出好处在哪里,反倒是给人以大一统的感觉,照这个思路,把web server也容纳到memcache中去岂不是更好。
7 楼 robbin 2008-01-23  
C3PO 写道
内存数据库?何必呢

建个内存盘(memdrive),把MySQL设置成数据库文件存放到内存盘里。再写个脚本每隔一段时间把instance拷到硬盘上。完事


你写个脚本出来给我看看? 不要说你把整个内存里面的instance热拷贝到硬盘上了,你就是把innodb里面的数据在线热备份出来,你都办不到! 因为你必须考虑内存数据的同步问题。所以innobase的hotbackup工具才能卖1万多块钱。

再者memcachedb是分布式的,可以把n台物理服务器组成一个逻辑数据库,那你MySQL你怎么给我分布式到n台机器的内存里面去? Oracle的Grid都办不到,不要说你可以办到。

6 楼 pi1ot 2008-01-23  
就算有资料,有的用么。
5 楼 andyao 2008-01-23  
淘宝的tbstore,使用的Berkeley DB,也是一个非常优秀的cache系统,淘宝内部大量使用。就是网上资料比较少
4 楼 sofire 2008-01-23  
以Sql方式查询DB4,会快吗?
3 楼 lgn21st 2008-01-22  
robbin老大近期实在太~~~实在是没有台词了。
Robbin出品,必属精品!
2 楼 ken1984 2008-01-22  
帮别人做个广告,想了解新浪的团队开发的开源产品,可去此BLOG:http://blog.s135.com/
目前它们又有一个新的开源项目发布了
1 楼 ken1984 2008-01-22  
占个沙发先,哈哈。。

相关推荐

    memcache_engine-0.7.tar.gz

    Memcache_engine-0.7.tar.gz 是一个专为 MySQL 5.1 数据库设计的存储引擎扩展,它的出现旨在提升数据库性能,特别是对于那些需要快速读取和写入大量数据的应用场景。这个存储引擎借鉴了广泛使用的缓存系统 Memcached...

    各种版本 PHP memcache_dll .zip

    Memcached是一种高性能、分布式内存对象缓存系统,用于在动态应用中减轻数据库负载,通过将数据存储在内存中来加快读取速度。在本压缩包中,你将找到不同版本的PHP Memcache DLL文件,这适用于那些需要与Memcached...

    apache+jk+memcache+nginx分布式网站建设笔记

    Memcache是一种高性能的分布式内存对象缓存系统,用于加速动态Web应用,减少数据库负载。其安装过程包括编译libevent库、安装memcached服务,并配置相应的jar包以支持session管理。 #### Nginx的角色 Nginx是一款高...

    memCached学习

    MySQL Memcache_engine的安装...Memcache_engine是一个MySQL 5.1数据库的存储引擎,它能够让用户通过标准的SQL语句(SELECT/UPDATE/INSERTE/DELETE)访问Memcached(还支持新浪的Memcachedb、dbcached)中存放的数据。

    Windows_Memcache安装(XAMPP+Memcache+PHP)

    Memcache是一种高性能的分布式内存对象缓存系统,主要用于加速动态Web应用程序并减轻数据库负担。该系统维护了一个巨大的hash表,存在于内存中,用于存储各类格式的数据,如图像、视频、文件、数据库检索结果等。...

    PyPI 官网下载 | memcache_lock-0.0.3.tar.gz

    `memcached`是一种高性能、分布式的内存对象缓存系统,常用于减轻数据库负载,提升Web应用性能。在分布式环境中,多个服务器可能同时访问共享资源,这就需要一种机制来确保同一时刻只有一个进程可以对资源进行操作,...

    memcache_cache_handler.php for smarty 示例代码

    3. **Memcache**:Memcache是一个高性能、分布式的内存对象缓存系统,能够存储键值对数据。它不是持久化的,但速度极快,适合存储临时性数据,如网页内容、查询结果等。 4. **`memcache_cache_handler.php` 的作用*...

    php_memcache_dll-for-php-5.3

    Memcache是一款高性能的分布式内存对象缓存系统,用于在动态应用中减少数据库负载,提升性能。它的工作原理是将数据存储在内存中,避免了反复读取硬盘上的数据,从而提高了数据访问速度。Memcache支持多种编程语言,...

    memadmin+php_memcached+memcached1.4.5

    Memcached是一款高性能、分布式内存对象缓存系统,广泛应用于减轻数据库负载,提高Web应用速度。它的工作原理是将数据存储在内存中,通过键值对的形式提供快速访问。Memcached 1.4.5是一个较旧的版本,发布于2010年...

    php_memcache 服务扩展

    $memcache = new Memcache; $memcache->connect("localhost",11211); echo "Server's version: " . $memcache->getVersion() . "\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "test"; $tmp_object->...

    php5.5.38_memcache_windows扩展

    这个扩展使得PHP开发者能够利用Memcache这种高性能的分布式内存对象缓存系统来提升网站或应用程序的性能。Memcache是一个广泛使用的开源软件,它能够存储数据,包括动态网页内容,从而减少数据库的负载,提高数据...

    php_memcache.dll Or php_opcache.dll For PHP5.3.27

    PHP5.3.27 的扩展 php_memcache.dll Or php_opcache.dll 测试平台:Windows 2008 R2 x64 (IIS7.5 FastCGI,Apache2.2.23,Apache2.4.3, Nginx 1.2.9) 包含 Non Thread Safe 和 Thread Safe 如果用的是 FastCGI 请...

    内存数据库介绍资料.ppt

    除了商业产品,还有开源的内存数据库,如FastDB、MemcacheDB和Dbcached,以及基于memcache和BerkeleyDB开发的分布式缓存系统。 总结来说,内存数据库是现代高并发、实时需求强烈场景下的理想选择。它们通过牺牲存储...

    memcache使用手册

    Memcache 是一种高性能的内存键值缓存,它可以为应用程序提供高速的数据访问。Memcache 服务可以通过应用程序的多个实例访问该缓存, Memcache 对于那些不需要数据库的永久性功能和事务功能的数据很有用,例如临时...

    memcache_php使用测试

    **memcache**模块作为高效内存缓存的守护进程,提供了程序式和面向对象的接口,尤其在设计动态Web程序时,它能够显著减少对数据库的直接访问,从而提升应用性能。此外,memcache还支持通信对话(session_handler)的...

    php_memcache.dll+5.2+5.3

    Memcache作为一个分布式内存对象缓存系统,广泛应用于减轻数据库负载,加速数据访问。而`php_memcache.dll`则是PHP与Memcache交互的桥梁,它是一个动态链接库,允许PHP脚本通过PHP语言直接操作Memcache服务。本文将...

    php5.5.12 memcache_dll

    它通过在内存中缓存数据来减少对数据库的访问,从而提升网站的响应速度。 描述中的“php5.5-ts-vc11-x64”提供了关于PHP安装包的更多信息。具体来说: 1. **PHP 5.5.12**:这是PHP的版本号,发布于2014年8月,属于...

    memcache.dll(5.2/5.3/5.4/5.5)

    $memcache = new Memcache; $memcache->connect("localhost",11211); echo "Server's version: " . $memcache->getVersion() . "\n"; $tmp_object = new stdClass; $tmp_object->str_attr = "test"; $tmp_...

    Nginx+Memcache+Linux+Tomcat集群

    在构建高性能的Web服务环境中,...总结来说,Nginx+Memcache+Linux+Tomcat集群通过合理利用资源,实现了Web服务的高性能、高可用性和可扩展性。这种架构在处理大量并发请求时表现出色,是现代互联网服务的常见选择。

    memcache软件和+教程

    Memcache是一种高性能的分布式内存对象缓存系统,常用于减轻数据库负载,提高Web应用的响应速度。它将数据存储在内存中,以便快速检索,从而实现了数据的高速访问。本教程将详细介绍Memcache的基本概念、安装与配置...

Global site tag (gtag.js) - Google Analytics