您好,登錄后才能下訂單哦!
生產(chǎn)環(huán)境下, 我們一般使用?esrally來(lái)做es的基準(zhǔn)測(cè)試。 但是畢竟和真實(shí)生產(chǎn)的請(qǐng)求場(chǎng)景可能有差異的。?
因此,有必要考慮使用真實(shí)流量來(lái)壓測(cè)ES集群。
常用的流量復(fù)制工具有tcpcopy之類(lèi)的,這里我們介紹一個(gè)更簡(jiǎn)單易用的工具 gor 。
github地址:?https://github.com/buger/goreplay
TIPS:
我在測(cè)試環(huán)境的 192.168.2.4 上實(shí)際測(cè)試用的命令(放大1倍流量):
#?192.168.2.4?為老es集群節(jié)點(diǎn) #?192.168.2.188?為新es集群節(jié)點(diǎn) wget?https://github.com/buger/goreplay/releases/download/v1.0.0/gor_1.0.0_x64.tar.gz tar?xf?gor_1.0.0_x64.tar.gz?-C?./ ./gor?--input-raw?:9200?--output-http?"http://192.168.2.188:9200|200%"
下圖是gor 輸出到stdout的內(nèi)容:
下圖是我在老es集群更新文檔后,可以看到新的es集群也自動(dòng)更新了文檔
更多的關(guān)于gor 流量復(fù)制的介紹,可以看下面的內(nèi)容:
參考文檔:
https://testerhome.com/articles/21180
https://github.com/buger/goreplay/wiki
https://www.jianshu.com/p/57e058ad4995
1、流量實(shí)時(shí)復(fù)制引流(--input-raw 攔截端口配合--output-http輸出),例如將本機(jī)9200端口的HTTP流量實(shí)時(shí)復(fù)制到 es-dest:9200。
gor?--input-raw?:9200?--output-http?"http://es-dest:9200"
2、如果目標(biāo)服務(wù)器使用的庫(kù)與線上機(jī)器一樣,且只需要引流Get方法的請(qǐng)求。
gor?--input-raw?:9200??--http-allow-method?GET?--output-http?"http://es-dest:9200"
3、當(dāng)需要對(duì)線上服務(wù)進(jìn)行整體性能壓測(cè)時(shí),可將線上請(qǐng)求擴(kuò)大N倍,進(jìn)行引流,將請(qǐng)求擴(kuò)大1倍,也可縮小,調(diào)整"|"后面的百分比即可。
gor?--input-raw?:9200??--http-allow-method?GET?--output-http?"http://es-dest:9200|200%"
4、只復(fù)制某個(gè)URL請(qǐng)求,--http-allow-url參數(shù),-http-allow-url參數(shù)可用正則表達(dá)式(--output-http-url-regexp在gor 0.16已經(jīng)過(guò)期,使用--http-allow-url代替)。
gor?--input-raw?:9200?--http-allow-method?GET?--output-http?"http://es-dest:9200"?--http-allow-url?mall.*hotword
5、多目標(biāo)服務(wù)器的流量復(fù)制引流,有點(diǎn)類(lèi)似nginx的mirror。
gor?--input-raw?:9200?--output-http?"http://es-dest:9200"?--output-http?"http://es-dest:9200"
6、將流量轉(zhuǎn)發(fā)到多個(gè)端點(diǎn),默認(rèn)情況下,它會(huì)將相同的流量發(fā)送到所有輸出。
gor?--input-tcp?:2920020?--output-http?"http://staging.com"??--output-http?"http://dev.com"
7、將相同的流量發(fā)送到多個(gè)站點(diǎn),并且平分所有流量。
gor?--input-raw?:9200?--output-http?"http://staging.com"??--output-http?"http://dev.com"?--split-output?true
8、HTTP超時(shí),默認(rèn)情況下,http請(qǐng)求和響應(yīng)的超時(shí)時(shí)間為5秒。你可以像這樣覆蓋它:
gor?--input-tcp?replay.local:2920020?--output-http?http://staging.com?--output-http-timeout?30s
9、基本身份驗(yàn)證,如果您的開(kāi)發(fā)或登臺(tái)環(huán)境受基本身份驗(yàn)證保護(hù),那么可以在重放期間注入這些憑據(jù):
gor?--input-raw?:9200?--output-http?"http://user:pass@staging.com"
10、性能壓力測(cè)試
可以將流量復(fù)制到文件,然后再對(duì)他們進(jìn)行回放?;胤诺臅r(shí)候,流量會(huì)維持原始的時(shí)間間隔。如果你使用了百分比來(lái)進(jìn)行速率限制,那么回放的速率會(huì)相應(yīng)的增加或減少。有了這種速率限制,gor就可以用來(lái)進(jìn)行壓力測(cè)試。
gor?--input-file?"requests.gor|200%"?--output-http?"staging.com"
目前,input-file僅在使用基于百分比的限制器時(shí)才支持此功能。與默認(rèn)限制器不同input-file,它不會(huì)降低請(qǐng)求速度,而會(huì)減慢速度或加速請(qǐng)求發(fā)射。
11 、錄制與回放
./gor?--input-raw?:9200?--output-file=requests.gor
執(zhí)行錄制命令后,將會(huì)創(chuàng)建新文件并不斷向其寫(xiě)入所有捕獲的請(qǐng)求。
12、流量回放,重播來(lái)自文件的請(qǐng)求。
./gor?--input-file?requests.gor?--output-http="http://localhost:92000"
您應(yīng)該看到所有記錄到http://localhost:92000的請(qǐng)求,并且它們將以相同的順序重播,并且與錄制的時(shí)間完全相同。
gor的用法也遠(yuǎn)不止上述提到的這些,更多的應(yīng)用測(cè)試場(chǎng)景,還請(qǐng)讀者自行挖掘。
?./gor --help? 可以列出更全面的幫助信息
Gor?is?a?simple?http?traffic?replication?tool?written?in?Go.?Its?main?goal?is?to?replay?traffic?from?production?servers?to?staging?and?dev?environments. Project?page:?https://github.com/buger/gor Author:?<Leonid?Bugaev>?leonsbox@gmail.com Current?Version:?1.0.0 ??-copy-buffer-size?int ????Set?the?buffer?size?for?an?individual?request?(default?5M)?(default?524289200) ??-cpuprofile?string ????write?cpu?profile?to?file ??-debug?verbose ????Turn?on?debug?output,?shows?all?intercepted?traffic.?Works?only?when?with?verbose?flag ??-exit-after?duration ????exit?after?specified?duration ??-http-allow-header?value ????A?regexp?to?match?a?specific?header?against.?Requests?with?non-matching?headers?will?be?dropped: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-allow-header?api-version:^v1 ??-http-allow-method?value ????Whitelist?of?HTTP?methods?to?replay.?Anything?else?will?be?dropped: ????gor?--input-raw?:9200?--output-http?staging.com?--http-allow-method?GET?--http-allow-method?OPTIONS ??-http-allow-url?value ????A?regexp?to?match?requests?against.?Filter?get?matched?against?full?url?with?domain.?Anything?else?will?be?dropped: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-allow-url?^www. ??-http-basic-auth-filter?value ????A?regexp?to?match?the?decoded?basic?auth?string?against.?Requests?with?non-matching?headers?will?be?dropped: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-basic-auth-filter?"^customer[0-9].*" ??-http-disallow-header?value ????A?regexp?to?match?a?specific?header?against.?Requests?with?matching?headers?will?be?dropped: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-disallow-header?"User-Agent:?Replayed?by?Gor" ??-http-disallow-url?value ????A?regexp?to?match?requests?against.?Filter?get?matched?against?full?url?with?domain.?Anything?else?will?be?forwarded: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-disallow-url?^www. ??-http-header-limiter?value ????Takes?a?fraction?of?requests,?consistently?taking?or?rejecting?a?request?based?on?the?FNV32-1A?hash?of?a?specific?header: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-header-limiter?user-id:25% ??-http-original-host ????Normally?gor?replaces?the?Host?http?header?with?the?host?supplied?with?--output-http.??This?option?disables?that?behavior,?preserving?the?original?Host?header. ??-http-param-limiter?value ????Takes?a?fraction?of?requests,?consistently?taking?or?rejecting?a?request?based?on?the?FNV32-1A?hash?of?a?specific?GET?param: ?????gor?--input-raw?:9200?--output-http?staging.com?--http-param-limiter?user_id:25% ??-http-pprof?:8181 ????Enable?profiling.?Starts??http?server?on?specified?port,?exposing?special?/debug/pprof?endpoint.?Example:?:8181 ??-http-rewrite-header?value ????Rewrite?the?request?header?based?on?a?mapping: ????gor?--input-raw?:9200?--output-http?staging.com?--http-rewrite-header?Host:?(.*).example.com,$1.beta.example.com ??-http-rewrite-url?value ????Rewrite?the?request?url?based?on?a?mapping: ????gor?--input-raw?:9200?--output-http?staging.com?--http-rewrite-url?/v1/user/([^\/]+)/ping:/v2/user/$1/ping ??-http-set-header?value ????Inject?additional?headers?to?http?reqest: ????gor?--input-raw?:9200?--output-http?staging.com?--http-set-header?'User-Agent:?Gor' ??-http-set-param?value ????Set?request?url?param,?if?param?already?exists?it?will?be?overwritten: ????gor?--input-raw?:9200?--output-http?staging.com?--http-set-param?api_key=1 ??-input-dummy?value ????Used?for?testing?outputs.?Emits?'Get?/'?request?every?1s ??-input-file?value ????Read?requests?from?file:? ????gor?--input-file?./requests.gor?--output-http?staging.com ??-input-file-loop ????Loop?input?files,?useful?for?performance?testing. ??-input-kafka-host?string ????Send?request?and?response?stats?to?Kafka: ????gor?--output-stdout?--input-kafka-host?'192.168.0.1:9092,192.168.0.2:9092' ??-input-kafka-json-format ????If?turned?on,?it?will?assume?that?messages?coming?in?JSON?format?rather?than??GoReplay?text?format. ??-input-kafka-topic?string ????Send?request?and?response?stats?to?Kafka: ????gor?--output-stdout?--input-kafka-topic?'kafka-log' ??-input-raw?value ????Capture?traffic?from?given?port?(use?RAW?sockets?and?require?*sudo*?access): ????#?Capture?traffic?from?9200?port ????gor?--input-raw?:9200?--output-http?staging.com ??-input-raw-bpf-filter?string ????BPF?filter?to?write?custom?expressions.?Can?be?useful?in?case?of?non?standard?network?interfaces?like?tunneling?or?SPAN?port.?Example:?--input-raw-bpf-filter?'dst?port?9200' ??-input-raw-buffer-size?int ????Controls?size?of?the?OS?buffer?(in?bytes)?which?holds?packets?until?they?dispatched.?Default?value?depends?by?system:?in?Linux?around?2MB.?If?you?see?big?package?drop,?increase?this?value. ??-input-raw-engine?libpcap ????Intercept?traffic?using?libpcap?(default),?and?`raw_socket`?(default?"libpcap") ??-input-raw-expire?duration ????How?much?it?should?wait?for?the?last?TCP?packet,?till?consider?that?TCP?message?complete.?(default?2s) ??-input-raw-immediate-mode ????Set?pcap?interface?to?immediate?mode. ??-input-raw-override-snaplen ????Override?the?capture?snaplen?to?be?64k.?Required?for?some?Virtualized?environments ??-input-raw-realip-header?string ????If?not?blank,?injects?header?with?given?name?and?real?IP?value?to?the?request?payload.?Usually?this?header?should?be?named:?X-Real-IP ??-input-raw-timestamp-type?string ????Possible?values:?PCAP_TSTAMP_HOST,?PCAP_TSTAMP_HOST_LOWPREC,?PCAP_TSTAMP_HOST_HIPREC,?PCAP_TSTAMP_ADAPTER,?PCAP_TSTAMP_ADAPTER_UNSYNCED.?This?values?not?supported?on?all?systems,?GoReplay?will?tell?you?available?values?of?you?put?wrong?one. ??-input-raw-track-response ????If?turned?on?Gor?will?track?responses?in?addition?to?requests,?and?they?will?be?available?to?middleware?and?file?output. ??-input-tcp?value ????Used?for?internal?communication?between?Gor?instances.?Example:? ????#?Receive?requests?from?other?Gor?instances?on?2920020?port,?and?redirect?output?to?staging ????gor?--input-tcp?:2920020?--output-http?staging.com ??-input-tcp-certificate?string ????Path?to?PEM?encoded?certificate?file.?Used?when?TLS?turned?on. ??-input-tcp-certificate-key?string ????Path?to?PEM?encoded?certificate?key?file.?Used?when?TLS?turned?on. ??-input-tcp-secure ????Turn?on?TLS?security.?Do?not?forget?to?specify?certificate?and?key?files. ??-memprofile?string ????write?memory?profile?to?this?file ??-middleware?string ????Used?for?modifying?traffic?using?external?command ??-output-dummy?value ????DEPRECATED:?use?--output-stdout?instead ??-output-file?value ????Write?incoming?requests?to?file:? ????gor?--input-raw?:9200?--output-file?./requests.gor ??-output-file-append ????The?flushed?chunk?is?appended?to?existence?file?or?not.? ??-output-file-flush-interval?duration ????Interval?for?forcing?buffer?flush?to?the?file,?default:?1s.?(default?1s) ??-output-file-max-size-limit?value ????Max?size?of?output?file,?Default:?1TB?(default?-1) ??-output-file-queue-limit?int ????The?length?of?the?chunk?queue.?Default:?256?(default?256) ??-output-file-size-limit?value ????Size?of?each?chunk.?Default:?32mb?(default?33554432) ??-output-http?value ????Forwards?incoming?requests?to?given?http?address. ????#?Redirect?all?incoming?requests?to?staging.com?address? ????gor?--input-raw?:9200?--output-http?http://staging.com ??-output-http-compatibility-mode ????Use?standard?Go?client,?instead?of?built-in?implementation.?Can?be?slower,?but?more?compatible. ??-output-http-debug ????Enables?http?debug?output. ??-output-http-elasticsearch?string ????Send?request?and?response?stats?to?ElasticSearch: ????gor?--input-raw?:9200?--output-http?staging.com?--output-http-elasticsearch?'es_host:api_port/index_name' ??-output-http-header?--output-http-header ????WARNING:?--output-http-header?DEPRECATED,?use?`--http-set-header`?instead ??-output-http-header-filter?--output-http-header-filter ????WARNING:?--output-http-header-filter?DEPRECATED,?use?`--http-allow-header`?instead ??-output-http-header-hash-filter?output-http-header-hash-filter ????WARNING:?output-http-header-hash-filter?DEPRECATED,?use?`--http-header-hash-limiter`?instead ??-output-http-method?--output-http-method ????WARNING:?--output-http-method?DEPRECATED,?use?`--http-allow-method`?instead ??-output-http-queue-len?int ????Number?of?requests?that?can?be?queued?for?output,?if?all?workers?are?busy.?default?=?1000?(default?1000) ??-output-http-redirects?int ????Enable?how?often?redirects?should?be?followed. ??-output-http-response-buffer?int ????HTTP?response?buffer?size,?all?data?after?this?size?will?be?discarded. ??-output-http-rewrite-url?--output-http-rewrite-url ????WARNING:?--output-http-rewrite-url?DEPRECATED,?use?`--http-rewrite-url`?instead ??-output-http-stats ????Report?http?output?queue?stats?to?console?every?N?milliseconds.?See?output-http-stats-ms ??-output-http-stats-ms?int ????Report?http?output?queue?stats?to?console?every?N?milliseconds.?default:?5000?(default?5000) ??-output-http-timeout?duration ????Specify?HTTP?request/response?timeout.?By?default?5s.?Example:?--output-http-timeout?30s?(default?5s) ??-output-http-track-response ????If?turned?on,?HTTP?output?responses?will?be?set?to?all?outputs?like?stdout,?file?and?etc. ??-output-http-url-regexp?--output-http-url-regexp ????WARNING:?--output-http-url-regexp?DEPRECATED,?use?`--http-allow-url`?instead ??-output-http-workers?int ????Gor?uses?dynamic?worker?scaling.?Enter?a?number?to?set?a?maximum?number?of?workers.?default?=?0?=?unlimited. ??-output-http-workers-min?int ????Gor?uses?dynamic?worker?scaling.?Enter?a?number?to?set?a?minimum?number?of?workers.?default?=?1. ??-output-kafka-host?string ????Read?request?and?response?stats?from?Kafka: ????gor?--input-raw?:9200?--output-kafka-host?'192.168.0.1:9092,192.168.0.2:9092' ??-output-kafka-json-format ????If?turned?on,?it?will?serialize?messages?from?GoReplay?text?format?to?JSON. ??-output-kafka-topic?string ????Read?request?and?response?stats?from?Kafka: ????gor?--input-raw?:9200?--output-kafka-topic?'kafka-log' ??-output-null ????Used?for?testing?inputs.?Drops?all?requests. ??-output-stdout ????Used?for?testing?inputs.?Just?prints?to?console?data?coming?from?inputs. ??-output-tcp?value ????Used?for?internal?communication?between?Gor?instances.?Example:? ????#?Listen?for?requests?on?9200?port?and?forward?them?to?other?Gor?instance?on?2920020?port ????gor?--input-raw?:9200?--output-tcp?replay.local:2920020 ??-output-tcp-secure ????Use?TLS?secure?connection.?--input-file?on?another?end?should?have?TLS?turned?on?as?well. ??-output-tcp-stats ????Report?TCP?output?queue?stats?to?console?every?5?seconds. ??-prettify-http ????If?enabled,?will?automatically?decode?requests?and?responses?with:?Content-Encodning:?gzip?and?Transfer-Encoding:?chunked.?Useful?for?debugging,?in?conjuction?with?--output-stdout ??-split-output?true ????By?default?each?output?gets?same?traffic.?If?set?to?true?it?splits?traffic?equally?among?all?outputs. ??-stats ????Turn?on?queue?stats?output ??-verbose ????Turn?on?more?verbose?output
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。