2014-10-28 54 views
4

對於某些數據結構,從Redis開始,我正在尋找其他具有良好磁盤/ SSD性能的解決方案。我最近發現了Aerospike,這似乎在SSD環境中表現優異。在Aerospike中建立數百萬個存在檢查的最佳方法?

其中最需要內存的結構是大約100.000個Redis集合,每個集合最多可包含10.000個字符串。每個字符串都在10到30個字符之間。

這些集合主要用於存在/唯一性檢查。

什麼是建模這些模型的最佳方法?我通常會看到2個選項: *將redis設置爲Aerospike lset *分別對一組中的每個值進行建模。

除了這個選擇,100.000 Redis集合用作鍵的分區。由於地區原因,在Aerospike中可能有類似的分區/命名空間。但是,我很確定Aerospike中'namespacing'的概念不用於這種關鍵分區。在Aerospike中做什麼是正確的方法(如果有的話),或者是不需要的?

回答

6

Aerospike針對負載均衡和高可用性需求做了自己的分區。命名空間與傳統意義上的數據庫同義,並且不是以分區數據。名稱空間中的數據被分區並存儲在羣集中。您作爲用戶不必擔心數據的放置。

我會將Redis設置爲Aerospike「lset」(一對一)。 Aerospike應該在給定的「lset」中處理數據的數據局部性。

5

是的,你不應該擔心Aerospike自動分片的數據的局部性。這確保了集羣中所有節點的數據分配和讀/寫負載的平衡。

放入lset有其優點。它提供的功能類似於redis,你不需要編寫自己的功能。但同時它也有其不足之處。所以,你應該根據你的要求來選擇。所有在一個集合上的操作都會被序列化。所以,如果你期望讀取/寫入的曲子平行,lset可能不適合你。此外,lset中的存在檢查實際上會讀取完整記錄並返回true false。 Aerospike針對正常密鑰有一個exists api,它將根據內存中索引返回真/假,速度更快。

對於這個用例,您可能無法將它們隔離到aerospike的「集合」中。你需要100,000套。但截至目前,Aerospike僅支持1024套。

讓我給你的清單添加第三個選項。您還可以模擬密鑰本身爲您如下創建虛擬場景:

  • 如果實際密鑰key1的是,你想它去設置1,您可以設置搗碎鍵作爲set1_key1。
  • 當你想搜索在SET5 KEY7的存在,搜索set5_key7

的存在,如果用這種模式去

  • ,你正在利用塞式的數據分佈,負載均衡,以最佳狀態。存在檢查將是最快的,因爲沒有I/O。

  • +0

    謝謝。與你的第三選擇,這實際上只是傾銷每-對(100.000 * 10.000 = 1.000.000.000)正確?可以肯定的是,這不是一個令人望而卻步的密鑰? I.e .:我可以想象,Aerospike每個鍵都保留一些in-mem條目以供指示?如果是這樣,那麼只有這個方面的mem要求已經遠遠超過了我未來的節點可以處理的範圍。關心?另外,格式「 _ 」在Aerospike中具有特殊含義,例如:告訴分片代碼在同一個分片上保留所有對具有相同的「 _」前綴? – 2014-10-29 16:07:09

    +3

    由於aerospike可以支持最多2^160個按鍵,因此這不是一個令人難以接受的數字。 Aerospike每個索引條目佔用大約64個字節的內存。所以,對於索引的RAM要求大約是64GB,如果你放3-4個節點,RAM要求不算太差。但是這是假設最壞的情況,即100k * 10k。如果實際情況較差,需求會相應減少。對於aerospike而言,這並不意味着什麼。對於aerospike,這是一個正常的關鍵。分片基於這個鍵。所以,一套鑰匙不會在一起。除非你有其他原因,否則你不應該這樣做。 – sunil 2014-10-29 16:35:53

    相關問題