menu

搭建 Elasticsearch 单节点以及简单的使用教程

date_range 2019/11/12

Elasticsearch是一个基于Lucene库的搜索引擎。它提供了一个分布式、支持多租户的全文搜索引擎,具有HTTP Web接口和无模式JSON文档。Elasticsearch是用Java开发的,并在Apache许可证下作为开源软件发布。 官方客户端在Java、.NET(C#)、PHP、Python、Apache Groovy、Ruby和许多其他语言中都是可用的。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr,也是基于Lucene。


搭建 Elasticsearch 单节点以及简单的使用教程

接下来介绍如何本地搭建一个单节点的 Elasticsearch 服务器以及进行一些增删改查的简单操作。

安装 Elasticsearch

  • 第一步:所需要的软件环境:最新稳定版 Java,若使用 docker 方式则不必安装 Java;
  • 第二步:下载最新版 Elasticsearch
  • 第三步:解压下载的 Elasticsearch,建议位置选择一个用于存放数据的目录,磁盘剩余空间尽量留大一点;
  • 第四步:运行 Elasticsearch,Linux 或者 macOS 运行 bin/Elasticsearch,Windows 运行 bin\Elasticsearch.bat;
  • 第五步:使用命令 curl -X GET http://localhost:9200/ 检查运行状态,或者直接复制链接到浏览器中打开也可以, 正常情况下会显示以下类似的内容:
    {
      "name" : "DESKTOP-FHFP51P",
      "cluster_name" : "Elasticsearch",
      "cluster_uuid" : "lAdgnvl8TrmSrzRn321AKw",
      "version" : {
     "number" : "7.4.2",
     "build_flavor" : "default",
     "build_type" : "zip",
     "build_hash" : "2f90bbf7b93631e52bafb59b3b049cb44ec25e96",
     "build_date" : "2019-10-28T20:40:44.881551Z",
     "build_snapshot" : false,
     "lucene_version" : "8.2.0",
     "minimum_wire_compatibility_version" : "6.8.0",
     "minimum_index_compatibility_version" : "6.0.0-beta1"
      },
      "tagline" : "You Know, for Search"
    }
    

使用 Elasticsearch 进行简单的操作

添加数据

curl -XPOST 'http://localhost:9200/twitter/_doc/?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

查找数据

curl -XGET 'http://localhost:9200/twitter/_search?pretty=true' -H 'Content-Type: application/json' -d '
{
    "query" : {
        "match_all" : {}
    }
}'

修改数据

curl -XPUT 'http://localhost:9200/twitter/_doc/{ID}?pretty' -H 'Content-Type: application/json' -d '
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}'

删除数据(不建议直接删除)

curl -XDELETE 'http://localhost:9200/twitter/_doc/{ID}?pretty''
注意:上文中的{ID}为变量,具体要操作哪条数据应当传入数据的实际 ID

Elasticsearch 性能测试

经过上文的教程,我们对 Elasticsearch 有了初步的了解以及学会了如何使用基本的操作,接下来我们测一下单节点的性能。 首先我们主要使用的是 ab 命令(Apache-Bench)进行压力测试,命令如下
ab -n100000 -c10 -p ./postfile.ab -T 'application/json' http://localhost:9200/twitter/_doc/?pretty=true
其中,postfile.ab 为我们需要发送给 Elasticsearch 的模拟数据,数据内容参考如下
{
    "user": "kimchy",
    "post_date": "2009-11-15T13:12:00",
    "message": "Trying out Elasticsearch, so far so good?"
}

并发 10TPS 请求 10 万次

测试报告如下
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests


Server Software:
Server Hostname:        localhost
Server Port:            9200

Document Path:          /twitter/_doc/?pretty=true
Document Length:        243 bytes

Concurrency Level:      10
Time taken for tests:   28.107 seconds
Complete requests:      10000
Failed requests:        5557
   (Connect: 0, Receive: 0, Length: 5557, Exceptions: 0)
Total transferred:      3815557 bytes
Total body sent:        2860000
HTML transferred:       2435557 bytes
Requests per second:    355.79 [#/sec] (mean)
Time per request:       28.107 [ms] (mean)
Time per request:       2.811 [ms] (mean, across all concurrent requests)
Transfer rate:          132.57 [Kbytes/sec] received
                        99.37 kb/s sent
                        231.94 kb/s total

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    6   6.5      5     170
Processing:     6   21  19.5     17     529
Waiting:        4   17  17.4     13     527
Total:         11   28  21.7     23     534

Percentage of the requests served within a certain time (ms)
  50%     23
  66%     26
  75%     29
  80%     31
  90%     41
  95%     53
  98%     79
  99%    112
 100%    534 (longest request)
通过 ab 的测试报告可以看出,单节点的 Elasticsearch 性能非常强悍,达到了 355.79 / 秒处理量,另外通过观测 JVM 的系统资源使用,也是比较低的水平。 搭建 Elasticsearch 单节点以及简单的使用教程

并发 400TPS 请求 10 万次

接下来我们进行更高的并发测试
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Completed 100000 requests
Finished 100000 requests


Server Software:
Server Hostname:        localhost
Server Port:            9200

Document Path:          /twitter/_doc/?pretty=true
Document Length:        245 bytes

Concurrency Level:      400
Time taken for tests:   209.947 seconds
Complete requests:      100000
Failed requests:        0
Total transferred:      38300000 bytes
Total body sent:        28600000
HTML transferred:       24500000 bytes
Requests per second:    476.31 [#/sec] (mean)
Time per request:       839.787 [ms] (mean)
Time per request:       2.099 [ms] (mean, across all concurrent requests)
Transfer rate:          178.15 [Kbytes/sec] received
                        133.03 kb/s sent
                        311.18 kb/s total

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       87  392 214.7    345    3133
Processing:    26  445 216.2    397    3697
Waiting:       25  300 188.6    265    2722
Total:        443  838 380.2    746    6498

Percentage of the requests served within a certain time (ms)
  50%    746
  66%    822
  75%    884
  80%    951
  90%   1074
  95%   1314
  98%   1637
  99%   2002
 100%   6498 (longest request)
可以看出,并发量达到了 476.31 / 秒,JVM 的资源使用情况也没有发生大幅提升的情况,可以说是非常的稳定。 搭建 Elasticsearch 单节点以及简单的使用教程

总结

Elasticsearch 单节点的性能已经非常强悍了,并且支持分布式提升更大的性能扩容,可以说是完全满足日常的需求已经高并发的需求。 另外我们可以将系统日志、网络日志、应用日志、业务日志等易产生大量数据的接入 Elasticsearch 进行统一的管理,这样既保证效率,也避免了日志分散、数量大无法维护等带来问题。

参考文献

版权

版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)
原创作者:10086@xiaoi.me 发表于 Xiaoi’s Blog:https://blog.xiaoi.me
原文链接:https://stevenkang.github.io/2019/11/12/elastic-search-get-start
扫码关注我,在线与我沟通、咨询 Xiaoi's Blog 转载请保留原文链接以及版权信息

Nextcloud 解决 MySQL 没有支持 4 字节字符时报错: SQLSTATE[42000],解决办法

date_range 2019/11/04

根据 Nextcloud 控制面板安全及设置警告,解决最后一个报警,不支持 4 字节的问题时,遇到该问题, 所使用的数据库为MySQL但没有对4字节字符的支持。为正确处理文件名或评论中使用的4字节字符(比如emoji表情),建议开启MySQL的4字节字符支持。详细信息请阅读相关文档页面。

PHP 使用 curl 访问获取 https 网站的内容

date_range 2019/10/31

遇到一个 PHP 获取 https 网站内容的问题,这里整理成博文供搭建参考。 需求是目前自己搭建了一个国外的博文网站,打算使用国内的服务器进行加速访问。

使用 ngrok 内网穿透工具

date_range 2019/10/23

ngrok 微信开发必备神器,ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。QQ群:619152722

使用 docker 运行 frp 服务端,并且上传到 docker hub 在线仓库

date_range 2019/10/23

最近在使用 frp 内网穿透服务,运行了一段时间,发现 frp 挺稳定的,突发奇想,之前学习了一下 docker 的使用,何不把 frp 打包成 docker 镜像,这样在任意服务器上就能快速开启 frp 服务了,于是折腾了一下午总算是搞定了。