1. 程式人生 > 實用技巧 >Twemproxy 代理Redis叢集

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

功能

  • 通過代理的方式減少快取伺服器的連線數。
  • 自動在多臺快取伺服器間共享資料。
  • 通過不同的策略與雜湊函式支援一致性雜湊。
  • 通過配置的方式禁用失敗的結點。
  • 執行在多個例項上,客戶端可以連線到首個可用的代理伺服器。
  • 支援請求的流式與批處理,因而能夠降低來回的消耗。

叢集架構

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 -h10.23.22.240-p 22121 -c 100 -t set -d 100

原生redis:

redis-benchmark -h10.23.22.241-p 6379 -c 100 -t set -d 100

Get測試

twemproxy:

redis-benchmark-h10.23.22.240-p22121-c100-tget-d100

原生redis:

redis-benchmark-h10.23.22.241-p6379-c100-t get-d100

Twemproxy優缺點

優缺點:

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

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

注意點:

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

缺點:

1.當redis叢集動態新增節點時,Twemproxy 需要重啟才能生效,並且資料不會自動重新 Reblance,需要人工單獨寫指令碼來實現。

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

3.單點問題,需要使用keepalived vip做高可用。