文章目录

  • 一、概述
  • 一、安装相关软件
  • 1. 安装redis-server
  • 2. 安装memtier_benchmark软件
  • 3. redis的一些基本操作
  • 二、测试步骤
  • 1. 准备redis数据
  • 2. 启动进程进行测试
  • 3. 参数含义解释
  • 三、创建多个redis实例-Ubuntu18.04
  • 1. 原理
  • 2. 具体步骤:
  • 3. 补充说明
  • 四、评价指标
  • 五、参考文章


一、概述

memtier_benchmark是Redis Labs推出的一款命令行工具,它能够产生各种各样的流量模式,可以对Memcached和Redis实例进行基准测试。

memtier-benchmark可以根据您的需求生成多种结构的数据对数据库进行压力测试,帮助您了解目标数据库的性能极限。其部分功能特性如下。

  • 支持Redis和Memcached数据库测试。
  • 支持多线程、多客户端测试。
  • 可设置测试中的读写比例(SET: GET Ratio)。
  • 可自定义测试中键的结构。
  • 支持设置随机过期时间。

一、安装相关软件

1. 安装redis-server

在Ubuntu中通过以下方法进行安装Redis-service。

sudo apt update 
sudo apt install redis-server

启动Redis-service。

sudo systemctl start redis

测试Redis是否启动。

redis-cli ping

如果redis正在运行,则会输出PONG

2. 安装memtier_benchmark软件

安装编译memtier时所需工具。

sudo apt-get install build-essential autoconf automake libpcre3-dev libevent-dev pkg-config zlib1g-dev

从github上面克隆memtier_benchmark源文件。

git clone https://github.com/RedisLabs/memtier_benchmark.git

在克隆文件夹下执行指令autoreconf生成编译配置文件

cd memtier_benchmark
autoreconf -ivf

执行脚本生成配置文件

./configure

编译源文件

make

安装

make install

查看软版本

memtier_benchmark --version

查看安装是否成功

memtier_benchmark --help

3. redis的一些基本操作

关闭服务方法

sudo systemctl stop redis-server

sudo redis-cli -p 6379 shutdown

启动服务方法

sudo systemctl start redis-server

查看服务状态方法

sudo systemctl status redis-server

连接redis-server方法:

redis-cli -h [hostname] -p [port]

redis-cli -h 192.168.0.100 -p 6379

使用SET在redis中设置一个键值对

SET mykey "Hello, world!"

使用GET得到key对应的值

GET mykey

使用DEL命令删除键值对,如果删除成功,则会返回1,否则返回0

# 可以删除多个键
DEL mykey
DEL key1 key2 key3

# 删除成功返回1
127.0.0.1:6380> DEL mykey
(integer) 1

使用exit退出redis-server服务

exit

在redis中,没有数据库的概念,但是使用“namespaces”将数据分成多个逻辑区,可以使用SELECT命令选择namespaces。在redis中支持16个逻辑区,编号为0到15,默认情况下,会使用逻辑区0.

# 选择逻辑区1
SELECT 1

可以使用FLUSHDB命令清空当前逻辑区中的键值对,使用FLUSHALL命令清空所有逻辑区中的数据。

# 清空当前逻辑区中的键值对
FLUSHDB

# 清空所有逻辑区中的数据
FLUSHALL

使用DBSIZE命令查看数据库大小

DBSIZE

二、测试步骤

1. 准备redis数据

memtier_benchmark -s 192.168.1.1 -p 7000 
--threads=20 
--clients=5 
--requests 100000 
--data-size=2048 
--ratio=1:0 
--key-minimum=1 
--key-maximum=10000
--key-pattern P:P 
--pipeline 32 
--key-prefix=memtier-benchmark-prefix-redistests

2. 启动进程进行测试

memtier_benchmark -s 192.168.1.1 -p 7000 
--threads=20 
--clients=5 
--data-size=2048 
--ratio=2:8 
--key-minimum=1 
--key-maximum=10000
--key-pattern G:G 
--key-stddev=436923 
--pipeline 32 
--key-prefix=memtier-benchmark-prefix-redistests 
--test-time=900 
--distinct-client-seed

3. 参数含义解释

memtier_benchmark --help
Usage: memtier_benchmark [options]
A memcache/redis NoSQL traffic generator and performance benchmarking tool.

Connection and General Options:
  -s, --server=ADDR              Server address (default: localhost)
  -p, --port=PORT                Server port (default: 6379)
  -S, --unix-socket=SOCKET       UNIX Domain socket name (default: none)
  -P, --protocol=PROTOCOL        Protocol to use (default: redis).
                                 other supported protocols are resp2, resp3, memcache_text and memcache_binary.
                                 when using one of resp2 or resp3 the redis protocol version will be set via HELLO command.
  -a, --authenticate=CREDENTIALS Authenticate using specified credentials.
                                 A simple password is used for memcache_text
                                 and Redis <= 5.x. <USER>:<PASSWORD> can be
                                 specified for memcache_binary or Redis 6.x
                                 or newer with ACL user support.
      --tls                      Enable SSL/TLS transport security
      --cert=FILE                Use specified client certificate for TLS
      --key=FILE                 Use specified private key for TLS
      --cacert=FILE              Use specified CA certs bundle for TLS
      --tls-skip-verify          Skip verification of server certificate
      --sni=STRING               Add an SNI header
  -x, --run-count=NUMBER         Number of full-test iterations to perform
  -D, --debug                    Print debug output
      --client-stats=FILE        Produce per-client stats file
  -o, --out-file=FILE            Name of output file (default: stdout)
      --json-out-file=FILE       Name of JSON output file, if not set, will not print to json
      --hdr-file-prefix=FILE     Prefix of HDR Latency Histogram output files, if not set, will not save latency histogram files
      --show-config              Print detailed configuration before running
      --hide-histogram           Don't print detailed latency histogram
      --print-percentiles        Specify which percentiles info to print on the results table (by default prints percentiles: 50,99,99.9)
      --cluster-mode             Run client in cluster mode
  -h, --help                     Display this help
  -v, --version                  Display version information

Test Options:
  -n, --requests=NUMBER          Number of total requests per client (default: 10000)
                                 use 'allkeys' to run on the entire key-range
  -c, --clients=NUMBER           Number of clients per thread (default: 50)
  -t, --threads=NUMBER           Number of threads (default: 4)
      --test-time=SECS           Number of seconds to run the test
      --ratio=RATIO              Set:Get ratio (default: 1:10)
      --pipeline=NUMBER          Number of concurrent pipelined requests (default: 1)
      --reconnect-interval=NUM   Number of requests after which re-connection is performed
      --multi-key-get=NUM        Enable multi-key get commands, up to NUM keys (default: 0)
      --select-db=DB             DB number to select, when testing a redis server
      --distinct-client-seed     Use a different random seed for each client
      --randomize                random seed based on timestamp (default is constant value)

Arbitrary command:
      --command=COMMAND          Specify a command to send in quotes.
                                 Each command that you specify is run with its ratio and key-pattern options.
                                 For example: --command="set __key__ 5" --command-ratio=2 --command-key-pattern=G
                                 To use a generated key or object, enter:
                                   __key__: Use key generated from Key Options.
                                   __data__: Use data generated from Object Options.
      --command-ratio            The number of times the command is sent in sequence.(default: 1)
      --command-key-pattern      Key pattern for the command (default: R):
                                 G for Gaussian distribution.
                                 R for uniform Random.
                                 S for Sequential.
                                 P for Parallel (Sequential were each client has a subset of the key-range).

Object Options:
  -d  --data-size=SIZE           Object data size in bytes (default: 32)
      --data-offset=OFFSET       Actual size of value will be data-size + data-offset
                                 Will use SETRANGE / GETRANGE (default: 0)
  -R  --random-data              Indicate that data should be randomized
      --data-size-range=RANGE    Use random-sized items in the specified range (min-max)
      --data-size-list=LIST      Use sizes from weight list (size1:weight1,..sizeN:weightN)
      --data-size-pattern=R|S    Use together with data-size-range
                                 when set to R, a random size from the defined data sizes will be used,
                                 when set to S, the defined data sizes will be evenly distributed across
                                 the key range, see --key-maximum (default R)
      --expiry-range=RANGE       Use random expiry values from the specified range

Imported Data Options:
      --data-import=FILE         Read object data from file
      --data-verify              Enable data verification when test is complete
      --verify-only              Only perform --data-verify, without any other test
      --generate-keys            Generate keys for imported objects
      --no-expiry                Ignore expiry information in imported data

Key Options:
      --key-prefix=PREFIX        Prefix for keys (default: "memtier-")
      --key-minimum=NUMBER       Key ID minimum value (default: 0)
      --key-maximum=NUMBER       Key ID maximum value (default: 10000000)
      --key-pattern=PATTERN      Set:Get pattern (default: R:R)
                                 G for Gaussian distribution.
                                 R for uniform Random.
                                 S for Sequential.
                                 P for Parallel (Sequential were each client has a subset of the key-range).
      --key-stddev               The standard deviation used in the Gaussian distribution
                                 (default is key range / 6)
      --key-median               The median point used in the Gaussian distribution
                                 (default is the center of the key range)

WAIT Options:
      --wait-ratio=RATIO         Set:Wait ratio (default is no WAIT commands - 1:0)
      --num-slaves=RANGE         WAIT for a random number of slaves in the specified range
      --wait-timeout=RANGE       WAIT for a random number of milliseconds in the specified range (normal 
                                 distribution with the center in the middle of the range)

-t表示基准测试使用的线程数量

-c表示客户端连接数

-d表示单条数据大小,单位byte

-n表示测试包数量

-r表示使用随机key数量

三、创建多个redis实例-Ubuntu18.04

1. 原理

原理:

  • 原理与nginx和tomcat等添加容器,单实例多应用一样,复制新的配置文件,改变配置名称,修改配置文件里面的端口号、PID文件路径以及日志文件路径、 转储文件路径,确保两个或者多个redis服务不会冲突;
  • 几个重要文件:
    /etc/init.d/redis-server-------------redis的可执行程序
    /etc/redis/redis.conf----------------redis的配置文件
    /usr/bin/redis-server---------------redis的自启动文件

2. 具体步骤:

首先我们要知道redis一个实例就是一个节点,每个节点分配一个端口号,每个节点对应一个redis.conf配置文件。

redis默认配置的端口号是6379,假设现在要多配置一个6380,我们可以直接复制redis.conf命名为redis6380.conf,并且编辑配置文件

cp /etc/redis/redis.conf /etc/redis/redis6380.conf
vi /etc/redis/redis6380.conf

需要修改几个参数

pidfile /var/run/redis/redis6380-server.pid #指定新的PID文件路径
port 6380 #指定新的端口号
logfile /var/log/redis/redis6380-server.log #指定新的日志文件路径
dbfilename dump6380.rdb #指定新的转储文件路径

然后保存,直接启动这个配置文件就行了

redis-server /etc/redis/redis6380.conf

我们可以查看下进程

ps auxf | grep redis-server

jianguo+ 19242  0.0  0.0  16180  1064 pts/0    S+   17:45   0:00  |       \_ grep --color=auto redis-server
root     19235  0.1  0.0  53200  3788 ?        Ssl  17:44   0:00  \_ redis-server 127.0.0.1:7000

# 查看redis-server进程号
pstree -p | grep redis-server

使用一下方法关闭各个子进程

redis-cli -p 6379 shutdown

3. 补充说明

redis 的存储分为内存存储、磁盘存储和log文件三部分,配置文件中有三个参数对其进行配置。

save seconds updates:在指定时间内,达到多少次更新操作时,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。

appendonly yes/no:是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面的save条件来同步的,所以有的数据会在一段时间内只存在于内存中。

appendfsyncno/always/everysec:no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次。

四、评价指标

QPS: 即Query Per Second,表示数据库每秒执行的命令数。

五、参考文章

  1. 使用memtier_benchmark工具进行性能测试
  2. 如何在Ubuntu 18.04上對Redis伺服器的效能進行基準測試
  3. 在一台机器上搭建多个redis实例
  4. redis多个端口实例启动
  5. redis启动多个实例,配置多个端口