本文介绍TairSearch、ElasticSearch数据写入和搜索性能的测试方法及测试结果。

TairSearch是基于Redis module全自研(不基于Lucene等开源搜索库)的全文搜索数据结构,采用和Elasticsearch相似(ES-LIKE)的查询语法,可实现高效的全文搜索,更多信息请参见TairSearch

测试说明

测试环境

执行测试的服务器规格:
  • 架构:x86_x64
  • 内存:251 GB
  • CPU:32 Core,64 Threads
  • 操作系统版本:Linux 4.19.91-011.ali4000.alios7.x86_64

数据库内核:

TairSearch ElasticSearch
  • 版本:内存型1.7.28
  • 配置:单进程无副本,4个Search线程
  • 内存:10 GB
  • CPU:分配5个CPU(1 worker + 4 io/search)
  • 版本:8.1.1
  • 配置:单节点,单shard无副本,indices.queries.cache.size和index.queries.cache.enabled都是默认值。
  • 内存:-Xms10g、-Xmx10g
  • CPU:node.processors设置为5

测试数据

本次测试数据为维基百科公开的英文文章摘要

压测工具

下载TairSearch测试工具,解压后,选择对应操作系统(Linux、Windows、Darwin)的二进制可执行文件。

以Linux为例,执行./TairSearchBench.linux --help可查看使用方法,用法如下:
Usage of ./TairSearchBench.linux:
  -a string
        The address of network to connect 
        # 实例连接地址。
  -c int
        Benchmark concurrency (default 30)
        # 并发数,默认为30。
  -e string
        The engine backend to run [tairsearch/elasticsearch]
        # 指定运行引擎为TairSearch或ElasticSearch。
  -f string
        Input file to ingest data from (wikipedia abstracts)
        # 执行数据文件路径。
  -h string
        Print usage (default "help")
        # 显示使用方法。
  -n uint
        Specify the number of times to benchmark (default 10000)
        # 指定总测试数,默认为10000。
  -q string
        Search query string to benchmark
        # 指定压测的查询语句。
  -t string
        Specify the type of benchmark [write/search]
        # 指定测试类型为write或search。

测试步骤与测试用例

  1. 创建Schema(索引)。
    由于TairSearch和ElasticSearch DSL部分兼容,可共用Schema。
    schemaByte, _ := json.Marshal(JsonObject{
        "settings": JsonObject{
        "number_of_shards":            1,
        "number_of_replicas":          1,
        "refresh_interval":            "1s",
        "index.queries.cache.enabled": false,
        },
        "mappings": JsonObject{
        "properties": JsonObject{
        "id":       JsonObject{"type": "keyword", "index": false},
        "url":      JsonObject{"type": "text", "index": false},
        "title":    JsonObject{"type": "text", "index": false},
        "abstract": JsonObject{"type": "text", "analyzer": "standard"},
        },
      },
    })
    说明 当前TairSearch创建Schema时无需配置settings,会自动忽略。
  2. 数据写入(单Schema)。
    在一个索引中写入500万个文档,文档内存为1.5 GB,压测并发数为30,命令示例:
    • TairSearch:TairSearchBench -t write -e tairsearch -f ./enwiki-latest-abstract.xml -c 30 -n 5000000 -a 192.168.0.1:6379
    • ElasticSearch(Refresh频率为1s):TairSearchBench -t write -e elasticsearch -f ./enwiki-latest-abstract.xml -c 30 -n 5000000 -a http://192.168.0.1:9200
  3. 关键字查询。
    搜索关键字,查询次数为10万,压测并发数为30,命令示例:
    • TairSearch:TairSearchBench -t search -e tairsearch -c 30 -n 100000 -q '{"query":{"term":{"abstract":"hello"}}}' -a 192.168.0.1:6379
    • ElasticSearch:TairSearchBench -t search -e elasticsearch -c 30 -n 100000 -q '{"track_total_hits": true, "query":{ "term":{"abstract":"world"}}}' -a http://192.168.0.1:9200
  4. 聚合查询。

    "abstract"="hello"的文档中,统计ID字段的value的去重个数,类似SQL:SELECT distinct_count(ID) FROM table WHERE abstract="hello" ORDER BY ID ASC LIMIT 10

    查询次数为10万,压测并发数为30,命令示例:

    • TairSearch:TairSearchBench -t search -e tairsearch -c 30 -n 100000 -q '{"size":0, "query":{"term":{"abstract":"hello"}}, "aggs":{"a1":{"terms":{"field":"id", "order":{"_key":"asc"} }} } }' -a 192.168.0.1:6379
    • ElasticSearch:TairSearchBench -t search -e elasticsearch -c 30 -n 100000 -q '{"size":0, "query":{"term":{"abstract":"hello"}}, "aggs":{"a1":{"terms":{"field":"id", "order":{"_key":"asc"} }} } }' -a http://192.168.0.1:9200
    说明 同时在开启缓存(默认)和关闭缓存情况下,分别测试TairSearch、ElasticSearch的性能。

测试结果

  • 数据写入
    类别 TairSearch ElasticSearch(Refresh频率为1s)
    使用内存(GB) 3.89 5 GB内存与1 GB磁盘
    总耗时(s) 257.33 1995.75
    QPS值 19430.09 2505.34
    平均时延(ms) 1.54 11.97
    说明 同时测试了ElasticSearch(Refresh为实时),由于写入时间较慢,仅测试写入个1000个文档数,压测并发数为30,测试结果:总耗时为5.16s、QPS值为199.54、平均时延为148.22ms。
  • 关键字查询
    类别 TairSearch ElasticSearch
    总耗时(s) 7.04 39.56
    QPS值 14209.48 2528.23
    平均时延(ms) 2.11 11.86
  • 聚合查询
    类别 TairSearch(默认) TairSearch(关闭Query cache) ElasticSearch(默认) ElasticSearch(关闭缓存
    总耗时(s) 1.75 124.98 12.86 121.95
    QPS值 57025.44 800.37 7780.01 82.24
    平均时延(ms) 0.53 37.48 3.86 364.60
    说明 ElasticSearch(关闭缓存)由于查询较慢,仅查询10000次,其余均为100000次。

总结

TairSearch经过精巧的倒排索引设计和算法实现,充分利用了内存运算速度快的优势,提升数据写入与查询性能;通过并发结构的设计实现无锁并发搜索,提升搜索吞吐量;同时在实现时尽量保证存储的局部性,提升缓存命中(Cache hit)概率。