阳光花 發表於 2023-9-29 00:00:00

ELK elasticsearch 1.7.2 升级到 2.0.0(7th)

<p>前一文费了老大劲闲扯了半天快照与恢复,就是为了本文升级做准备的。在升级前需考虑下面三件事:</p>
<ol>
<li>查看阅读新版本的更改内容</li>
<li>在测试环境下测试升级</li>
<li>升级之前备份数据,升级后是不能再回滚到旧版本的</li>
</ol>
<p>elasticsearch滚动升级过程,不会造成服务中断。elasticsearch提供两种升级类型:全集群重启和滚动升级。</p>
<p>elasticsearch版本所支持的升级类型如下表:</p>
<table border="1" cellpadding="4px">
<thead><tr>
<th align="left" valign="top">Upgrade From</th>
<th align="left" valign="top">Upgrade To</th>
<th align="left" valign="top">Supported Upgrade Type</th>
</tr></thead>
<tbody>
<tr>
<td align="left" valign="top"><code class="literal">0.90.x</code></td>
<td align="left" valign="top"><code class="literal">1.x, 2.x</code></td>
<td align="left" valign="top">Full cluster restart</td>
</tr>
<tr>
<td align="left" valign="top"><code class="literal">&lt; 0.90.7</code></td>
<td align="left" valign="top"><code class="literal">0.90.x</code></td>
<td align="left" valign="top">Full cluster restart</td>
</tr>
<tr>
<td align="left" valign="top"><code class="literal">&gt;= 0.90.7</code></td>
<td align="left" valign="top"><code class="literal">0.90.x</code></td>
<td align="left" valign="top">Rolling upgrade</td>
</tr>
<tr>
<td align="left" valign="top"><code class="literal">1.0.0 - 1.3.1</code></td>
<td align="left" valign="top"><code class="literal">1.x</code></td>
<td align="left" valign="top">
Rolling upgrade (if <code class="literal">indices.recovery.compress</code> set to <code class="literal">false</code>)</td>
</tr>
<tr>
<td align="left" valign="top"><code class="literal">&gt;= 1.3.2</code></td>
<td align="left" valign="top"><code class="literal">1.x</code></td>
<td align="left" valign="top">Rolling upgrade</td>
</tr>
<tr>
<td align="left" valign="top"><code class="literal">1.x</code></td>
<td align="left" valign="top"><code class="literal">2.x</code></td>
<td align="left" valign="top">Full cluster restart</td>
</tr>
</tbody>
</table>
<p>重要的事情再强调一遍,在执行升级之前,务必先备份数据,这将给你留条后路,如果升级后出现问题还允许你回滚到之前的版本,否则死无葬身之地。</p>
<p>再啰嗦一句,如果没有备份的数据,将不可能回滚到旧版本。</p>
<p>elasticsearch1.0 和更高的版本备份请参考前文《elasticsearch 快照和恢复》。elasticsearch0.90.x和更早版本备份请参考官方文档,这里不说了。</p>
<h3>Rolling upgrade</h3>
<p>滚动升级一个一个的升级集群中的节点,待该节点升级稳定后,接着下一个节点,如此反复,直到整个集群中的所有节点都升级完为止。</p>
<p>步骤如下:</p>
<ol>
<li>关闭分片分配<br>
当关闭一个节点,分配进程将会立即尝试把该节点上的分片复制到其它节点上,浪费大量的IO操作。<br><span class="pln">PUT </span><span class="pun">/</span><span class="pln">_cluster</span><span class="pun">/</span><span class="pln">settings<br></span><span class="pun">{</span><br><span class="str">"transient"</span><span class="pun">:</span> <span class="pun">{</span><br><span class="str">      "cluster.routing.allocation.enable"</span><span class="pun">:</span> <span class="str">"none"<br></span><span class="pun">   }</span><br><span class="pun">}</span>
</li>
<li>停止非必要的所有和执行同步刷新(可选)<br>
可以在升级过程中继续建索引,然而,如果停掉非必要的索引分片恢复将会更快,同时发出同步刷新的请求,尽可能的多请求几次同步刷新的操作。<br><span class="pln">POST </span><span class="pun">/</span><span class="pln">_flush</span><span class="pun">/</span><span class="pln">synced</span>
</li>
<li>停止并升级单个节点<br>
停止单个节点,安装新的版本,指定不同的数据目录等其它参数,不要覆盖旧版本的配置文件、数据等。</li>
<li>启动新版本的节点<br>
查看日志文件,节点状态,确认是否成功加入到集群中。<br><span class="pln">GET _cat</span><span class="pun">/</span><span class="pln">nodes</span>
</li>
<li>重新启动分片分配<br>
一旦该节点加入的集群中,重新启动分片分配。<br><span class="pln">PUT </span><span class="pun">/</span><span class="pln">_cluster</span><span class="pun">/</span><span class="pln">settings<br></span><span class="pun">{</span><br><span class="str">"transient"</span><span class="pun">:</span> <span class="pun">{<br></span><span class="str">    "cluster.routing.allocation.enable"</span><span class="pun">:</span> <span class="str">"all"<br></span><span class="pun">    }</span><br><span class="pun">}</span>
</li>
<li>等待节点恢复<br>
等待该节点分片分片完全完成。通过下面的命令查看进展情况:<br><span class="pln">GET _cat</span><span class="pun">/</span><span class="pln">health<br>
等待状态栏从黄色转变为绿色,绿色意味着所有的主和副本分片已被完全分配完。<br>
在滚动升级过程中,较高版本节点上的主分片永远不会分配复制到较低版本节点上的,这是因为较高版本的数据格式低版本不支持。<br>
分片如果没有同步刷新可能需要一段时间才能恢复。看通过_cat/recovery请求查看恢复状态。</span>
</li>
<li>如此往复,升级集群中其它的节点</li>
</ol>
<h3>Full cluster restart upgrade</h3>
<p>当升级elasticsearch主要版本时,需要全集群重启升级。如从0.x到1.x,从1.x到2.x。滚动升级不支持主版本。</p>
<p>步骤如下:</p>
<ol>
<li>关闭分片分配<br><span class="pln">PUT </span><span class="pun">/</span><span class="pln">_cluster</span><span class="pun">/</span><span class="pln">settings<br></span><span class="pun">{</span><br><span class="str">    "persistent"</span><span class="pun">:</span> <span class="pun">{</span><br><span class="str">         "cluster.routing.allocation.enable"</span><span class="pun">:</span> <span class="str">"none"</span><br><span class="pun">     }</span><br><span class="pun">}</span>
</li>
<li>执行同步刷新<br><span class="pln">POST </span><span class="pun">/</span><span class="pln">_flush</span><span class="pun">/</span><span class="pln">synced</span>
</li>
<li>关闭并升级所有节点<br>
停止掉集群中的所有节点,升级所有节点到新版本。</li>
<li>启动集群<br>
如果有专门的主节点,node.master设置为true(默认值),node.data设置为false,那么首先启动该节点。等待它们形成一个集群,可查看日志检查进度情况。<br><span class="pln">GET _cat</span><span class="pun">/</span><span class="pln">health<br>
GET _cat</span><span class="pun">/</span><span class="pln">nodes<br></span>通过这些API接口检查所有节点是否成功加入到集群。</li>
<li>等待黄色状态<br>
一旦每个节点加入到集群,将会恢复存储在本地的任何主分片。最初,请求_cat/health 获取到的是红色状态,意味着并非所有主分片已经被分配。一旦每个节点已恢复了本地分片,状态将变成黄色,意味着所有主分片已经被恢复,但不是所有的副本被分配。这是可以接受的,因为分片分配在第一步就已经被关闭了。</li>
<li>重新启用分配<br>
延迟副本分片,直到所有节点都加入到集群中,允许主分配副本到已经有复制完本地分片的节点上。基于这一点,重新启动分配是安全的。<br><span class="pln">PUT </span><span class="pun">/</span><span class="pln">_cluster</span><span class="pun">/</span><span class="pln">settings<br></span><span class="pun">{</span><br><span class="str">"persistent"</span><span class="pun">:</span> <span class="pun">{</span><br><span class="str">      "cluster.routing.allocation.enable"</span><span class="pun">:</span> <span class="str">"all"</span><br><span class="pun">      }</span><br><span class="pun">}<br></span>集群开始分配副本到所有的数据节点上。此时,恢复索引和搜索仍然是安全的,为了集群更快的恢复,延迟索引和搜索直到所有分片都被恢复。<br>
可通过下面的API查看进度情况:<br><span class="pln">GET _cat</span><span class="pun">/</span><span class="pln">health<br>
GET _cat</span><span class="pun">/</span><span class="pln">recovery<br></span>一旦_cat/health 状态列变成绿色,说明所有的主和副本分片已被成功分配。</li>
</ol>
<h3>实操</h3>
<p>要将线上的elasticsearch 1.7.2 版本升级到 2.0.0版本。</p>
<p>elasticsearch提供了一个插件migration,来检测当前版本是否能升级到新版本。插件如果安装下文再说。如图所示:</p>
<p><img title="ELK elasticsearch 1.7.2 升级到 2.0.0(7th)" class="alignnone wp-image-10657" src="https://zhuji.jb51.net/uploads/img/20230519/d25c616fc91f019fecb737ab98cbebf7.jpg" width="670" height="705"></p>
<p>可以检测到哪些索引有改变,需要注意。</p>
<p>第一步,将数据写入进程停止,如logstash、Filebeat、packetbeat、topbeat等</p>
<p>第二步,暂停分片分配</p><pre class="brush:bash;toolbar:false">PUT /_cluster/settings
{
    "persistent": {
         "cluster.routing.allocation.enable": "none"
   }
}
输出内容:
{
   "acknowledged": true,
   "persistent": {
      "cluster": {
         "routing": {
            "allocation": {
               "enable": "none"
            }
         }
      }
   },
   "transient": {}
}</pre><p>第三步,做个快照备份</p><pre class="brush:bash;toolbar:false">注册:
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"
                  }
               }
            }
         }
      }
   ]
}</pre><p>第四步,待上一步快照完成后停止各节点</p><pre class="brush:bash;toolbar:false">GET /_snapshot/backup/snapshot_20151125/_status
{
   "snapshots": [
      {
         "snapshot": "snapshot_20151125",
         "repository": "backup",
         "state": "SUCCESS",
........
状态是SUCCESS,说明快照完成了。
或者
GET /_snapshot/backup/_status
{
   "snapshots": []
}
说明目前没有正在执行的快照</pre><p>停止elasticsearch进程。</p>
<p>第五步,下载安装新版本</p>
<p>第六步,待各节点都加入到集群后,重新开启分片分配</p><pre class="brush:bash;toolbar:false">重新启动分配
PUT /_cluster/settings
{
"persistent": {
    "cluster.routing.allocation.enable": "all"
}
}
查看恢复状态:
GET /_cat/recovery?v
index                      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 donen/a         localhost   backup   snapshot_20151125 16    100.0%      7901095   100.0%      16          7901095   0      100.0%         0            
filebeat-2015.11.24      1   5874   snapshot donen/a         localhost   backup   snapshot_20151125 34    100.0%      8118852   100.0%      34          8118852   0      100.0%         0            
filebeat-2015.11.24      2   8155   snapshot donen/a         localhost   backup   snapshot_20151125 37    100.0%      8118949   100.0%      37          8118949   0      100.0%         0            
filebeat-2015.11.24      3   5747   snapshot donen/a         localhost   backup   snapshot_20151125 31    100.0%      7852163   100.0%      31          7852163   0      100.0%         0            
filebeat-2015.11.24      4   3537   snapshot donen/a         localhost   backup   snapshot_20151125 13    100.0%      7785124   100.0%      13          7785124   0      100.0%         0            
filebeat-2015.11.23      0   4654   snapshot donen/a         localhost   backup   snapshot_20151125 34    100.0%      7800272   100.0%      34          7800272   0      100.0%         0            
filebeat-2015.11.23      1   3637   snapshot donen/a         localhost   backup   snapshot_20151125 16    100.0%      7681675   100.0%      16          7681675   0      100.0%         0</pre><p>第七步,开启第一步停掉的写入进程</p>
頁: [1]
查看完整版本: ELK elasticsearch 1.7.2 升级到 2.0.0(7th)