Elasticserch集群部署及简单应用

一. Elasticsearch介绍

0.Elasticserch简介

elasticsearch是一个高度可扩展全文搜索和分析引擎,基于Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。

1.什么是全文检索和Lucene

基于java环境,基于Lucene之上包装一层外壳
Lucene是一个java的搜索引擎库,操作非常繁琐
​
全文检索和倒排索引:
数据里里的标题:
1.中国大学排名             1 1 1
2.中国大学专业排名      1 1 1 1 1
3.中国艺术院校排名      1 1 1 1
4.中国985大学          1 1 1
5.中国211大学          1 1 1
​
ES内部分词,评分,倒排索引:
中国     1 2 3 4 5 
大学     1 2 4 5 
排名     1 2 3 
专业     2
院校     3
艺术     3
985     4
211     5
用户输入:
中国大学
结果:中国大学专业排名

2.Elasticsearch应用场景

1.搜索: 电商,百科,app搜索
2.高亮显示: github 
3.分析和数据挖掘: ELK

3.Elasticsearch特点

1.高性能,天然分布式
2.对运维友好,不需要会java语言,开箱即用
3.功能丰富

4.Elasticsearch在电商搜索的实现

mysql:
skuid   name  
1       狗粮100kg
2       猫粮50kg
3       猫罐头200g
​
ES:
聚合运算之后得到SKUID:
1
2
​
拿到ID之后,mysql就只需要简单地where查询即可
mysql:
select xx from xxx where skuid 1

二.ES安装启动

0.关闭防火墙

iptables -nL
iptables -F
iptables -X
iptables -Z
iptables -nL

1.下载软件

mkdir /data/soft
[root@db-01 /data/soft]# ll -h
total 268M
-rw-r--r-- 1 root root 109M Feb 25  2019 elasticsearch-6.6.0.rpm
-rw-r--r-- 1 root root 159M Sep  2 16:35 jdk-8u102-linux-x64.rpm

2.安装jdk

rpm -ivh jdk-8u102-linux-x64.rpm 
[root@db-01 /data/soft]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

3.安装ES

rpm -ivh elasticsearch-6.6.0.rpm

4.启动并检查

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
​
netstat -lntup|grep 9200
​
[root@db01 /data/soft]# curl 127.0.0.1:9200
{
 "name" : "pRG0qLR",
 "cluster_name" : "elasticsearch",
 "cluster_uuid" : "mNuJSe07QM61IOxecnanZg",
 "version" : {
 "number" : "6.6.0",
 "build_flavor" : "default",
 "build_type" : "rpm",
 "build_hash" : "a9861f4",
 "build_date" : "2019-01-24T11:27:09.439740Z",
 "build_snapshot" : false,
 "lucene_version" : "7.6.0",
 "minimum_wire_compatibility_version" : "5.6.0",
 "minimum_index_compatibility_version" : "5.0.0"
 },
 "tagline" : "You Know, for Search"
}

三. ES自定义配置

1.查看ES有哪些配置

[root@db01 ~]# rpm -qc elasticsearch 
/etc/elasticsearch/elasticsearch.yml        #ES的主配置文件
/etc/elasticsearch/jvm.options              #jvm虚拟机配置
/etc/sysconfig/elasticsearch                #默认一些系统配置参数
/usr/lib/sysctl.d/elasticsearch.conf        #配置参数,不需要改动
/usr/lib/systemd/system/elasticsearch.service   #system启动文件

2.自定义配置文件

cp /etc/elasticsearch/elasticsearch.yml  /opt/
cat >/etc/elasticsearch/elasticsearch.yml<

3.重启服务

systemctl restart elasticsearch.service

4.解决内存锁定失败

重启后查看日志发现提示内存锁定失败

[root@db01 ~]# tail -f /var/log/elasticsearch/elasticsearch.log 
[2019-11-14T09:42:29,513][ERROR][o.e.b.Bootstrap          ] [node-1] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

解决方案:

systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
​
systemctl daemon-reload
systemctl restart elasticsearch.service

四. es-head插件安装

注意:需要修改配置文件添加允许跨域参数

http.cors.enabled: true 
http.cors.allow-origin: "*"

1.es-head 三种方式

1.npm安装方式

2.docker安装

3.google浏览器插件(推荐)

从google商店安装es-head插件
将安装好的插件导出到本地
修改插件文件名为zip后缀
解压目录
拓展程序-开发者模式-打开已解压的目录
连接地址修改为ES的IP地址

2.具体操作命令

Head插件在5.0以后安装方式发生了改变,需要nodejs环境支持,或者直接使用别人封装好的docker镜像

插件官方地址 https://github.com/mobz/elasticsearch-head

使用docker部署elasticsearch-head

docker pull alivv/elasticsearch-head
docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head

使用nodejs编译安装elasticsearch-head

cd /opt/
wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
tar xf node-v12.13.0-linux-x64.tar.xz
mv node-v12.13.0-linux-x64 node
echo "PATH=\$PATH:/opt/node/bin" >> /etc/profile
source profile 
npm -v
node -v 
git clone git://github.com/mobz/elasticsearch-head.git
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install
npm run start &

五. kibana与ES交互

1.安装kibana

rpm -ivh kibana-6.6.0-x86_64.rpm

2.配置kibana

[root@db-01 /data/soft]# grep "^[a-Z]" /etc/kibana/kibana.yml 
server.port: 5601
server.host: "10.0.0.51"
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana"

3.启动kibana

systemctl start kibana

六. 插入命令

1.使用自定义的ID

PUT oldzhang/info/1
{
 "name": "zhang",
 "age": "29"
}

2.使用随机ID

POST oldzhang/info/
{
 "name": "zhang",
 "age": "29",
 "pet": "xiaoqi"
}

3.和mysql对应关系建议单独列一个id字段

POST oldzhang/info/
{
 "uid": "1",
 "name": "ya",
 "age": "29"
}

七. 查询命令

1.创建测试语句

POST oldzhang/info/
{
 "name": "zhang",
 "age": "29",
 "pet": "xiaoqi",
 "job": "it"
}
​
POST oldzhang/info/
{
 "name": "xiao1",
 "age": "30",
 "pet": "xiaoqi",
 "job": "it"
}
​
POST oldzhang/info/
{
 "name": "xiao2",
 "age": "26",
 "pet": "xiaoqi",
 "job": "it"
}
​
POST oldzhang/info/
{
 "name": "xiao4",
 "age": "35",
 "pet": "xiaoqi",
 "job": "it"
}
​
POST oldzhang/info/
{
 "name": "ya",
 "age": "28",
 "pet": "xiaomin",
 "job": "it"
}
​
POST oldzhang/info/
{
 "name": "xiaomin",
 "age": "26",
 "pet": "xiaowang",
 "job": "SM"
​
}
​
POST oldzhang/info/
{
 "name": "hemengfei",
 "age": "38",
 "pet": "xiaohe",
 "job": "3P"
}
​
POST oldzhang/info/
{
 "name": "xiaoyu",
 "age": "28",
 "pet": "bijiben",
 "job": "fly"
}

2.简单查询

GET oldzhang/_search/

3.条件查询

GET oldzhang/_search
{
 "query": {
 "term": {
 "name": {
 "value": "xiaomin"
 }
 }
 }
}
​
GET oldzhang/_search
{
 "query": {
 "term": {
 "job": {
 "value": "it"
 }
 }
 }
}

4.多条件查询

GET /oldzhang/_search
{
 "query" : {
 "bool": {
 "must": [
 {"match": {"pet": "xiaoqi"}},
 {"match": {"name": "zhang"}}
 ],
 "filter": {
 "range": {
 "age": {
 "gte": 27,
 "lte": 30
 }
 }
 }
 }
 }
 }
}

八. 集群相关名词

0.默认分片和副本规则

5分片
1副本

1.集群健康状态

绿色: 所有数据都完整,且副本数满足
黄色: 所有数据都完整,但是副本数不满足
红色: 一个或多个索引数据不完整

2.节点类型

主节点:     负责调度数据分配到哪个节点
数据节点:  实际负责处理数据的节点
默认:         主节点也是工作节点

3.数据分片

主分片:        实际存储的数据,负责读写,粗框的是主分片
副本分片:    主分片的副本,提供读,同步主分片,细框的是副本分片

4.副本

主分片的备份,副本数量可以自定义

九. 部署ES集群

1.安装java

rpm -ivh jdk-8u102-linux-x64.rpm

2.安装ES

rpm -ivh elasticsearch-6.6.0.rpm

3.配置内存锁定

systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

4.集群配置文件

b01配置文件:

cat > /etc/elasticsearch/elasticsearch.yml <

db02配置文件:

cat> /etc/elasticsearch/elasticsearch.yml <

5.启动

systemctl daemon-reload
systemctl restart elasticsearch

6.查看日志

tail -f /var/log/elasticsearch/linux5.log

7.检查集群

ES-head查看是否有2个节点

十. 集群注意事项

1.插入和读取数据在任意节点都可以执行,效果一样
2.es-head可以连接集群内任一台服务
​
3.主节点负责读写
如果主分片所在的节点坏掉了,副本分片会升为主分片
​
4.主节点负责调度
如果主节点坏掉了,数据节点会自动升为主节点
​
5.通讯端口
默认会有2个通讯端口:9200和9300
9300并没有在配置文件里配置过
如果开启了防火墙并且没有放开9300端口,那么集群通讯就会失败

十一. 查看集群各种信息

GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards

十二. 扩容第三台机器

1.安装java

rpm -ivh jdk-8u102-linux-x64.rpm

2.安装ES

rpm -ivh elasticsearch-6.6.0.rpm

3.配置内存锁定

systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

4.db03集群配置文件

cat > /etc/elasticsearch/elasticsearch.yml <

5.添加节点注意

1.对于新添加的节点来说:  
只需要直到集群内任意一个节点的IP和他自己本身的IP即可
​
对于以前的节点来说:
什么都不需要更改
​
2.最大master节点数设置
3个节点,设置为2
​
3.默认创建索引为1副本5分片
​
4.数据分配的时候会出现2中颜色
紫色: 正在迁移
黄色: 正在复制
绿色: 正常
​
5.3节点的时候
0副本一台都不能坏 
1副本的极限情况下可以坏2台: 1台1台的坏,不能同时坏2台,在数据复制完成的情况下,可以坏2台
2副本的情况可以同时坏2台

十三. 动态修改最小发现节点数

GET _cluster/settings
​
PUT _cluster/settings
{
 "transient": {
 "discovery.zen.minimum_master_nodes": 2
 }
}

十四. 自定义副本分片和索引

1.注意事项

索引一旦建立完成,分片数就不可以修改了
但是副本数可以随时修改

2.创建索引的时候就自定义副本和分片

PUT /yayayaay/
{
 "settings": {
 "number_of_shards": 3, 
 "number_of_replicas": 0
 }
}

3.修改单个索引的副本数

PUT /oldzhang/_settings/
{
 "settings": {
 "number_of_replicas": 0
 }
}

4.修改所有的索引的副本数

PUT /_all/_settings/
{
 "settings": {
 "number_of_replicas": 0
 }
}

5.es-head中修改索引

6.本机修改分片和副本集设置

#在每个节点上执行,分配1个副本6个分片
[root@elkstack01 ~]# curl -XPUT 10.0.0.51:9200/_template/my_template -d'
{    "template": "*",
     "settings": {
        "index": {
            "number_of_shards": 6,
            "number_of_replicas": 1
        }
     }
}'

#返回结果为true,分片成功
{"acknowledged":true}

7.工作如何设置

2个节点: 默认就可以 
3个节点: 重要的数据,2副本 不重要的默认 
日志收集: 1副本3分片 

十五. ES监控

1.监控注意

0.不能只监控集群状态
1.监控节点数
2.监控集群状态
3.两者任意一个发生改变了都报警

2.监控命令

GET _cat/nodes
GET _cat/health

十六. ES优化

1.内存 
不要超过32G 
​
48内存 
系统留一半: 24G 
自己留一半: 24G
8G 12G 16G 24G 30G 
​
2.SSD硬盘
0   1
​
3.代码优化
​
4.升级大版本

十七. 中文分词

未分词的情况

1.插入测试数据

POST /news/txt/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
​
POST /news/txt/2
{"content":"公安部:各地校车将享最高路权"}
​
POST /news/txt/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
​
POST /news/txt/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}

2.检测

POST /news/_search
{
 "query" : { "match" : { "content" : "中国" }},
 "highlight" : {
 "pre_tags" : ["", ""],
 "post_tags" : ["", ""],
 "fields" : {
 "content" : {}
 }
 }
}

中文分词配置

0.前提条件

所有的ES节点都需要安装
所有的ES都需要重启才能生效

1.配置中文分词器

在线安装

cd /usr/share/elasticsearch
./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.6.0/elasticsearch-analysis-ik-6.6.0.zip

离线本地文件安装

/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///XXX/elasticsearch-analysis-ik-6.6.0.zip

2.创建索引

PUT /news2

3.创建模板

POST /news2/text/_mapping
{
 "properties": {
 "content": {
 "type": "text",
 "analyzer": "ik_max_word",
 "search_analyzer": "ik_smart"
 }
 }
​
}

4.插入测试数据

POST /news2/text/1
{"content":"美国留给伊拉克的是个烂摊子吗"}
​
POST /news2/text/2
{"content":"公安部:各地校车将享最高路权"}
​
POST /news2/text/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}
​
POST /news2/text/4
{"content":"中国驻洛杉矶领事馆遭亚裔男子枪击 嫌犯已自首"}

5.再次查询数据发现已经能识别中文了

POST /news2/_search
{
 "query" : { "match" : { "content" : "中国" }},
 "highlight" : {
 "pre_tags" : ["", ""],
 "post_tags" : ["", ""],
 "fields" : {
 "content" : {}
 }
 }
}

热更新中文分词库

1.官方安装nginx

cat >> /etc/yum.repos.d/nginx.repo<

2.写字典

cat >>/usr/share/nginx/html/my_dic.txt<

3.配置es的中文分词器插件

vim /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml



 IK Analyzer 扩展配置
 
 
 
 
 
 http://10.0.0.51/my.txt
 
 

5.将修改好的IK配置文件复制到其他所有ES节点

cd /etc/elasticsearch/analysis-ik/
scp IKAnalyzer.cfg.xml 10.0.0.52:/etc/elasticsearch/analysis-ik/

6.重启所有的ES节点

systemctl restart elasticsearch.service 

7.查看日志里字典的词有没有加载出来

[2020-02-12T14:56:38,610][INFO ][o.w.a.d.Monitor          ] [node-1] 重新加载词典...
[2020-02-12T14:56:38,611][INFO ][o.w.a.d.Monitor          ] [node-1] try load config from /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
[2020-02-12T14:56:38,614][INFO ][o.w.a.d.Monitor          ] [node-1] [Dict Loading] http://10.0.0.51/my_dic.txt
[2020-02-12T14:56:38,628][INFO ][o.w.a.d.Monitor          ] [node-1] 上海
[2020-02-12T14:56:38,629][INFO ][o.w.a.d.Monitor          ] [node-1] 班长
[2020-02-12T14:56:38,629][INFO ][o.w.a.d.Monitor          ] [node-1] 学委
[2020-02-12T14:56:38,629][INFO ][o.w.a.d.Monitor          ] [node-1] 张亚
[2020-02-12T14:56:38,629][INFO ][o.w.a.d.Monitor          ] [node-1] 胖虎
[2020-02-12T14:56:38,629][INFO ][o.w.a.d.Monitor          ] [node-1] 重新加载词典完毕...

8.打开es日志,然后更新字典内容,查看日志里会不会自动加载

POST /news2/text/6
{"content":"昨天胖虎很嚣张,把班长打了一顿并让班长请他吃饭"}

9.搜索测试验证结果

POST /news2/_search
{
 "query" : { "match" : { "content" : "班长" }},
 "highlight" : {
 "pre_tags" : ["", ""],
 "post_tags" : ["", ""],
 "fields" : {
 "content" : {}
 }
 }
}

10.测试追加字典

#测试新增加新词效果
echo "武汉" >> /usr/share/nginx/html/my_dic.txt
​
#查看日志有没有重新加载字典
tail -f /var/log/elasticsearch/linux.log
​
#编写测试语句
POST /news2/text/7
{"content":"武汉加油!"}
​
​
POST /news2/_search
{
 "query" : { "match" : { "content" : "武汉" }},
 "highlight" : {
 "pre_tags" : ["", ""],
 "post_tags" : ["", ""],
 "fields" : {
 "content" : {}
 }
 }
}

11手动更新字典

1.更新字典
vi /etc/elasticsearch/analysis-ik/main.dic 
​
2.把字典发送到集群内所有的机器
scp main.dic 10.0.0.52:/etc/elasticsearch/analysis-ik/
​
3.重启所有的ES节点!!!
systemctl restart elasticsearch 
​
4.更新索引的数据
POST /news2/text/5
{"content":"昨天胖虎很嚣张,让张亚请他吃饭"}
​
5.搜索测试
POST /news2/_search
{
 "query" : { "match" : { "content" : "胖虎" }},
 "highlight" : {
 "pre_tags" : ["", ""],
 "post_tags" : ["", ""],
 "fields" : {
 "content" : {}
 }
 }
}
​
​
没更新字典之前
字典里的词:中国
插入语句:
1.中国加油 武汉加油
2.胖虎胖
3.张亚好
​
分词:
1.中国
2.胖 虎 胖
3.张 亚 好
​
更新了字典:
中国
张亚
胖虎
​
更新数据:
1.中国
2.张亚
3.胖虎
​
==========================================
自定义更新字典目前的几个问题:
更新麻烦
1.更新后的字典要发送到所有的服务器
2.每次更新字典后都需要重启

12.电商上架新产品流程

先把新上架的商品的关键词更新到词典里
查看ES日志,确认新词被动态更新了
自己编写一个测试索引,插入测试数据,然后查看搜索结果
确认没有问题之后,在让开发插入新商品的数据
测试

十八. 备份恢复

安装和使用文档:https://github.com/taskrabbit/elasticsearch-dump

0.前提条件

必须要有Node环境和npm软件
nodejs
npm    

1.nodejs环境安装

cd /opt
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
tar xf  node-v10.16.3-linux-x64.tar.xz -C /opt/
mv  node-v10.16.3-linux-x64 node
vim /etc/profile
export PATH=/opt/node/bin:$PATH
source /etc/profile
[root@db-01 ~]# node -v
v10.16.3
[root@db-01 ~]# npm -v
6.9.0

2.指定使用国内淘宝npm源

npm install -g cnpm --registry=https://registry.npm.taobao.org

3.安装es-dump

cnpm install elasticdump -g

4.备份命令

#备份成可读的json格式
elasticdump \
 --input=http://10.0.0.51:9200/news2 \
 --output=/data/news2.json \
 --type=data
​
#备份成压缩格式
elasticdump \
 --input=http://10.0.0.51:9200/news2 \
 --output=$|gzip > /data/news2.json.gz
​
#备份分词器/mapping/数据一条龙服务
elasticdump \
 --input=http://10.0.0.51:9200/news2 \
 --output=/data/news2_analyzer.json \
 --type=analyzer
elasticdump \
 --input=http://10.0.0.51:9200/news2 \
 --output=/data/news2_mapping.json \
 --type=mapping
elasticdump \
 --input=http://10.0.0.51:9200/news2 \
 --output=/data/news2.json \
 --type=data

5.只恢复数据

elasticdump \
--input=/data/oldzhang.json \
--output=http://10.0.1.51:9200/oldzhang

6.备份恢复注意

恢复的时候需要先解压缩成json格式 
恢复的时候,如果已经存在相同的数据,会被覆盖掉
如果新增加的数据,则不影响,继续保留

7.完全恢复

恢复所有数据包含分词器/mapping一条龙
elasticdump \
 --input=/data/news2_analyzer.json \
 --output=http://10.0.0.51:9200/news2 \
 --type=analyzer
elasticdump \
 --input=/data/news2_mapping.json \
 --output=http://10.0.0.51:9200/news2 \
 --type=mapping
elasticdump \
 --input=/data/news2.json \
 --output=http://10.0.0.51:9200/news2
 --type=data

8.批量备份

#脚本实现
curl -s 127.0.0.1:9200/_cat/indices|awk '{print $3}'

注意:集群部署时,数据导入前安装好es-head以及分词器。后期添加之后先前的数据也不支持中文分词,只能重新导入数据。

你可能感兴趣的:(Elasticserch集群部署及简单应用)