在升级前需考虑下面三件事:
- 查看阅读新版本的更改内容
- 在测试环境下测试升级
- 升级之前备份数据,升级后是不能再回滚到旧版本的
elasticsearch滚动升级过程,不会造成服务中断。elasticsearch提供两种升级类型:全集群重启和滚动升级。
elasticsearch版本所支持的升级类型如下表:
Upgrade From | Upgrade To | Supported Upgrade Type |
---|---|---|
0.90.x |
1.x, 2.x |
Full cluster restart |
< 0.90.7 |
0.90.x |
Full cluster restart |
>= 0.90.7 |
0.90.x |
Rolling upgrade |
1.0.0 - 1.3.1 |
1.x |
Rolling upgrade (if indices.recovery.compress set to false ) |
>= 1.3.2 |
1.x |
Rolling upgrade |
1.x |
2.x |
Full cluster restart |
重要的事情再强调一遍,在执行升级之前,务必先备份数据,这将给你留条后路,如果升级后出现问题还允许你回滚到之前的版本,否则死无葬身之地。
再啰嗦一句,如果没有备份的数据,将不可能回滚到旧版本。
elasticsearch1.0 和更高的版本备份请参考前文《elasticsearch 快照和恢复》。elasticsearch0.90.x和更早版本备份请参考官方文档,这里不说了。
Rolling upgrade
滚动升级一个一个的升级集群中的节点,待该节点升级稳定后,接着下一个节点,如此反复,直到整个集群中的所有节点都升级完为止。
步骤如下:
- 关闭分片分配
当关闭一个节点,分配进程将会立即尝试把该节点上的分片复制到其它节点上,浪费大量的IO操作。
PUT /_cluster/settings
{
“transient”: {
“cluster.routing.allocation.enable”: “none”
}
} - 停止非必要的所有和执行同步刷新(可选)
可以在升级过程中继续建索引,然而,如果停掉非必要的索引分片恢复将会更快,同时发出同步刷新的请求,尽可能的多请求几次同步刷新的操作。
POST /_flush/synced - 停止并升级单个节点
停止单个节点,安装新的版本,指定不同的数据目录等其它参数,不要覆盖旧版本的配置文件、数据等。 - 启动新版本的节点
查看日志文件,节点状态,确认是否成功加入到集群中。
GET _cat/nodes - 重新启动分片分配
一旦该节点加入的集群中,重新启动分片分配。
PUT /_cluster/settings
{
“transient”: {
“cluster.routing.allocation.enable”: “all”
}
} - 等待节点恢复
等待该节点分片分片完全完成。通过下面的命令查看进展情况:
GET _cat/health
等待状态栏从黄色转变为绿色,绿色意味着所有的主和副本分片已被完全分配完。
在滚动升级过程中,较高版本节点上的主分片永远不会分配复制到较低版本节点上的,这是因为较高版本的数据格式低版本不支持。
分片如果没有同步刷新可能需要一段时间才能恢复。看通过_cat/recovery请求查看恢复状态。 - 如此往复,升级集群中其它的节点
Full cluster restart upgrade
当升级elasticsearch主要版本时,需要全集群重启升级。如从0.x到1.x,从1.x到2.x。滚动升级不支持主版本。
步骤如下:
- 关闭分片分配
PUT /_cluster/settings
{
“persistent”: {
“cluster.routing.allocation.enable”: “none”
}
} - 执行同步刷新
POST /_flush/synced - 关闭并升级所有节点
停止掉集群中的所有节点,升级所有节点到新版本。 - 启动集群
如果有专门的主节点,node.master设置为true(默认值),node.data设置为false,那么首先启动该节点。等待它们形成一个集群,可查看日志检查进度情况。
GET _cat/health
GET _cat/nodes
通过这些API接口检查所有节点是否成功加入到集群。 - 等待黄色状态
一旦每个节点加入到集群,将会恢复存储在本地的任何主分片。最初,请求_cat/health 获取到的是红色状态,意味着并非所有主分片已经被分配。一旦每个节点已恢复了本地分片,状态将变成黄色,意味着所有主分片已经被恢复,但不是所有的副本被分配。这是可以接受的,因为分片分配在第一步就已经被关闭了。 - 重新启用分配
延迟副本分片,直到所有节点都加入到集群中,允许主分配副本到已经有复制完本地分片的节点上。基于这一点,重新启动分配是安全的。
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等
第二步,暂停分片分配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
PUT /_cluster/settings
{
“persistent”: {
“cluster.routing.allocation.enable”: “none”
}
}
输出内容:
{
“acknowledged”: true,
“persistent”: {
“cluster”: {
“routing”: {
“allocation”: {
“enable”: “none”
}
}
}
},
“transient”: {}
}
|
第三步,做个快照备份
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
注册:
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”
}
}
}
}
}
]
}
|
第四步,待上一步快照完成后停止各节点
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
GET /_snapshot/backup/snapshot_20151125/_status
{
“snapshots”: [
{
“snapshot”: “snapshot_20151125”,
“repository”: “backup”,
“state”: “SUCCESS”,
........
状态是SUCCESS,说明快照完成了。
或者
GET /_snapshot/backup/_status
{
“snapshots”: []
}
说明目前没有正在执行的快照
|
停止elasticsearch进程。
第五步,下载安装新版本
第六步,待各节点都加入到集群后,重新开启分片分配
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
重新启动分配
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 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
|
第七步,开启第一步停掉的写入进程
文章转载来自:ttlsa.com