集群版本升级——rolling upgrade在ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态

简介:

集群版本升级

Elasticsearch 作为一个新兴项目,版本更新非常快。而且每次版本更新都或多或少带有一些重要的性能优化、稳定性提升等特性。可以说,ES 集群的版本升级,是目前 ES 运维必然要做的一项工作。

按照 ES 官方设计,有 restart upgrade 和 rolling upgrade 两种可选的升级方式。对于 1.0 版本以上的用户,推荐采用 rolling upgreade 方式。

但是,对于主要负载是数据写入的 Elastic Stack 场景来说,却并不是这样!

rolling upgrade 的步骤大致如下:

  1. 暂停分片分配;
  2. 单节点下线升级重启;
  3. 开启分片分配;
  4. 等待集群状态变绿后继续上述步骤。

实际运行中,步骤 2 的 ES 单节点从 restart 到加入集群,大概要 100s 左右的时间。也就是说,这 100s 内,该节点上的所有分片都是 unassigned 状态。而按照 Elasticsearch 的设计,数据写入需要至少达到 replica/2+1 个分片完成才能算完成。也就意味着你所有索引都必须至少有 1 个以上副本分片开启。

但事实上,很多日志场景,由于写入性能上的要求要高于数据可靠性的要求,大家普遍减小了副本数量,甚至直接关掉副本复制。这样一来,整个 rolling upgrade 期间,数据写入就会受到严重影响,完全丧失了 rolling 的必要性。

其次,步骤 3 中的 ES 分片均衡过程中,由于 ES 的副本分片数据都需要从主分片走网络复制重新传输一次,而由于重启,新升级的节点上的分片肯定全是副本分片(除非压根没副本)。在数据量较大的情况下,这个步骤耗时可能是几十分钟甚至以小时计。而且并发和限速上稍微不注意,可能导致分片均衡的带宽直接占满网卡,正常写入也还是受到影响。

所以,对于写入压力较大,数据可靠性要求偏低的实时日志场景,依然建议大家进行主动停机式的 restart upgrade。

restart upgrade 的步骤如下:

  1. 首先适当加大集群的数据恢复和分片均衡并发度以及磁盘限速:
# curl -XPUT http://127.0.0.1:9200/_cluster/settings -d '{
  "persistent" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "disable_allocation" : "false",
          "cluster_concurrent_rebalance" : "5",
          "node_concurrent_recoveries" : "5",
          "enable" : "all"
        }
      }
    },
    "indices" : {
      "recovery" : {
        "concurrent_streams" : "30",
        "max_bytes_per_sec" : "2gb"
      }
    }
  },
  "transient" : {
    "cluster" : {
      "routing" : {
        "allocation" : {
          "enable" : "all"
        }
      }
    }
  }
}'
  1. 暂停分片分配:
# curl -XPUT http://127.0.0.1:9200/_cluster/settings -d '{
  "transient" : {
    "cluster.routing.allocation.enable" : "none"
  }
}'
  1. 通过配置管理工具下发新版本软件包。
  2. 公告周知后,停止数据写入进程(即 logstash indexer 等)
  3. 如果使用 Elasticsearch 1.6 版本以上,可以手动运行一次 synced flush,同步副本分片的 commit id,缩小恢复时的网络传输带宽:
# curl -XPOST http://127.0.0.1:9200/_flush/synced
  1. 全集群统一停止进程,更新软件包,重新启动。
  2. 等待各节点都加入到集群以后,恢复分片分配:
# curl -XPUT http://127.0.0.1:9200/_cluster/settings -d '{
  "transient" : {
    "cluster.routing.allocation.enable" : "all"
  }
}'

由于同时启停,主分片几乎可以同时本地恢复,整个集群从 red 变成 yellow 只需要 2 分钟左右。而后的副本分片,如果有 synced flush,同样本地恢复,否则网络恢复总耗时,视数据大小而定,会明显大于单节点恢复的耗时。

  1. 如果有 synced flush,建议等待集群变成 green 状态后,恢复写入;否则在集群变成 yellow 状态之后,即可着手开始恢复数据写入进程。
















本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/7444394.html,如需转载请自行联系原作者
相关文章
|
9月前
|
缓存 Kubernetes 数据安全/隐私保护
k8s1.18多master节点高可用集群安装-超详细中文官方文档
k8s1.18多master节点高可用集群安装-超详细中文官方文档
|
2月前
|
Kubernetes Cloud Native 虚拟化
云原生|kubernetes|找回丢失的etcd集群节点---etcd节点重新添加,扩容和重新初始化k8s的master节点
云原生|kubernetes|找回丢失的etcd集群节点---etcd节点重新添加,扩容和重新初始化k8s的master节点
150 0
|
安全 Linux 网络安全
Kibana 最常见的“启动报错”或“无法连接ES集群服务”的故障原因及解决方案汇总
Kibana 最常见的“启动报错”或“无法连接ES集群服务”的故障原因及解决方案汇总
Kibana 最常见的“启动报错”或“无法连接ES集群服务”的故障原因及解决方案汇总
|
11月前
|
运维 安全 Java
Elasticsearch生产集群部署之各个节点以daemon模式运行以及优雅关闭
Elasticsearch生产集群部署之各个节点以daemon模式运行以及优雅关闭
|
NoSQL Redis
Redis进阶-Redis集群 【高可用切换】&【cluster-require-full-coverage】集群是否完整才能对外提供服务
Redis进阶-Redis集群 【高可用切换】&【cluster-require-full-coverage】集群是否完整才能对外提供服务
158 0
|
Java
白话Elasticsearch71-ES生产集群部署之各个节点以daemon模式运行以及优雅关闭
白话Elasticsearch71-ES生产集群部署之各个节点以daemon模式运行以及优雅关闭
88 0
|
NoSQL Redis
Redis Cluster集群收缩主从节点详细教程
文章目录 Redis Cluster集群收缩主从节点 1.Cluster集群收缩概念 2.将6390主节点从集群中收缩 2.1.计算需要分给每一个节点的槽位数 2.2.分配1365个槽位给192.168.81.210的6380节点 2.3.分配1365个槽位给192.168.81.220的6380节点 2.4.分配1365个槽位给192.168.81.230的6380节点 2.5.查看当前集群槽位分配 3.验证数据迁移过程是否导致数据异常 4.将下线的主节点从集群中删除 4.1.删除节点 4.2.调整主从交叉复制 4.3.当节点存在数据无法删除 5.将下线主机清空集群信息
242 0
Redis Cluster集群收缩主从节点详细教程
|
监控 NoSQL Linux
CentOS 7单机安装Redis Cluster(3主3从伪集群),仅需简单五步
CentOS 7单机安装Redis Cluster(3主3从伪集群),仅需简单五步
166 0
CentOS 7单机安装Redis Cluster(3主3从伪集群),仅需简单五步
|
Kubernetes 对象存储 容器
阿里云容器服务ACK集群上如何使用ack-etcd-backup-operator定期自动对ETCD集群数据做备份
如果用户在 [阿里云容器服务平台](https://cs.console.aliyun.com) 上创建了独享专有的Kubernetes集群(dedicated kubernetes cluster),那么用户将对集群的管理节点和工作节点享有完全的控制能力,其中Etcd集群是Kubernetes集群中一个十分重要的组件,用于保存集群所有的网络配置和对象的状态信息。 本文旨在介绍如何使用 [a
621 0
阿里云容器服务ACK集群上如何使用ack-etcd-backup-operator定期自动对ETCD集群数据做备份
|
存储 Kubernetes 关系型数据库
在kubernetes中运行单节点有状态MySQL应用
前提需求 / Rquirements 现成的kubernetes集群 持久存储-PersistentVolume 持久存储容量声明-PersistentVolumeClaim 创建yaml文件 / Create YAML file https://raw.
2050 0