elasticsearch
2020-01-10 本文已影响0人
吃可爱长大鸭
第一章 安装部署
1.创建目录并进入
[root@elk ~]# mkdir /data/soft/ -p
[root@elk ~]# cd /data/soft/
2.上传软件包
[root@elk /data/soft]# rz -E
-rw-r--r-- 1 root root 114059630 Oct 6 16:03 elasticsearch-6.6.0.rpm
-rw-r--r-- 1 root root 185123116 Oct 6 16:03 kibana-6.6.0-x86_64.rpm
4.解压/data/soft/*.rpm包
[root@elk /data/soft]# rpm -ivh *.rpm
5.更改elasticsearch配置文件
[root@elk /data/soft]# vim /etc/elasticsearch/elasticsearch.yml
23 node.name: node-1 #打开注释
33 path.data: /var/lib/elasticsearch #打开状态
37 path.logs: /var/log/elasticsearch #打开状态
43 bootstrap.memory_lock: true #打开注释
55 network.host: 10.0.0.88,127.0.0.1 #更改自己的本机IP和本地IP
59 http.port: 9200 #打开注释的端口号
6.启动elasticsearch服务
[root@elk /data/soft]# systemctl daemon-reload
[root@elk /data/soft]# systemctl start elasticsearch.service
[root@elk /data/soft]# systemctl enable elasticsearch.service
7.查看服务开启没有
[root@elk /data/soft]# curl 127.0.0.1:9200
{
"name" : "node-1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "VGosthZISMmh0C89vv0hbw",
"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"
}
8.启动服务发现报错
解决内存锁定失败:
查看日志发现提示内存锁定失败
[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
9.配置kibana文件
[root@elk /data/soft]# vim /etc/kibana/kibana.yml
2 server.port: 5601 #打开注释
7 server.host: "10.0.0.88" #更改IP地址
37 kibana.index: ".kibana" #打开kibana服务
10.启动服务
systemctl start kibana
es-head插件安装
注意:需要修改配置文件添加允许跨域参数
修改ES配置文件支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
es-head 三种方式:
1.npm安装方式
- 需要nodejs环境
- 需要连接国外源
2.docker安装
3.google浏览器插件
- 修改文件名为zip后缀
- 解压目录
- 拓展程序-开发者模式-打开已解压的目录
- 连接地址修改为ES的IP地址
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
vim /etc/profile
PATH=$PATH:/opt/node/bin
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 &
=================================================
1.打开kibana 10.0.0.88:5601
image.png
2.打开elasticsearchweb界面
image.png
image.png
3.操作ES
Dev Tools
image.png
第二章 es数据库操作
使用自定义的ID
PUT oldzhang/info/1
{
"name": "zhang",
"age": "29"
}
2.使用随机ID
POST oldzhang/info/
{
"name": "zhang",
"age": "29",
"pet": "xiaoqi"
}
3.和mysql对应关系建议单独列一个字段
POST oldzhang/info/
{
"uid": "1",
"name": "ya",
"age": "29"
}
curl -XPUT '10.0.0.51:9200/oldzhang/info/1?pretty' -H 'Content-Type: application/json' -d'
{
"uid": "1",
"name": "ya",
"age": "29"
}'
curl -XPUT '10.0.0.51:9200/oldzhang/info/2?pretty' -H 'Content-Type: application/json' -d'
{
"uid": "1",
"name": "zhang",
"age": "29"
}'
curl -XPUT '10.0.0.51:9200/oldzhang/info/3?pretty' -H 'Content-Type: application/json' -d'
{
"uid": "1",
"name": "ya",
"age": "27"
}'
curl -XPUT '10.0.0.51:9200/oldzhang/info/4?pretty' -H 'Content-Type: application/json' -d'{
"uid": "1",
"name": "ya",
"age": "30"}'
mysql es
库 索引 index
表 类型 type
字段 json key
行 文档 doc
建测试语句
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"
}
#简单查询
GET oldzhang/_search/
#条件查询
GET oldzhang/_search
{
"query": {
"term": {
"name": {
"value": "xiaomin"
}
}
}
}
GET oldzhang/_search
{
"query": {
"term": {
"job": {
"value": "it"
}
}
}
}
#多条件查询
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.配置ES配置文件
配置内存锁定:
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity
集群配置文件:
db01配置文件:
cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: linux5
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.51,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 1
EOF
==================================================================
db02配置文件:
cat> /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: linux5
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.52,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.minimum_master_nodes: 1
EOF
4.启动
systemctl daemon-reload
systemctl restart elasticsearch
5.查看日志
tail -f /var/log/elasticsearch/linux5.log
6.ES-head查看是否有2个节点
第五章 ES集群相关注意
注意事项:
1.插入和读取数据在任意节点都可以执行,效果一样
2.es-head可以连接集群内任一台服务
3.主节点负责读写
如果主分片所在的节点坏掉了,副本分片会升为主分片
4.主节点负责调度
如果主节点坏掉了,数据节点会自动升为主节点
5. 查看集群各种信息
GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/oldzhang
集群注意事项
注意1:发现节点参数不需要把集群内所有的机器IP都加上
只需要包含集群内任意一个IP和自己的IP就可以
discovery.zen.ping.unicast.hosts: ["10.0.0.51","10.0.0.53"]
注意2: 集群选举相关的参数需要设置为集群节点数的大多数
discovery.zen.minimum_master_nodes: 2
注意3: 默认创建索引为1副本5分片
注意4: 数据分配的时候会出现2中颜色
紫色: 正在迁移
黄色: 正在复制
绿色: 正常
注意5: 3节点的时候
0副本一台都不能坏
1副本的极限情况下可以坏2台: 1台1台的坏,不能同时坏2台
2副本的情况可以同时坏2台
自定义副本分片和索引
索引为2副本3分片
索引为0副本5分片
注意:
索引一旦建立完成,分片数就不可以修改了
但是副本数可以随时修改
命令:
1.创建索引的时候就自定义副本和分片
PUT /yayayaay/
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
2.修改单个索引的副本数
PUT /oldzhang/_settings/
{
"settings": {
"number_of_replicas": 0
}
}
3.修改所有的索引的副本数
PUT /_all/_settings/
{
"settings": {
"number_of_replicas": 0
}
}
工作如何设置:
2个节点: 默认就可以
3个节点: 重要的数据,2副本 不重要的默认
日志收集: 1副本3分片
第六章 扩容第三台机器
1.安装java
rpm -ivh jdk-8u102-linux-x64.rpm
2.安装ES
rpm -ivh elasticsearch-6.6.0.rpm
3.配置ES配置文件
配置内存锁定:
systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity
集群配置文件:
db03配置文件:
cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: linux5
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.53,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"]
discovery.zen.minimum_master_nodes: 1
EOF
4.添加节点注意
对于新添加的节点来说: 只需要直到集群内任意一个节点的IP和他自己本身的IP即可
对于以前的节点来说: 什么都不需要更改
5.最大master节点数设置
3个节点,设置为2
第七章 动态修改最小发现节点数
GET _cluster/settings
PUT _cluster/settings
{
"transient": {
"discovery.zen.minimum_master_nodes": 2
}
}
第八章 优化
1.内存
不要超过32G
48内存
系统留一半: 24G
自己留一半: 24G
8G 12G 16G 24G 30G
2.SSD硬盘
0 1
3.代码优化
4.升级大版本
第九章 监控
3节点实验宕机一台机器,集群状态仍然为绿色
监控注意,不能只监控集群状态
1.监控节点数
2.监控集群状态
3.2者任意一个发生改变了都报警
监控命令:
GET _cat/nodes
GET _cat/health
第十章 增强插件x-pack监控功能!
image.png第十一章 安全功能
7.x版本以上有自带功能,或者使用search-guard插件
第十二章 ES备份与恢复
前提条件:
必须要有Node环境和npm软件
nodejs
npm
1.nodejs环境安装
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/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/news2.json \
--output=http://10.0.0.51:9200/news2
恢复所有数据包含分词器/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
6.注意
恢复的时候需要先解压缩成json格式
恢复的时候,如果已经存在相同的数据,会被覆盖掉
如果新增加的数据,则不影响,继续保留
7.批量备份
curl -s 127.0.0.1:9200/_cat/indices|awk '{print $3}'
第十三章 集群发现相关参数
discovery.zen.fd.ping_timeout: 120s
discovery.zen.fd.ping_retries: 6
discovery.zen.fd.ping_interval: 30s
超时时间为120s
重试次数为6次
每次间隔30秒
第十四章 中文分词
注意:ES是国外开发,不支持中文词语组合搜索
未分词的情况:
1.插入测试数据
PUT /news
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" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
3.得出结论
默认没有中文分词器的时候ES并不认识中文,会把中文的词拆成一个一个的字
分词配置
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:///root/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" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
第十五章 手动更新字典
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" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
没更新字典之前
字典里的词:中国
插入语句:
1.中国加油 武汉加油
2.胖虎胖
3.张亚好
分词:
1.中国
2.胖 虎 胖
3.张 亚 好
更新了字典:
中国
张亚
胖虎
更新数据:
1.中国
2.张亚
3.胖虎
第十六章 热更新中文分词库
1.安装nginx
[root@db-01 ~]# cat /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=0
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
yum makecache fast
yum -y install nginx
2.创建字典文件
cat >>/usr/share/nginx/html/my_dic.txt<<EOF
上海
班长
学委
张亚
胖虎
EOF
3.重启nginx
nginx -t
systemctl restart nginx
4.配置IK分词器
[root@db01 /etc/elasticsearch/analysis-ik]# cat 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"></entry>
<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords"></entry>
<!--用户可以在这里配置远程扩展字典 -->
<entry key="remote_ext_dict">http://10.0.0.51/my_dic.txt</entry>
<!--用户可以在这里配置远程扩展停止词字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
5.将修改好的配置发送到所有的ES节点
cd /etc/elasticsearch/analysis-ik/
scp IKAnalyzer.cfg.xml 10.0.0.52:/etc/elasticsearch/analysis-ik/
6.重启所有的节点
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.编写测试数据并搜索
POST /news2/text/6
{"content":"昨天胖虎很嚣张,把班长打了一顿并让班长请他吃饭"}
POST /news2/_search
{
"query" : { "match" : { "content" : "班长" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
9.测试新增加新词效果
echo "武汉" >> /usr/share/nginx/html/my_dic.txt
查看日志有没有重新加载字典
tail -f /var/log/elasticsearch/linux.log
10.编写测试语句
POST /news2/text/7
{"content":"武汉加油!"}
POST /news2/_search
{
"query" : { "match" : { "content" : "武汉" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
11.电商上架新产品流程
先把新上架的商品的关键词更新到词典里
查看ES日志,确认新词被动态更新了
自己编写一个测试索引,插入测试数据,然后查看搜索结果
确认没有问题之后,在让开发插入新商品的数据
测试
第十六章 中文分词(二)
1.字典二次创建,因为原来的已经用原来的字典分配好了,不会加载新的词典进去分配
cd /etc/elasticsearch/analysis-ik/
mkdir custom
cd custom
[root@mongo-01 custom]# cat mydict.dic
地球
chown -R elasticsearch:elasticsearch custom
[root@db01 analysis-ik]# vim IKAnalyzer.cfg.xml
image.png
2.重启配置文件
systemctl restart elasticsearch