Twemproxy 又稱nutcracker ,是一個memcache、Redis協議的輕量級代理,一個用於sharding 的中間件。有了Twemproxy,客戶端不直接訪問Redis服務器,而是經過twemproxy 代理中間件間接訪問。 Twemproxy 爲 Twitter 開源產品,簡單來講,Twemproxy是Twitter開發的一個redis代理proxy,相似於nginx的反向代理或者mysql的代理工具,如amoeba。Twemproxy經過引入一個代理層,能夠將其後端的多臺Redis或Memcached實例進行統一管理與分配,使應用程序只須要在Twemproxy上進行操做,而不用關心後面具體有多少個真實的Redis或Memcached存儲。html
通常來講,只要服務器上運行了Redis,那麼就有可能形成一種很是可怕局面:服務器的內存將馬上被佔滿,並且一臺Redis數據庫的性能終歸是有限制的,那麼如今若是要求保證用戶的執行速度快,就須要使用集羣的設計。而對於集羣的設計主要的問題就是解決單實例Redis的性能瓶頸。 前端
Twemproxy是一個專門爲了這種nosql數據庫設計的一款代理工具軟件,這個工具軟件最大的特徵是能夠實現數據的分片處理。所謂的分片指的是根據必定的算法將要保存的數據保存到不一樣的節點之中。 有了分片以後數據的保存節點就可能有無限多個,可是理論上若是要真進行集羣的搭建,每每要求三臺節點起步。Twemproxy代理機制具備以下特色:mysql
1)支持失敗節點自動刪除 能夠設置從新鏈接該節點的時間 能夠設置鏈接多少次以後刪除該節點 2)支持設置HashTag 經過HashTag能夠本身設定將兩個key哈希到同一個實例上去 3)減小與redis的直接鏈接數 保持與redis的長鏈接 減小了客戶端直接與服務器鏈接的鏈接數量 4)自動分片到後端多個redis實例上 多種hash算法:md五、crc1六、crc32 、crc32a、fnv1_6四、fnv1a_6四、fnv1_3二、fnv1a_3二、hsieh、murmur、jenkins 多種分片算法:ketama(一致性hash算法的一種實現)、modula、random 能夠設置後端實例的權重 5)避免單點問題 能夠平行部署多個代理層,經過HAProxy作負載均衡,將redis的讀寫分散到多個twemproxy上。 6)支持狀態監控 可設置狀態監控ip和端口,訪問ip和端口能夠獲得一個json格式的狀態信息串 可設置監控信息刷新間隔時間 7)使用 pipelining 處理請求和響應 鏈接複用,內存複用 將多個鏈接請求,組成reids pipelining統一貫redis請求 8)並非支持全部redis命令 不支持redis的事務操做 使用SIDFF, SDIFFSTORE, SINTER, SINTERSTORE, SMOVE, SUNION and SUNIONSTORE命令須要保證key都在同一個分片上。
舉個小例子:linux
你能夠把公司前臺的MM看做一個proxy,你是個送快遞的,你能夠經過這個妹子替你代理把你要送達的包裹給公司內部的人,而你不用知道公司每一個人座位在哪裏。 Twemproxy能夠把多臺redis server看成一臺使用,開發人員經過twemproxy訪問這些redis servers 的時候不用關心到底去哪一臺redis server讀取 k-v數據或者把k-v數據更新到數據集中。
經過Twemproxy可使用多臺服務器來水平擴張redis服務,能夠有效的避免單點故障問題。雖然使用Twemproxy須要更多的硬件資源和在redis性能有必定的損失(twitter測試約20%),可是可以提升整個系統的HA也是至關划算的。好比我所在的公司,只使用一臺redis server進行讀寫,可是還有一臺slave server一直在同步這臺生產服務器的數據。這樣作就是爲了防止這臺單一的生產服務器出現故障時可以有一個"備胎",能夠把前端的redis數據讀寫請求切換到從服務器上,web程序於是不須要直接去訪問mysql數據庫。再借助於haproxy(又是proxy)或者VIP技術能夠實現一個簡單的HA方案,能夠避免單點故障。可是這種簡單的Master-Slave"備胎"方案不能擴張整個redis的容量(若是用系統內存大小衡量,且不考慮內存不足時把數據swap到磁盤上),最大容量由全部的redis servers中最小內存決定的【木桶的短板】。nginx
Twemproxy能夠把數據sharding(碎片,這裏是分散的意思)到多臺服務器的上,每臺服務器存儲着整個數據集的一部分。於是,當某一臺redis服務器宕機了,那麼也就失去了一部分數據。若是藉助於redis的master-slave replication,能保證在任何一臺redis不能工做狀況下,仍然可以保證可以存在一個整個數據集的徹底覆蓋,那麼整個redis group(或者稱做cluster)仍然可以正常工做。git
須要注意的是:
Twemproxy不會增長Redis的性能指標數據,據業界測算,使用twemproxy相比直接使用Redis會帶來大約10%的性能降低。可是單個Redis進程的內存管理能力有限。據測算,單個Redis進程內存超過20G以後,效率會急劇降低。目前,建議單個Redis最好配置在8G之內;8G以上的Redis緩存需求,經過Twemproxy來提供支持。github
-----------------------------------------------------------------------------------------------------------------------------------------------------
下面記錄下Redis+Twemproxy(nutcracker)集羣部署過程:web
先簡單看下集羣架構redis
Twemproxy能夠把多臺redis server看成一臺使用,擴大整個redis的容量,開發人員經過twemproxy訪問這些redis servers 的時候不用關心到底去哪一臺redis server讀取k-v數據或者把k-v數據更新到數據集中。算法
1)集羣環境 182.48.115.236 twemproxy-server 安裝nutcracker 182.48.115.237 redis-server1 安裝redis 182.48.115.238 redis-server2 安裝redis 若是在線上使用的話: 中間代理層twemproxy須要2臺,而且須要結合keepalived(心跳測試)實現高可用,客戶端經過vip資源訪問twemproxy。 另外,後面的redis節點也都要作主從複製環境。由於twemproxy會將數據碎片到每一個redis節點上,若是節點掛了,那部分數據就沒了。因此最好對每一個redis節點機作主從,防止數據丟失。 這裏作測試,我只使用一臺twemproxy+2個redis節點(不作主從)。 關閉三臺機器的iptables防火牆和selinux 2)在兩臺redis機器上安裝並啓動redis 能夠參考:http://www.cnblogs.com/kevingrace/p/6265722.html 3)在twemproxy-server機器上安裝nutcracker 編譯安裝autoconf [root@twemproxy-server ~]# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz [root@twemproxy-server ~]# tar -zvxf autoconf-2.69.tar.gz [root@twemproxy-server ~]# cd autoconf-2.69 [root@twemproxy-server autoconf-2.69]# ./configure && make && make install 編譯安裝automake [root@twemproxy-server ~]# wget http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz [root@twemproxy-server ~]# tar -zvxf automake-1.15.tar.gz [root@twemproxy-server ~]# cd automake-1.15 [root@twemproxy-server automake-1.15]# ./configure && make && make install 編譯安裝libtool [root@twemproxy-server ~]# wget https://ftp.gnu.org/gnu/libtool/libtool-2.4.6.tar.gz [root@twemproxy-server ~]# tar -zvxf libtool-2.4.6.tar.gz [root@twemproxy-server ~]# cd libtool-2.4.6 [root@twemproxy-server libtool-2.4.6]# ./configure && make && make install 編譯安裝twemproxy [root@twemproxy-server ~]# wget https://github.com/twitter/twemproxy/archive/master.zip [root@twemproxy-server ~]# unzip master.zip [root@twemproxy-server ~]# cd twemproxy-master [root@twemproxy-server twemproxy-master]# aclocal [root@twemproxy-server twemproxy-master]# autoreconf -f -i -Wall,no-obsolete //執行autoreconf 生成 configure文件等 [root@twemproxy-server twemproxy-master]# ./configure --prefix=/usr/local/twemproxy/ [root@twemproxy-server twemproxy-master]# make && make install ................................................................................. 注意:若是沒有安裝libtool 的話,autoreconf 的時候會報錯,以下: configure.ac:133: the top level configure.ac:36: error: possibly undefined macro: AC_PROG_LIBTOOL If this token and others are legitimate, please use m4_pattern_allow. See the Autoconf documentation. autoreconf: /usr/local/bin/autoconf failed with exit status: 1 ................................................................................. twemproxy配置: [root@twemproxy-server ~]# cd /usr/local/twemproxy/ [root@twemproxy-server twemproxy]# ls sbin share [root@twemproxy-server twemproxy]# cp -r /root/twemproxy-master/conf /usr/local/twemproxy/ [root@twemproxy-server twemproxy]# cd conf/ [root@twemproxy-server conf]# ls nutcracker.leaf.yml nutcracker.root.yml nutcracker.yml [root@twemproxy-server conf]# cp nutcracker.yml nutcracker.yml.bak [root@twemproxy-server conf]# vim nutcracker.yml alpha: //這個名稱能夠本身隨意定義 listen: 182.48.115.236:22121 hash: fnv1a_64 distribution: ketama auto_eject_hosts: true redis: true server_retry_timeout: 2000 server_failure_limit: 1 servers: //這裏配置了兩個分片 - 182.48.115.237:6379:1 - 182.48.115.238:6379:1 [root@twemproxy-server conf]# nohup /usr/local/twemproxy/sbin/nutcracker -c /usr/local/twemproxy/conf/nutcracker.yml & [root@twemproxy-server conf]# ps -ef|grep nutcracker root 6407 24314 0 23:26 pts/0 00:00:00 /usr/local/twemproxy/sbin/nutcracker -c /usr/local/twemproxy/conf/nutcracker.yml root 6410 24314 0 23:26 pts/0 00:00:00 grep nutcracker [root@twemproxy-server conf]# lsof -i:22121 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nutcracke 6407 root 5u IPv4 155109 0t0 TCP localhost:22121 (LISTEN) 4)測試 twemproxy set/get ,後端分片查看 [root@twemproxy-server ~]# redis-cli -h 182.48.115.236 -p 22121 182.48.115.236:22121> 測試短key - value [root@twemproxy-server ~]# redis-cli -h 182.48.115.236 -p 22121 182.48.115.236:22121> set wangshibo 666666 OK 182.48.115.236:22121> get wangshibo "666666" 測試長key - value 182.48.115.236:22121> set huihuihuihuihuihui "hahahahahahahahhahahahahahahahhahahahahahah" OK 182.48.115.236:22121> get huihuihuihuihuihui "hahahahahahahahhahahahahahahahhahahahahahah" 登陸兩臺redis節點上查看,發現已經有分片了 [root@redis-server1 ~]# redis-cli -h 182.48.115.237 -p 6379 182.48.115.237:6379> get wangshibo "666666" 182.48.115.237:6379> get huihuihuihuihuihui "hahahahahahahahhahahahahahahahhahahahahahah" [root@redis-server2 ~]# redis-cli -h 182.48.115.238 -p 6379 182.48.115.238:6379> get wangshibo "666666" 182.48.115.238:6379> get huihuihuihuihuihui "hahahahahahahahhahahahahahahahhahahahahahah"