Twemproxy 代理Redis集群


Twemproxy 概述

Twemproxy(又稱為nutcracker)是一個輕量級的Redis和Memcached代理,主要用來減少對后端緩存服務器的連接數。Twemproxy是由Twitter開源出來的緩存服務器集群管理工具,主要用來彌補Redis/Memcached 對集群(cluster)管理的不足。

antirez(Redis作者)寫過一篇對twemproxy的介紹,他認為twemproxy是目前Redis 分片管理的最好方案,雖然antirez的Redis cluster正在實現並且對其給予厚望,但從現有的cluster實現上還是認為cluster除了增加Redis復雜度,對於集群的管理沒有twemproxy來的輕量和有效。

Twemproxy特性

  • 輕量級、快速
  • 保持長連接
  • 減少了直接與緩存服務器連接的連接數量
  • 使用 pipelining 處理請求和響應
  • 支持代理到多台服務器上
  • 同時支持多個服務器池
  • 自動分片數據到多個服務器上
  • 實現完整的 memcached 的 ASCII 和再分配協議
  • 通過 yaml 文件配置服務器池
  • 支持多個哈希模式,包括一致性哈希和分布
  • 能夠配置刪除故障節點
  • 可以通過端口監控狀態
  • 支持 linux, *bsd,os x 和 solaris

功能

  • 通過代理的方式減少緩存服務器的連接數。
  • 自動在多台緩存服務器間共享數據。
  • 通過不同的策略與散列函數支持一致性散列。
  • 通過配置的方式禁用失敗的結點。
  • 運行在多個實例上,客戶端可以連接到首個可用的代理服務器。
  • 支持請求的流式與批處理,因而能夠降低來回的消耗。

集群架構

image

Twemproxy 安裝

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

twemproxy命令行選項:

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]

-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塊大小,默認16384 bytes

啟動twemproxy服務

檢測配置文件:

./sbin/nutcracker -t
nutcracker: configuration file 'conf/nutcracker.yml' syntax is ok

注意:默認檢查命令會檢查所在路徑的conf下面的nutcracker.yml文件。

啟動命令:

./sbin/nutcracker -d -c /usr/local/twemproxy/conf/nutcracker.yml -p /usr/local/twemproxy/run/redisproxy.pid -o /usr/local/twemproxy/run/redisproxy.log

查看是否啟動成功:

ps -ef|grep nutcracker

 

Twemproxy 配置

Twemproxy 通過YAML文件配置,例如:

alpha:
  listen: 0.0.0.0:22121
  hash: fnv1a_64
  distribution: ketama
  auto_eject_hosts: true
  redis: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers: --兩台redis服務器的地址和端口
   - 10.23.22.240:6379:1   
   - 10.23.22.241:6379:1

說明:

listen
twemproxy監聽地址,支持UNIX域套接字。

hash
可以選擇的key值的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
hash_tag允許根據key的一個部分來計算key的hash值。hash_tag由兩個字符組成,一個是hash_tag的開始,另外一個是hash_tag的結束,在hash_tag的開始和結束之間,是將用於計算key的hash值的部分,計算的結果會用於選擇服務器。

例如:如果hash_tag被定義為”{}”,那么key值為"user:{user1}:ids"和"user:{user1}:tweets"的hash值都是基於”user1”,最終會被映射到相同的服務器。而"user:user1:ids"將會使用整個key來計算hash,可能會被映射到不同的服務器。

distribution
存在ketama、modula和random3種可選的配置。其含義如下:

  • ketama,一致性hash算法,會根據服務器構造出一個hash ring,並為ring上的節點分配hash范圍。ketama的優勢在於單個節點添加、刪除之后,會最大程度上保持整個群集中緩存的key值可以被重用。
  • modula,根據key值的hash值取模,根據取模的結果選擇對應的服務器;
  • random,無論key值的hash是什么,都隨機的選擇一個服務器作為key值操作的目標;

timeout

單位是毫秒,是連接到server的超時值。默認是永久等待。

backlog
監聽TCP 的backlog(連接等待隊列)的長度,默認是512。

preconnect
是一個boolean值,指示twemproxy是否應該預連接pool中的server。默認是false。

redis
是一個boolean值,用來識別到服務器的通訊協議是redis還是memcached。默認是false。

server_connections
每個server可以被打開的連接數。默認,每個服務器開一個連接。

auto_eject_hosts
是一個boolean值,用於控制twemproxy是否應該根據server的連接狀態重建群集。這個連接狀態是由server_failure_limit閥值來控制。
默認是false。

server_retry_timeout
單位是毫秒,控制服務器連接的時間間隔,在auto_eject_host被設置為true的時候產生作用。默認是30000 毫秒。

server_failure_limit
控制連接服務器的次數,在auto_eject_host被設置為true的時候產生作用。默認是2。

servers
一個pool中的服務器的地址、端口和權重的列表,包括一個可選的服務器的名字,如果提供服務器的名字,將會使用它決定server的次序,從而提供對應的一致性hash的hash ring。否則,將使用server被定義的次序。

 

連接twemproxy

和連接redis 一摸一樣,只是端口換成了22121:

redis-cli -p 22121
127.0.0.1:22121> get kin
"kin"
127.0.0.1:22121> set kin king
OK
127.0.0.1:22121> get kin
"king"

 

Twemproxy 監控

Twemproxy 監控端口默認為22222,並每隔30s收集一次信息。

nutcracker --describe-stats

報告的信息如下:

pool stats:
  client_eof          "# eof on client connections"
  client_err          "# errors on client connections"
  client_connections  "# active client connections"
  server_ejects       "# times backend server was ejected"
  forward_error       "# times we encountered a forwarding error"
  fragments           "# fragments created from a multi-vector request"

server stats:
  server_eof          "# eof on server connections"
  server_err          "# errors on server connections"
  server_timedout     "# timeouts on server connections"
  server_connections  "# active server connections"
  requests            "# requests"
  request_bytes       "total request bytes"
  responses           "# responses"
  response_bytes      "total response bytes"
  in_queue            "# requests in incoming queue"
  in_queue_bytes      "current request bytes in incoming queue"
  out_queue           "# requests in outgoing queue"
  out_queue_bytes     "current request bytes in outgoing queue"

 

性能測試

用redis自帶的redis-benchmark進行性能測試:

set 測試:

twemproxy:

redis-benchmark -10.23.22.240 -p 22121 -c 100 -t set -d 100

原生redis:

redis-benchmark -10.23.22.241 -p 6379 -c 100 -t set -d 100

Get測試

twemproxy:

redis-benchmark -h 10.23.22.240 -22121 -100 -get -100

原生redis:

redis-benchmark -h 10.23.22.241 -6379 -100 -t get -100

 

Twemproxy優缺點

優缺點:

1.前端使用 Twemproxy 做代理,后端的 Redis 數據能基本上根據 key 來進行比較均衡的分布。

2.后端一台 Redis 掛掉后,Twemproxy 能夠自動摘除。恢復后,Twemproxy 能夠自動識別、恢復並重新加入到 Redis 組中重新使用。

注意點:

1.Redis 掛掉后,后端數據是否丟失依據 Redis 本身的策略配置,與 Twemproxy 基本無關。

缺點:

1.當redis集群動態添加節點時,Twemproxy 需要重啟才能生效,並且數據不會自動重新 Reblance,需要人工單獨寫腳本來實現。

2.性能上的損耗,作者是說最差情況下,性能損耗不會多於20%。

3.單點問題,需要使用keepalived vip做高可用或者使用 HAProxy 進行負載均衡。

4.不支持Redis的事務操作

5.不支持針對多個值的操作,比如取sets的子交並補等(MGET 和 DEL 除外)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM