1、twemproxy explore
&HTTP://www.aliyun.com/zixun/aggregation/37954.html">nbsp; 當11545.html">我們有大量 Redis 或 Memcached 的時候,通常只能通過用戶端的一些資料分配演算法(比如一致性雜湊),來實現集群存儲的特性。 雖然Redis 2.6版本已經發佈Redis Cluster,但還不是很成熟適用正式生產環境。 Redis 的 Cluster 方案還沒有正式推出之前,我們通過 Proxy 的方式來實現集群存儲。
Twitter,世界最大的Redis集群之一部署在Twitter用於為使用者提供時間軸資料。 Twitter Open Source部門提供了Twemproxy。
Twemproxy,也叫nutcraker。 是一個twtter開源的一個redis和memcache代理伺服器。 redis作為一個高效的快取服務器,非常具有應用價值。 但是當使用比較多的時候,就希望可以通過某種方式 統一進行管理。 避免每個應用每個用戶端管理連接的鬆散性。 同時在一定程度上變得可以控制。
Twemproxy是一個快速的單線程代理程式,支援Memcached ASCII協定和更新的Redis協定:
它全部用C寫成,使用Apache 2.0 License授權。 專案在Linux上可以工作,而在OSX上無法編譯,因為它依賴了epoll API.
Twemproxy 通過引入一個代理層,可以將其後端的多台 Redis 或 Memcached 實例進行統一管理與分配,使應用程式只需要在 Twemproxy 上進行操作,而不用關心後面具體有多少個真實的 Redis 或 Memcached 存儲。
2、twemproxy特性:
支援失敗節點自動刪除
可以設置重新連接該節點的時間可以設置連接多少次之後刪除該節點該方式適合作為cache存儲
支援設置HashTag
通過HashTag可以自己設定將兩個KEYhash到同一個實例上去。
減少與redis的直接連接數
保持與redis的長連接可設置代理與後臺每個redis連接的數目
自動分片到後端多個redis實例上
多種hash演算法:能夠使用不同的策略和散列函數支援一致性hash。 可以設置後端實例的權重
避免單點問題
可以平行部署多個代理層.client自動選擇可用的一個
支援redis pipelining request
支援請求的流式與批次處理,降低來回的消耗
支援狀態監控
可設置狀態監控ip和埠,訪問ip和埠可以得到一個json格式的狀態資訊串可設置監控資訊刷新間隔時間
高輸送量
連接複用,記憶體複用。 將多個連接請求,組成reids pipelining統一向redis請求。
另外可以修改redis的原始程式碼,抽取出redis中的前半部分,作為一個中間代理層。 最終都是通過linux下的epoll 事件機制提高併發效率,其中nutcraker本身也是使用epoll的事件機制。 並且在效能測試上的表現非常出色。
3、twemproxy問題與不足
Twemproxy 由於其自身原理限制,有一些不足之處,如:
不支援針對多個值的操作,比如取sets的子交並補等(MGET 和 DEL 除外)不支援Redis的事務操作出錯提示還不夠完善也不支援select操作
4、安裝與配置 具體的安裝步驟可用查看github:HTTPs://github.com/twitter/twemproxyTwemproxy 的安裝,主要命令如下: apt-get install automakeapt-get install libtoolgit clone git://github.com/twitter/twemproxy.gitcd twemproxyautoreconf -fvi./configure --enable-debug =logmakesrc/nutcracker -h
通過上面的命令就算安裝好了,然後是具體的配置,下面是一個典型的配置 redis1: listen: 127.0.0.1:6379 #使用哪個埠啟動Twemproxy redis: true #是否是Redis的proxy hash: fnv1a_64 #指定具體的hash函數 distribution: ketama #具體的hash演算法 auto_eject_hosts: true #是否在結點無法回應的時候臨時摘除結點 timeout: 400 #超時時間 (毫秒) server_retry_timeout: 2000 #重試的時間(毫秒) server_failure_limit: 1 #結點故障多少次就算摘除掉 servers: #下面表示所有的Redis節點(IP:埠號:權重) - 127.0.0.1:6380:1 - 127.0.0.1:6381:1 - 127.0.0.1:6382:1redis2: listen: 0.0.0.0:10000 redis: true hash: fnv1a_64 distributi on: ketama auto_eject_hosts: false timeout: 400 servers: - 127.0.0.1:6379:1 - 127.0.0.1:6380:1 - 127.0.0.1:6381:1 - 127.0. 0.1:6382:1
你可以同時開啟多個 Twemproxy 實例,它們都可以進行讀寫,這樣你的應用程式就可以完全避免所謂的單點故障。