ELasticSearch滚动升级:6.8.14 -> 7.6.0

658 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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,因为无法将分片从升级的节点复制到运行旧版本的节点。

强烈建议在升级时将集群的节点分成以下两组,并按以下顺序升级:

  1. 不具备master资格的节点。GET /_nodes/master:false
  2. 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

  1. 下载ES-7.6.0软件包

  2. 解压相关tar包

    tar -zxvf [es.7.6.0.tar.gz]
    
  3. 根据配置修改config/jvm.options文件

  4. 修改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"]
    
  5. 修改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节点

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