ELK elasticsearch 1.7.2 升级到 2.0.0(7th)


前一文费了老大劲闲扯了半天快照与恢复,就是为了本文升级做准备的。在升级前需考虑下面三件事:

  1. 查看阅读新版本的更改内容
  2. 在测试环境下测试升级
  3. 升级之前备份数据,升级后是不能再回滚到旧版本的

elasticsearch滚动升级过程,不会造成服务中断。elasticsearch提供两种升级类型:全集群重启和滚动升级。

elasticsearch版本所支持的升级类型如下表:

Upgrade FromUpgrade ToSupported Upgrade Type
0.90.x1.x, 2.xFull cluster restart
< 0.90.70.90.xFull cluster restart
>= 0.90.70.90.xRolling upgrade
1.0.0 - 1.3.11.xRolling upgrade (if indices.recovery.compress set to false)
>= 1.3.21.xRolling upgrade
1.x2.xFull cluster restart

重要的事情再强调一遍,在执行升级之前,务必先备份数据,这将给你留条后路,如果升级后出现问题还允许你回滚到之前的版本,否则死无葬身之地。

再啰嗦一句,如果没有备份的数据,将不可能回滚到旧版本。

elasticsearch1.0 和更高的版本备份请参考前文《elasticsearch 快照和恢复》。elasticsearch0.90.x和更早版本备份请参考官方文档,这里不说了。

Rolling upgrade

滚动升级一个一个的升级集群中的节点,待该节点升级稳定后,接着下一个节点,如此反复,直到整个集群中的所有节点都升级完为止。

步骤如下:

  1. 关闭分片分配
    当关闭一个节点,分配进程将会立即尝试把该节点上的分片复制到其它节点上,浪费大量的IO操作。
    PUT /_cluster/settings
    {
    "transient": {
          "cluster.routing.allocation.enable": "none"
       }
    }
  2. 停止非必要的所有和执行同步刷新(可选)
    可以在升级过程中继续建索引,然而,如果停掉非必要的索引分片恢复将会更快,同时发出同步刷新的请求,尽可能的多请求几次同步刷新的操作。
    POST /_flush/synced
  3. 停止并升级单个节点
    停止单个节点,安装新的版本,指定不同的数据目录等其它参数,不要覆盖旧版本的配置文件、数据等。
  4. 启动新版本的节点
    查看日志文件,节点状态,确认是否成功加入到集群中。
    GET _cat/nodes
  5. 重新启动分片分配
    一旦该节点加入的集群中,重新启动分片分配。
    PUT /_cluster/settings
    {
    "transient": {
        "cluster.routing.allocation.enable": "all"
        }
    }
  6. 等待节点恢复
    等待该节点分片分片完全完成。通过下面的命令查看进展情况:
    GET _cat/health
    等待状态栏从黄色转变为绿色,绿色意味着所有的主和副本分片已被完全分配完。
    在滚动升级过程中,较高版本节点上的主分片永远不会分配复制到较低版本节点上的,这是因为较高版本的数据格式低版本不支持。
    分片如果没有同步刷新可能需要一段时间才能恢复。看通过_cat/recovery请求查看恢复状态。
  7. 如此往复,升级集群中其它的节点

Full cluster restart upgrade

当升级elasticsearch主要版本时,需要全集群重启升级。如从0.x到1.x,从1.x到2.x。滚动升级不支持主版本。

步骤如下:

  1. 关闭分片分配
    PUT /_cluster/settings
    {
        "persistent": {
             "cluster.routing.allocation.enable": "none"
         }
    }
  2. 执行同步刷新
    POST /_flush/synced
  3. 关闭并升级所有节点
    停止掉集群中的所有节点,升级所有节点到新版本。
  4. 启动集群
    如果有专门的主节点,node.master设置为true(默认值),node.data设置为false,那么首先启动该节点。等待它们形成一个集群,可查看日志检查进度情况。
    GET _cat/health
    GET _cat/nodes
    通过这些API接口检查所有节点是否成功加入到集群。
  5. 等待黄色状态
    一旦每个节点加入到集群,将会恢复存储在本地的任何主分片。最初,请求_cat/health 获取到的是红色状态,意味着并非所有主分片已经被分配。一旦每个节点已恢复了本地分片,状态将变成黄色,意味着所有主分片已经被恢复,但不是所有的副本被分配。这是可以接受的,因为分片分配在第一步就已经被关闭了。
  6. 重新启用分配
    延迟副本分片,直到所有节点都加入到集群中,允许主分配副本到已经有复制完本地分片的节点上。基于这一点,重新启动分配是安全的。
    PUT /_cluster/settings
    {
    "persistent": {
          "cluster.routing.allocation.enable": "all"
          }
    }
    集群开始分配副本到所有的数据节点上。此时,恢复索引和搜索仍然是安全的,为了集群更快的恢复,延迟索引和搜索直到所有分片都被恢复。
    可通过下面的API查看进度情况:
    GET _cat/health
    GET _cat/recovery
    一旦_cat/health 状态列变成绿色,说明所有的主和副本分片已被成功分配。

实操

要将线上的elasticsearch 1.7.2 版本升级到 2.0.0版本。

elasticsearch提供了一个插件migration,来检测当前版本是否能升级到新版本。插件如果安装下文再说。如图所示:

可以检测到哪些索引有改变,需要注意。

第一步,将数据写入进程停止,如logstash、Filebeat、packetbeat、topbeat等

第二步,暂停分片分配

PUT /_cluster/settings{    "persistent": {         "cluster.routing.allocation.enable": "none"     }}输出内容:{   "acknowledged": true,   "persistent": {      "cluster": {         "routing": {            "allocation": {               "enable": "none"            }         }      }   },   "transient": {}}

第三步,做个快照备份

注册:PUT /_snapshot/backup {  "type": "fs",  "settings": {    "location": "/ttlsa.com/bak/20151125",    "compress": true  }}输出:{   "acknowledged": true}创建快照:put  /_snapshot/backup/snapshot_20151125?wait_for_completion=true查看状态:GET /_snapshot/backup/snapshot_20151125/_status{   "snapshots": [      {         "snapshot": "snapshot_20151125",         "repository": "backup",         "state": "STARTED",         "shards_stats": {            "initializing": 556,            "started": 2,            "finalizing": 0,            "done": 24,            "failed": 0,            "total": 582         },         "stats": {            "number_of_files": 783,            "processed_files": 762,            "total_size_in_bytes": 794280101,            "processed_size_in_bytes": 739330035,            "start_time_in_millis": 0,            "time_in_millis": 0         },         "indices": {.........                  "4": {                     "stage": "INIT",                     "stats": {                        "number_of_files": 0,                        "processed_files": 0,                        "total_size_in_bytes": 0,                        "processed_size_in_bytes": 0,                        "start_time_in_millis": 0,                        "time_in_millis": 0                     },                     "node": "F-PLO3hCShKI7mNuodmghQ"                  }               }            }         }      }   ]}

第四步,待上一步快照完成后停止各节点

GET /_snapshot/backup/snapshot_20151125/_status{   "snapshots": [      {         "snapshot": "snapshot_20151125",         "repository": "backup",         "state": "SUCCESS",........状态是SUCCESS,说明快照完成了。或者GET /_snapshot/backup/_status{   "snapshots": []}说明目前没有正在执行的快照

停止elasticsearch进程。

第五步,下载安装新版本

第六步,待各节点都加入到集群后,重新开启分片分配

重新启动分配PUT /_cluster/settings{  "persistent": {    "cluster.routing.allocation.enable": "all"  }}查看恢复状态:GET /_cat/recovery?vindex                      shard time   type     stage source_host target_host repository snapshot          files files_percent bytes     bytes_percent total_files total_bytes translog translog_percent total_translog filebeat-2015.11.24        0     3161   snapshot done  n/a         localhost   backup     snapshot_20151125 16    100.0%        7901095   100.0%        16          7901095     0        100.0%           0              filebeat-2015.11.24        1     5874   snapshot done  n/a         localhost   backup     snapshot_20151125 34    100.0%        8118852   100.0%        34          8118852     0        100.0%           0              filebeat-2015.11.24        2     8155   snapshot done  n/a         localhost   backup     snapshot_20151125 37    100.0%        8118949   100.0%        37          8118949     0        100.0%           0              filebeat-2015.11.24        3     5747   snapshot done  n/a         localhost   backup     snapshot_20151125 31    100.0%        7852163   100.0%        31          7852163     0        100.0%           0              filebeat-2015.11.24        4     3537   snapshot done  n/a         localhost   backup     snapshot_20151125 13    100.0%        7785124   100.0%        13          7785124     0        100.0%           0              filebeat-2015.11.23        0     4654   snapshot done  n/a         localhost   backup     snapshot_20151125 34    100.0%        7800272   100.0%        34          7800272     0        100.0%           0              filebeat-2015.11.23        1     3637   snapshot done  n/a         localhost   backup     snapshot_20151125 16    100.0%        7681675   100.0%        16          7681675     0        100.0%           0

第七步,开启第一步停掉的写入进程

虚拟机使用PuTTY、SSH Secure Shell Client前的配置

虚拟机使用PuTTY、SSH Secure Shell Client前的配置1 仅主机模式 2 检查子网IP为192.168.154.0 3 进入虚拟机,检查IP地址?1ip addr show添加IP地址?1ip addr add dev eno167777...
虚拟机SSHPuttyShellClientSecure

3种有效方法保障服务器数据的安全

数据备份的意义就在于,当受到网络攻击、病毒入侵、电源故障或者操作失误等事故的发生后,可以完整、快速、简捷、可靠地恢复原有系统,在一定的范围内保障系统的正常运行。一些对备份数据重视程度较低的企业,一旦服务器数据出现突然丢失或者损坏,往往会悔莫及。在数据备份方面,...
服务器安全服务器数据

新的勒索软件正被部署在 Log4Shell 攻击中

据 bleepingcomputer 消息,上周五,基于Java日志平台的 "Log4Shell "漏洞公开利用程序被发布。Log4j是一个开发框架,允许开发人员在他们的Java应用程序中添加错误及事件日志。该漏洞允许威胁者创建特殊的 JNDI 字符串,当 L...
漏洞服务器安全Log4Shell勒索软件

ELk elasticsearch 部署(3rd)

根据《ELK 产品支持的平台和软件》选定你所要安装的版本。这里将安装elasticsearch最新版本2.0.0。1. jdkelasticsearch只支持Oracle java 和 OpenJDK。在这里不再重复了,参见《ELK 部署指南》详细的不能再详细...
服务器运维ELkelasticsearchjavajdk