Gemcached

Geode服务器能够配置成以memcached协议进行通讯。Geode服务器是memcache兼容的(memcapable),这意味着现有memcached应用在不改动任何代码的情况下也可在Geode集群上来运行。唯一需要做的就是在启动Geode服务器时指定一个接口(port)和/或协议(Binary 或 ASCII)。

gfsh> start server --name=server1 --memcached-port=11211 --memcached-protocol=BINARY

Geode服务器会创建一个叫”gemcached”的区域(region)来存储所有的memcached数据。Gemcached region默认设置为PARTITION。

配置 “gemcached”

若想改变gemcached region中region的属性,请使用cache.xml来定义你想要的属性。下面cache.xml的例子中展示了怎样将buckets的总数设置为251。

 

在启动Geode服务器时使用cache.xml,如下所示:

gfsh> start server --name=server1 --memcached-port=11211 --memcached-protocol=BINARY --cache-xml-file=/path/to/cache.xml 

为什么从 memcached 迁走?

Memcached有一个根本的问题是它只支持”cache-aside” (“write-through”的反义) 。例如,应用需要同时更新缓存和数据库。这样会导致下面的问题:

  • 缓存与数据库间潜在的不一致

  • 因为架构上的风险而影响了你所有应用的商业逻辑。

memcached workflow

在一个典型的工作流中,你的应用会从memcached中读取数据,如果没有数据则会从DB中读取数据,并将找到的数据写入到memcached中。当数据更新时,你需要更新/无效化缓存后再更新数据库。因为这是两个步骤的操作,所以会使缓存和数据库的更新进入竞争条件而导致数据的不一致。

过时缓存

一个客户端可能在更新过数据库但并未更新memcached的时候死掉。但所有其他的客户端会忽略掉已更新的数据库并继续使用已经过时的数据。

不一致缓存

应用可以使用CAS命令来确认他们不会覆盖他们没有操作的数据。在使用CAS时,工作流程如下:从memcached中读取CAS identifier (所以,对任意写操作我们需要额外的一个读操作),通过CAS操作写入memcached然后更新数据库,如果CAS操作失败,则摧毁/无效化缓存入口(cached entry)。即使使用CAS,仍然有间隙会出现数据库和缓存的不一致。比方说你有两个客户端(c1和c2)同时写同一个主键(key, K)。两个客户端会首先从memcached中找到同一个CAS identifier,更新memcached后再更新数据库。从CAS失败到应用摧毁主键(key),memcached会存着过时的数据。如果客户端在发送摧毁命令前死掉,你的缓存和数据会永远的存在不一致。

惊群效应

如果你的应用从你memcached集群中的一台服务器中频繁访问数据。当这台服务器崩溃后,所有连接这台服务器的客户端会出现缓存丢失的情况,导致所有客户端会同时去访问数据库从而会有数据库过载的情况出现。

Gemcached 来解救你!

使用 Gemcached, 你可以使用 Geode 作为一个write-through 缓存. Geode as write through cache

这意味着你的应用不需要在与数据库直接交互,从而简化你的代码。所有的数据库操作全部交由Geode来进行。从数据库中读取数据可以使用Geode的CacheLoader,向数据库中写数据使用AsyncEventListener。下面展示使用gemcached来解决上述memcached的几个问题。

过时缓存

客户端只对Geode进行写操作,当写操作完成时,Geode保证写操作已完成备份复制。即使存放主键(Key)的primary bucket(主节点)在复制完成前挂掉,客户端、数据库均不会看到更新。

不一致缓存

由于所有的操作均会先到Geode再在数据库中持久化,所有缓存均保证一致。即使出现Geode节点崩溃的情况,AsyncEventListener中的队列也会被复制,所有的更新会持久化到数据库中。

惊群效应

当多个并发同时访问Geode中的同一个key时,他们会导致缓存丢失并触发CacheLoader,此时CacheLoader会只允许一个请求来操作数据库。其他的并发请求将使用从数据库中新拿到的数据。

                         

                                                                                                                                                                                                                                       本章节由 blueice 翻译, 由 theseusyang 校对  

 

  • No labels