ElasticSearch介绍
Elasticsearch 是一个分布式可扩展的实时搜索和分析引擎,一个建立在全文搜索引擎 Apache Lucene(TM) 基础上的搜索引擎.当然 Elasticsearch 并不仅仅是 Lucene 那么简单,它不仅包括了全文搜索功能,还可以进行以下工作:
- 分布式实时文件存储,并将每一个字段都编入索引,使其可以被搜索。
- 实时分析的分布式搜索引擎。
- 可以扩展到上百台服务器,处理PB级别的结构化或非结构化数据。
基本概念
先说Elasticsearch的文件存储,Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档,用JSON作为文档序列化的格式,比如下面这条用户数据:
{ "name" : "test", "sex" : "demo", "age" : 11, "birthDate": "2008/11/11", "about" : "I have apple", "interests": [ "pen", "sleep" ] }
用Mysql这样的数据库存储就会容易想到建立一张User表,有balabala的字段等,在Elasticsearch里这就是一个文档,当然这个文档会属于一个User的类型,各种各样的类型存在于一个索引当中。这里有一份简易的将Elasticsearch和关系型数据术语对照表:
关系数据库 ⇒ 数据库 ⇒ 表 ⇒ 行 ⇒ 列(Columns)
Elasticsearch ⇒ 索引(Index) ⇒ 类型(type) ⇒ 文档(Docments) ⇒ 字段(Fields)
一个 Elasticsearch 集群可以包含多个索引(数据库),也就是说其中包含了很多类型(表)。这些类型中包含了很多的文档(行),然后每个文档中又包含了很多的字段(列)。Elasticsearch的交互,可以使用Java API,也可以直接使用HTTP的Restful API方式,比如我们打算插入一条记录,可以简单发送一个HTTP的请求:
PUT /net/mont/test
{ "name" : "test", "sex" : "demo", "age" : 11, "birthDate": "2008/11/11", "about" : "I have apple", "interests": [ "pen", "sleep" ] }
具体操作手册可以参见Elasticsearch权威指南
ElasticSearch安装指南(以下简称ES)
ElasticSearch安装环境:
使用系统版本 | centos6.10 |
ES使用版本 | 7.2.0 |
java使用版本 | 1.8.0+ |
1. java环境需求1.8以上的jdk安装,可yum安装或二进制安装
1.1 yum安装
yum -y install java-1.8.0-openjdk*
1.2 二进制安装需要下载jdk1.8二进制包,上传至服务器,且修改全局变量
mkdir -p /usr/java
tar xf "jdk二进制包名" -C /usr/java
1.3 修改全局变量/etc/profile
vim /etc/profile
export JAVA_HOME=/usr/java/jdk1.8.0_*(*安装包版本) export PATH=$PATH:$JAVA_HOME/bin export CLASSPATH=.:$JAVA_HOME/dt.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME PATH CLASSPATH
2. ES安装部署(二进制包安装)
2.1 上传二进制包至服务器,解压
tar xf elasticsearch-7.2.0-linux-x86_64.tar.gz -C /usr/local
2.2 修改ES配置文件
vim /usr/local/elasticsearch-7.2.0/config/elasticsearch.yml
node.name: node-1
path.data:/database/es
path.logs:/logs/es
network.host: 192.168.1.130
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
2.3 创建es启动用户
useradd elasticsearch
echo "passwd" | passwd --stdin elasticsearch
2.4 es启动需要普通用户启动
mkdir -p /database/es /logs/es
chown -R elasticsearch.elasticsearch /usr/local/elasticsearch-7.2.0
chown -R elasticsearch.elasticsearch /database/es /logs/es
2.5 切换普通用户启动(启动报错,详情可参考4. 启动报错问题)
su elasticsearch
/usr/local/elasticsearch-7.2.0/bin/elasticsearch #启动后观察输出是否存在报错
/usr/local/elasticsearch-7.2.0/bin/elasticsearch > /dev/null 2>&1 & #无报错进行后台启动
2.6 页面输入192.168.1.130:9200,显示如下图即安装成功
3. elasticsearch-head安装
安装包下载地址:https://github.com/mobz/elasticsearch-head
3.1 将下载的zip解压
unzip /opt/elasticsearch-head-master.zip
3.2 将解压的目录移动
mkdir -p mv /opt/elasticsearch-head-master /usr/local/elasticsearch-head
3.3 安装nodejs和npm
yum install epel-release -y yum install nodejs -y
mkdir -p /usr/loacl/node/ #创建目录
cd /usr/loacl/node/
wget https://npm.taobao.org/mirrors/node/v4.4.7/node-v4.4.7-linux-x64.tar.gz
tar xf node-v4.4.7-linux-x64.tar.gz
mv node-v4.4.7-linux-x64 node-v4.4.7
rm -rf node-v4.4.7-linux-x64.tar.gz
ln -s /usr/local/node/node-v4.4.7/bin/npm /usr/local/bin/npm
ln -s /usr/local/node/node-v4.4.7/bin/node /usr/local/bin/node
npm -v
3.4
修改elasticsearch.yml文件,添加配置
http.cors.enabled: true http.cors.allow-origin: "*"
修改/usr/local/elasticsearch-head/_site/app.js文件,如下图位置
修改Gruntfile.js文件,修改服务监听地址(增加hostname属性,将其值设置为'0.0.0.0’)
92行下添加:hostname:'0.0.0.0',
启动服务(先启动ES再启动head插件)
npm run start
npm run start > /dev/null 2>&1 &
访问192.168.1.130:9300,启动成功后即可显示如下图
4. 启动报错问题
4.1 如出现上述报错,进行以下的报错处理
报错1:无法创建本地文件问题,用户最大可创建文件数太小
解决方案:切换到root用户,编辑limits.conf配置文件并添加类似如下内容,添加完成后退出用户重新登陆即可生效
vim /etc/security/limits.conf
* soft nofile 65536 * hard nofile 65536 * soft nproc 4096 * hard nproc 4096
报错2:无法创建本地线程问题,用户最大可创建线程数太小
解决方案:切换到root用户,进入limits.d目录下,修改90-nproc.conf 配置文件。
vim /etc/security/limits.d/90-nproc.conf
修改 * soft nproc 1024 为 * soft nproc 4096
报错3:最大虚拟内存太小
解决方案:切换到root用户下,修改配置文件sysctl.conf
vim /etc/sysctl.conf
添加下面配置:vm.max_map_count=655360 并执行命令:sysctl -p
报错4:Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true
解决方案:
禁用:在elasticsearch.yml中配置bootstrap.system_call_filter为false,注意要在Memory下面:
bootstrap.memory_lock: false bootstrap.system_call_filter: false
报错5:
解决方案:
vim /usr/local/elasticsearch-7.2.0/config/elasticsearch.yml
#cluster.initial_master_nodes: ["node-1", "node-2"] #在此行下插入 cluster.initial_master_nodes: ["node-1"]