EBLK之1---Elasticsearch集群

ELK之1---Elasticsearch集群

EB/LK

  • EB/LK架构

image-20201228085615816

  • 阿里云云盾面板

image-20201228085705247

  • ELK面板

image-20201228085730103

第1章 Elasticsearch介绍

Lucene

Lucene是一个高性能的java搜索引擎库,操作非常繁琐,需要具备Java开发经验。

Elasticsearch是基于Lucene之上包装一层外壳,屏蔽了Lucene的复杂操作,即使不会java语 ⾔也可以快速上⼿。

image-20201228090451583

索引

索引就好⽐书的目录,如果我们想快速查看某个章节,只需要找到目录里相应章节对应的页数即
可。

通过目录找到章节,通过章节找到页码这个过程就是索引的过程。

索引的目的就是加快数据搜索的效率。


全文检索

先建⽴索引,再对索引进⾏搜索的过程就叫全文检索(Full-text Search)。

image-20201228090622800


倒排索引

索引是根据章节找到页数,但是如果我并不知道我要找的内容属于哪个章节,⽐如我只知道⼀个
关键词,但是不知道这个关键词属于哪个章节。⼤家可以想⼀下,我们平时利用搜索引擎搜索的
时候是不是也是这种场景呢?
⽐如我们想知道⼀个电影的名字,但是记不起来具体的名字,只知道部分关键词或者剧情的内
容,那这种情景背后如何用技术解决呢?
这时候就不得不提到倒排索引了。
那么什么是倒排索引呢?还是拿书的目录举例⼦:

正常索引:
第1章 Elasticsearch介绍 第10页
第2章 Elasticsearch安装配置 第15页
第3章 Elasticsearch自定义配置 第20页

倒排索引:
关键词 章节
Elasticsearch 第1章 第2章 第3章
安装 第2章
配置 第2章 第3章
自定义 第3章

image-20201228091221446

假设数据里里有以下新闻标题:
1.老男孩教育				 1
2.老男孩教育linux学院		1	1
3.老男孩教育python学院		1	1
4.老男孩教育DBA学院		1	1
5.老男孩教育oldzhang		 1	2
6.老男孩教育安全			1

Elasticsearch 内部分词,倒排索引,评分:
老男孩			  1 2 3 4 5 6
教育			  1 2 3 4 5 6 
linux			2
python			3
DBA				4
oldzhang		5
学院			   2 3 4
安全			   6

用户输入:
老男孩 学院 oldzhang

分词:
老男孩
DBA

打分:
老男孩	
DBA

返回给用户:
4.老男孩教育DBA学院	   1	1

Elasticsearch应用场景

  1. 搜索: 电商,百科,app搜索,搜索结果⾼亮显示

  2. 日志分析和数据挖掘,数据展示

Elasticsearch特点

  1. 高性能,天然分布式集群
  2. 对运维友好,不需要会java语言,开箱即用,配置文件精简
  3. 功能丰富,社区活跃,版本更新特别的快2.6 -- 8.0

Elasticsearch在电商搜索的实现

cat
skuid    name
1        狗粮100kg
2        猫粮50kg
3        猫罐头200g

select * from cat where name 1ike '%狗粮%'

Elasticsearch:
聚合运算之后得到SKUID:
1
2

拿到ID之后,mysq1就只需要简单地where查询即可
mysq1:
select xx from xxx where skuid = 1

第2章 Elasticsearch部署

环境准备

主机名 IP 配置
node-1 10.0.0.51 1C4G
node-2 10.0.0.52 1C2G
node-3 10.0.0.53 1C2G
  • 关闭:selinuxfirewalldNetworkManagerpostfix(非必须)

  • 修改IP地址、主机名

hostnamectl set-hostname node-1
sed -i 's/200/51/g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
  • 关闭SWAP分区
swapoff -a
sed -i '11d' /etc/fstab

Elasticsearch部署

Elasticsearch官网下载

elastic中文社区下载中心

  1. 下载
mkdir -p /data/soft && cd /data/soft
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.1-x86_64.rpm
  1. 安装jdk
对于Elasticsearch7.0之后的版本不需要再独⽴的安装JDK了,软件包里已经自带了最新的JDK,所以直接启动即可。
  1. 安装
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
  1. 启动并加入开机自启
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
  1. 验证:查看端口,页面,日志
netstat -tupln | grep 9200
curl 127.0.0.1:9200
tail -f /var/log/elasticsearch/elasticsearch.log

第3章 Elasticsearch自定义配置

  1. 查看ES配置文件
[root@node-1 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml          # 主配置文件
/etc/elasticsearch/jvm.options                # JVM配置文件
/etc/init.d/elasticsearch                     # init启动脚本
/etc/sysconfig/elasticsearch                  # 环境变量文件
/usr/lib/sysctl.d/elasticsearch.conf          # 内核参数文件
/usr/lib/systemd/system/elasticsearch.service # systemd启动文件
  1. 自定义配置文件
cp /etc/elasticsearch/elasticsearch.yml /opt/
cat > /etc/elasticsearch/elasticsearch.yml << 'EOF'
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.51
http.port: 9200
discovery.seed_hosts: ["10.0.0.51"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF
bootstrap.memory_lock: true # 内存锁,最大堆内存=最小堆内存,启动时锁定内存
# /etc/elasticsearch/jvm.options
-Xms1g
-Xmx1g
  1. 重启服务
systemctl restart elasticsearch.service
  1. 解决内存锁定失败

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

[root@node-1 ~]# tail -f /var/log/elasticsearch/elasticsearch.log
[2020-12-17T19:34:38,132][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

第4章 Elasticsearch插件安装

image-20201228110858703

  1. elasticsearch-head 介绍

elasticsearch-head是⼀款用来管理Elasticsearch集群的第三方插件⼯具。

elasticsearch-Head插件在5.0版本之前可以直接以插件的形式直接安装,但是5.0以后安装方式发⽣了改变,需要nodejs环境⽀持,或者直接使用别⼈封装好的docker镜像,更推荐的是谷歌浏览器的插件。

  1. elasticsearch-head的三种安装方式

    1. npm安装方式
    2. docker安装
    3. google浏览器插件(推荐)
  2. 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 'export PATH=$PATH:/opt/node/bin' >> /etc/profile
source /etc/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
cnpm run start &
  1. es-head谷歌浏览器插件安装

更多工具 --> 扩展程序 --> 开发者模式 --> 选择解压缩后的插件目录

image-20201228111343990

第5章 kibana部署

  1. 安装kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.1-x86_64.rpm
rpm -ivh kibana-7.9.1-x86_64.rpm
  1. 配置kibana
cat <<EOF >> /etc/kibana/kibana.yml
server.port: 5601
server.host: "10.0.0.51"
elasticsearch.hosts: ["http://10.0.0.51:9200"]
kibana.index: ".kibana"
EOF
  1. 启动kibana
systemctl enable kibana
systemctl start kibana
  1. 验证访问http://10.0.0.51:5601/

image-20201228113338912

image-20201228113807635

  1. 清除其他数据库

image-20201228114359070

image-20201228114441167

image-20201228114502702

image-20201228114528015

image-20201228114542974

  1. API操作
curl -XPUT 'http://10.0.0.51:9200/linux/_doc/1' -H 'Content-Type: application/json' -d '
{
  "name": "zhang",
  "age": "29"
}'

image-20201228114646542

粘贴API操作格式转变:

image-20201228114718462

第6章 Elasticsearch插⼊数据

官网参考

Relational DB Elasticsearch
database Indices
Tables Types
rows Documents
columns Fields
POST Indices/Types/
{
 "Fields": "Documents",
}
  1. 使用自定义ID
PUT linux/_doc/1
{
 "name": "zhang",
 "age": "29"
}
  1. 使用随机ID
POST linux/_doc/
{
 "name": "zhang",
 "age": "29",
 "address": "BJ"
}
  1. 保证和mysql数据对应:使用POST随机ID,指定单独一列ID字段
mysql
id name  age address job
1  zhang 27   BJ     it
2  ya    22   SZ     it
POST linux/_doc/
{
 "id": "1",
 "name": "zhang",
 "age": "29",
 "address": "BJ",
 "job": "it"
}
POST linux/_doc/
{
 "id": "2",
 "name": "ya",
 "age": "22",
 "address": "SZ",
 "job": "it"
}

第7章 Elasticsearch查询命令

  1. 创建测试语句
POST linux/_doc/
{
 "name": "zhang3",
 "age": "22",
 "address": "SZ",
 "job": "ops"
}
POST linux/_doc/
{
 "name": "li4",
 "age": "30",
 "address": "BJ",
 "job": "dev"
}
POST linux/_doc/
{
 "name": "wang5",
 "age": "24",
 "address": "BJ",
 "job": "dev"
}
POST linux/_doc/
{
 "name": "zhao6",
 "age": "35",
 "address": "SZ",
 "job": "devops"
}
POST linux/_doc/
{
 "name": "sun7",
 "age": "21",
 "address": "BJ",
 "job": "ops"
}
POST linux/_doc/
{
 "name": "jack",
 "age": "27",
 "address": "BJ",
 "job": "devops"
}
POST linux/_doc/
{
 "name": "scott",
 "age": "25",
 "address": "SZ",
 "job": "dev"
}
  1. 简单查询
GET linux/_search/
  1. 条件查询
GET linux/_search
{
  "query": {
    "term": {
      "name": {
        "value": "zhang3"
      }
    }
  }
}
GET linux/_search
{
  "query": {
    "term": {
      "job": {
        "value": "ops"
      }
    }
  }
}
  1. 多条件查询
GET /linux/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "BJ"
          }
        },
        {
          "match": {
            "job": "dev"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 27,
            "lte": 30
          }
        }
      }
    }
  }
}

image-20201228145018369

第8章 Elasticsearch更新命令

  1. 自定义的ID更新
PUT linux/info/1
{
 "name": "zhang",
 "age": 30,
 "job": "it",
 "id": 1
}
  1. 随机ID更新

创建测试数据

PUT linux/_doc/1
{
 "name": "zhang",
 "age": "30",
 "job": "it",
 "id": 2
}

先根据自定义的Id字段查出数据的随机ID

GET linux/_search/
{
  "query": {
    "term": {
      "id": {
        "value": "2"
      }
    }
  }
}

取到随机ID后更改数据

PUT linux/_doc/CVDdknIBq3aq7mPQaoWw
{
 "name": "tony",
 "age": 30,
 "job": "it",
 "id": 2
}

删除:DELETE linux/_doc/Iz0UqHYBKb3_fEmINvjQ

建议先关闭,等一段时间后,备份,最后删除

image-20201228145621132

第9章 Elasticsearch集群概念介绍

  1. Elasticsearch集群特点

对运维友好:不需要太多java的知识也可以很方便的维护整个集群。
搭建方便:搭建副本⾮常简单,只需要将新节点加⼊已有集群即可,会自动同步数据。
自动故障转移:当节点出现故障时,会自动故障转移,将有数据复制到其他正常的节点。

image-20201228153748911

  1. 数据分片

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

  1. 副本

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

  1. 默认分⽚和副本规则

7.x版本之前默认规则:1副本,5分⽚
7.x版本之后默认规则:1副本,1分⽚

  1. 节点类型

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

  1. 集群健康状态

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

第10章 Elasticsearch集群部署

  1. 部署集群前注意

如果以前有单节点的数据,最好备份出来,然后再清空集群数据。

  1. 新节点安装java

7.x版本之后不需要单独的安装JDK,软件包自带了JDK

  1. 新节点安装Elasticsearch
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
  1. 配置内存锁定
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload
systemctl restart elasticsearch.service
  1. node1配置文件
cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.51
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF
  1. node2配置文件
cat> /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.52
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF
cluster.name: oldboy_linux                       # 集群名称
node.name: node-1                                # 节点名称
path.data: /var/lib/elasticsearch                # 数据目录
path.logs: /var/log/elasticsearch                # 日志目录
bootstrap.memory_lock: true                      # 设置内存锁定
network.host: 127.0.0.1,10.0.0.51                # 本地监听地址
http.port: 9200                                  # 本地端⼝
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]  # 集群节点互相发现的地址,不需要把所有节点IP都写上。
cluster.initial_master_nodes: ["10.0.0.51"]      # 集群初始化节点,只有创建集群的第⼀次有用,集群创建后参数失效。
  1. 以前单节点有数据,先停⽌运⾏,然后清空数据,再启动
systemctl stop elasticsearch.service
rm -rf /var/lib/elasticsearch/*
systemctl start elasticsearch
  1. 查看日志
tail -f /var/log/elasticsearch/oldboy_linux.log
  1. 检查集群:ES-head查看是否有2个节点

image-20201228152756755

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

第11章 Elasticsearch集群扩容

  1. 安装java

  2. 安装ES

  3. 配置内存锁定

  4. node3集群配置文件

cat> /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.53
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
EOF
  1. 添加节点注意

    • 对于新添加的节点来说:
      只需要直到集群内任意⼀个节点的IP和他自己本身的IP即可
      discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
    • 对于以前的节点来说:
      什么都不需要更改
  2. 数据分⽚颜⾊解释

    • 紫⾊: 正在迁移
    • ⻩⾊: 正在复制
    • 绿⾊: 正常
  3. 集群故障转移实验

1.停掉主节点,观察集群是否正常
2.停掉主节点,是否还会选举出新的主节点
3.停掉主节点,数据分片的分布会不会发生变化,分片状态会不会发生变化
4.停掉主节点,然后在持续的写入数据,等节点恢复之后,会如何处理落后的数据
5.3个节点的Elasticsearch集群,极限情况下最多允许坏几台? 
6.主节点故障,集群健康状态发生什么变化?

结论:

1.如果主节点坏掉了,会从活着的数据节点中选出一台新的主节点
2.如果主分片坏掉了,副本分片会升级为主分片
3.如果副本数不满足,会尝试在其他的节点上重新复制一份数据
4.修复上线只需要正常启动故障的节点即会自动加入到集群里,并且自动同步数据
5.7.x版本之前允许单个节点的集群运⾏。
  7.x版本之后则必须至少2个节点存活集群才能正常工作

image-20201222145109387

image-20201222161714345

image-20201222161848055

第12章 Elasticsearch集群维护

  1. 自定义副本数和索引数参数注意事项

索引⼀旦建⽴完成,分⽚数就不可以修改了,但是副本数可以随时修改

  1. 创建索引的时候就自定义副本和分⽚
PUT /linux2/
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  }
}
  1. 修改单个索引的副本数
PUT /linux2/_settings/
{
  "settings": {
    "number_of_replicas": 2
  }
}
  1. 修改所有的索引的副本数
PUT /_all/_settings/
{
  "settings": {
    "number_of_replicas": 0
  }
}
  1. ⼯作如何设置

2个节点: 默认就可以

3个节点: 重要的数据,2副本 不重要的默认

日志收集: 1副本3分⽚

image-20201222165008364

image-20201222165036682

第13章 ES监控

  1. 监控注意

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

  1. 监控命令
GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/linux
# zabbix监控:集群健康状态 OR 节点个数
# 查看集群健康状态
curl -s 127.0.0.1:9200/_cat/health|grep "green"|wc -l
# 查看节点个数
curl -s 127.0.0.1:9200/_cat/nodes|wc -l
  1. kibana开启监控

点击kibana⾯板的监控按钮

image-20201228170339085

image-20201228170105555

image-20201228170439853

image-20201228170447300

image-20201228170510535

  1. kibana关闭监控
GET /_cluster/settings
PUT /_cluster/settings
{
  "persistent": {
    "xpack": {
      "monitoring": {
        "collection": {
          "enabled": "false"
        }
      }
    }
  }
}

第14章 中文分词器

未配置中文分词

  1. 插⼊测试数据
POST /news/_doc/1
{"content":"美国留给伊拉克的是个烂摊⼦吗"}

POST /news/_doc/2
{"content":"公安部:各地校⻋将享最⾼路权"}

POST /news/_doc/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}

POST /news/_doc/4
{"content":"中国驻洛杉矶领事馆遭亚裔男⼦枪击 嫌犯已自⾸"}
  1. 查询测试
POST /news/_search
{
  "query": { "match": { "content": "中国" }},
  "highlight": {
    "pre_tags": ["<tag1>", "<tag2>"],
    "post_tags": ["</tag1>", "</tag2>"],
    "fields": {
      "content": {}
    }
  }
}
  1. 结论

未配置中文分词器时,查询中文会将词拆分成⼀个⼀个的汉字。

配置中文分词

  1. 前提条件
所有的ES节点都需要安装
所有的ES都需要重启才能⽣效
中文分词器的版本号要和ES版本号对应
https://github.com/medcl/elasticsearch-analysis-ik
  1. 配置中文分词器
  • 在线安装
/usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip
  • 离线本地文件安装
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///opt/elasticsearch-analysis-ik-7.9.1.zip
  1. 重启所有ES节点生效
systemctl restart elasticsearch.service
  1. 创建索引
PUT /news2
  1. 创建模板,指定:search_analyzer
POST /news2/_doc/_mapping?include_type_name=true
{
  "properties": {
    "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    }
  }
}
  1. 插⼊测试数据
POST /news2/_doc/1
{"content":"美国留给伊拉克的是个烂摊⼦吗"}

POST /news2/_doc/2
{"content":"公安部:各地校⻋将享最⾼路权"}

POST /news2/_doc/3
{"content":"中韩渔警冲突调查:韩警平均每天扣1艘中国渔船"}

POST /news2/_doc/4
{"content":"中国驻洛杉矶领事馆遭亚裔男⼦枪击 嫌犯已自⾸"}
  1. 再次查询数据发现已经能识别中文了
POST /news2/_search
{
  "query" : { "match" : { "content" : "中国" }},
  "highlight" : {
    "pre_tags" : ["<tag1>", "<tag2>"],
    "post_tags" : ["</tag1>", "</tag2>"],
    "fields" : {
      "content" : {}
    }
  }
}

根据字典拆,没有就拆到最小,因此需要更新中文分词库。

ll /etc/elasticsearch/analysis-ik/main.dic

热更新中文分词库

  1. 安装nginx
yum install nginx -y
  1. 编写字典文件
cat >>/usr/share/nginx/html/my_dic.txt<<EOF
北京
张亚
武汉
中国
深圳
EOF
  1. 启动并测试
nginx -t
systemctl start nginx
curl 127.0.0.1/my_dic.txt
  1. 配置es启用中文分词器插件
cat <<EOF >/etc/elasticsearch/analysis-ik/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>
EOF
  1. 将修改好的IK配置文件,复制到其他所有ES节点
scp -rp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.52:/etc/elasticsearch/analysis-ik/
scp -rp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.53:/etc/elasticsearch/analysis-ik/
  1. 重启所有的ES节点
systemctl restart elasticsearch.service
  1. 查看日志里字典的词有没有加载出来
tail -f /var/log/elasticsearch/oldboy_linux.log
[2020-12-18T10:27:08,126][INFO ][o.w.a.d.Dictionary ] [node-1]
start to reload ik dict.
[2020-12-18T10:27:08,127][INFO ][o.w.a.d.Dictionary ] [node-1] try
load config from /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
[2020-12-18T10:27:08,538][INFO ][o.w.a.d.Dictionary ] [node-1]
[Dict Loading] http://10.0.0.51/my_dic.txt
[2020-12-18T10:27:08,540][INFO ][o.w.a.d.Dictionary ] [node-1] 北京
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 张亚
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 武汉
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 中国
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 深圳
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1]
reload ik dict finished.
  1. 更新字典内容,看日志里会不会自动加载
echo "老男孩教育" >> /usr/share/nginx/html/my_dic.txt
  1. 搜索测试验证结果
POST /news2/_doc/7
{
 "content":"学Linux来老男孩教育"

POST /news2/_search
{
  "query" : { "match" : { "content" : "老男孩教育" }},
  "highlight" : {
    "pre_tags" : ["<tag1>", "<tag2>"],
    "post_tags" : ["</tag1>", "</tag2>"],
    "fields" : {
      "content" : {}
    }
  }
}
  1. 电商上架新产品流程
    1. 先把新上架的商品的关键词更新到词典里
    2. 查看ES日志,确认新词被动态更新了
    3. 自己编写⼀个测试索引,插⼊测试数据,然后查看搜索结果
    4. 确认没有问题之后,在让开发插⼊新商品的数据
    5. 测试

第15章 备份恢复

使用官方的快照snap功能备份恢复

image-20201229092542123

  1. 前提条件

官方文档

如果是Elasticsearch集群想使用快照功能,则存储快照的目录必须是共享存储,并且所有节点都需要挂载这个目录。

  1. 配置NFS服务端
yum install nfs-utils -y
cat > /etc/exports << 'EOF'
/data/backup 10.0.0.0/24(rw,sync,all_squash,anonuid=998,anongid=996)
EOF
mkdir /data/backup -p
systemctl start nfs
showmount -e 10.0.0.51
  1. 所有节点创建目录,并授权
yum install nfs-utils -y
mkdir /data/backup -p
chown -R elasticsearch:elasticsearch /data/backup/
mount -t nfs 10.0.0.51:/data/backup /data/backup
df -h
  1. 所有节点修改Elasticsearch配置文件,添加参数
cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
path.repo: ["/data/backup"]
EOF
  1. 重启ES生效
systemctl restart elasticsearch
  1. 注册快照存储库
PUT /_snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "/data/backup/my_fs_backup_location",
    "compress": true
  }
}
  1. 查看所有快照
GET /_snapshot/my_fs_backup
  1. 创建快照:全备
PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true
  1. 创建指定索引的快照
PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
{
  "indices": "news1,news2",
  "ignore_unavailable": true,
  "include_global_state": false
}
  1. 查询快照信息
GET /_snapshot/my_fs_backup/snapshot_1
GET /_snapshot/my_fs_backup/snapshot_2
  1. 查看正在运行的快照
GET /_snapshot/my_fs_backup/_current
  1. 删除快照
DELETE /_snapshot/my_fs_backup/snapshot_2
  1. 删除存储库
DELETE /_snapshot/my_fs_backup
  1. 全部还原
POST /_snapshot/my_fs_backup/snapshot_1/_restore
  1. 还原部分:包括全局声明和同名重命名
POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
  "indices": "news1,news2",
  "ignore_unavailable": true,
  "include_global_state": true,
  "rename_pattern": "news(.+)",
  "rename_replacement": "restored_news_$1"
}
  1. 恢复的同时更改索引配置
POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
  "indices": "index_1",
  "index_settings": {
    "index.number_of_replicas": 0
  },
  "ignore_index_settings": [
    "index.refresh_interval"
  ]
}
  1. 以日期命名快照
PUT /_snapshot/my_fs_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E
GET /_snapshot/my_fs_backup/_all

使用第三方工具elasticdump备份恢复

elasticdump Github

  1. 依赖node环境,安装nodejs
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/
ln -s /opt/node-v10.16.3-linux-x64 /opt/node
echo 'export PATH=/opt/node/bin:$PATH' >> /etc/profile
. /etc/profile
npm -v
node -v
  1. 指定使用国内淘宝npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 安装es-dump
cnpm install elasticdump -g
  1. 备份成可读的json格式
elasticdump \
  --input=http://10.0.0.51:9200/news2 \
  --output=/data/news2.json \
  --type=data
  1. 备份成压缩格式
elasticdump \
  --input=http://10.0.0.51:9200/news2 \
  --output=$|gzip > /data/news2.json.gz 
  1. 备份分词器/mapping/数据一条龙服务
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
  1. 只恢复数据
elasticdump \
  --input=/data/news2.json \
  --output=http://10.0.0.51:9200/news2
  1. 恢复所有数据包含分词器/mapping一条龙服务
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
  1. 批量备份
curl -s 10.0.0.52:9200/_cat/indices|awk '{print $3}'|grep -v "^\."
  1. 注意

    • 如果恢复的时候数据冲突了,会被覆盖掉
    • 如果已经存在备份文件里没有的数据,会保留下来
  2. 带密码认证的导出

--input=http://name:password@production.es.com:9200/my_index

第16章 安全认证

官方文档

  1. node-1生成证书和密钥
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

密码可以不填,全部回车即可。

  1. 所有节点创建证书目录
mkdir /etc/elasticsearch/certs
  1. node-1复制证书到合适的位置,并推送到集群所有节点
cp /usr/share/elasticsearch/*.p12 /etc/elasticsearch/certs/
scp -r /etc/elasticsearch/certs 10.0.0.52:/etc/elasticsearch/
scp -r /etc/elasticsearch/certs 10.0.0.53:/etc/elasticsearch/
  1. 所有节点证书修改权限
chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/
  1. node-1修改ES配置文件:开启安全功能
cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate 
xpack.security.transport.ssl.keystore.path: certs/elastic-stack-ca.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-stack-ca.p12
EOF
  1. 所有节点重启ES生效
systemctl restart elasticsearch
  1. node-1配置内置用户(7个用户)的密码
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user.
You will be prompted to enter passwords as the process progresses.
Please confirm that you would like to continue [y/N]y


Enter password for [elastic]: 
Reenter password for [elastic]: 
Enter password for [apm_system]: 
Reenter password for [apm_system]: 
Enter password for [kibana_system]: 
Reenter password for [kibana_system]: 
Enter password for [logstash_system]: 
Reenter password for [logstash_system]: 
Enter password for [beats_system]: 
Reenter password for [beats_system]: 
Enter password for [remote_monitoring_user]: 
Reenter password for [remote_monitoring_user]: 
Changed password for user [apm_system]
Changed password for user [kibana_system]
Changed password for user [kibana]
Changed password for user [logstash_system]
Changed password for user [beats_system]
Changed password for user [remote_monitoring_user]
Changed password for user [elastic]
  1. kibana配置密码认证
cat <<EOF >>/etc/kibana/kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "elastic"
EOF
  1. 重启kibana生效
systemctl restart kibana
  1. 访问elasticsearch-head测试:管理员 elastic

image-20201229103559431

  1. 访问kibana测试:管理员 elastic

image-20201228183252422

  1. 注意事项
    1. 一定要先配置证书认证,再配置密码,不然就会报错。
    2. 默认创建的证书是root只读权限,需要设置为elasticsearch只读权限。
    3. 配置账号密码命令只需要在master节点配置即可。
    4. 配置账号密码命令只能运行一次,再次运行就会报错。
    5. 初始化的账号密码仅仅是作为组件之间传输信息使用,并不是给用户使用的。
    6. 给用户分配权限:需要在kibana里以elastic用户登录,创建新用户和新角色。

image-20201229103752860

image-20201229103817152

第17章 ES优化

  1. 内存:
    1. 系统建议预留一半
    2. 每个ES节点不要超过32G
    3. 关闭swap分区
    4. 配置文件打开内存锁定参数
  2. 升级SSD硬盘
  3. 升级大版本
  4. 加机器:官方参考文档
posted @ 2021-01-03 18:12  原因与结果  阅读(213)  评论(0编辑  收藏  举报