温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

使用 gor 复制真实流量压测ES集群

发布时间:2020-07-18 19:21:13 阅读:2593 作者:我的二狗呢 栏目:系统运维
GO开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

生产环境下, 我们一般使用 esrally来做es的基准测试。 但是毕竟和真实生产的请求场景可能有差异的。 

因此,有必要考虑使用真实流量来压测ES集群。

常用的流量复制工具有tcpcopy之类的,这里我们介绍一个更简单易用的工具 gor 。

github地址: https://github.com/buger/goreplay

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的内容:

使用 gor 复制真实流量压测ES集群

下图是我在老es集群更新文档后,可以看到新的es集群也自动更新了文档

使用 gor 复制真实流量压测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:pass@staging.com"

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> 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 systemin 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, default1s. (default 1s)
  -output-file-max-size-limit value
    Max size of output file, Default1TB (default -1)
  -output-file-queue-limit int
    The length of the chunk queue. Default256 (default 256)
  -output-file-size-limit value
    Size of each chunk. Default32mb (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. default5000 (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

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×