1. 程式人生 > >Twemproxy 介紹與使用

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就成了單點,所以通常會結合keepalived來實現Twemproxy的高可用。架構圖如下:

上面的架構通常只有一臺Twemproxy在工作,另外一臺處於備機,當一臺掛掉以後,vip自動漂移,備機接替工作。關於keepalived相關的資料可以參考我前面相關文章。 

1.編譯安裝:

查詢舊版本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 測試配置檔案

測試配置檔案這裡有個小坑,本來以為要指定配置檔案路徑,於是這樣檢查配置檔案:

[[email protected] ~]# 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/目錄下,再次進行檢測:

[[email protected] sbin]# pwd
/usr/local/twemproxy/sbin
[[email protected]-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
[[email protected]-server sbin]# ./nutcracker -t
nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok
[[email protected]-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)

檢視程序,確認啟動。

[[email protected] 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
[[email protected]-server run]# 

5. 簡單測試

[[email protected] ~]# 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      
[[email protected]-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%),但是相對來說還是很值得的,而且久經考驗,使用非常廣泛。後面再進行效能測試。關於更多更加詳細的資料請參考官方文件。

參考資料: