Twemproxy是一種代理分片機制,由Twitter開源。Twemproxy作為代理,可接受來自多個程序的訪問,按照路由規則,轉發給后臺的各個Redis服務器,再原路返回。該方案很好的解決了單個Redis實例承載能力的問題。當然,Twemproxy本身也是單點,需要用Keepalived做高可用方案。通過Twemproxy可以使用多臺服務器來水平擴張redis服務,可以有效的避免單點故障問題。雖然使用Twemproxy需要更多的硬件資源和在redis性能有一定的損失(twitter測試約20%),但是能夠提高整個系統的HA也是相當劃算的。不熟悉twemproxy的同學,如果玩過nginx反向代理或者mysql proxy,那么你肯定也懂twemproxy了。其實twemproxy不光實現了redis協議,還實現了memcached協議,什么意思?換句話說,twemproxy不光可以代理redis,還可以代理memcached,官方說明:
twemproxy (pronounced "two-em-proxy"), aka nutcracker is a fast and lightweight proxy for memcachedand redis protocol. It was built primarily to reduce the number of connections to the caching servers on the backend. This, together with protocol pipeling and sharding enables you to horizontally scale your distributed caching architecture.
Twemproxy架構:
但是從上面我們可以看到這樣以來Twemproxy就成了單點,所以通常會結合keepalived來實現Twemproxy的高可用。架構圖如下:
上面的架構通常只有一臺Twemproxy在工作,另外一臺處于備機,當一臺掛掉以后,vip自動漂移,備機接替工作。關于keepalived相關的資料可以參考我前面相關文章。
1.編譯安裝:
autoconf下載地址:http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
twemproxy下載地址:https://codeload.github.com/twitter/twemproxy/zip/master
twemproxy的安裝要求autoconf的版本在2.64以上,否則提示"error: Autoconf version 2.64 or higher is required"。
查找舊版本autoconf,并且卸載
rpm -qf /usr/bin/autoconf rpm -e --nodeps autoconf-2.63
安裝最新版本
tar zxvf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix=/usr make && make install
編譯安裝twemproxy
unzip twemproxy-master.zip cd twemproxy-master autoreconf -fvi ./configure --prefix=/usr/local/twemproxy make -j 8 make install
設置環境變量:
echo "PATH=$PATH:/usr/local/twemproxy/sbin/" >> /etc/profile source /etc/profile
2.創建相關目錄(存放配置文件和pid文件)
cd /usr/local/twemproxy mkdir run conf
3.添加proxy配置文件
vim /usr/local/twemproxy/conf/nutcracker.yml
內容如下(配置文件參考官方)
alpha: listen: 127.0.0.1:22121 hash: fnv1a_64 distribution: ketama auto_eject_hosts: true redis: true server_retry_timeout: 2000 server_failure_limit: 1 servers: - 127.0.0.1:7000:1 - 127.0.0.1:7001:1 - 127.0.0.1:7002:1 - 127.0.0.1:7003:1 - 127.0.0.1:7004:1 - 127.0.0.1:7005:1
我在本地安裝了6個redis實例,不清楚的同學參考redis官網安裝或者我前面的文章Redis安裝以及主從實現。
4.啟動Twemproxy服務
nutcracker -t 測試配置文件
測試配置文件這里有個小坑,本來以為要指定配置文件路徑,于是這樣檢查配置文件:
[root@redis-server ~]# nutcracker -t /usr/local/twemproxy/conf/nutcracker.yml nutcracker: configuration file 'conf/nutcracker.yml' syntax is invalid
后來才反應過來是檢查命令所在路徑的conf下面的nutcracker.yml文件,于是把conf目錄復制到/usr/local/twemproxy/sbin/目錄下,再次進行檢測:
[root@redis-server sbin]# pwd /usr/local/twemproxy/sbin [root@redis-server sbin]# ll total 808 drwxr-xr-x 2 root root 4096 Apr 10 03:02 conf -rwxr-xr-x 1 root root 819245 Apr 9 23:26 nutcracker [root@redis-server sbin]# ./nutcracker -t nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok [root@redis-server sbin]#
可以看見提示配置文件沒有語法錯誤了。
啟動命令:
nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log
nutcracker用法與命令選項
Usage: nutcracker [-?hVdDt] [-v verbosity level] [-o output file] [-c conf file] [-s stats port] [-a stats addr] [-i stats interval] [-p pid file] [-m mbuf size]
Options: -h, –help : 查看幫助文檔,顯示命令選項 -V, –version : 查看nutcracker版本 -t, –test-conf : 測試配置腳本的正確性 -d, –daemonize : 以守護進程運行 -D, –describe-stats : 打印狀態描述 -v, –verbosity=N : 設置日志級別 (default: 5, min: 0, max: 11) -o, –output=S : 設置日志輸出路徑,默認為標準錯誤輸出 (default: stderr) -c, –conf-file=S : 指定配置文件路徑 (default: conf/nutcracker.yml) -s, –stats-port=N : 設置狀態監控端口,默認22222 (default: 22222) -a, –stats-addr=S : 設置狀態監控IP,默認0.0.0.0 (default: 0.0.0.0) -i, –stats-interval=N : 設置狀態聚合間隔 (default: 30000 msec) -p, –pid-file=S : 指定進程pid文件路徑,默認關閉 (default: off) -m, –mbuf-size=N : 設置mbuf塊大小,以bytes單位 (default: 16384 bytes)
查看進程,確認啟動。
[root@redis-server run]# ps -ef | grep nutcracker | grep -v grep root 809 1 0 03:09 ? 00:00:00 nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log [root@redis-server run]#
5. 簡單測試
[root@redis-server ~]# netstat -nltp | grep nutcracker tcp 0 0 0.0.0.0:22222 0.0.0.0:* LISTEN 809/nutcracker tcp 0 0 127.0.0.1:22121 0.0.0.0:* LISTEN 809/nutcracker [root@redis-server ~]# redis-cli -p 22121 127.0.0.1:22121> set name yaun OK 127.0.0.1:22121> get name "yaun" 127.0.0.1:22121>
總結:
Twemproxy還是非常的靠譜,雖然性能有損失(20%),但是相對來說還是很值得的,而且久經考驗,使用非常廣泛。后面再進行性能測試。關于更多更加詳細的資料請參考官方文檔。
參考資料:
文章列表