摘要:中文日本語基于的高性能緩存服務(wù)器和緩存服務(wù)器。定義條件詳見的也可以用作類似或者那樣的緩存服務(wù)器,來緩存動態(tài)或者靜態(tài)的資源。
NuSTER
Wiki | English | 中文 | 日本語
基于HAProxy的高性能HTTP緩存服務(wù)器和RESTful NoSQL緩存服務(wù)器。
中文版更新可能不及時(shí),最新版請參照英文版README.md目錄
介紹
性能
入門指南
使用方法
指令
Cache
管理
開啟關(guān)閉
生存時(shí)間
清除
統(tǒng)計(jì)
NoSQL
Set
Get
Delete
FAQ
介紹NuSTER是一個(gè)基于HAProxy的高性能HTTP緩存服務(wù)器和RESTful NoSQL緩存服務(wù)器,完全兼容HAProxy,并且利用HAProxy的ACL功能來提供非常細(xì)致的緩存規(guī)則。
特性 HTTP/TCP負(fù)載均衡器NuSTER可以作為HTTP/TCP負(fù)載均衡器使用。
繼承了HAProxy的所有特性,完全兼容HAProxy
負(fù)載均衡
前端后端HTTPS
HTTP壓縮
HTTP重寫重定向
HTTP信息增刪改
HTTP2
監(jiān)控
粘性
訪問控制
內(nèi)容切換
HTTP緩存服務(wù)器NuSTER也可以用作類似Varnish或者Nginx那樣的HTTP緩存服務(wù)器,來緩存動態(tài)或者靜態(tài)的HTTP資源。
HAProxy的所有特性(HTTPS, HTTP/2, ACL, etc)
非常快
強(qiáng)大的動態(tài)緩存功能
基于HTTP method, URI, path, query, header, cookies, etc
基于HTTP request or response contents, etc
基于environment variables, server state, etc
基于SSL version, SNI, etc
基于connection rate, number, byte, etc
緩存管理
緩存清除
緩存統(tǒng)計(jì)信息
緩存生存時(shí)間
RESTful NoSQL緩存服務(wù)器NuSTER也可以用作RESTful NoSQL緩存服務(wù)器, 用HTTP POST/GET/DELETE 來 添加/取得/刪除 Key/Value.
可以像Memcached或者Redis那樣放在應(yīng)用和數(shù)據(jù)庫之間作為內(nèi)部KV緩存使用,也可以放在用戶和應(yīng)用之間作為面向用戶的NoSQL使用。
支持header, cookie等等,所以可以將不同的用戶數(shù)據(jù)存到相同的路勁。
HAProxy的所有特性(HTTPS, HTTP/2, ACL, etc)
有條件的緩存
內(nèi)部KV緩存
面向用戶緩存
支持任何類型的數(shù)據(jù)
支持所有編程語言,不需要特定的庫,只需HTTP支持
性能非常快, 單進(jìn)程模式下是nginx的3倍,多進(jìn)程下nginx的2倍,varnish的3倍。
詳見benchmark
入門指南 下載生產(chǎn)環(huán)境的話從Download下載最新穩(wěn)定版, 其他情況可以git clone。
編譯make TARGET=linux2628 USE_LUA=1 LUA_INC=/usr/include/lua5.3 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1 make install PREFIX=/usr/local/nuster
添加USE_PTHREAD_PSHARED=1使用pthread如果不需要可以刪除USE_LUA=1 LUA_INC=/usr/include/lua5.3 USE_OPENSSL=1 USE_PCRE=1 USE_ZLIB=1
具體可以參考HAProxy README。
配置文件準(zhǔn)備一個(gè)配置文件: nuster.cfg
global nuster cache on data-size 100m uri /_nuster nuster nosql on data-size 200m defaults mode http frontend fe bind *:8080 #bind *:4433 ssl crt example.com.pem alpn h2,http/1.1 use_backend be2 if { path_beg /_kv/ } default_backend be1 backend be1 nuster cache on nuster rule img ttl 1d if { path_beg /img/ } nuster rule api ttl 30s if { path /api/some/api } server s1 127.0.0.1:8081 server s2 127.0.0.1:8082 backend be2 nuster nosql on nuster rule r1 ttl 3600
nuster監(jiān)聽8080端口,接受HTTP請求。
/_kv/開頭的請求分配到backend be2, 可以發(fā)送HTTP POST/GET/DELETE到/_kv/any_key 來 添加/取得/刪除 Key/Value.
其他的請求都被分配到backend be1, 并且會被轉(zhuǎn)發(fā)到服務(wù)器s1 or s2. 其中/img/*請求會被緩存1天,而/api/some/api會被緩存30秒。
/usr/local/nuster/sbin/nuster -f nuster.cfg
Dockerdocker pull nuster/nuster docker run -d -v /path/to/nuster.cfg:/etc/nuster/nuster.cfg:ro -p 8080:8080 nuster/nuster使用方法
NuSTER基于HAProxy, 支持所有的HAProxy指令。
基本配置文件里有四個(gè)基本的sections: global, defaults, frontend and backend。
global
定義全局指令
需要定義nuster cache on or nuster nosql on,否則cache和nosql無法使用
defaults
定義frontend, backend的默認(rèn)參數(shù)
可以在frontend or backend section重新定義
frontend
定義監(jiān)聽端口等等面向用戶的設(shè)置
bankend
定義后端服務(wù)器等等設(shè)置
需要設(shè)置nuster cache on or nuster nosql on, 否則該backend沒有nosql或者nosql功能
需要設(shè)置nuster rule
可以定義多個(gè)frontend or backend . 如果定義了nuster cache|nosql off或者沒有nuster cache|nosql on|off, nuster就是一個(gè)HAProxy。
具體參考/doc下的HAProxy文檔, 或者在線HAProxy文檔
As TCP loader balancerfrontend mysql-lb bind *:3306 mode tcp default_backend mysql-cluster backend mysql-cluster balance roundrobin mode tcp server s1 10.0.0.101:3306 server s2 10.0.0.102:3306 server s3 10.0.0.103:3306As HTTP/HTTPS loader balancer
frontend web-lb bind *:80 #bind *:443 ssl crt XXX.pem mode http default_backend apps backend apps balance roundrobin mode http server s1 10.0.0.101:8080 server s2 10.0.0.102:8080 server s3 10.0.0.103:8080 #server s4 10.0.0.101:8443 ssl verify noneAs HTTP cache server
global nuster cache on data-size 200m frontend fe bind *:8080 default_backend be backend be nuster cache on nuster rule all server s1 127.0.0.1:8081As RESTful NoSQL cache server
global nuster nosql on data-size 200m frontend fe bind *:8080 default_backend be backend be nuster nosql on nuster rule r1 ttl 3600指令 global: nuster cache|nosql
syntax:
nuster cache on|off [data-size size] [dict-size size] [purge-method method] [uri uri]
nuster nosql on|off [data-size size] [dict-size size]
default: none
context: global
控制是否開啟cache或者nosql。
會分配一塊data-size + dict-size的共享內(nèi)存來存儲HTTP頭,數(shù)據(jù),key等等,臨時(shí)數(shù)據(jù)從系統(tǒng)內(nèi)存池分配。
如果沒有足夠內(nèi)存,新的請求不會被緩存直到有內(nèi)存被釋放。
和dict-size一起決定內(nèi)存塊的大小。
可以使用m, M, g 和 G. 默認(rèn)是1MB,同時(shí)也是最小值。
dict-size決定hash table的大小.
可以使用m, M, g 和 G. 默認(rèn)是1MB,同時(shí)也是最小值。
這個(gè)決定hash table buckets的大小,并非key的大小,key存在共享內(nèi)存中。
dict-size(bucket數(shù)) 不等于 key數(shù). 就算key的數(shù)量超過了dict-size,只要整個(gè)共享內(nèi)存有空間,新的key仍然可以被添加。
不過如果key數(shù)超過dict-size(bucket數(shù))性能也許會下降. dict-size可以設(shè)為大概的最大key數(shù)乘以8。
將來版本會刪除dict-size, 像第一版本那樣自動伸縮purge-method [cache only]
自定義PURGE用的HTTP method,最大14個(gè)字符,默認(rèn)是 PURGE.
uri [cache only]定義并開啟cache manager/stats API
nuster cache on uri /_my/_unique/_/_cache/_uri
cache manager/stats默認(rèn)是關(guān)閉的. 如果開啟了,主義開啟訪問控制(see FAQ).
具體請參考緩存管理 和 緩存統(tǒng)計(jì).
proxy: nuster cache|nosqlsyntax:
nuster cache [on|off]
nuster nosql [on|off]
default: on
context: backend, listen
決定是否在這個(gè)backend開啟cache/nosql。
如果這個(gè)section有filter,記得放在最后。
syntax: nuster rule name [key KEY] [ttl TTL] [code CODE] [if|unless condition]
default: none
context: backend, listen
定義cache/nosql的生效條件,需要定義至少一個(gè)rule。
nuster cache on # cache request `/asdf` for 30 seconds nuster rule asdf ttl 30 if { path /asdf } # cache if the request path begins with /img/ nuster rule img if { path_beg /img/ } # cache if the response header `cache` is `yes` acl resHdrCache res.hdr(cache) yes nuster rule r1 if resHdrCache
可以定義多個(gè)rule,按定義順序先后匹配。
acl pathA path /a.html nuster cache on nuster rule all ttl 3600 nuster rule path01 ttl 60 if pathA
rule path01永遠(yuǎn)不會被匹配。
name定義rule的name。
在cache manager API中使用, 不必唯一但是建議不同的rule用不同的name,否則相同name的rule視作一樣。
key KEY定義cache/nosql的key, 由下列關(guān)鍵字加.組成
method: http method, GET/POST...
scheme: http or https
host: the host in the request
uri: first slash to end of the url
path: the URL path of the request
delimiter: "?" if query exists otherwise empty
query: the whole query string of the request
header_NAME: the value of header NAME
cookie_NAME: the value of cookie NAME
param_NAME: the value of query NAME
body: the body of the request
CACHE的默認(rèn)key是 method.scheme.host.uri, NoSQL的默認(rèn)key是 GET.scheme.host.uri.
Example
GET http://www.example.com/q?name=X&type=Y http header: GET /q?name=X&type=Y HTTP/1.1 Host: www.example.com ASDF: Z Cookie: logged_in=yes; user=nuster;
生成:
method: GET
scheme: http
host: www.example.com
uri: /q?name=X&type=Y
path: /q
delimiter: ?
query: name=X&type=Y
header_ASDF: Z
cookie_user: nuster
param_type: Y
body: (empty)
默認(rèn)key產(chǎn)生GET.http.www.example.com./q?name=X&type=Y., 而key method.scheme.host.path.header_ASDF.cookie_user.param_type 則生成 GET.http.www.example.com./q.Z.nuster.Y..
相同key的請求則會直接返回cache給客戶端。
ttl TTL設(shè)置緩存生存時(shí)間,過期后緩存會被刪除。 可以使用 d, h, m and s。默認(rèn)3600秒.
如果不希望失效則設(shè)為0
默認(rèn)只緩存200的響應(yīng),如果需要緩存其他的則可以添加,all會緩存任何狀態(tài)碼。
cache-rule only200 cache-rule 200and404 code 200,404 cache-rule all code allif|unless condition
定義ACL條件
詳見HAProxy configuration的7. Using ACLs and fetching samples
NuSTER也可以用作類似Varnish或者Nginx那樣的HTTP緩存服務(wù)器,來緩存動態(tài)或者靜態(tài)的HTTP資源。
出了HAProxy的SSL, HTTP, HTTP2, 重寫重定向,增刪改Header等等,還提供了下面的功能。
緩存可以通過uri定義一個(gè)endpoint并發(fā)送HTTP請求來進(jìn)行管理。
定義并且開啟
nuster cache on uri /nuster/cache
基本用法
curl -X POST -H "X: Y" http://127.0.0.1/nuster/cache
記得進(jìn)行訪問控制
緩存開啟關(guān)閉rule可以通過manager uri動態(tài)開啟關(guān)閉,關(guān)閉的rule不會再進(jìn)行匹配。
headers
header | value | description |
---|---|---|
state | enable | enable rule |
disable | disable rule | |
name | rule NAME | the rule to be enabled/disabled |
proxy NAME | all rules belong to proxy NAME | |
* | all rules |
相同name的rule都會被開啟關(guān)閉。
Examples
關(guān)閉rule r1
curl -X POST -H "name: r1" -H "state: disable" http://127.0.0.1/nuster/cache
關(guān)閉backend app1b的所有rule
curl -X POST -H "name: app1b" -H "state: disable" http://127.0.0.1/nuster/cache
開啟所有的rule
curl -X POST -H "name: *" -H "state: enable" http://127.0.0.1/nuster/cache
緩存生存時(shí)間更改緩存TTL,只會影響后續(xù)的新緩存,不會影響已經(jīng)存在的緩存。
headers
header | value | description |
---|---|---|
ttl | new TTL | see ttl in nuster rule |
name | rule NAME | the rule to be changed |
proxy NAME | all rules belong to proxy NAME | |
* | all rules |
Examples
curl -X POST -H "name: r1" -H "ttl: 0" http://127.0.0.1/nuster/cache curl -X POST -H "name: r2" -H "ttl: 2h" http://127.0.0.1/nuster/cache同時(shí)設(shè)置state和ttl
同時(shí)設(shè)置state和ttl
curl -X POST -H "name: r1" -H "ttl: 0" -H "state: enabled" http://127.0.0.1/nuster/cache緩存清除
There are several ways to purge cache by making HTTP PURGE requests to the manager uri defined by uri.
You can define customized http method using purge-method MYPURGE other than the default PURGE in case you need to forward PURGE to backend servers.
刪除一個(gè)特定URLcurl -XPURGE https://127.0.0.1/imgs/test.jpg
生成key GET.scheme.host.uri, 并刪除那個(gè)key。
默認(rèn)key 包含Host, 如果緩存時(shí)用了http://example.com/test 而在localhost刪除是需要Host header:
curl -XPURGE -H "Host: example.com" http://127.0.0.1/test
通過name刪除可以通過帶上name header來 PURGE
headers
header | value | description |
---|---|---|
name | nuster rule NAME | caches belong to rule ${NAME} will be purged |
proxy NAME | caches belong to proxy ${NAME} | |
* | all caches |
Examples
# 刪除所有緩存 curl -X PURGE -H "name: *" http://127.0.0.1/nuster/cache # 刪除backend applb的所有緩存 curl -X PURGE -H "name: app1b" http://127.0.0.1/nuster/cache # 刪除所有rule r1生成的緩存 curl -X PURGE -H "name: r1" http://127.0.0.1/nuster/cache通過host刪除
通過帶上x-hostheader來刪除所有屬于這個(gè)host的緩存。
headers
header | value | description |
---|---|---|
x-host | HOST | the ${HOST} |
Examples
curl -X PURGE -H "x-host: 127.0.0.1:8080" http://127.0.0.1/nuster/cache通過path刪除
默認(rèn)情況下,query部分也包含在key中,所以相同的path不同的query會產(chǎn)生不同的緩存。
比如nuster rule imgs if { path_beg /imgs/ }, 然后請求
curl https://127.0.0.1/imgs/test.jpg?w=120&h=120 curl https://127.0.0.1/imgs/test.jpg?w=180&h=180
會生成兩個(gè)緩存,因?yàn)閝uery不一樣。
如果要刪除這些緩存,可以
如果知道所有的query,那么可以一個(gè)一個(gè)刪除
curl -XPURGE https://127.0.0.1/imgs/test.jpg?w=120&h=120 curl -XPURGE https://127.0.0.1/imgs/test.jpg?w=180&h=180
大多數(shù)情況下不知道所有的query
如果query部分不重要,則可以從key里面刪除query
定義nuster rule imgs key method.scheme.host.path if { path_beg /imgs }, 這樣的話只會生成一個(gè)緩存,那么就可以不用query刪除緩存
curl -XPURGE https://127.0.0.1/imgs/test.jpg
大多數(shù)情況需要query
通過rule name刪除
curl -X PURGE -H "name: imgs" http://127.0.0.1/nuster/cache
但是如果rule被定義成了 nuster rule static if { path_beg /imgs/ /css/ },則無法只刪除imgs
因此,可以通過path刪除
headers
header | value | description |
---|---|---|
path | PATH | caches with ${PATH} will be purged |
x-host | HOST | and host is ${HOST} |
Examples
# 刪除所有path是/imgs/test.jpg的緩存 curl -X PURGE -H "path: /imgs/test.jpg" http://127.0.0.1/nuster/cache # 刪除所有path是/imgs/test.jpg 并且host是127.0.0.1:8080的緩存 curl -X PURGE -H "path: /imgs/test.jpg" -H "x-host: 127.0.0.1:8080" http://127.0.0.1/nuster/cache通過正則刪除
也可以通過正則刪除,所有匹配正則的緩存將被刪除。
headers
header | value | description |
---|---|---|
regex | REGEX | caches which path match with ${REGEX} will be purged |
x-host | HOST | and host is ${HOST} |
Examples
# 刪除所有 /imgs 開頭 .jpg結(jié)尾的緩存 curl -X PURGE -H "regex: ^/imgs/.*.jpg$" http://127.0.0.1/nuster/cache #delete all caches which path starts with /imgs and ends with .jpg and belongs to 127.0.0.1:8080 curl -X PURGE -H "regex: ^/imgs/.*.jpg$" -H "127.0.0.1:8080" http://127.0.0.1/nuster/cache
PURGE 注意事項(xiàng)
開啟訪問控制
如果有多個(gè)header,按照name, path & host, path, regex & host, regex, host的順序處理
curl -XPURGE -H "name: rule1" -H "path: /imgs/a.jpg": purge by name
如果有重復(fù)的header,處理第一個(gè)
curl -XPURGE -H "name: rule1" -H "name: rule2": purge by rule1
regex 不是 glob
比如 /imgs下的.jpg文件是^/imgs/.*.jpg$ 而不是 /imgs/*.jpg
緩存統(tǒng)計(jì)可以通過GET uri定義的endpoint來獲取緩存統(tǒng)計(jì)信息。
Eanble and define the endpointnuster cache on uri /nuster/cacheUsage
curl http://127.0.0.1/nuster/cache
Outputused_mem: http緩存使用的內(nèi)存,不包括overhead
req_total: 開啟了cache的所有的backend的總請求數(shù),不包含那些沒有cache的backend的請求數(shù)
req_hit: cache擊中數(shù)
req_fetch: 從后端取得數(shù)量
req_abort: 中斷的請求
NoSQLNuSTER也可以用作RESTful NoSQL緩存服務(wù)器, 用HTTP POST/GET/DELETE 來 添加/取得/刪除 Key/Value.
基本操作 Setcurl -v -X POST -d value1 http://127.0.0.1:8080/key1 curl -v -X POST --data-binary @icon.jpg http://127.0.0.1:8080/imgs/icon.jpgGet
curl -v http://127.0.0.1:8080/key1
Deletecurl -v -X DELETE http://127.0.0.1:8080/key1
ResponseCheck status code.
200 OK
POST/GET: 成功
DELETE: 總是
400 Bad request
空值
不正確的acl, rules, etc
404 Not Found
POST: rule tests失敗
GET: not found
405 Method Not Allowed
其他的methods
500 Internal Server Error
發(fā)生未知錯(cuò)誤
507 Insufficient Storage
超過data-size
分用戶的data通過在key里加入header, cookie等等,可以將不同的用戶數(shù)據(jù)存到相同的路勁。
nuster rule r1 key method.scheme.host.uri.header_userId if { path /mypoint } nuster rule r2 key method.scheme.host.uri.cookie_sessionId if { path /mydata }Set
curl -v -X POST -d "333" -H "userId: 1000" http://127.0.0.1:8080/mypoint curl -v -X POST -d "555" -H "userId: 1001" http://127.0.0.1:8080/mypoint curl -v -X POST -d "userA data" --cookie "sessionId: ijsf023xe" http://127.0.0.1:8080/mydata curl -v -X POST -d "userB data" --cookie "sessionId: rosre329x" http://127.0.0.1:8080/mydataGet
curl -v http://127.0.0.1:8080/mypoint < 404 Not Found curl -v -H "userId: 1000" http://127.0.0.1:8080/mypoint < 200 OK 333 curl -v --cookie "sessionId: ijsf023xe" http://127.0.0.1:8080/mydata < 200 OK userA data客戶端
支持任何支持HTTP的客戶端,庫: curl, postman, python requests, go net/http, etc.
FAQ 如何調(diào)試?在global添加debug, 或者帶-d啟動haproxy
緩存相關(guān)的調(diào)試信息以[CACHE]開頭
如何緩存POST請求?添加option http-buffer-request
如果自定義了key的話需要使用body關(guān)鍵字
請求body可能不完整,詳見HAProxy configuration 的 option http-buffer-request小節(jié)
另外可以為post請求多帶帶設(shè)置一個(gè)后端
如何做訪問控制?類似
acl network_allowed src 127.0.0.1 acl purge_method method PURGE http-request deny if purge_method !network_allowed如何開啟HTTP2?
bind :443 ssl crt pub.pem alpn h2,http/1.1Example
global nuster cache on data-size 100m nuster nosql on data-size 100m #daemon ## to debug cache #debug defaults retries 3 option redispatch timeout client 30s timeout connect 30s timeout server 30s frontend web1 bind *:8080 mode http acl pathPost path /search use_backend app1a if pathPost default_backend app1b backend app1a balance roundrobin # mode must be http mode http # http-buffer-request must be enabled to cache post request option http-buffer-request acl pathPost path /search # enable cache for this proxy nuster cache # cache /search for 120 seconds. Only works when POST/PUT nuster rule rpost key method.scheme.host.uri.body ttl 120 if pathPost server s1 10.0.0.10:8080 backend app1b balance roundrobin mode http nuster cache on # cache /a.jpg, not expire acl pathA path /a.jpg nuster rule r1 ttl 0 if pathA # cache /mypage, key contains cookie[userId], so it will be cached per user acl pathB path /mypage nuster rule r2 key method.scheme.host.path.delimiter.query.cookie_userId ttl 60 if pathB # cache /a.html if response"s header[cache] is yes http-request set-var(txn.pathC) path acl pathC var(txn.pathC) -m str /a.html acl resHdrCache1 res.hdr(cache) yes nuster rule r3 if pathC resHdrCache1 # cache /heavy for 100 seconds if be_conn greater than 10 acl heavypage path /heavy acl tooFast be_conn ge 100 nuster rule heavy ttl 100 if heavypage tooFast # cache all if response"s header[asdf] is fdsa acl resHdrCache2 res.hdr(asdf) fdsa nuster rule resCache ttl 0 if resHdrCache1 server s1 10.0.0.10:8080 frontend web2 bind *:8081 mode http default_backend app2 backend app2 balance roundrobin mode http # disable cache on this proxy nuster cache off nuster rule all server s2 10.0.0.11:8080 listen web3 bind *:8082 mode http nuster cache nuster rule everything server s3 10.0.0.12:8080 frontend nosql_fe bind *:9090 default_backend nosql_be backend nosql_be nuster nosql on nuster rule r1 ttl 3600Conventions
Files with same name: those with .md extension belong to NuSTER, otherwise HAProxy
ContributingJoin the development
Give feedback
Report issues
Send pull requests
Spread nuster
LicenseCopyright (C) 2017-2018, Jiang Wenyuan, < koubunen AT gmail DOT com >
All rights reserved.
Licensed under GPL, the same as HAProxy
HAProxy and other sources license notices: see relevant individual files.
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/62022.html
摘要:是一個(gè)基于的高性能緩存服務(wù)器和緩存服務(wù)器,既可以用作類似或者那樣的緩存服務(wù)器,來緩存動態(tài)或者靜態(tài)的資源,也可以用作緩存服務(wù)器用來添加取得刪除。 nuster 是一個(gè)基于 HAProxy 的高性能 HTTP 緩存服務(wù)器和 RESTful NoSQL 緩存服務(wù)器,既可以用作類似 Varnish 或者 Nginx 那樣的 HTTP 緩存服務(wù)器,來緩存動態(tài)或者靜態(tài)的 HTTP 資源,也可以用作...
閱讀 1618·2021-09-08 10:42
閱讀 3604·2021-08-11 10:23
閱讀 3959·2019-08-30 14:10
閱讀 2732·2019-08-29 17:29
閱讀 3090·2019-08-29 12:50
閱讀 637·2019-08-26 13:36
閱讀 3456·2019-08-26 11:59
閱讀 1487·2019-08-23 16:23