文章出處

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%),但是相對來說還是很值得的,而且久經考驗,使用非常廣泛。后面再進行性能測試。關于更多更加詳細的資料請參考官方文檔。

 

參考資料:

https://github.com/twitter/twemproxy


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()