1. 部署说明
elasticsearch集群规划为三个节点,elasticsearch版本为7.8.1
2. 下载安装包
1)下载 Elasticsearch7.8.1安装包
# cd /opt
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.8.1-linux-x86_64.tar.gz
3. Elasticsearch安装
3.1 解压
cd elasticsearch-7.8.1
# tar -zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz
3.2 修改配置
1)jvm.options调整内存大小
# vi config/jvm.options
#-Xms4g
#-Xmx4g
-Xms1g
-Xmx1g
2)修改elasticsearch.yml
集群规划为三个节点,三个节点的配置,只有node.name: es-node1 不同,请分别配置
node1:
node.name: es-node1
transport.tcp.port: 9300
node2:
node.name: es-node2
transport.tcp.port: 9301
node3:
node.name: es-node3
transport.tcp.port: 9302
具体配置如下
# vi config/elasticsearch.yml
#集群名称,三台集群,要配置相同的集群名称
cluster.name: es-cluster
#节点名称
node.name: es-node1
#是不是有资格主节点
node.master: true
#是否存储数据
node.data: true
#最⼤集群节点数
node.max_local_storage_nodes: 3
# 数据和日志存储路径
path.data: /opt/elasticsearch-7.8.1/data
path.logs: /opt/elasticsearch-7.8.1/logs
# 三个节点配置备份路径白名单,此处如果不指定,在备份索引的时候会报错
path.repo: ["/opt/elasticsearch-7.8.1/backup", "/data/esbackup"]
#⽹关地址
network.host: 0.0.0.0
#端⼝
http.port: 9200
#内部节点之间沟通端⼝
transport.tcp.port: 9300
#es7.x 之后新增的配置,写⼊候选主节点的设备地址,在开启服务后可以被选为主节点
discovery.seed_hosts: ["10.3.9.202:9300", "10.3.9.203:9301", "10.3.9.204:9302"]
#es7.x 之后新增的配置,初始化⼀个新的集群时需要此配置来选举master
cluster.initial_master_nodes: ["es-node1", "es-node2", "es-node3"]
##末尾添加
indices.memory.index_buffer_size: 40%
thread_pool.write.size: 3
thread_pool.write.queue_size: 1000
indices.fielddata.cache.size: 40%
#允许跨域访问
http.cors.enabled: true
http.cors.allow-origin: "*"
3.3 创建用户
#创建es用户,adduser会在/home目录下会自动创建同名文件夹
# adduser es
#修改es用户密码,接着输入两次密码123456
# passwd es
#给新用户文件夹权限
# chown -R es /opt/elasticsearch-7.8.1
3.4 启动
#切换成新建的es用户
# su es
$ cd elasticsearch-7.6.2/
$ ./bin/elasticsearch
3.4.1 排错
cmd
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
#修改系统内核参数
#切换到root用户
$ su
#修改limits.conf
# vi /etc/security/limits.conf
#es : 表示用户,* 表示所有用户
#soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。
#hard xxx : 代表严格的设定,不允许超过这个设定的值
#nofile : 是每个进程可以打开的文件数的限制
#nproc : 是操作系统级别对每个用户创建的进程数的限制
es soft nofile 65536 #es用户可打开的文件描述符的最大数(超过会警告)
es hard nofile 65536 #es用户可打开的文件描述符的最大数(超过会报错)
es soft nproc 4096 #es用户可用的最大进程数量(超过会警告)
es hard nproc 4096 #es用户可用的最大进程数量(超过会报错)
编辑 /etc/security/limits.conf,追加以下内容;
* soft nofile 65536
* hard nofile 65536
此文件修改后需要重新登录用户,才会生效
#修改sysctl.conf,在末尾追加
# vi /etc/sysctl.conf
vm.max_map_count=262144
#使修改立即生效
# sysctl -p
3.4.2 后台启动
es三个节点配置完成后,分别启动三个节点的elasticsearch进程
cmd
#切换成es用户来启动
# su es
$ nohup ./bin/elasticsearch &
#查看控制台
# tail -f nohup.out
#关闭
# ps aux |grep elasticsearch
# kill -9 2382(进程号)
3.5 访问
浏览器请求http://10.3.9.202:9200/、http://10.3.9.203:9200/、http://10.3.9.204:9200/
{
"name" : "es-node1",
"cluster_name" : "es-cluster",
"cluster_uuid" : "QhAtHT6XQ7yvZAYw8I7qaw",
"version" : {
"number" : "7.8.1",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "b5ca9c58fb664ca8bf9e4057fc229b3396bf3a89",
"build_date" : "2020-07-21T16:40:44.668009Z",
"build_snapshot" : false,
"lucene_version" : "8.5.1",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
3.5.1 查看es状态
浏览器访问或者curl命令
1)查看集群状态信息
http://10.3.9.202:9200/_cluster/stats?pretty
-
查看集群健康状态
http://10.3.9.202:9200/_cluster/health?pretty
{
"cluster_name" : "es-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3, ##集群节点数
"number_of_data_nodes" : 3, ##数据节点数量
"active_primary_shards" : 0, ##主分片数量
"active_shards" : 0, ##可用的分片数量
"relocating_shards" : 0, ##正在重新分配的分片数量,在新加或者减少节点的时候会发生
"initializing_shards" : 0, ##正在初始化的分片数量,新建索引或者刚启动会存在,时间很短
"unassigned_shards" : 0, ##没有分配的分片,一般就是那些名存实不存的副本分片。
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 100.0
}
集群三种状态
green 所有主要分片和复制分片都可用
yellow 所有主要分片可用,但不是所有复制分片都可用。高可用不牢靠。但不会丢失数据
red 不是所有的主要分片都可用。数据有极大风险。数据不能用
3)查看集群状态查看集群将康状态
http://10.3.9.202:9200/_cat/health?v
4)集群状态查询
##索引级别集群状态,可以细致查看到底是哪个索引引起集群的故障的
GET _cluster/health?level=indices
##分片级别集群状态,可以细致查看到底是哪个分片引起的集群故障
GET _cluster/health?level=shards
##阻塞查看集群状态,适用于自动化脚本。当状态变为指定状态或者更好就返回继续执行。
GET _cluster/health?wait_for_status=yellow
5)##监控单个节点状态信息,各部分节点数据的解释请参看网址
https://www.elastic.co/guide/cn/elasticsearch/guide/current/_monitoring_individual_nodes.html
GET _nodes/stats
-
集群状态信息,比第一个更详细
GET _cluster/stats
7)索引级别的统计信息,比节点级别的统计信息详细。但是并不很实用
GET my_index/_stats
GET my_index,another_index/_stats
GET _all/_stats
8)统计 my_index 索引。
使用逗号分隔索引名可以请求多个索引统计值。
使用特定的 _all 可以请求全部索引的统计值
9)单机集群颜色为yellow:
curl -XPUT 'http://90.11.35.127:9200/_settings' -H 'content-Type:application/json' -d'
{
"number_of_replicas": 0
}'
4. es集群备份和恢复
4.1 es索引index备份
参考官网文档:
备份集群:https://www.elastic.co/guide/cn/elasticsearch/guide/current/backing-up-your-cluster.html
备份集群使用 snapshot API,集群里当前的状态和数据然后保存到一个共享仓库里。第一个快照会是一个数据的完整拷贝,但是所有后续的快照会保留的是已存快照和新数据之间的差异。
1) 备份前首先创建一个保存数据的仓库。
有多个仓库类型可以选择:
- 共享文件系统,比如 NAS
- Amazon S3
- HDFS (Hadoop 分布式文件系统)
- Azure Cloud
本次备份方案使用NFS共享存储
2) 挂载nfs存储
所有节点安装nfs-utils
# yum install nfs-utils -y
# mkdir -p /data/esbackup/
# mount -t nfs 10.3.9.70:/nfsdata /data/esbackup/
添加到开机启动命令
# vi /etc/fstab
10.3.9.70:/nfsdata /data/esbackup nfs defaults 0 0
修改权限
# chown -R es /data/esbackup/
3) 创建snapshot仓库
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/2021-12-28 -d '
{
"type": "fs",
"settings": {
"location": "/data/esbackup"
}
}'
参数说明:
- 给仓库取一个名字,在本例它叫2021-12-28
- 指定仓库的类型是共享文件系统。type:fs // 仓库类型为共享文件系统
- 提供一个已挂载的设备作为目的地址。
注意:共享文件系统路径必须确保集群所有节点都可以访问到。
上述命令会在挂载点创建仓库和所需的元数据。还可以配置节点、网络的性能状况和仓库位置:
max_snapshot_bytes_per_sec
当快照数据进入仓库时,这个参数控制这个过程的限流情况。默认是每秒 20mb 。
max_restore_bytes_per_sec
当从仓库恢复数据时,这个参数控制什么时候恢复过程会被限流以保障你的网络不会被占满。默认是每秒 20mb。
假设有一个非常快的网络,而且对额外的流量带宽很高,那可以增加这些默认值:
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/2021-12-28 -d '
{
"type": "fs",
"settings": {
"location": "/data/esbackup",
"max_snapshot_bytes_per_sec": "50mb",
"max_restore_bytes_per_sec": "50mb"
}
}'
#列出仓库
curl -XGET http://127.0.0.1:9200/_snapshot/*
#删除仓库
curl -XDELETE http://127.0.0.1:9200/_snapshot/2021-12-28
创建索引的快照
1、快照的创建
创建快照,默认为异步执行,添加参数wait_for_completion则为同步等待,如下:
PUT _snapshot/my_backup/snapshot_1?wait_for_completion=true
my_backup:仓库名称
snapshot_1:快照名称
2、索引配置
由于es集群环境中一般除了业务数据索引外还会有kibana或监控的索引,所以一般会指定需要快照的索引,如下:
PUT _snapshot/my_backup/snapshot_2{
"indices": "index_1,index_2"
}
3、获取快照相关信息
获取某仓库下的一个或索引的快照信息,如下:
GET _snapshot/my_backup/snapshot_2
或
GET _snapshot/my_backup/_all
4、具体创建快照命令
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/2021-12-28/xx_app_event-2021-12-28?wait_for_completion=true -d '
{
"indices": "xx_app_event"
}'
备注:请求体中indices指定需要备份的索引(多个用逗号隔开),也可以不指定,这样会备份所有的es索引库数据。
执行后最终返回如下信息表示备份创建成功:
{
"accepted": true
}
#列出快照
curl -XGET http://127.0.0.1:9200/_snapshot/2021-12-28/*
#删除快照
curl -XDELETE http://127.0.0.1:9200/_snapshot/2021-12-28/xx_app_event-2021-12-28
curl -XDELETE http://127.0.0.1:9200/_snapshot/2021-12-28/xx_app_startup-2021-12-28
curl -XDELETE http://127.0.0.1:9200/_snapshot/2021-12-28/xx_app_switch_menu-2021-12-28
索引恢复
从镜像中恢复快照数据
-
查询2021-12-28仓库下的快照信息
curl -XGET "http://127.0.0.1:9200/_snapshot/2021-12-28/_all?pretty"
"snapshots" : [
"snapshot" : "xx_app_event-2021-12-28",
"snapshot" : "xx_app_startup-2021-12-28",
"snapshot" : "xx_app_switch_menu-2021-12-28", -
恢复快照数据
-
为本机恢复
本机节点恢复数据直接执行如下请求即可 -
为其他节点恢复
如果需要对其他节点机器上的es进行数据恢复,
如果使用nfs共享文件系统,需要在新集群创建仓库 ,然后执行索引还原 即可
如果不使用nfs共享文件系统,需要将备份出来的索引复制到新集群的服务器 上,然后创建仓库 ,最后执行索引还原命令 。
还原命令如下:curl -H "Content-Type: application/json" -XPOST 'http://127.0.0.1:9200/_snapshot/2021-12-28/xx_app_event-2021-12-28/_restore' -d '{
"indices": "xx_app_event"
}'
-d 可选参数:
"rename_pattern": "index_(.+)",
"rename_replacement": "restored_xx_app_event_index_2021-12-28",
"index_settings": {
"index.number_of_replicas": 1
},
"ignore_index_settings": [
"index.refresh_interval"
]
可以使用wait_for_completion=true同步获取结果,并且可以使用indices参数指定需要恢复的索引的名称。
使用rename_replacement参数重命名恢复后的索引名称。
4.2索引自动备份脚本
1)索引备份脚本说明
首先在/data/esbackup创建仓库路径、创建snapshot仓库,循环创建三个索引xx_app_event xx_app_startup xx_app_switch_menu的备份
2)具体脚本内容如下
#!/bin/bash
ES_BACKUP_DIR=/data/esbackup
DATE_TODAY=`date -d "0 day" +%Y-%m-%d`
INDEX=(xx_app_event xx_app_startup xx_app_switch_menu)
if [[ ! -d ${ES_BACKUP_DIR}/${DATE_TODAY} ]];then
mkdir -p ${ES_BACKUP_DIR}/${DATE_TODAY}
fi
chown -R es ${ES_BACKUP_DIR}/${DATE_TODAY}
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/${DATE_TODAY} -d '
{
"type": "fs",
"settings": {
"location": "'${ES_BACKUP_DIR}'/'${DATE_TODAY}'",
"max_snapshot_bytes_per_sec": "50mb",
"max_restore_bytes_per_sec": "50mb"
}
}'
if [[ $? == 0 ]];then
echo "${DATE_TODAY} REPOSITORY CREATE SUCCESS!"
fi
for i in ${INDEX[@]}
do
curl -H "Content-Type: application/json" -XPUT http://127.0.0.1:9200/_snapshot/${DATE_TODAY}/${i}-${DATE_TODAY}?wait_for_completion=true -d '
{
"indices": "'${i}'"
}'
if [[ $? == 0 ]];then
echo "${i}-${DATE_TODAY} INDEX CREATE SUCCESS!"
fi
done
#--------------snap data compress--------------
cd ${ES_BACKUP_DIR}
tar czvf ${DATE_TODAY}.tg.gz ${DATE_TODAY}
rm -rf ${DATE_TODAY}
cd -
echo "End time: `date +%Y-%m-%d_%H:%m:%S`"
3)执行脚本
./es_index_backup.sh
{"acknowledged":true}2021-12-28 REPOSITORY CREATE SUCCESS!
{"snapshot":{"snapshot":"xx_app_event-2021-12-28","uuid":"vseR_GeyR3WG3CEXAYTiWA","version_id":7080199,"version":"7.8.1","indices":["xx_app_event"],"include_global_state":true,"state":"SUCCESS","start_time":"2021-12-28T15:29:58.640Z","start_time_in_millis":1640705398640,"end_time":"2021-12-28T15:29:58.840Z","end_time_in_millis":1640705398840,"duration_in_millis":200,"failures":[],"shards":{"total":3,"failed":0,"successful":3}}}xx_app_event-2021-12-28 INDEX CREATE SUCCESS!
{"snapshot":{"snapshot":"xx_app_startup-2021-12-28","uuid":"ZfMxQHjsSUKzHAswnsAfVg","version_id":7080199,"version":"7.8.1","indices":["xx_app_startup"],"include_global_state":true,"state":"SUCCESS","start_time":"2021-12-28T15:29:59.040Z","start_time_in_millis":1640705399040,"end_time":"2021-12-28T15:29:59.040Z","end_time_in_millis":1640705399040,"duration_in_millis":0,"failures":[],"shards":{"total":3,"failed":0,"successful":3}}}xx_app_startup-2021-12-28 INDEX CREATE SUCCESS!
{"snapshot":{"snapshot":"xx_app_switch_menu-2021-12-28","uuid":"vt9LZ48USm2eO3b-bVdk6w","version_id":7080199,"version":"7.8.1","indices":["xx_app_switch_menu"],"include_global_state":true,"state":"SUCCESS","start_time":"2021-12-28T15:29:59.240Z","start_time_in_millis":1640705399240,"end_time":"2021-12-28T15:29:59.240Z","end_time_in_millis":1640705399240,"duration_in_millis":0,"failures":[],"shards":{"total":3,"failed":0,"successful":3}}}xx_app_switch_menu-2021-12-28 INDEX CREATE SUCCESS!
4)设置定时任务
定时任务设置每天的23点01分执行
编辑定时任务
crontab -e
写入如下内容
01 23 * * *
4.3 配置优化,修改search.max_buckets
通过 API 调用的方式动态进行配置
# curl -XPUT "http://10.3.9.202:9200/_cluster/settings" -H "Content-Type:application/json" -d "{\"persistent\":{\"search.max_buckets\":100000}}"
调整es集群三个节点的max_buckets配置
curl -XPUT "http://90.11.35.182:9200/_cluster/settings" -H "Content-Type:application/json" -d "{\"persistent\":{\"search.max_buckets\":524288}}"
curl -XPUT "http://90.11.35.71:9200/_cluster/settings" -H "Content-Type:application/json" -d "{\"persistent\":{\"search.max_buckets\":524288}}"
curl -XPUT "http://90.11.35.56:9200/_cluster/settings" -H "Content-Type:application/json" -d "{\"persistent\":{\"search.max_buckets\":524288}}"