twemproxy的引數解析和監控

hotdog04發表於2015-06-08
之前寫了twemproxy的安裝配置,今天主要內容是引數解析和它提供監控:

引數解讀:

listen:
    監聽地址和埠(name:port 或者ip:port),也可以用sock檔案(/var/run/nutcracker.sock)的絕對路徑

hash: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的部分做hash運算。
         例如兩個key aaaa,xxx:{aaaa}:xxxx;指定{}中間部分做hash運算
         他們將被分配到同一server(找不到的場景使用完整的key做hash)

distribution: 資料分配方式:
     ketama:一致性hash演算法,根據server構造hash ring,為每個階段分配hash範圍
             它的優點是一個節點down後,整個叢集re-hash,有部分key-range會跟之
             前的key-range重合,所以它只能合適做單純的cache
     modula:根據key做hash值取模,根據結果分配到對應的server
             這種方式如果叢集做re-hash,所有的key值都會目標錯亂
     random:不管key值的hash結果是啥,隨機選取一個server作為操作目標
             適合只讀場景,需要配合資料載入?

timeout:單位毫秒,等待到server建立連線的時間或者接收server相應過程的等待時間
         預設是無限期等待
         等待超時報錯:SERVER_ERROR Connection timed out


backlog:TCP backlog佇列,預設512

preconnect: 在程式啟動的時候,twemproxy是否需要預連線到所有的server,預設值是false

redis:使用redis還是memcached協議,預設false(即memcached)

redis_auth: 連線redisserver的驗證

server_connections:每一個server能夠開啟的最大連線值,預設最大是1

auto_eject_host: 當連線一個server失敗次數超過server_failure_limit值時,是否把這個
                 server驅逐出叢集,預設是false
server_retry_timeout:單位毫秒,當auto_eject_host開啟後,重試被臨時驅逐的server之前
                     的等待時間
server_failure_limit: 當auto_eject_host開啟後,驅逐一個server之前重試次數

servers: serverpool中包含的的server的地址、埠和權重的列表(name:port:weight or ip:port:weight)

配置例子:
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:6379:1

beta:
  listen: 127.0.0.1:22122
  hash: fnv1a_64
  hash_tag: "{}"
  distribution: ketama
  auto_eject_hosts: false
  timeout: 400
  redis: true
  servers:
   - 127.0.0.1:6380:1 server1
   - 127.0.0.1:6381:1 server2
   - 127.0.0.1:6382:1 server3
   - 127.0.0.1:6383:1 server4

gamma:
  listen: 127.0.0.1:22123
  hash: fnv1a_64
  distribution: ketama
  timeout: 400
  backlog: 1024
  preconnect: true
  auto_eject_hosts: true
  server_retry_timeout: 2000
  server_failure_limit: 3
  servers:
   - 127.0.0.1:11212:1
   - 127.0.0.1:11213:1

delta:
  listen: 127.0.0.1:22124
  hash: fnv1a_64
  distribution: ketama
  timeout: 100
  auto_eject_hosts: true
  server_retry_timeout: 2000
  server_failure_limit: 1
  servers:
   - 127.0.0.1:11214:1
   - 127.0.0.1:11215:1
   - 127.0.0.1:11216:1
   - 127.0.0.1:11217:1
   - 127.0.0.1:11218:1
   - 127.0.0.1:11219:1
   - 127.0.0.1:11220:1
   - 127.0.0.1:11221:1
   - 127.0.0.1:11222:1
   - 127.0.0.1:11223:1

omega:
  listen: /tmp/gamma
  hash: hsieh
  distribution: ketama
  auto_eject_hosts: false
  servers:
   - 127.0.0.1:11214:100000
   - 127.0.0.1:11215:1


配置檔案的語法檢查可以使用-t引數來做

監控:
nutcracker有兩個引數:
-s, --stats-port=N     : set stats monitoring port (default: 22222)
-a, --stats-addr=S     : set stats monitoring ip (default: 0.0.0.0)

啟動後,訪問http://xx.xx.xx.xx:22222/
{"service":"nutcracker", "source":"bjm6-24-32.58os.org", "version":"0.3.0", "uptime":344017, "timestamp":1433757840,

"total_connections":749874, "curr_connections":4, "1o": {"client_eof":610078, "client_err":139766, "client_connections":1,

"server_ejects":20, "forward_error":505857, "fragments":0, "xxx.xxx.xxx.32:30001": {"server_eof":1, "server_err":4,

"server_timedout":0, "server_connections":1, "server_ejected_at":1433674556689492, "requests":3028841, "request_bytes":137924947,

"responses":3028700, "response_bytes":21150788, "in_queue":0, "in_queue_bytes":0, "out_queue":0,

"out_queue_bytes":0},"xxx.xxx.xxx.33:30001": {"server_eof":1, "server_err":4, "server_timedout":0, "server_connections":1,

"server_ejected_at":1433674556688643, "requests":118, "request_bytes":5235, "responses":3, "response_bytes":17, "in_queue":0,

"in_queue_bytes":0, "out_queue":0, "out_queue_bytes":0},"xxx.xxx.xxx.34:30001": {"server_eof":1, "server_err":4, "server_timedout":0,

"server_connections":0, "server_ejected_at":1433674556690998, "requests":251, "request_bytes":11264, "responses":2,

"response_bytes":12, "in_queue":0, "in_queue_bytes":0, "out_queue":0, "out_queue_bytes":0},"xxx.xxx.xxx.35:30001": {"server_eof":1,

"server_err":4, "server_timedout":0, "server_connections":1, "server_ejected_at":1433674556687407, "requests":70058868,

"request_bytes":2900003041, "responses":70058722, "response_bytes":467091290, "in_queue":0, "in_queue_bytes":0, "out_queue":0,

"out_queue_bytes":0}}}


各個項的含義可以通過下面檢視說明:
$ 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"


日誌只有在編譯安裝的時候啟用( --enable-debug=log),預設情況下日誌寫到stderr.
可以使用 -o 或者 --output 命令指定輸出檔案,使用-v標記日誌級別

 

生成環境推薦:

1、log level:
推薦編譯時候開啟日誌,使用等級6記錄日誌資訊

2、liveness:
分散式事務,failure將會是常態,為了應對failure,推薦為每一個server pool配置如下:
resilient_pool:
  auto_eject_hosts: true
  server_retry_timeout: 30000
  server_failure_limit: 3

auto_eject_hosts,server_failure_limit:確保dead server會被驅逐出hash環
server_retry_timeout:確保閃斷的server不會被標記成dead server

3、timeout:
nutceacker通常需要配置timeout,而不是依賴客戶端的超時配置:
resilient_pool_with_timeout:
  auto_eject_hosts: true
  server_retry_timeout: 30000
  server_failure_limit: 3
  timeout: 400
預設場景,nutcracker一直等到請求傳送到server,配置timeout後,請求
超時後將會返回錯誤資訊( SERVER_ERROR Connection timed out\r\n  (memcached)
or  -ERR Connection timed out\r\n  (redis))

4、 error response:
發現錯誤資訊返回的情況,可以認為是一個客戶端的瞬間失效,最好重新發起請求

5、read, writev and mbuf
   所有的請求和響應都在mbuf裡面,mbuf預設大小是16K(512b-16M),可以使用
-m or -mbuf-size=N來配置,每一個連線都會獲得至少一個mbuf,這意味著nutcracker支援的
併發的連線數依賴於mbuf的大小,小的mbuf可以控制更多的連線,大的mbuf可以讓我們
讀或者寫更多的資料導socker buffer。如果併發量很大的場景,推薦使用比較小的mbuf(512 or 1K)

6、mbuf-size=N
  每一個客戶端連線最好需要一個mbuf,一個服務請求最少是兩個連線(client->proxy、proxy->server)
所以最少需要兩個mbufs
  1000個客戶端連線的場景計算:1000*2*mbuf=32M,如果每個連線有10個操作,這個值將會是320M,假設
連線是10000,那麼將會消耗3.2G記憶體!這種場景下最好調小mbuf值比如512b,1000*2*512*10=10M
這個就是當併發量高的場景下使用小的mbuf的原因


7、key長度:
   memcached的長度上限是250, redis沒有類似限制,但是nutcracker需要key儲存在連續的記憶體裡面,而因為
所有的請求和響應都在mbuf中,所以redis key的長度將會受限制於mbuf,也就是說如果你的redis例項如果要
操作超長的key,你必須把mbuf調大

8、server name
配置1:
servers:
 - 127.0.0.1:6379:1
 - 127.0.0.1:6380:1
 - 127.0.0.1:6381:1
 - 127.0.0.1:6382:1
配置2:
servers:
 - 127.0.0.1:6379:1 server1
 - 127.0.0.1:6380:1 server2
 - 127.0.0.1:6381:1 server3
 - 127.0.0.1:6382:1 server4

配置1 keys直接使用host:port:weight做匹配;
配置2 跟node name匹配
第二種場景可以讓我們方便的移動節點到不同的伺服器上,而不會打亂hash ring

9、server_connections: > 1
當值大於1的時候,“read my last write”的請求會導致不一致。


 

最後注意使用twemproxy最redis命令的支援情況:
https://github.com/twitter/twemproxy/blob/master/notes/redis.md

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/20625855/viewspace-1692022/,如需轉載,請註明出處,否則將追究法律責任。

相關文章