携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第5天,点击查看活动详情
数据备份与恢复
数据备份
①注册快照存储库
首选需要将备份的location fs在config/elasticsearch.yml文件中配置一下:(所有的主节点和数据节点均需要配置)
path.repo: ["my_backup_location"]
修改配置后重启ES
# 查找es相关进程
ps -ef | grep elasticsearch
# 杀死相关进程
kill -9 [pid]
# 重启es
sh elasticsearch -d
然后执行下面指令来注册快照存储库
这里settings有几个默认参数需要了解一下:
compress,是否压缩,默认为是。
max_restore_bytes_per_sec,节点恢复速率。默认40mb/s。
max_snapshot_bytes_per_sec,每个节点快照速率。默认40mb/s。
PUT /_snapshot/my_backup
{
"type": "fs",
"settings": {
"compress": true,
"location": "my_backup_location",
"max_snapshot_bytes_per_sec" : "50mb",
"max_restore_bytes_per_sec" : "50mb"
}
}
要检索关于注册存储库的信息,使用GET请求:
GET /_snapshot/my_backup
②备份索引
本质是在刚才的仓库里创建快照,快照可以指定一个或多个索引进行备份,默认是全部索引,同一个仓库可以创建多个快照。
备份过程也分为同步和异步,默认是异步,备份在后台执行,可以通过wait_for_completion=true参数设定为同步。
异步方式备份全部索引
PUT _snapshot/my_backup/snapshot_all
同步方式备份部分索引
PUT _snapshot/my_backup/snapshot_entity?wait_for_completion=true
{
"indices": "index_entity"
}
③查看备份信息
GET _snapshot/my_backup/snapshot_all
恢复
索引在被恢复时需要像关闭,否则索引的写操作会影响恢复,于是关闭索引:
POST index_entity/_close
恢复命令比较简单,就是选择一个快照执行_restore就可以了也是默认异步执行,通过wait_for_completion=true可以改成同步执行,如下:
POST _snapshot/my_backup/snapshot_all/_restore
恢复好后记得打开索引
POST index_entity/_open
滚动升级6.8.14 -> 7.6.0
滚动升级允许 Elasticsearch 集群一次升级一个节点,因此升级不会中断服务。不支持在升级持续时间之后在同一集群中运行多个版本的 Elasticsearch,因为无法将分片从升级的节点复制到运行旧版本的节点。
强烈建议在升级时将集群的节点分成以下两组,并按以下顺序升级:
- 不具备master资格的节点。
GET /_nodes/master:false - Master-eligible 节点,即数据节点。可以使用
GET /_nodes/master:true。
①禁用分片分配
当关闭一个节点时,分配过程会等待
index.unassigned.node_left.delayed_timeout(默认为一分钟),然后才开始将该节点上的分片复制到集群中的其他节点,这可能涉及大量 I/O。由于节点很快将重新启动,因此此 I/O 是不必要的。可以通过在关闭节点之前禁用副本分配来避免此情况 :
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
②停止不必要的索引并执行同步刷新<可选>
虽然在升级期间可以继续进行索引,但如果临时停止不必要的索引并执行同步刷新,分片恢复会快得多
POST _flush/synced
③关闭需要升级的单个节点
# 查询es进程信息
ps -ef | grep elasticsearch
# 关闭需要升级的节点
kill -9 [PID]
④安装7.6.0的es
-
下载ES-7.6.0软件包
-
解压相关tar包
tar -zxvf [es.7.6.0.tar.gz] -
根据配置修改
config/jvm.options文件 -
修改
config/elasticsearch.yml文件# 集群名称 cluster.name: addct-search-7.6.0 # 节点名称 node.name: master-node-1 # 数据存储地址 path.data: /home/hadoop/elasticsearch/elasticsearch-7.6.0/data/master # 日志存储地址 path.logs: /home/hadoop/elasticsearch/elasticsearch-7.6.0/data/master/logs # host network.host: 192.168.200.13 # 对外提供服务的端口 http.port: 9200 # 节点列表 discovery.seed_hosts: ["192.168.200.13"] # 初始化时master节点的选举列表 cluster.initial_master_nodes: ["master-node-1"] -
修改elasticsearch启动脚本
ES-7.6.0所需的jdk版本为11,并且新版本的ES软件包中已经包含jdk11了,而我们的服务器目前使用的时jdk8,Elasticsearch的启动脚本默认使用的是服务器默认的java版本,所以我们需要es的启动脚本,让其使用软件自带的jdk11。
vim elasticsearch-env 39 #if [ ! -z "$JAVA_HOME" ]; then 40 # JAVA="$JAVA_HOME/bin/java" 41 # JAVA_TYPE="JAVA_HOME" 42 #else 43 if [ "$(uname -s)" = "Darwin" ]; then 44 # macOS has a different structure 45 JAVA="$ES_HOME/jdk.app/Contents/Home/bin/java" 46 else 47 JAVA="$ES_HOME/jdk/bin/java" 48 fi 49 JAVA_TYPE="bundled jdk" 50 #fi查看bash版本
bash -version如果bash版本
>3.0,则需要将elasticsearch-env文件的116行的 < <(env) 改为 <<< `env`,因为bash 3.0后,shell中加入了新的符号"<<<" 可以获取子任务
⑤更新插件
- 下载插件的压缩包,进入到新版本的es的plugins/目录中解压
- 插件
所有插件文件已修改完成,并放在了文章末尾! 安装插件:在es的plugins目录下创建对应的目录并进入目录解压文件
⑥启动新版本的es节点
sh bin/elasticsarch -d
⑦查看节点状态
我们可以通过提交相应请求来获取集群状态
GET _cat/nodes
⑧启动分片分配
一旦节点加入了集群,我们就可以移除cluster.routing.allocation.enable设置来启用shard分配并开始使用该节点:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
⑨等待节点恢复 在升级下一个节点之前,需要等待集群完成分片分配。可以通过提交_cat/health请求来检查进度:
GET _cat/health?v
等待状态栏变为绿色。一旦节点变为绿色,就分配了所有主碎片和副本碎片
⑩【补充】
-
分片重新分配
如果节点在升级过程中,分片分配失败,我们可以手动地将分片重新分配
POST _cluster/reroute?retry_failed=true -
查询已经安装的插件
GET _cat/plugins