2.Elasticsearch集群管理

2022-05-01 分类:ELK 阅读(378) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.Elasticsearch集群概念介绍

1.Elasticsearch集群特点

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

2.分片和副本


主分片: 实际存储的数据,负责读写,粗框的是主分片
副本分片: 主分片的副本,提供读,同步主分片,细框的是副本分片
分片指的是将数据分成几份。主分片和副本分片数量一致
副本
:相当于备份,是主分片的备份,副本数量可以自定义

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

3.节点类型

Cluster state:集群相关的数据称为cluster state;会存储在每个节点中,主要有以下信息:
1)节点信息,比如节点名称、节点连接地址等
2)索引信息,比如索引名称、索引配置信息等
Master节点:
1.ES集群中只能有一个master节点,master节点用于控制整个集群的操作;
2.master主要维护Cluster state,当有新数据产生后,Master会将最新的数据同步给其他Node节点,
3.master节点是通过选举产生的,可以通过node.master: true 指定为master选举节点(默认为 true)
Data节点
1.存储数据的节点即为data节点,默认节点都是data类型,相关配置node.data: true (默认为true)
2.当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为data节点
Coordinating节点
1.处理请求的节点即为coordinating节点,该节点为所有节点的默认角色,不能取消
2.coordinating节点主要将请求路由到正确的节点处理。比如创建索引的请求会由coordinating路由到master节点处理;当配置node.master: false、node.data:false则为coordinating节点

4.集群健康状态

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

2.Elasticsearch集群部署

1.Elasticsearch集群部署注意事项

最好是使用干净的环境部署集群,如果以前有单节点的数据,最好备份出来,然后再清空集群数据。
7.x版本之后不需要单独的安装JDK,软件包自带了JDK
插入和读取数据在任意节点都可以执行,效果一样
es-head可以连接集群内任一台服务
主节点负责读写 如果主分片所在的节点坏掉了,副本分片会升为主分片
主节点负责调度 如果主节点坏掉了,数据节点会自动升为主节点
通讯端口 默认会有2个通讯端口:9200和9300 9300并没有在配置文件里配置过 如果开启了防火墙并且没有放开9300端口,那么集群通讯就会失败

2.安装Elasticsearch并编辑配置文件

###安装es
yum localinstall elasticsearch -y
###配置内存锁定
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
###node1配置文件:
[root@es-02 ~]# egrep "^[a-z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-application###集群名称
node.name: es-02###节点名称
path.data: /var/lib/elasticsearch###数据路径
path.logs: /var/log/elasticsearch###es日志路径
bootstrap.memory_lock: true###内存锁定,不使用swap分区
network.host: 0.0.0.0###监听的地址
http.port: 9200###监听的端口
discovery.seed_hosts: ["10.0.0.150","10.0.0.151"]###自动发现的地址
cluster.initial_master_nodes: ["10.0.0.150", "10.0.0.151"]####集群初始化选举节点,只有创建集群的第一次有用,集群创建后参数失效
###node2配置文件:
[root@es-03 ~]# egrep "^[a-z]" /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-application
node.name: es-03
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.150","10.0.0.151","10.0.0.152"]
cluster.initial_master_nodes: ["10.0.0.150","10.0.0.151","10.0.0.152"]

3.启动并检查集群状态

systemctl daemon-reload
systemctl restart elasticsearch
登录elasticsearch-head查看是否多了两个节点

3.Elasticsearch集群增加节点

1.安装并配置新节点es

##安装es
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
##配置内存锁定
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
##node3集群配置文件
[root@es-03 ~]# egrep "^[a-z]" /etc/elasticsearch/elasticsearch.yml 
cluster.name: my-application
node.name: es-03
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.82","10.0.0.81"]
cluster.initial_master_nodes: ["10.0.0.82","10.0.0.81"]

2.添加节点注意

对于新添加的节点来说: 只需要指到集群内任意一个节点的IP和他自己本身的IP即可 discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
对于以前的节点来说: 什么都不需要更改

3.数据分片颜色解释

紫色: 正在迁移
黄色: 正在复制
绿色: 正常

4.集群故障转移实验

1.停掉主节点,观察集群是否正常
2.停掉主节点,是否还会选举出新的主节点
3.停掉主节点,数据分片的分布会不会发生变化,分片状态会不会发生变化
4.停掉主节点,然后在持续的写入数据,等节点恢复之后,会如何处理落后的数据
5.3个节点的Elasticsearch集群,极限情况下最多允许坏几台?
6.主节点故障,集群健康状态发生什么变化?
结论:
1.如果主节点坏掉了,会从活着的数据节点中选出一台新的主节点
2.如果主分片坏掉了,副本分片会升级为主分片
3.如果副本数不满足,会尝试在其他的节点上重新复制一份数据
4.修复上线只需要正常启动故障的节点即会自动加入到集群里,并且自动同步数据
5.7.x版本之后则必须至少2个节点存活集群才能正常工作

4.Elasticsearch集群副本和分片管理

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

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

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

PUT /linux2/
{
 "settings": {
   "number_of_shards": 3, ###设置分片
   "number_of_replicas": 0###设置副本数
 }
}

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

PUT /linux2/_settings/
{
 "settings": {
   "number_of_replicas": 2
 }
}

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

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

5.Elasticsearch集群监控

1.监控注意

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

2.获取监控项的监控命令

使用curl命令获取 ip:/_cat/
例如curl -s 127.0.0.1:9200/_cat/health|grep "green"|wc -l

3.kibana开启和关闭监控

###kibana开启监控
点击kibana面板的堆栈监测按钮-使用内部收集设置
###kibana关闭监控
GET /_cluster/settings
PUT /_cluster/settings
{
 "persistent" : {
   "xpack" : {
     "monitoring" : {
       "collection" : {
         "enabled" : "false"
       }
     }
   }
 }
}

6.Elasticsearch的中文分词器

1.未分词的情况

1.插入测试数据

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

2.查询测试

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

2.中文分词配置

1.前提条件

所有的ES节点都需要安装
所有的ES都需要重启才能生效
中文分词器的版本号要和ES版本号对应 https://github.com/medcl/elasticsearch-analysis-ik

2.配置中文分词器

在线安装
/usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.3/elasticsearch-analysis-ik-7.9.3.zip
离线本地文件安装
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///opt/elasticsearch-analysis-ik-7.9.1.zip

3.重启所有ES节点并创建索引

systemctl restart elasticsearch.service
PUT /news2

4.创建模板

POST /news2/_doc/_mapping?include_type_name=true
{
   "properties": {
       "content": {
           "type": "text",
           "analyzer": "ik_max_word",
           "search_analyzer": "ik_smart"
       }
   }
}

5.插入测试数据

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

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

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

7.Elasticsearch备份恢复

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

1.前提条件

官方地址:
https://www.elastic.co/guide/en/elasticsearch/reference/7.9/snapshot-restore.html
前提条件:
如果是Elasticsearch集群想使用快照功能,则存储快照的目录必须是共享存储,并且所有节点都需要挂载这个目录。
配置NFS:
#服务端配置
yum install nfs-utils -y
cat > /etc/exports << 'EOF'
/data/backup 10.0.0.0/24(rw,sync,all_squash,anonuid=997,anongid=995)
EOF
systemctl restart nfs
showmount -e 10.0.0.51
mkdir /data/backup -p
#客户端配置
yum install nfs-utils -y
mkdir /data/backup -p
mount -t nfs 10.0.0.31:/data/backup /data/backup
df -h

2.所有节点修改Elasticsearch配置文件,添加参数并重启

path.repo: ["/data/backup"]
systemctl restart elasticsearch

3.注册快照

PUT /_snapshot/my_fs_backup
{
    "type": "fs",
    "settings": {
        "location": "/data/backup/my_fs_backup_location",
        "compress": true
    }
}

4.查看快照并创建快照

GET /_snapshot/my_fs_backup
PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true

5.创建指定索引的快照

PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
{
 "indices": "news,news2",
 "ignore_unavailable": true,
 "include_global_state": false
}

6.查询快照信息

GET /_snapshot/my_fs_backup/snapshot_1
GET /_snapshot/my_fs_backup/snapshot_2

7.查看正在运行的快照

GET /_snapshot/my_fs_backup/_current

8.删除快照

DELETE /_snapshot/my_fs_backup/snapshot_2

9.快照还原

###删除存储库
DELETE /_snapshot/my_fs_backup
###全部还原
POST /_snapshot/my_fs_backup/snapshot_1/_restore
##注意全部还原索引不能冲突
###还原部分
POST /_snapshot/my_fs_backup/snapshot_1/_restore?wait_for_completion=true
{
  "indices": "linux,linux76,linux76-lnb",
  "ignore_unavailable": true,
  "include_global_state": false,
  "rename_pattern": "index_(.+)",###匹配需要重命名的索引,避免索引冲突
  "rename_replacement": "restored_index_$1",##重命名后的名字
  "include_aliases": false
}
###恢复的同时更改索引配置
POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
 "indices": "index_1",
 "index_settings": {
   "index.number_of_replicas": 0
 },
 "ignore_index_settings": [
   "index.refresh_interval"
 ]
}

10.以日期命名快照

PUT /_snapshot/my_fs_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E
GET /_snapshot/my_fs_backup/_all

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

1.前提条件

需要node环境
npm -v
node -v

2.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/
cd /opt/
ln -s node-v10.16.3-linux-x64 node
echo 'export PATH=/opt/node/bin:$PATH' >> /etc/profile
source /etc/profile
npm -v
node -v

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

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

4.安装es-dump

cnpm install elasticdump -g

5.备份

备份成可读的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_mapping.json --type=mapping
elasticdump --input=http://10.0.0.51:9200/news2 --output=/data/news2.json --type=data
###可以写到定时任务里实时备份

6.恢复

只恢复数据
elasticdump --input=/data/news2.json --output=http://10.0.0.51:9200/news2
恢复所有数据包含分词器/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

7.批量备份

curl -s 10.0.0.52:9200/_cat/indices|awk '{print $3}'|grep -v "^\."

8.注意事项

1.如果恢复的时候数据冲突了,会被覆盖掉
2.如果已经存在备份文件里没有的数据,会保留下来

9.带密码认证的导出

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

8.Elasticsearch优化

1.官方参考

https://www.elastic.co/guide/en/elasticsearch/reference/current/system-config.html

2.优化建议

1.内存系统建议预留一半
2.每个ES节点不要超过32G
3.关闭swap分区
4.配置文件打开内存锁定参数
5.升级SSD硬盘
6.升级大版本

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1