7

假設我有一個Web應用在一些負載均衡的EC2服務器上運行,存儲和檢索來自SimpleDB的元數據,並在S3上存儲更大的數據塊(由於SimpleDB的整個1 KB限制)。由於S3的延遲非常高,我不希望在那裏發出大量請求,所以我需要緩存層來獲取信息......進入ElastiCache。EC2上的應用程序如何自動發現ElastiCache實例?

好,所以我配備了一個ElastiCache服務器和端點X,這樣我就可以將X編碼到我的EC2應用程序中,並且它運行愉快,直到我得到幾十萬新用戶,並且突然間我的緩存服務器因需求而受到不利影響。幸運的是,我可以啓動一些新的更大的緩存服務器......但後來我意識到我已經有X,Y和Z端點,而我的應用只知道嘗試X,所以我仍然有問題。

所以現在我只是試圖讓我的腦袋圍繞着這個謎題的各個部分,我還沒有開始編碼部分,但是這不是一個問題嗎?我已經閱讀了ElastiCache的文檔,它提到它是一個緩存集羣,但是集羣中的每臺服務器似乎都有自己的端點。在EC2上運行的應用程序是否有辦法知道所有正在運行的緩存服務器,還有更多關於哪個包含特定密鑰數據的點?是否有可能要求整個集羣存儲或檢索一條信息?

+0

我懷疑它關係重大這個問題的答案,但不管它的價值我的EC2應用程序將更有可能在PHP中完成。 –

+0

我在https://forums.aws.amazon.com/thread.jspa?threadID=74852注意到了一個功能請求,所以不幸的是,它看起來像在你的緩存中有一個配置文件是關於你所有的現在可以做。 –

回答

0

如果你的應用程序是從versioncontrol部署的(我希望它),你只需編輯配置文件並重新部署應用程序。我沒有看到這種方法的一個巨大的問題,但也許我錯過了顯而易見的。

讓我知道。

+2

我曾希望有一種彈性緩存機制可以將緩存集羣呈現給應用程序,就好像它是單個服務器一樣。不必擔心哪個端點擊中某個特定的密鑰,在啓動或關閉緩存節點時不必擔心緩存配置等等。似乎這樣的事情還不存在。 –

+0

它沒有。通常,AWS的ElastiCache爲您提供節點。如何使用這些節點(例如,您將所有這些節點用作巨型商店,還是鏡像等)取決於您。這就是memcache的工作原理。您可能可以將您的發現封裝到定期的API調用中,但我不會推薦。我們重新部署這些更改。 – Till

+0

我不會在這方面施加延長的魔法。例如。只是添加一個節點通常不是一個好主意,或者您的應用程序可能會處理的東西。例如。當我向ElasticCache集羣添加另一個節點時,我需要重新平衡緩存集羣才能說話。通常,將其添加到配置更容易,調整ext/memcache(我們使用PHP)的設置,然後通過清空緩存並重新填充來從頭開始。 – Till

0

亞馬遜的Elasticache Autodiscovery絕對是可怕的。這基本上不可能安裝,這很瘋狂,因爲它應該非常簡單。

我在PHP中編寫了一個簡單的函數,根據您運行的節點數量生成彈性緩存節點URL。是的,如果您更改節點數(或者可能將此值放在env var中),則必須更新代碼。

它相同的鍵映射到同一個節點:

function get_elasticache_node_url($key, $config_url, $num_nodes) { 
    $node = hexdec(substr(md5($key), 0, 15)) % $num_nodes + 1; 
    $nodestr = str_pad($node, 4, "0", STR_PAD_LEFT); 
    return str_replace('.cfg.','.'.$nodestr.'.',$config_url); 
} 

$num_nodes = 10; 
$config_url = 'cluster-name.xyzxyz.cfg.use1.cache.amazonaws.com'; 

echo get_elasticache_node_url("key1", $config_url, $num_nodes); 
echo get_elasticache_node_url("key2", $config_url, $num_nodes); 

輸出:

cluster-name.xyzxyz.0001.use1.cache.amazonaws.com 
cluster-name.xyzxyz.0004.use1.cache.amazonaws.com 
相關問題