天天看點

Twemproxy 介紹與使用

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 介紹與使用
但是從上面我們可以看到這樣以來Twemproxy就成了單點,是以通常會結合keepalived來實作Twemproxy的高可用。架構圖如下:
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%),但是相對來說還是很值得的,而且久經考驗,使用非常廣泛。後面再進行性能測試。關于更多更加詳細的資料請參考官方文檔。

參考資料:

https://github.com/twitter/twemproxy

作者:Atlas

出處:Atlas的部落格 http://www.cnblogs.com/gomysql

您的支援是對部落客最大的鼓勵,感謝您的認真閱讀。本文版權歸作者所有,歡迎轉載,但請保留該聲明。如果您需要技術支援,本人亦提供有償服務。

繼續閱讀