业务背景:

生产环境原先为Solr,因为Solr的性能问题,故现在抛弃它,团队决定使用ElasticSearch。先说说ElasticSearch和Solr的对比。

Solr的优缺点:

优点:

  • Solr有一个更大、更成熟的用户、开发和贡献者社区。.
  • 支持添加多种格式的索引,如:HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。
  • Solr比较成熟、稳定。
  • 不考虑建索引的同时进行搜索,速度更快。

    缺点:

  • 建立索引时,搜索效率下降,实时索引搜索效率不高。

    ElasticSearch的优缺点:

    优点:

  • Elasticsearch是分布式的。不需要其他组件,分发是实时的,被叫做”Push replication”。
  • Elasticsearch 完全支持 Apache Lucene 的接近实时的搜索。
  • 处理多租户(multitenancy)不需要特殊配置,而Solr则需要更多的高级设置。
  • Elasticsearch 采用 Gateway 的概念,使得完备份更加简单。
  • 各节点组成对等的网络结构,某些节点出现故障时会自动分配其他节点代替其进行工作。

    缺点:

  • 只有一名开发者(当前Elasticsearch GitHub组织已经不只如此,已经有了相当活跃的维护者)
  • 还不够自动(不适合当前新的Index Warmup API)

    ElasticSearch简介

    以下内容引用自:http://i.zhcy.tk/blog/elasticsearchyu-solr/
    Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。
    它可以用于全文搜索,结构化搜索以及分析,当然你也可以将这三者进行组合。
    Elasticsearch是一个建立在全文搜索引擎 Apache Lucene™ 基础上的搜索引擎,可以说Lucene是当今最先进,最高效的全功能开源搜索引擎框架。
    但是Lucene只是一个框架,要充分利用它的功能,需要使用JAVA,并且在程序中集成Lucene。需要很多的学习了解,才能明白它是如何运行的,Lucene确实非常复杂。
    Elasticsearch使用Lucene作为内部引擎,但是在使用它做全文搜索时,只需要使用统一开发好的API即可,而不需要了解其背后复杂的Lucene的运行原理。
    当然Elasticsearch并不仅仅是Lucene这么简单,它不但包括了全文搜索功能,还可以进行以下工作:

    1. 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
    2. 实时分析的分布式搜索引擎。
    3. 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
      这么多的功能被集成到一台服务器上,你可以轻松地通过客户端或者任何你喜欢的程序语言与ES的RESTful API进行交流。
      Elasticsearch的上手是非常简单的。它附带了很多非常合理的默认值,这让初学者很好地避免一上手就要面对复杂的理论,
      它安装好了就可以使用了,用很小的学习成本就可以变得很有生产力。
      随着越学越深入,还可以利用Elasticsearch更多高级的功能,整个引擎可以很灵活地进行配置。可以根据自身需求来定制属于自己的Elasticsearch。
      使用案例:
  • 维基百科使用Elasticsearch来进行全文搜做并高亮显示关键词,以及提供search-as-you-type、did-you-mean等搜索建议功能。
  • 英国卫报使用Elasticsearch来处理访客日志,以便能将公众对不同文章的反应实时地反馈给各位编辑。
  • StackOverflow将全文搜索与地理位置和相关信息进行结合,以提供more-like-this相关问题的展现。
  • GitHub使用Elasticsearch来检索超过1300亿行代码。
  • 每天,Goldman Sachs使用它来处理5TB数据的索引,还有很多投行使用它来分析股票市场的变动。
    但是Elasticsearch并不只是面向大型企业的,它还帮助了很多类似DataDog以及Klout的创业公司进行了功能的扩展。

    废话不多说来看看这个是怎么搭建的----搭建篇

    先说说搭建过程中需要注意到的坑,-------很坑人的。

    坑①:启动Elasticsearch的时候不能用root启动
    坑②:从Elasticsearch目录开始后面所有的目录属主和属组都要是你启动Elasticsearch时候用的用户和用户所在的组
    坑③:jdk版本要使用8以及以上
    坑④:系统允许打开的最大文件数设置成65536,如果设置成65535还会提醒你设置的。
    坑⑤:系统允许打开的最大线程数设置成65536,如果设置成65535还会提醒你设置的。有点啰嗦。没办法小编就是一个仔细的人。
    坑⑥:当你买过了坑④和坑⑤的时候,你会发现,切换到启动用户后,还是会报错,没错,就是会报错,因为你在root下设置的系统参数在非root下不生效,要想一次性生效,自己百度吧,时间关系,小编没有弄。
    坑⑦:因为这个东西绝对是有钱人玩的东西,所以默认jvm的内存给的很大,默认1G。所以我们要修改这个值。这里先不说如何修改,后面说,先记着。
    所有的坑都说过了,接下来说说怎么安装,以及安装的过程和步骤。

    搭建过程

    首先要下载ElasticeSearch源程序,感谢各位开源的大神,收下小弟的膝盖。

    下载地址:
    https://www.elastic.co/downloads 下载的时候看清楚了哦,要下载Elasticsearch(小编开始的时候问老大这个行不行,老大给了我一个眼神,叫我自己体会)
    点击这里下载
    ElasticSearch伪集群搭建之渐行渐远

    配置jdk环境变量

    怎么配置环境就不说了,很简单。

    解压程序,并分别修改每个节点的配置文件

    目录结构是这样的

    
    root@bogon:/Disk/ES/elasticsearch01# tree
    .
    ├── bin
    │   ├── elasticsearch
    │   ├── elasticsearch.bat
    │   ├── elasticsearch-env
    │   ├── elasticsearch-env.bat
    │   ├── elasticsearch-keystore
    │   ├── elasticsearch-keystore.bat
    │   ├── elasticsearch-plugin
    │   ├── elasticsearch-plugin.bat
    │   ├── elasticsearch-service.bat
    │   ├── elasticsearch-service-mgr.exe
    │   ├── elasticsearch-service-x64.exe
    │   ├── elasticsearch-translog
    │   ├── elasticsearch-translog.bat
    │   ├── hs_err_pid1167.log
    │   ├── hs_err_pid1209.log
    │   ├── hs_err_pid5775.log
    │   └── hs_err_pid5816.log
    ├── config
    │   ├── elasticsearch.yml   # ES主要配置文件
    │   ├── jvm.options # 该文件设置jvm的相应参数,包括垃圾回收策略和虚拟机内存。
                                      #一般可以设置Xms和Xmx
    │   └── log4j2.properties
    ├── data
    │   └── nodes
    │       └── 0
    │           ├── indices
    │           │   └── wUOA5MkQSL-YRUP6jKx1uQ
    │           │       ├── 1
    │           │       │   ├── index
    │           │       │   │   ├── segments_1
    │           │       │   │   └── write.lock
    │           │       │   ├── _state
    │           │       │   │   └── state-0.st
    │           │       │   └── translog
    │           │       │       ├── translog-1.tlog
    │           │       │       └── translog.ckp
    │           │       ├── 3
    │           │       │   ├── index
    │           │       │   │   ├── segments_2
    │           │       │   │   └── write.lock
    │           │       │   ├── _state
    │           │       │   │   └── state-0.st
    │           │       │   └── translog
    │           │       │       ├── translog-1.tlog
    │           │       │       └── translog.ckp
    │           │       ├── 4
    │           │       │   ├── index
    │           │       │   │   ├── segments_1
    │           │       │   │   └── write.lock
    │           │       │   ├── _state
    │           │       │   │   └── state-0.st
    │           │       │   └── translog
    │           │       │       ├── translog-1.tlog
    │           │       │       └── translog.ckp
    │           │       └── _state
    │           │           └── state-5.st
    │           ├── node.lock
    │           └── _state
    │               ├── global-1.st
    │               └── node-9.st
    ├── lib
    │   ├── elasticsearch-6.1.0.jar
    │   ├── elasticsearch-cli-6.1.0.jar
    │   ├── HdrHistogram-2.1.9.jar
    │   ├── hppc-0.7.1.jar
    │   ├── jackson-core-2.8.10.jar
    │   ├── jackson-dataformat-cbor-2.8.10.jar
    │   ├── jackson-dataformat-smile-2.8.10.jar
    │   ├── jackson-dataformat-yaml-2.8.10.jar
    │   ├── java-version-checker-6.1.0.jar
    │   ├── jna-4.4.0-1.jar
    │   ├── joda-time-2.9.5.jar
    │   ├── jopt-simple-5.0.2.jar
    │   ├── jts-1.13.jar
    │   ├── log4j-1.2-api-2.9.1.jar
    │   ├── log4j-api-2.9.1.jar
    │   ├── log4j-core-2.9.1.jar
    │   ├── lucene-analyzers-common-7.1.0.jar
    │   ├── lucene-backward-codecs-7.1.0.jar
    │   ├── lucene-core-7.1.0.jar
    │   ├── lucene-grouping-7.1.0.jar
    │   ├── lucene-highlighter-7.1.0.jar
    │   ├── lucene-join-7.1.0.jar
    │   ├── lucene-memory-7.1.0.jar
    │   ├── lucene-misc-7.1.0.jar
    │   ├── lucene-queries-7.1.0.jar
    │   ├── lucene-queryparser-7.1.0.jar
    │   ├── lucene-sandbox-7.1.0.jar
    │   ├── lucene-spatial3d-7.1.0.jar
    │   ├── lucene-spatial-7.1.0.jar
    │   ├── lucene-spatial-extras-7.1.0.jar
    │   ├── lucene-suggest-7.1.0.jar
    │   ├── plugin-cli-6.1.0.jar
    │   ├── securesm-1.2.jar
    │   ├── snakeyaml-1.17.jar
    │   ├── spatial4j-0.6.jar
    │   └── t-digest-3.0.jar
    ├── LICENSE.txt
    ├── logs
    │   ├── elasticsearch_deprecation.log
    │   ├── elasticsearch_index_indexing_slowlog.log
    │   ├── elasticsearch_index_search_slowlog.log
    │   ├── elasticsearch.log
    │   ├── jlj-es_deprecation.log
    │   ├── jlj-es_index_indexing_slowlog.log
    │   ├── jlj-es_index_search_slowlog.log
    │   └── jlj-es.log
    ├── modules
    │   ├── aggs-matrix-stats
    │   │   ├── aggs-matrix-stats-6.1.0.jar
    │   │   └── plugin-descriptor.properties
    │   ├── analysis-common
    │   │   ├── analysis-common-6.1.0.jar
    │   │   └── plugin-descriptor.properties
    │   ├── ingest-common
    │   │   ├── ingest-common-6.1.0.jar
    │   │   ├── jcodings-1.0.12.jar
    │   │   ├── joni-2.1.6.jar
    │   │   └── plugin-descriptor.properties
    │   ├── lang-expression
    │   │   ├── antlr4-runtime-4.5.1-1.jar
    │   │   ├── asm-5.0.4.jar
    │   │   ├── asm-commons-5.0.4.jar
    │   │   ├── asm-tree-5.0.4.jar
    │   │   ├── lang-expression-6.1.0.jar
    │   │   ├── lucene-expressions-7.1.0.jar
    │   │   ├── plugin-descriptor.properties
    │   │   └── plugin-security.policy
    │   ├── lang-mustache
    │   │   ├── compiler-0.9.3.jar
    │   │   ├── lang-mustache-6.1.0.jar
    │   │   ├── plugin-descriptor.properties
    │   │   └── plugin-security.policy
    │   ├── lang-painless
    │   │   ├── antlr4-runtime-4.5.3.jar
    │   │   ├── asm-debug-all-5.1.jar
    │   │   ├── lang-painless-6.1.0.jar
    │   │   ├── plugin-descriptor.properties
    │   │   └── plugin-security.policy
    │   ├── mapper-extras
    │   │   ├── mapper-extras-6.1.0.jar
    │   │   └── plugin-descriptor.properties
    │   ├── parent-join
    │   │   ├── parent-join-6.1.0.jar
    │   │   └── plugin-descriptor.properties
    │   ├── percolator
    │   │   ├── mapper-extras-6.1.0.jar
    │   │   ├── percolator-6.1.0.jar
    │   │   └── plugin-descriptor.properties
    │   ├── reindex
    │   │   ├── commons-codec-1.10.jar
    │   │   ├── commons-logging-1.1.3.jar
    │   │   ├── elasticsearch-rest-client-6.1.0.jar
    │   │   ├── httpasyncclient-4.1.2.jar
    │   │   ├── httpclient-4.5.2.jar
    │   │   ├── httpcore-4.4.5.jar
    │   │   ├── httpcore-nio-4.4.5.jar
    │   │   ├── plugin-descriptor.properties
    │   │   ├── plugin-security.policy
    │   │   └── reindex-6.1.0.jar
    │   ├── repository-url
    │   │   ├── plugin-descriptor.properties
    │   │   ├── plugin-security.policy
    │   │   └── repository-url-6.1.0.jar
    │   ├── transport-netty4
    │   │   ├── netty-buffer-4.1.13.Final.jar
    │   │   ├── netty-codec-4.1.13.Final.jar
    │   │   ├── netty-codec-http-4.1.13.Final.jar
    │   │   ├── netty-common-4.1.13.Final.jar
    │   │   ├── netty-handler-4.1.13.Final.jar
    │   │   ├── netty-resolver-4.1.13.Final.jar
    │   │   ├── netty-transport-4.1.13.Final.jar
    │   │   ├── plugin-descriptor.properties
    │   │   ├── plugin-security.policy
    │   │   └── transport-netty4-6.1.0.jar
    │   └── tribe
    │       ├── plugin-descriptor.properties
    │       └── tribe-6.1.0.jar
    ├── NOTICE.txt
    ├── plugins
    └── README.textile

38 directories, 143 files

##### 看看主配置文件都怎么修改的吧

root@bogon:/Disk/ES/elasticsearch01/config# cat elasticsearch.yml
#集群名称
cluster.name: jlj-es
#节点名称
node.name: jlj-es01
#是不是为主节点
node.master: true
#数据路径
#path.data: /path/to/data
#log路径
#path.logs: /path/to/logs
#bootstrap.memory_lock: true
#绑定地址,默认的地址是127.0.0.1,要修改不然http访问不到的哦
network.host: 192.168.1.202
#监听端口,默认9200
#http.port: 9200

用于集群通讯的端口,此端口和9200端口是两个概念; 给Java或者其它节点的服务端口,代码里面用这个。

transport.tcp.port: 9300
#集群地址
discovery.zen.ping.unicast.hosts: ["192.168.1.202:9300","192.168.1.202:9310", "192.168.1.202:9320"]
#列脑值
discovery.zen.minimum_master_nodes: 2
#多少个节点启动后集群才能正常启动
gateway.recover_after_nodes: 1
#允许跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"

##### 修改默认jvm内存大小
首先注释掉配置文件 jvm.options中的内存大小。

17 ################################################################
18
19 # Xms represents the initial size of total heap space
20 # Xmx represents the maximum size of total heap space
21
22 #-Xms1g
23 #-Xmx1g 注释掉这两行
24
25 ################################################################

修改启动脚本的jvm配置: bin/elasticsearch
`ES_JAVA_OPTS="-Xms128m -Xmx128m"`
##### 好了,到这里一个单点的ES就配置完了。
因为俺配置的伪集群所以这里建议直接cp这个文件夹,然后修改端口和节点名称就可以了。
注意:前方高能----->需要修改的都在配置文件里,这里分别列出三个节点的配置文件内容:
ES1

#集群名称
cluster.name: jlj-es
#节点名称
node.name: jlj-es01
node.master: true
#node.attr.rack: r1
#数据路径
#path.data: /path/to/data
#log路径
#path.logs: /path/to/logs
#bootstrap.memory_lock: true
#绑定地址
network.host: 192.168.1.202
#监听端口
#http.port: 9200
transport.tcp.port: 9300
#集群地址
discovery.zen.ping.unicast.hosts: ["192.168.1.202:9300","192.168.1.202:9310", "192.168.1.202:9320"]
#列脑值
discovery.zen.minimum_master_nodes: 2
#多少个节点启动后集群才能正常启动
gateway.recover_after_nodes: 1
#action.destructive_requires_name: true
#允许跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"

ES2

#集群名称
cluster.name: jlj-es
#节点名称
node.name: jlj-es02
#node.attr.rack: r2
#数据路径
#path.data: /path/to/data
#log路径
#path.logs: /path/to/logs
#bootstrap.memory_lock: true
#绑定地址
network.host: 192.168.1.202
#监听端口
http.port: 9201
transport.tcp.port: 9310
#集群地址
discovery.zen.ping.unicast.hosts: ["192.168.1.202:9300","192.168.1.202:9310", "192.168.1.202:9320"]
#列脑值
discovery.zen.minimum_master_nodes: 2
#多少个节点启动后集群才能正常启动
gateway.recover_after_nodes: 1
#action.destructive_requires_name: true
#允许跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"

ES3

#集群名称
cluster.name: jlj-es
#节点名称
node.name: jlj-es03
#node.attr.rack: r3
#数据路径
#path.data: /path/to/data
#log路径
#path.logs: /path/to/logs
#bootstrap.memory_lock: true
#绑定地址
network.host: 192.168.1.202
#监听端口
http.port: 9202
transport.tcp.port: 9320
#集群地址
discovery.zen.ping.unicast.hosts: ["192.168.1.202:9300","192.168.1.202:9310", "192.168.1.202:9320"]
#列脑值
discovery.zen.minimum_master_nodes: 2
#多少个节点启动后集群才能正常启动
gateway.recover_after_nodes: 1
#action.destructive_requires_name: true
#允许跨域请求
http.cors.enabled: true
http.cors.allow-origin: "*"

#### 创建用户、修改文件夹以及文件属性这里就不阐述了
修改系统可打开最大文件数和最大进程数命令,至于如何永久生效,自己google吧!

#修改可打开的最大文件数
ulimit -n 65536
#修改可打开的最大进程数
ulimit -u 65536

#### 可视化,安装head插件:
小编使用的系统是ubuntu,只在此系统中实操过具体过程可以保证没有问题,看其他博友在centos中也有安装过的,不保证不报错哦。
##### ubuntu 14.04安装nmp插件过程
安装过程借鉴:https://www.howtoing.com/install-latest-nodejs-npm-on-ubuntu

$ apt-get update
$ sudo apt-get install nodejs

验证

root@bogon:/Disk/ES/elasticsearch03/config# nodejs -v
v6.12.2
root@bogon:/Disk/ES/elasticsearch03/config# npm -v
3.10.10

安装git命令
`apt-get install git`
从git上克隆head代码

git clone git://github.com/mobz/elasticsearch-head.git

进入到克隆下来的head目录,使用nodejs安装head插件

npm install
#大概过程如下
root@bogon:/Disk/ES/aa/elasticsearch-head# npm install
npm WARN deprecated coffee-script@1.10.0: CoffeeScript on NPM has moved to "coffeescript" (no hyphen)
npm WARN deprecated http2@3.3.7: Use the built-in module in node 9.0.0 or newer, instead
[ ............] / fetchMetadata: WARN deprecated http2@3.3.7: Use the built-in module in node 9.0.0 or newer, instead
#修改Gruntfile.js文件
90 connect: {
91 server: {
92 options: {
93 hostname: '192.168.1.202', #添加这行代码,切记最后又逗号,结尾不要有空格。
94 port: 9100,
95 base: '.',
96 keepalive: true
97 }
98 }
99 }
100
101 });
#修改_site/app.js 文件
4353 this.prefs = services.Preferences.instance();
4354 this.base_uri = this.config.base_uri || this.prefs.get("app-base_uri") || "http://192.168.1.202:9200"; # 这里写上本机的ip地址和ES master的端口号
4355 if( this.base_uri.charAt( this.base_uri.length - 1 ) !== "/" ) {
4356 // XHR request fails if the URL is not ending with a "/"
4357 this.base_uri += "/";
4358 }


# OK,完事具备,诸葛亮之启动三个ES节点和head插件
启动ES节点
分别进入到bin目录下执行./elasticsearch,当然你也可以使用-d叫他后台运行。
启动head插件
npm run start
如果一切顺利的话,访问head插件中Gruntfile.js配置的ip和接口就能看到想要的界面了。
**~~这个图片为盗图~~**
![](https://s1.51cto.com/images/blog/201712/20/b648b3e469f9807a98073fd85d6b7c82.png?x-oss-process=image/watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=)

未完,待续----
head插件的汉化版本
所有接口的调用关系
遇到的报错截图以及处理
Centos 安装head插件过程

本文的成功编写,离不开广大博友的支持:
友情连接如下:
 ElasticSearch 安装 (单机单节点/伪集群) http://chenzhijun.me/2017/12/01/elasticsearch-install/
 elasticsearch集群搭建  http://blog.csdn.net/guduyishuai/article/details/78702871
 elasticsearch head插件安装 http://blog.csdn.net/guduyishuai/article/details/78680881
 elasticsearch单点搭建 http://blog.csdn.net/guduyishuai/article/details/78649376
 在Ubuntu 14.04上设置生产环境可用的Node.js http://blog.csdn.net/zstack_org/article/details/53100478
 如何在Ubuntu 16.04和14.04安装最新NodeJS与Npm https://www.howtoing.com/install-latest-nodejs-npm-on-ubuntu
 linux下进程的进程最大数、最大线程数、进程打开的文件数和ulimit命令修改硬件资源限制 http://blog.csdn.net/gatieme/article/details/51058797
 Elasticsearch 服务配置属性 https://www.ibm.com/support/knowledgecenter/zh/SSFPJS_8.5.7/com.ibm.wbpm.main.doc/topics/rfps_esearch_configoptions.html

                                                                                                                                 2017年12月20日 深夜