ElasticSearch
一、概述
1). ES介绍
- 基于Lucene的搜索服务器。
- 提供分布式多用户能力的全文搜索引擎。
- 基于RESTful web接口
- Java开发,Apache许可条款下的开源产品。
2). 优点
- 扩展性好,可部署上百太服务器集群,处理PB级数据。
- 近试试的去索引数据、搜索数据。
3). 原理
ES倒排索引.png
- 将要搜索的文档内容分词,所有不重复的词组成分词列表。
- 将搜索的文档最终以Document方式存储起来。
- 每个词和document都有关联,可以使用相似性算法算出匹配度高的文档。
- 使用RESTful API 接口,json格式交互。
二、安装ES
1).安装ES
以6.2.1为例
- 新版jdk1.8以上。
- 支持tar、zip、rpm等多种方式安装。
- Win下开发环境建议使用ZIP方式安装,解压配置运行即可。
- docker即其他方式安装
- 下载Elasticsearch 6.2.1
2).安装路径介绍
-
bin
:脚本目录,包括:启动、停止等可执行脚本。 -
config
:配置文件目录。 -
data
:索引目录,存放索引文件的地方。 -
logs
:日志目录。 -
modules
:模块目录,包括了es的功能模块。 -
plugins
:插件目录,es支持插件机制。
3).配置文件
- ES的配置文件的地址根据安装形式的不同而不同
- 使用zip、tar安装,配置文件的地址在安装目录的config下。
- 使用RPM安装,配置文件在/etc/elasticsearch下。
- 使用MSI安装,配置文件的地址在安装目录的config下,并且会自动将config目录地址写入环境变量ES_PATH_CONF。
4).elasticsearch.yml
用于配置ElasticSearch运行参数
- 常用配置介绍 (utf-8编码)
cluster.name: xuecheng # 配置集群名称,逻辑概念
node.name: xc_node_1 # 物理服务器节点名称,物理概念
network.host: 0.0.0.0 # 绑定主机的ip地址,设置为0.0.0.0表示可以绑定任何ip(实际以物理机ip为主),运行外网访问,生产环境建议设置为具体的ip
http.port: 9200 # 对外服务的http端口,默认为9200
transport.tcp.port: 9300 # 集群节点之间通信的端口
node.master: true # 有资格选举为master节点
node.data: true # 是否存储索引数据
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"] # 集群配置中master节点的初始化列表,由于支持弹性扩展,后期自动加入的节点会被自动发现
discovery.zen.minimum_master_nodes: 1 # 主节点数量的最少值:计算公式为 (master_eligible_nodes/2) + 1,比如有三个复合要求的主节点,这里就要设置为2
node.ingest: true # 是否允许成为协调节点
bootstrap.memory_lock: false # 设置为true可以锁住ES使用的内存,避免内存与swap分区交换数据
node.max_local_storage_nodes: 2 # 单机允许的最大存储节点数,生产环境建议设置为1,开发环境可设置多个
path.data: D:\elasticSearch\elasticsearch-01\data # 索引数据存储的位置,可以设置多个存储路径,逗号隔开
path.logs: D:\elasticSearch\elasticsearch-01\logs # 日志存储的位置
http.cors.enabled: true # 开启跨域设置,允许跨域【header插件在node.js环境下运行,出现的跨域请求!】
http.cors.allow-origin: /.*/ # 开发环境下允许所用的不同域访问
# ~~~~~~~~~~~~~~~~~~~~其他配置~~~~~~~~~~~~~~~~~~~~
# path.conf: 设置配置文件的存储路径,tar或zip包安装默认在es根目录下的config文件夹,rpm安装默认在/etc/elasticsearch
# path.plugins: 设置插件的存放路径,默认是es根目录下的plugins文件夹
- 三个节点集群搭建配置案例
cluster.name: xuecheng
node.name: xc_node_1
network.host: 0.0.0.0
http.port: 9200
transport.tcp.port: 9300
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 2
path.data: D:\elasticSearch\elasticsearch-01\data
path.logs: D:\elasticSearch\elasticsearch-01\logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
cluster.name: xuecheng
node.name: xc_node_2
network.host: 0.0.0.0
http.port: 9201
transport.tcp.port: 9301
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 2
path.data: D:\elasticSearch\elasticsearch-02\data
path.logs: D:\elasticSearch\elasticsearch-02\logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
cluster.name: xuecheng
node.name: xc_node_3
network.host: 0.0.0.0
http.port: 9202
transport.tcp.port: 9302
node.master: false
node.data: true
discovery.zen.ping.unicast.hosts: ["0.0.0.0:9300", "0.0.0.0:9301"]
discovery.zen.minimum_master_nodes: 1
node.ingest: true
bootstrap.memory_lock: false
node.max_local_storage_nodes: 2
path.data: D:\elasticSearch\elasticsearch-03\data
path.logs: D:\elasticSearch\elasticsearch-03\logs
http.cors.enabled: true
http.cors.allow-origin: /.*/
- jvm.options
- 在jvm.options中设置
-Xms
和-Xmx
两个值设置为相等 - 将
Xmx
设置为不超过物理内存的一半。
- 在jvm.options中设置
用于配置ElasticSearch JVM设置最小及最大的堆内存大小
- log4j2.properties
用于配置ElasticSearch日志, ES使用log4j,注意日志级别的配置
- 系统配置
在linux上根据系统资源情况,可将每个进程最多允许打开的文件数设置大些。
su limit -n # 查询当前文件数
sudo su
ulimit -n 65536
su elasticsearch
也可通过下边的方式修改文件进行持久设置
/etc/security/limits.conf
将下边的行加入此文件:
elasticsearch - nofile 65536
5).安装IK分词器
-
将解压的一堆文件放在
ES安装根路径\plugins\ik
下 -
ik的两种分词模式 analyzer
-
ik_max_word
: 最细粒度拆分 【插入新文档是采用此方案】 -
ik_smart
: 最粗粒度拆分 【搜索分词时采用此方案】
-
-
自定义词库(utf-8,注意不要恶心的
utf-8 BOM)plugins/ik/config
下新建如下文件。-
main.dic
: 默认词库文件 -
my.dic
: 自定义追加词库 -
stop.dic
: 自定义停用词库,敏感词
-
自动词库每个单词以换行符分割
- 配置自定义词库
IKAnalyzer.cfg.xml
(相同的路径下)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">my.dic</entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">stop.dic</entry>
<!--用户可以在这里配置远程扩展字典 -->
<!-- <entry key="remote_ext_dict">words_location</entry> -->
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
6).启动ES
- 进入bin目录,在cmd下运行:集群环境下要每个都单独启动。
elasticsearch.bat # linux下为 ./elasticsearch.sh
7).验证
- 浏览器输入:http://localhost:9200
- 显示结果如下(配置不同内容则不同)说明 ES启动成功:
{
"name" : "xc_node_1",
"cluster_name" : "xuecheng",
"cluster_uuid" : "NbtaHIRSTiWXuJ6u0LJHlQ",
"version" : {
"number" : "6.2.1",
"build_hash" : "7299dc3",
"build_date" : "2018-02-07T19:34:26.990113Z",
"build_snapshot" : false,
"lucene_version" : "7.2.1",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
8). 集群管理
- 节点:每个服务器为一个节点(一个ES进程)
- 分片:每个分片为一个独立的lucene实例,保存了部分的索引等信息
- 副本:对提高分片的高可用性,与对应的分片存储在不同的服务器节点上
- 主节点:管理集群,增加. 移除节点等,主节点挂掉后会重新选举一个新的节点
node.master # 是否允许为主结点
node.data # 允许存储数据作为数据结点
node.ingest # 是否允许成为协调节点
- 集群的健康
- get http://localhost:9200/_cluster/health
- green : 一切正常
- yellow: 所有主分片正常,某些副本不正常
- red: 存在主分片不正常
二、head插件安装
1). 介绍
- head插件是ES的一个可视化管理插件,用来监视ES的状态,并通过head客户端和ES服务进行交互,比如创建映射、创建索引等。
- 项目地址
- 从ES6.0开始,head插件支持使得node.js运行
2). 安装。
- 安装node.js
- 下载head
git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start
- 访问http://localhost:9100/
- 注意elasticsearch.yml中要配置允许跨域访问。
三、安装Logstash6.2.1(与ES对应,可选)
1). 简介
- ES下的一款开源软件,能从多个来源采集数据,并发送到Elasticsearch中创建索引
2). 安装
- 安装ruby2.5环境:因为要使用logstash-input-jdbc
- 6.x需要手动安装
cd logstash-6.2.1/bin> .\logstash-plugin.bat install logstash-input-jdbc
3). 配置案例
- 创建mapping的模板文件 logstash-6.2.1/config/xc_course_templage.json,格式如下
{
"mappings" : {
"doc" : {
"properties" : {
"charge" : {
"type" : "keyword"
},
"description" : {
"analyzer" : "ik_max_word",
"search_analyzer" : "ik_smart",
"type" : "text"
},
...
}
}
},
"template" : "xc_course"
}
- 配置 logstash-6.2.1/config/mysql.conf : logstash会根据此配置文件将MySQL中的数据向ES中写入索引
- ES采用UTC时区,ES读取时间时让最后更新时间+8小时,见下方对应配置where timestamp > date_add(:sql_last_value,INTERVAL 8 HOUR)
- logstash每之sing完成会在logstash-6.2.1/config/logstash_metadata记录执时间,下次以此时间为基准增量同步到索引库
# 配置输入数据源
input {
stdin {}
jdbc {
jdbc_connection_string => "jdbc:mysql://localhost:3306/xc_course?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC"
# the user we wish to excute our statement as
jdbc_user => "root"
jdbc_password => abc123
# the path to our downloaded jdbc driver
jdbc_driver_library => "D:/maven_repository_xuecheng/mysql/mysql-connector-java/5.1.41/mysql-connector-java-5.1.41.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#要执行的sql文件
#statement_filepath => "/conf/course.sql"
statement => "select * from course_pub where timestamp > date_add(:sql_last_value,INTERVAL 8 HOUR)"
#定时配置
schedule => "* * * * *"
record_last_run => true
last_run_metadata_path => "D:/elasticSearch/logstash-6.2.1/config/logstash_metadata"
}
}
# 配置输出数据源
output {
elasticsearch {
#ES的ip地址和端口
hosts => "localhost:9200"
#hosts => ["localhost:9200","localhost:9201","localhost:9202"]
#ES索引库名称
index => "xc_course"
document_id => "%{id}"
document_type => "doc"
template =>"D:/elasticSearch/logstash-6.2.1/config/xc_course_template.json"
template_name =>"xc_course"
template_overwrite =>"true"
}
# 日志输出
stdout {
codec => json_lines
}
}
- 启动Logstash.bat
logstash-6.2.1\bin> .\logstash.bat -f ..\config\mysql.conf
网友评论