Twemproxy 又稱nutcracker ,是一個memcache、Redis協議的輕量級代理,一個用於sharding 的中間件。有了Twemproxy,客戶端不直接訪問Redis服務器,而是通過twemproxy 代理中間件間接訪問。 Twemproxy 為 Twitter 開源產品,簡單來說,Twemproxy是Twitter開發的一個redis代理proxy,類似於nginx的反向代理或者mysql的代理工具,如amoeba。Twemproxy通過引入一個代理層,可以將其后端的多台Redis或Memcached實例進行統一管理與分配,使應用程序只需要在Twemproxy上進行操作,而不用關心后面具體有多少個真實的Redis或Memcached存儲。
一般來說,只要服務器上運行了Redis,那么就有可能造成一種非常可怕局面:服務器的內存將立刻被占滿,而且一台Redis數據庫的性能終歸是有限制的,那么現在如果要求保證用戶的執行速度快,就需要使用集群的設計。而對於集群的設計主要的問題就是解決單實例Redis的性能瓶頸。
Twemproxy是一個專門為了這種nosql數據庫設計的一款代理工具軟件,這個工具軟件最大的特征是可以實現數據的分片處理。所謂的分片指的是根據一定的算法將要保存的數據保存到不同的節點之中。 有了分片之后數據的保存節點就可能有無限多個,但是理論上如果要真進行集群的搭建,往往要求三台節點起步。Twemproxy代理機制具有如下特點:
1)支持失敗節點自動刪除
可以設置重新連接該節點的時間
可以設置連接多少次之后刪除該節點
2)支持設置HashTag
通過HashTag可以自己設定將兩個key哈希到同一個實例上去
3)減少與redis的直接連接數
保持與redis的長連接
減少了客戶端直接與服務器連接的連接數量
4)自動分片到后端多個redis實例上
多種hash算法:md5、crc16、crc32 、crc32a、fnv1_64、fnv1a_64、fnv1_32、fnv1a_32、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都在同一個分片上。
舉個小例子:比如可以把公司前台的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中最小內存決定的【木桶的短板】。
Twemproxy可以把數據sharding(碎片,這里是分散的意思)到多台服務器的上,每台服務器存儲着整個數據集的一部分。因而,當某一台redis服務器宕機了,那么也就失去了一部分數據。如果借助於redis的master-slave replication,能保證在任何一台redis不能工作情況下,仍然能夠保證能夠存在一個整個數據集的完全覆蓋,那么整個redis group(或者稱作cluster)仍然能夠正常工作。
需要注意的是:
Twemproxy不會增加Redis的性能指標數據,據業界測算,使用twemproxy相比直接使用Redis會帶來大約10%的性能下降。但是單個Redis進程的內存管理能力有限。據測算,單個Redis進程內存超過20G之后,效率會急劇下降。目前,建議單個Redis最好配置在8G以內;8G以上的Redis緩存需求,通過Twemproxy來提供支持。
Twemproxy是一種代理分片機制,由Twitter開源,主要用於減少后端緩存服務器的連接數量。Twemproxy作為代理,可接受來自多個程序的訪問,按照路由規則,轉發給后台的各個Redis或memcached服務器,再原路返回。該方案很好的解決了單個Redis或memcached實例承載能力的問題。Twemproxy本身也是單點,需要用Keepalived做高可用方案,可以使用多台服務器來水平擴張redis或memcached服務,可以有效的避免單點故障問題。
-----------------------------------------------------------------------------------------------------------------------------------------------------
下面記錄下Redis+Twemproxy(nutcracker)集群部署過程:
先簡單看下集群架構
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"