ES(ElasticSearch)安装与配置

ES集群安装与配置

[TOC]

简要介绍ES服务

ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口,能够达到实时搜索,稳定,可靠,快速,安装使用方便。
test

ES集群安装

前提准备

集群配置准备

根据业务方需求(JIRA), 在中间件开机,如8C32G150G, 数量3台

JDK依赖库安装

使用本地仓库源,执行yum -y install jdk18

集群环境

用途 IP 备注
elasticsearch-jy-10.0.29.108 10.0.29.108 es集群的管理节点,head插件安装在此,ik分词安装在此
elasticsearch-jy-10.0.29.109 10.0.29.109 es集群的node节点,ik分词安装在此
elasticsearch-jy-10.0.29.111 10.0.29.111 es集群的node节点,ik分词安装在此

安装

安装包下载与安装

由于是国外网站可能下载较慢,耐心等待

wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.3.3.rpm
rpm -ivh elasticsearch-5.3.3.rpm

设置开机启动

chkconfig --add elasticsearch

创建es数据存放目录并修改属性

mkdir -p /es/data
chown -R elasticsearch:elasticsearch /es/data

配置

elasticsearch配置修改

每个节点修改node.namenetwork.host为相应的IP

vi /etc/elasticsearch/elasticsearch.yml

cluster.name: zbj-bjzw-jy-elastic
node.name: 10.0.29.108
node.master: true
node.data: true
http.cors.enabled: true
http.cors.allow-origin: "*"
path.data: /es/data
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 10.0.29.108
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.29.109","10.0.29.108","10.0.29.111"]
discovery.zen.minimum_master_nodes: 2

插件安装

安装NPM
yum -y install npm
安装head插件

只安装在master节点

# 下载安装包
cd /opt/
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head/
# 安装此包
npm install
# 测试运行,CTRL+C退出
npm run start
# 后台运行
npm run start &
# 查看端口是否有9100
netstat -ntlp
安装ik分词器插件

每个节点都要安装

# 下载

es-ik-dl

wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.3.3/elasticsearch-analysis-ik-5.3.3.zip

# ik分词器安装与配置
unzip elasticsearch-analysis-ik-5.3.3.zip
mv elasticsearch-analysis-ik-5.3.3 /usr/share/elasticsearch/plugins
cd /usr/share/elasticsearch/plugins
mv elasticsearch-analysis-ik-5.3.3 ik

各服务启动与检查

设置开机自启动
# es服务
chkconfig --add elasticsearch

# npm服务
chkconfig --add npm

# elasticsearch 服务启动
/etc/init.d/elasticsearch start

# head插件服务启动
cd /opt/elasticsearch-head/
npm run start &

# 端口检查    
[prod] [root@elasticsearch-jy-10.0.29.108 elasticsearch-head]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name
tcp        0      0 0.0.0.0:10050               0.0.0.0:*                   LISTEN      1647/zabbix_agentd
tcp        0      0 0.0.0.0:9100                0.0.0.0:*                   LISTEN      29357/grunt
tcp        0      0 10.0.29.108:9200            0.0.0.0:*                   LISTEN      4881/java
tcp        0      0 10.0.29.108:9300            0.0.0.0:*                   LISTEN      4881/java
tcp        0      0 10.0.29.108:60020           0.0.0.0:*                   LISTEN      1361/./bk_gse_agent
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1546/sshd
tcp        0      0 127.0.0.1:25                0.0.0.0:*                   LISTEN      1630/master
tcp        0      0 :::22                       :::*                        LISTEN      1546/sshd
[prod] [root@elasticsearch-jy-10.0.29.108 elasticsearch-head]#

# 进程检查
[prod] [root@elasticsearch-jy-10.0.29.108 elasticsearch-head]# ps -ef |grep elasticsearch --color
root      1266     1  0 13:38 ?        00:00:00 /sbin/dhclient -H elasticsearch-jy -1 -q -lf /var/lib/dhclient/dhclient-eth0.leases -pf /var/run/dhclient-eth0.pid eth0
495       4881     1  0 20:42 ?        00:01:04 /usr/bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-5.3.3.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid -d -Edefault.path.logs=/var/log/elasticsearch -Edefault.path.data=/var/lib/elasticsearch -Edefault.path.conf=/etc/elasticsearch
root     12651 19259  0 22:35 pts/0    00:00:00 grep elasticsearch --color
[prod] [root@elasticsearch-jy-10.0.29.108 elasticsearch-head]#

常用命令

# 查看es版本
curl -XGET 10.0.29.108:9200

# 创建索引
curl -XPUT "http://10.0.29.108:9200/index"

# 查看索引 
curl -XGET "http://10.0.29.108:9200/_cat/indices?v"

# 创建匹配器
curl -XPOST http://10.0.29.108:9200/index/fulltext/_mapping -d'
{
        "properties": {
            "content": {
                "type": "text",
                "analyzer": "ik_max_word",
                "search_analyzer": "ik_max_word"
            }
        }

}'

# 查看es集群状态
curl -XGET "http://10.0.29.108:9200/_cat/health?v"

# 查看结点 
curl -XGET "http://10.0.29.108:9200/_cat/nodes?v"

# 插入数据
curl -XPOST http://10.0.29.108:9200/index/fulltext/1 -d'
{"content":"美国留给伊拉克的是个烂摊子吗"}'

curl -XPOST http://10.0.29.108:9200/index/fulltext/2 -d'
{"content":"公安部:各地校车将享最高路权"}'

curl -XPOST http://10.0.29.108:9200/index/fulltext/3 -d'
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}'

curl -XPOST http://10.0.29.108:9200/index/fulltext/4 -d'
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}'

# 查询
curl -XPOST http://10.0.29.108:9200/index/fulltext/_search  -d'
{
    "query" : { "match" : { "content" : "中国" }},
    "highlight" : {
        "pre_tags" : ["<tag1>", "<tag2>"],
        "post_tags" : ["</tag1>", "</tag2>"],
        "fields" : {
            "content" : {}
        }
    }
}'

# 使用默认分词查询
curl -XGET 'http://10.0.29.108:9200/_analyze?pretty&analyzer=standard' -d '我是全宇宙最帅的人'

# 使用ik分词查询
curl -XGET 'http://10.0.29.108:9200/_analyze?pretty&analyzer=ik_max_word' -d '我是全宇宙最帅的人'

名词解释

ik_max_word :会将文本做最细粒度的拆分;尽可能多的拆分出词语

ik_smart:会做最粗粒度的拆分;已被分出的词语将不会再次被其它词语占有

9200端口作用:ES节点和外部通讯使用

9300端口作用:ES节点之间通讯使用

cluster: 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。

shards: 代表索引分片,es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。

replicas: 代表索引副本,es可以设置多个索引的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高es的查询效率,es会自动对搜索请求进行负载均衡。

recovery: 代表数据恢复或叫数据重新分布,es在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。

river: 代表es的一个数据源,也是其它存储方式(如:数据库)同步数据到es的一个方法。它是以插件方式存在的一个es服务,通过读取river中的数据并把它索引到es中,官方的river有couchDB的,RabbitMQ的,Twitter的,Wikipedia的。

gateway: 代表es索引快照的存储方式,es默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。gateway对索引快照进行存储,当这个es集群关闭再重新启动时就会从gateway中读取索引备份数据。es支持多种类型的gateway,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。

discovery.zen: 代表es的自动发现节点机制,es是一个基于p2p的系统,它先通过广播寻找存在的节点,再通过多播协议来进行节点之间的通信,同时也支持点对点的交互。

Transport: 代表es内部节点或集群与客户端的交互方式,默认内部是使用tcp协议进行交互,同时它支持http协议(json格式)、thrift、servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。

相关文档

# ik安装参考文档
http://www.sojson.com/blog/82.html
https://github.com/medcl/elasticsearch-analysis-ik

# es安装参考文档
https://www.elastic.co/downloads/past-releases

# es配置文件详解
https://www.cnblogs.com/hdflzh/p/4103226.html

踩坑记

# analyzer [ik_max_word] not found for field [content]"},"status":400
1. 版本不对应,参考ik安装文档Versions节

# unknown setting [index.properties.content.analyzer] please check that any required plugins are installed, or check th breaking changes documention for removed settings,"status":400 
1. 得三个节点都安装ik分词

# head集群管理界面显示“集群健康值: 未连接”
1. elasticsearch.yml,目测由于跨域问题需要添加以下配置:
http.cors.enabled: true
http.cors.allow-origin: "*"

# head集群管理界面连接客户端提示未连接
1. 由于开的代理使用IP访问http://10.0.29.108:9100/,默认连接客户端的地址是http://localhost:9200/ 改成http://10.0.29.108:9200,连接成功后会显示“集群健康值: green”。
Jeff wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
码字不易,坚持原创技术分享,您的支持将鼓励我继续创作!么么哒!