標籤:
轉載自http://blog.csdn.net/sweetvvck/article/details/38315149?utm_source=tuicool
要搭建Redis叢集,首先得考慮下面的幾個問題; Redis叢集搭建的目的是什嗎?或者說為什麼要搭建Redis叢集? Redis叢集搭建的目的其實也就是叢集搭建的目的,所有的叢集主要都是為瞭解決一個問題,橫向擴充。在叢集的概念出現之前,我們使用的硬體資源都是縱向擴充的,但是縱向擴充很快就會達到一個極限,單台機器的Cpu的處理速度,記憶體大小,硬碟大小沒辦法一直滿足需求,而且機器縱向擴充的成本是相當高的。叢集的出現就是能夠讓多台機器像一台機器一樣工作,實現了資源的橫向擴充。 Redis是記憶體型資料庫,當我們要儲存的資料達到一定程度時,單台機器的記憶體滿足不了我們的需求,搭建叢集則是一種很好的解決方案。 那麼如何能夠讓多台機器上的Redis能夠像一台機器上的Redis一樣工作呢? 需要解決以下三個問題;1.對外暴露一個訪問節點2.請求分區(sharding)3.分區要合理(分區均勻,相同的請求要分配到同樣的redis節點) 首先,要對外暴露一個訪問節點,後面可能有多台redis再工作;我們很容易想到的就是代理(Proxy),對於用戶端只需要知道代理,通過代理來和背景多台redis互動。 第二個問題可以使用hash演算法解決,將請求的某個key取hash值,對redis個數取餘,來分配的不同的redis上;然而這麼做不能滿足第三點中的相同的請求要分配到同樣的redis中。在這種情況下一致性雜湊能夠完美的解決這個問題,一致性雜湊可以將redis的節點通過hash演算法分布再一個232 個節點的圓環上,將請求的key用同樣的hash演算法映射到這個圓環上,然後在key值的節點順時針尋找最近的redis節點,這樣就保證了一致性;詳細介紹可以參考:http://blog.csdn.net/sparkliang/article/details/5279393 。 如果讓我來實現redis叢集的話,我會採用zookeeper加上一個redis精靈加上一致性hash演算法來實現。不過twicer的大神們已經實現並開源了一個redis叢集方案,我就不重複製造輪子了;來看看這個全球最大的redis叢集使用者之一的大神們實現的 twemproxy (nutcracker)有哪些特性。 Twemproxy除了可以作為redis的代理,它同樣支援memerycached的ASCII協議。我這裡主要瞭解Twemproxy在redis叢集上的解決方案。Twemproxy除了完美的解決了上面的三個問題(同樣採用了一致性hash演算法),還有一個重要的特點;它支援node ejection,如果使用redis當緩衝,不是很注重資料的一致性的話,開啟node ejection可以在叢集中某一台redis掛掉的時候將其送叢集列表中移除,達到高可用性。如果redis叢集做為資料存放區的話,或者很注重資料的一致性,則可以禁用node jection,但此時需要使用其他方法實現高可用性,比如redis sentiel。Twemproxy的詳細介紹可以看看這篇文章:http://antirez.com/news/44 ;Twemproxy項目Github地址:https://github.com/twitter/twemproxy 。 廢話說了這麼多,來看看怎麼安裝twemproxy,搭建redis叢集吧 首先按照github提示的步驟安裝twemproxy:
To build nutcracker from source with debug logs enabled and assertions disabled:
$ git clone [email protected]:twitter/twemproxy.git$ cd twemproxy$ autoreconf -fvi$ ./configure --enable-debug=log$ make依次輸入上面的命令,然後輸入:$ src/nutcracker -h如果顯示協助資訊,則表示安裝成功;接下來編輯配置資訊,找一個自己喜歡的目錄,建立設定檔,尾碼為yml,如twemproxy.test.yml;填入如下資訊:
alpha: listen: 127.0.0.1:55555 hash: fnv1a_64 distribution: ketama auto_eject_hosts: true redis: true server_retry_timeout: 30000 server_failure_limit: 1 servers: - 192.168.1.10:6379:1 - 192.168.1.7:6379:1
注意縮排,否則將無法啟動twenproxy。其中listen:表示代理的ip以及連接埠號碼,是暴露給用戶端使用的;hash: 表示使用哪種hash方法,twemproxy提供了多種方式,具體可以看github介紹;distribution表示分配模式,有三種選擇:ketama, modula,random;auto_reject_hosts: 就是上面所說的,自動移除失敗的節點;redis: 表示使用的是redis叢集,剩下的配置很簡單就不一一介紹了......通過如此簡單的配置之後,執行./src/nutcracker -c ./conf/nutcracker.test.yml(這裡使用自己的安裝路徑和設定檔路徑) 就啟動了twemproxy, 用戶端只需要通過redis-cli就能串連上proxy,使用方法和redis完全一樣(但不是所有命令都支援)。這樣redis的叢集就搭好了,是不是簡單到爆?不過不要開心得太早,twemproxy也有它的不足之處。1.不支援事務以及大量操作;2.相較於直接存取redis效能有所損耗;
雖然twemproxy有上述缺點,單相較於起帶來的好處簡直不值一提!但也說明它不適用於所有情況。Redis叢集還有很多種搭建方式,其官方的cluster一直處於beta狀態,相信瞭解了twemproxy後,大家會發現它是現在最好的選擇!
[轉載] Redis叢集搭建最佳實務