安全并正确地重启Elasticsearch集群

前言

elasticsearch本身具有高可用性,可以做到停机不停服务,在重启elasticsearch后可能存在数据丢失,或者是“启动ES后,怎么一直有大量的数据在迁移?”

问题原因其本质

原因有两点:

  1. ES中的数据不是实时写入磁盘的。
    数据进入ES后先进入data buffer segmenttransientLog这两个buffer,(此处又涉及到数据防丢失的机制)然后进入操作系统文件系统缓存的数据段,最后再特定时机(两个条件,一个是segment到达容量,一个是到达refresh时间间隔)下才刷入磁盘。即在内存中有很多数据是没写入磁盘的。
  2. ES的分片自动分配迁移机制。
    当集群发现经过一分钟后(index.unassigned.node_left.delayed_timeout参数设置)还连接不上某个节点,就会把集群内的数据重新进行分布,即使后来节点重新连接上,原来的数据因为重新分布也无效了。

提前准备

  1. 检查废弃日志查看你使用的所有废弃功能,并更新相关的代码
  2. 检阅Elasticsearch的迭代变更,并对代码和新版本的配置有必要更改的地方进行更改
  3. 如果你有使用插件,确保每一个插件能够兼容新版本的Elasticsearch
  4. 在升级生产环境的Elasticsearch集群之前,需要在一个独立的环境测试一下升级更新
  5. 通过快照snapshot的形式进行备份

准备重启集群

设置集群重新分配的类型,使用cluster.routing.allocation.enable设置选项。

启用或禁用分片重新分配的类型:

  • all - (默认) 允许所有类型分片重新分配.
  • primaries - 只允许主分片重新分配.
  • new_primaries - 只允许新索引的主分片重新分配.
  • none - 所有索引的任何类型分片不被允许重新分配.
  1. 关闭分片分配
PUT _cluster/settings{
  "persistent": {
    "cluster.routing.allocation.enable": "none"
    }
}
  1. 停止索引并执行同步刷新
POST _flush/synced
  1. 暂时停止机器学习和数据仓库相关任务
curl -X POST "localhost:9200/_ml/set_upgrade_mode?enabled=true&pretty"

# 或者是
POST /_ml/set_upgrade_mode?enabled=true&pretty
  1. 关闭所有节点
  • 如果是通过systemd运行的Elastiseach
sudo systemctl stop elasticsearch.service
  • 如果是用SysV的init运行Elasticsearch
sudo -i service elasticsearch stop
  • 如果是通过守护进程(daemon)运行elasticsearch
kill $(cat pid)
  1. 执行完更改动作后开始重启elasticsearch
cd  $ES_HOME/bin ./elasticsearch -d -p $ES_HOME/pid.txt
  1. ,启用分片自动分布
PUT _cluster/settings { 
    "persistent": {
        "cluster.routing.allocation.enable": null }
}

更新集群

  • 使用 Debian 或者 RPM 包进行更新:
    使用rpm或者dpkg全装新包,所有文件安装将会被安装到操作系统上合适的位置,并且elasticsearch的配置文件将会被保留,不会被覆盖。
  • 使用 zip 或者是tar 压缩包进行更新:
    1. 解压压缩包到一个新的或指定的目录,如果你没有使用外部指定的 config
    2. 如果不需要使用外部config目录和 jvm.options,可以复制旧版本的配置文件目录到新安装的配置文件目录。
      如果需要指定外部config目录和 jvm.options则需要配置环境变量ES_PATH_CONF Elasticsearch启动时将会在环境脚本elasticsearch-env 中进行调用,如下图:
      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFw12iXf-1599405415427)(en-resource://database/1698:1)]@w=450
    3. elasticsearch.yml中配置指定path.data ,即指定外部data目录路径,如果不使用外部指定data目录,可以把外部data目录复制到新安装的目录中。

    如果使用了监控功能,当你更新elasticsearch集群并要复用监控数据时,监控时通过辨认经过持久化的节点UUID(独一无二的)进行区分的,这个UUID值存储在data目录里

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好,针对您的问题,可以通过以下步骤操作: 1. 首先查看故障节点的状态,可以使用以下命令检查: curl -XGET 'http://localhost:9200/_cat/nodes?v' 该命令将列出所有ES节点的信息,例如: ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 127.0.0.1 50 90 5 0.04 0.10 0.23 mdi * es-master-1 127.0.0.1 30 60 3 0.01 0.05 0.19 mdi - es-node-1 127.0.0.1 30 60 3 0.01 0.05 0.19 mdi - es-node-2 127.0.0.1 50 90 5 0.04 0.10 0.23 mdi - es-node-3 从上面的结果中可以看到,有三个节点处于正常状态,一个节点(state列未知)处于故障状态。 2. 接下来,您需要在故障节点上执行重启操作,可以使用以下命令: systemctl restart elasticsearch.service 这个命令将会重启ES服务。 3. 然后,您需要确保配置文件中的所有集群相关信息都是正确的,如下所示: cluster.name: your_cluster_name node.name: your_node_name network.host: your_host_ip #发现节点的地址信息,可以是多个 discovery.seed_hosts: ["192.168.10.10","192.168.10.11","192.168.10.12"] cluster.initial_master_nodes: ["node1","node2","node3"] 在上面的代码中,“discovery.seed_hosts”属性指定了节点地址列表,“cluster.initial_master_nodes”属性指定了初始主节点列表。确保这些信息与集群配置一致。 4. 最后,执行以下命令,加入集群: bin/elasticsearch 这个命令将启动您的ES节点并将其添加到集群中。 希望上述步骤能够解决您的问题,如果您有其他问题或疑问,请随时联系我。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喜马拉雅以南

奶茶,干杯?!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值