使用 gor 複製真實流量壓測ES集群

  • 2019 年 12 月 11 日
  • 筆記

生產環境下, 我們一般使用 esrally來做es的基準測試。 但是畢竟和真實生產的請求場景可能有差異的。 

因此,有必要考慮使用真實流量來壓測ES集群。

常用的流量複製工具有tcpcopy之類的,這裡我們介紹一個更簡單易用的工具 gor 。

TIPS:

我在測試環境的 192.168.2.4 上實際測試用的命令(放大1倍流量):

# 192.168.2.4 為老es集群節點  # 192.168.2.188 為新es集群節點    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的內容:

下圖是我在老es集群更新文檔後,可以看到新的es集群也自動更新了文檔

更多的關於gor 流量複製的介紹,可以看下面的內容:

參考文檔:

https://testerhome.com/articles/21180

https://github.com/buger/goreplay/wiki

https://www.jianshu.com/p/57e058ad4995

1、流量實時複製引流(–input-raw 攔截埠配合–output-http輸出),例如將本機9200埠的HTTP流量實時複製到 es-dest:9200。

gor --input-raw :9200 --output-http "http://es-dest:9200"

2、如果目標伺服器使用的庫與線上機器一樣,且只需要引流Get方法的請求。

gor --input-raw :9200  --http-allow-method GET --output-http "http://es-dest:9200"

3、當需要對線上服務進行整體性能壓測時,可將線上請求擴大N倍,進行引流,將請求擴大1倍,也可縮小,調整"|"後面的百分比即可。

gor --input-raw :9200  --http-allow-method GET --output-http "http://es-dest:9200|200%"

4、只複製某個URL請求,–http-allow-url參數,-http-allow-url參數可用正則表達式(–output-http-url-regexp在gor 0.16已經過期,使用–http-allow-url代替)。

gor --input-raw :9200 --http-allow-method GET --output-http "http://es-dest:9200" --http-allow-url mall.*hotword

5、多目標伺服器的流量複製引流,有點類似nginx的mirror。

gor --input-raw :9200 --output-http "http://es-dest:9200" --output-http "http://es-dest:9200"

6、將流量轉發到多個端點,默認情況下,它會將相同的流量發送到所有輸出。

gor --input-tcp :2920020 --output-http "http://staging.com"  --output-http "http://dev.com"

7、將相同的流量發送到多個站點,並且平分所有流量。

gor --input-raw :9200 --output-http "http://staging.com"  --output-http "http://dev.com" --split-output true

8、HTTP超時,默認情況下,http請求和響應的超時時間為5秒。你可以像這樣覆蓋它:

gor --input-tcp replay.local:2920020 --output-http http://staging.com --output-http-timeout 30s

9、基本身份驗證,如果您的開發或登台環境受基本身份驗證保護,那麼可以在重放期間注入這些憑據:

gor --input-raw :9200 --output-http "http://user:[email protected]"

10、性能壓力測試

可以將流量複製到文件,然後再對他們進行回放。回放的時候,流量會維持原始的時間間隔。如果你使用了百分比來進行速率限制,那麼回放的速率會相應的增加或減少。有了這種速率限制,gor就可以用來進行壓力測試。

gor --input-file "requests.gor|200%" --output-http "staging.com"

目前,input-file僅在使用基於百分比的限制器時才支援此功能。與默認限制器不同input-file,它不會降低請求速度,而會減慢速度或加速請求發射。

11 、錄製與回放

./gor --input-raw :9200 --output-file=requests.gor

執行錄製命令後,將會創建新文件並不斷向其寫入所有捕獲的請求。

12、流量回放,重播來自文件的請求。

./gor --input-file requests.gor --output-http="http://localhost:92000"

您應該看到所有記錄到http://localhost:92000的請求,並且它們將以相同的順序重播,並且與錄製的時間完全相同。

gor的用法也遠不止上述提到的這些,更多的應用測試場景,還請讀者自行挖掘。

 ./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> [email protected]  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