2015年4月15日 星期三

AWS 筆記 - 使用 Amazon ElastiCache - Memcached Cluster



由於服務是儲存在 RDBMS ,以此做出許多關聯設計。有朋友分享實際案例,對於線上服務盡量不要用 JOIN 等技術,例如把查詢結果定期儲存一張表上來使用,然而,在開發階段只能一切求快 XD 因此,快速開發後就想一下有沒有快一點的強化服務方式,於是乎就想到透過 memcache 來暫存儲存結果。於是乎,來使用一下 Amazon ElastiCache。

原先想自己在 EC2 上架設,接著就想到要維護 Cluster 的問題,所以就...先試一下別人的產品吧 XD 開幾台最便宜的 cache.t2.micro (555MB memory),然後開個兩台。

接著就可以得到一個入口點,如:

your_name.cfg.your_region.cache.amazonaws.com:11211

因此,有人幫你維護 cluster 也是件好事吧!有專人維護入口點,也有人維護節點,都可以在 AWS 控制界面看到。



以 PHP 程式範例就接用吧!

<?php

$memcache = new Memcache;
$memcache->connect('your_name.cfg.your_region.cache.amazonaws.com', 11211);

for ($i=0 ; $i<1024 * 1024 * 30 ; ++$i) {
        $key = "key-$i";
        $memcache->set($key, $i);
}


執行:

$ time php test.php

就可以在 Amzon ElastiCache 管理介面觀看那兩個 node 的情況,簡言之,兩個 node 是一直彼此 sync 的啦。且過程中也可以很便利的透過 Add Node 新增機器,而程式碼由於都寫定在一個入口點了,所以維護非常輕鬆。




若是把範例程式改成這樣,會發現跑一陣子後(約四千,大概跟 DNS Cache有關)會出現連不到的問題,我想,站在 cache 機制上,服務本身也不會出錯才對 :P

<?php
for ($i=0 ; $i<1024 * 1024 * 30 ; ++$i) {
        $key = "key-$i";

        $memcache = new Memcache;
        $memcache->connect('your_cache.cfg.region.cache.amazonaws.com', 11211);
        $memcache->set($key, $i);
        $memcache->get($key);
        $memcache->close();
        echo "finish $i\n";
}


$ php test.php
...

PHP Warning:  Memcache::connect(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /path/test.php on line 6
PHP Stack trace:
PHP   1. {main}() /path/test.php:0
PHP   2. Memcache->connect() /path/test.php:6
PHP Notice:  Memcache::connect(): Server your_cache.cfg.region.cache.amazonaws.com (tcp 11211, udp 0) failed with: php_network_getaddresses: ge
taddrinfo failed: Name or service not known (0) in /path/test.php on line 6
PHP Stack trace:
PHP   1. {main}() /path/test.php:0
PHP   2. Memcache->connect() /path/test.php:6
PHP Warning:  Memcache::connect(): Can't connect to your_cache.cfg.region.cache.amazonaws.com:11211, php_network_getaddresses: getaddrinfo fail
ed: Name or service not known (0) in /path/test.php on line 6
PHP Stack trace:
PHP   1. {main}() /path/test.php:0
PHP   2. Memcache->connect() /path/test.php:6

沒有留言:

張貼留言