不停机迁移 elasticsearch 集群

一、背景

ES 集群不停机迁移,迁移过程中不影响业务使用。 所用集群版本为 6.3.0 。

二、方案

1、业务通过域名访问集群;

2、在新的机器搭建集群;

3、对原有集群进行快照,万一数据有丢失可以从快照进行恢复;

4、新旧集群进行合并,并强制使旧集群数据通过数据均衡的方式迁移到新集群;

5、下线原有旧集群。

三、实施

1、在新的机器搭建集群的方法

1)机器准备(root设置):参考官网

![]()![]() ```
vim /etc/security/limits.conf
解除文件与内存限制

  • soft memlock unlimited
  • hard memlock unlimited
    • nofile 65536
    • core unlimited
      生效: 退出再登入
      vim /etc/sysctl.conf
      添加
      vm.max_map_count = 262144
      vm.swappiness = 1
      生效:sysctl -p

    View Code

2)配置节点:参考官网

![]()![]() ```
The order of precedence for cluster settings is:
transient cluster settings
persistent cluster settings
settings in the elasticsearch.yml configuration file.


 View Code

注意事项:

1)ES 堆内存需要在32G 以内,最好是26G。

[官网](https://www.elastic.co/guide/en/elasticsearch/reference/6.3/heap-size.html) [网友说法](https://elasticsearch.cn/question/3995) [参考1](https://www.elastic.co/guide/cn/elasticsearch/guide/cn/_limiting_memory_usage.html) [参考2](https://elasticsearch.cn/article/698)

2)shard越多,QPS就会越低([详情](https://elasticsearch.cn/question/369)),Shard大小官方推荐值为20-40GB([详情](https://elasticsearch.cn/question/6544)),每1GB堆内存对应集群的分片在20-25之间(26G 可以存储520个 shard)([详情](%20https://mp.weixin.qq.com/s/mKL2PJuNUJTl71Axv4-Rcw));

每个节点上可以存储的分片数量与可用的堆内存大小成正比关系,但是 Elasticsearch 并未强制规定固定限值。这里有一个很好的经验法则:确保对于节点上已配置的每个 GB,将分片数量保持在 20 以下。如果某个节点拥有 30GB 的堆内存,那其最多可有 600 个分片,但是在此限值范围内,您设置的分片数量越少,效果就越好([详情](https://www.elastic.co/cn/blog/how-many-shards-should-i-have-in-my-elasticsearch-cluster))。每个节点的 shard 数量[设置方法](https://www.elastic.co/guide/en/elasticsearch/reference/6.3/allocation-total-shards.html),集群中 shard 分配策略[设置方法](https://www.elastic.co/guide/en/elasticsearch/reference/6.3/shards-allocation.html)。

3)master 与 client 节点的内存与 CPU 都用量比较少,相应的参数可以设小些。

2、集群快照的方法:通过自己搭建Hadoop 集群实现(需要安装 hdfs 插件)

![]()![]() ```
curl -XPUT http://XXX/_snapshot/hdfs_repo -H 'Content-Type: application/json' -d '
    {
    "type": "hdfs",
    "settings": {
        "uri": "hdfs://XXX:8800/",
        "path": "hdfs_repo",
        "compress": true
    }
    }'

View Code

3、新旧集群合并:可以启动一个能够连接两个集群的 master, 这样两个集群就能合并成一个集群

注意:相同的索引会覆盖,如果集群有部分索引 RED 了,确认无影响后可以通过 reroute 重新分配分片

![]()![]() ```
POST /_cluster/reroute?retry_failed=true&pretty
{
}


 View Code

4、集群数据迁移的方法:通过分片配置过滤实现,使数据从旧机器中迁移走。

![]()![]() ```
curl -XPUT http://XXX/_cluster/settings -H 'Content-Type: application/json' -d '
    {
  "transient": {
    "cluster.routing.allocation.exclude._name": "XXX"
  }
}'

View Code

四、其他

1、数据冷热分离

![]()![]() ```
1、使所有分片都不能分配在 ssd 上;
curl -XPUT "http://XXX/*/_settings?master_timeout=120s" -H 'Content-Type: application/json' -d'
{
"index.routing.allocation.exclude.box_type": "hot"
}'
2、使 test 能够分配在 ssd 上;
PUT test/_settings
{
"index.routing.allocation.include.box_type": "hot"
}
3、启用 tag 感知策略(不设也没关系)
PUT /_cluster/settings
{
"transient" : {
"cluster.routing.allocation.awareness.attributes": "box_type"
}
}


 View Code

 2、使用 [esrally](https://esrally.readthedocs.io/en/stable/quickstart.html) 进行压测

3、[kibana](https://www.elastic.co/cn/downloads/past-releases/kibana-6-3-0%20)

4、滚动重启

![]()![]() ```
1、暂停集群数据均衡
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.rebalance.enable": "none"
  }
}
2、禁止分片分配
PUT _cluster/settings
{
  "transient": {
    "cluster.routing.allocation.enable": "none"
  }
}
3、刷新索引(可选)
curl -XPOST http://XXX/_flush/synced

4、此处进行节点更新操作后再重启

5、重新允许分片分配
PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}
6、待集群恢复 green 后再重复2~5步,直到完成所有节点的更新重启
7、恢复集群数据均衡

View Code

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。