linux下使用redis代理twmproxy
twemproxy,又名nutracker,是一個快速,輕量級的代理程序,支持memcache 和redis協議。它主要用來降低后端緩存服務器的連接數。
目前的***版本為0.3.0.git地址:https://github.com/yuyunliuhen/twemproxy。
編譯:
- $get clone https://github.com/yuyunliuhen/twemproxy
- $cd twemproxy & ./configure --enable-debug=log & make
- $src/nutcracker --help
這樣就已經編譯成功了,這里從源代碼目錄啟動,也可以通過make install 安裝。
命令行選項:
- -t, --test-conf : test configuration for syntax errors and exit
測試配置文件是否正確,默認為conf/nutcracker.yml,詳細內容是這樣的:
#p#
配置文件各項參數的說明下面會進行詳細的介紹;
- -d, --daemonize : run as a daemon
后臺啟動進程
- -D, --describe-stats : print stats description and exit
- -v, --verbosity=N : set logging level (default: 5, min: 0, max: 11)
默認情況下debug日志是不可用的,不過在生產環境中打開debug日志并將日志級別設置為verbosity,LOG_INFO(-v 6 或者 –verbosity=6);
默認日志級別:
日志級別-v 6 或者 –verbosity=6:
在這個日志級別里,nutcracker 日志記錄了每個客戶端和服務端的生存周期和一些像節點從hash環上淘汰等重要信息.
打開debug日志的方法是在編譯的時候加上--enable-debug=log選項.
- -o, --output=S : set logging file (default: stderr)
- -c, --conf-file=S : set configuration file (default: conf/nutcracker.yml)
如果不指定此選項,默認為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)
指定啟動地址,默認為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)
#p#
配置文件參數:
- listen: The listening address and port (name:port or ip:port) for this server pool.
nutcracker服務器池監聽端口和地址;
- hash: The name of the hash function
hash函數,支持md5,crc16,crc32,finv1a_32等十多種;
- hash_tag: A two character string that specifies the part of the key used for hashing. Eg "{}" or "$$". Hash tagenable mapping different keys to the same server as long as the part of the key within the tag is the same.
啟用hash tags 意味著你將使用key的一部分來計算hash值,當hash tages存在的時候 ,我們使用在標簽內的key的一部分來構建一致性hash,其他情況,我們使用全部的key去構建。hash tags能夠讓你將不同的key(只要在標簽內的部分相同)映射到相同的服務器上。
例如,服務池beta的配置如下,指定了兩個hash_tag字符“{}”,這意味著keys”user:{user1}:ids” 和 “user:{user1}:tweets” 將會映射到同一臺服務器上,因為我們使用的是’user1′來計算hash,對于key “user:user1:ids”將會是用整個字符串來計算hash,所以可能會映射到其他服務器上。
- timeout: The timeout value in msec that we wait for to establish a connection to the server or receive a response from a server. By default, we wait indefinitely.
為nutcracker的每一個服務池配置timeout 要比僅僅依靠客戶端超時要好的多。
比如 :timeout: 400
僅僅依靠客戶端超時設置并不能達到理想的超時效果,反而起到了相反的作用,因為客戶端的超時設置在這里變成了客戶端對代理的超時,但代理對服務端的鏈接是一直保持的,客戶端重試請求對于服務端是沒有效果的。默認情況下,任何發送給服務端的請求,nutcracker都會無限期的等待,當timeout被設置后,如果在timeout的時間過后還沒有從服務端得到回應,這時會將超時錯誤信息SERVER_ERROR Connection time out發送給客戶端。
- backlog: The TCP backlog argument. Defaults to 512.
- preconnect: A boolean value that controls if nutcracker should preconnect to all the servers in this pool on process start. Defaults to false.
- redis: A boolean value that controls if a server pool speaks redis or memcached protocol. Defaults to false.
- server_connections: The maximum number of connections that can be opened to each server. By default, we open at most 1 server connection.
twemproxy的設計意圖是通過少量的服務端的鏈接來響應更多的客戶端的鏈接,但是需要注意的是當twemproxy配置了 server_connections: > 1時,情況就不一定是這樣的。
為了說明這一點,假設在twemproxy 配置為server_connections: 2的場景下,一個客戶端發出了以set foo 0 0 3\r\nbar\r\n(寫)為開始,然后第二個命令是get foo\r\n (讀)的piplined請求,期望的結果是讀取foo的時候能夠返回bar,然而,由于配置了兩個服務端鏈接,讀寫請求可能被發送到不同的鏈接上,也意味著他們的執行順序要看哪一個先到達服務端,總結一下,如果客戶端期望得到的是我***寫的內容,需要將twemproxy配置為 server_connections:1或者客戶端只發起同步的請求。
- auto_eject_hosts: A boolean value that controls if server should be ejected temporarily when it fails consecutively server_failure_limit times. See liveness recommendations for information. Defaults to false.
- server_retry_timeout: The timeout value in msec to wait for before retrying on a temporarily ejected server, when auto_eject_host is set to true. Defaults to 30000 msec.
- server_failure_limit: The number of consecutive failures on a server that would lead to it being temporarily ejected when auto_eject_host is set to true. Defaults to 2.
- servers: A list of server address, port and weight (name:port:weight or ip:port:weight) for this server pool.
twemproxy上代理的服務實例可以通過兩種字符串格式指定‘host:port:weight’ 或者 ‘host:port:weight name’.
或者
在前面的配置中,keys是直接由‘host:port:weight’三重映射而來,而在后者keys是由節點名映射而來,節點名和主機的地址和端口對應,后者的方法可以使我們更自由地在不打亂hash環的情況下重置節點后端實例。在auto_eject_hosts設置為false的情況下,達到理想的配置。 了解詳細issue 25
需要注意的是當使用節點名來構建一致性hash環的時候,twemproxy將會忽略’host:port:weight name’這種格式的字符串中權重的值。
測試使用:
(1) 配置一份配置文件:
(2) 按照servers的配置分別在對應服務器上啟動redis-server;
(3) 啟動nutcracker
日志顯示redis pool代理4 servers.
#p#
(4) 連接nutcracker,并設置獲取鍵值
各個redis服務器的監視情況:
nutcracker日志:
以上只是展示了一主機多實例的情況,如果是多主機多實例,只需要更改對應IP就行了。
參考:twemproxy/recommendation.md(翻譯)twemproxy的一些生產環境使用經驗