基於twemproxy的redis叢集方案實踐
Twemproxy又名nutcraker,是由Twtter 開源,是一種代理分片機制的中介軟體(類似於mycat),主要用於管理 Redis Memcached 叢集,可接受來自多個客戶端的請求,按照路由規則,轉發給後端cache節點,減少了客戶端與cache 伺服器直接連線的數量。
一、twemproxy特性
1、優點
- 快速。
- 輕量級。
- 保持與伺服器的長連線。
- 減少了直接與快取伺服器連線的連線數量
- 啟用管道pipelining請求和響應。
- 支援代理到多個伺服器。
- 同時支援多個伺服器池。
- 跨多個伺服器自動共享資料。
- 實現完整的memcached ascii和redis協議。
- 通過yaml檔案輕鬆配置伺服器池。
- 支援多種雜湊模式,包括一致的雜湊和分佈。
- 可以配置為在故障時禁用節點。
- 可通過埠監控狀態。
- 可執行在Linux、*BSD、OS X和SmartOS(Solaris)
2、缺點
- 不支援針對多個值的操作,比如取sets的子交併補等
- 不支援Redis的事務操作
- 錯誤訊息、日誌資訊匱乏,排查問題困難
- 無友好管理介面,運維操作困難
- 無法平滑擴充套件,新增去除新節點必須重啟服務
二、twemproxy安裝
autoconf是一個用於生成可以自動地配置軟體原始碼包,用以適應多種UNIX類系統的shell指令碼工具,因此要安裝autoconf。
1、檢查autoconf
檢查是否安裝autoconf:rpm -qa |grep -i autoconf,看到:autoconf-2.63-5.1.el6.noarch
若已安裝版本低於2.64,解除安裝 rpm -e --nodeps autoconf-*
若沒有安裝,則去http://ftp.gnu.org/gnu/autoconf/下載目前最新版本autoconf-2.69.tar.gz安裝
解壓 tar -zxvf autoconf-2.69.tar.gz後進入根目錄cd autoconf-2.69
配置:./configure
編譯:make
安裝:make install
確保每一步操作沒有錯誤出現
2、twemproxy安裝
去https://github.com/twitter/twemproxy下載原始碼包,wget https://codeload.github.com/twitter/twemproxy/zip/master
解壓:unzip master,
進入解壓目錄:cd twemproxy-master
生成原始碼包 :autoreconf -fvi
配置 :./configure --prefix=/usr/local/twemproxy
編譯 :make
安裝 :make install
三、配置nutcracker
1、引數釋義
- listen: 監聽伺服器池的地址和埠或者是sock檔案的絕對路勁 (如 /var/run/nutcracker.sock)
- client_connections: 允許從Redis客戶端的獲取的最大連線數。預設不限制,同樣適用於作業系統強制的限制
- hash: 雜湊函式名. 取值如下
- one_at_a_time
- md5
- crc16
- crc32 (crc32 implementation compatible with libmemcached)
- crc32a (correct crc32 implementation as per the spec)
- fnv1_64
- fnv1a_64
- fnv1_32
- fnv1a_32
- hsieh
- murmur
- jenkins
- hash_tag: 一個兩個字元的字串,指定用於雜湊的key部分。例如"{}" 或 "$$"。雜湊標記允許將不同的金鑰對映到同一個伺服器,只要標記中的金鑰部分相同
- distribution: key的分發模式. 可能取值如下:
- ketama
- modula
- random
- timeout: 等待與伺服器建立連線或從伺服器接收響應的超時值(毫秒)。預設一直等待
- backlog: tcp backlog引數。預設為512.
- preconnect: 用於控制twemproxy在程序啟動時是否應預連線到此池中的所有伺服器。預設為false
- redis: 制服務器池是否使用redis或memcached協議。預設為false。
- redis_auth: 連線時對redis伺服器進行身份驗證.
- redis_db: 池伺服器上要使用的資料庫編號。預設值為0。twemproxy將始終以db0的形式呈現給客戶機
- server_connections: 可以開啟到每個伺服器的最大連線數。預設最多開啟1個伺服器連線
- auto_eject_hosts:用於當伺服器連續請求失敗超過限制次數時是否禁用該伺服器。預設為false
- server_retry_timeout: 當auto_eject_hosts為true時,在要禁用伺服器上重試之前等待的超時值(毫秒)。預設為30000毫秒.
- server_failure_limit: 當auto_eject_hosts為true時,連續請求失敗超限次數,超過次數該redis節點被禁用。預設值為2。
- servers: 伺服器池的伺服器地址、埠、權重.
2、配置nutcracker.yml
安裝後會在/usr/local/twemproxy 生成 sbin share,sbin下為nutcraker命令,share下為nutcraker.8命令
需要把twemproxy-master下conf的配置nutcracker.yml複製到/usr/local/twemproxy下
編輯vim /usr/local/twemproxy/conf/nutcracker.yml配置檔案如下
alpha:
listen: 192.168.172.71:22121
hash: fnv1a_64
distribution: ketama
auto_eject_hosts: true
redis: true
server_retry_timeout: 3000
server_failure_limit: 3
servers:
- 192.168.172.72:6379:1
- 192.168.172.73:6379:1
- 192.168.172.74:6379:1
listen後為twmeproxy所在節點,servers為每個redis節點,distribution採用一致性雜湊演算法ketama
3、測試配置
配置完成了,測試下nutcracker.yml在語法 上是否有誤
/usr/local/twemproxy/sbin/nutcracker -t /usr/local/twemproxy/conf/nutcracker.yml
正確顯示如下:
nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok
四、啟動nutcracker
進入到安裝路徑/usr/local/twemproxy下
啟動命令:sbin/nutcracker -d -c conf/nutcracker.yml -o logs/log.log -p ./twemproxy.pid
-d守護程序啟動,-c指定配置檔案,o指定日誌檔案路徑,日誌需要自己建立,-p指定pid儲存路徑
/usr/local/twemproxy/sbin/nutcracker --help命令詳細引數如下
This is nutcracker-0.4.1
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 : this help
-V, --version : show version and exit
-t, --test-conf : test configuration for syntax errors and exit
-d, --daemonize : run as a daemon
-D, --describe-stats : print stats description and exit
-v, --verbose=N : set logging level (default: 5, min: 0, max: 11)
-o, --output=S : set logging file (default: stderr)
-c, --conf-file=S : set configuration file (default: conf/nutcracker.yml)
-s, --stats-port=N : set stats monitoring port (default: 22222)
-a, --stats-addr=S : set stats monitoring ip (default: 0.0.0.0)
-i, --stats-interval=N : set stats aggregation interval in msec (default: 30000 msec)
-p, --pid-file=S : set pid file (default: off)
-m, --mbuf-size=N : set size of mbuf chunk in bytes (default: 16384 bytes)