经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Elasticsearch » 查看文章
ElasticSearch6.3.2 集群做节点冷(warm) 热(hot) 分离
来源:cnblogs  作者:hapjin  时间:2019/8/12 8:39:50  对本文有异议

拿一个小规模的5节点ES集群做冷热分离尝试,它上面已经有60多个索引,有些索引按月、每月生成一个索引,随着数据的不断写入,历史数据(只需保留三个月数据,三个月之前的数据视为历史数据)越来越占磁盘空间和内存资源,影响搜索响应时间。因此想把集群中节点分成2种类型,一种是hot节点,配置大内存和SSD,用来扛平常的用户请求;一种是warm节点,机械硬盘小内存,用来存储历史不常用的数据,和偶尔的后台任务查询。

把现有的5台节点全做hot节点,另外新增2台节点做warm节点。参考官方bloghot-warm-architecture-in-elasticsearch-5-x架构实现。需要注意的地方主要是:不要让已有的索引分片被ES自动Rebalance到warm节点上去了,并且新创建的索引,只应该分配在hot节点上。下面来看具体的实现步骤:

第一步:禁用 rebalance

主要是为了防止集群中已有的索引 rebalance 到 新添加的2台warm节点上去,我们只想手动把那些历史索引 迁移到warm节点上。

  1. PUT _cluster/settings
  2. {
  3. "transient": {
  4. "cluster.routing.allocation.cluster_concurrent_rebalance":0
  5. }
  6. }

第二步:给节点加标识:node.attr.box_type

关于 node.attr.box_type 属性介绍,可参考:enabling-awareness

修改hot节点的elasticsearch.yml配置文件,添加一行:

node.attr.box_type: hot

修改warm节点的elasticsearch.yml配置文件,添加一行:

node.attr.box_type: warm

第三步:定义通用的索引模板保证新创建索引的分片不会分配到warm节点上

当每月生成一个索引时,新建的索引,肯定是热索引,热索引的分片需要分配到hot节点上,不能分配到warm节点上。比如,loginmac-201908是新建的索引,其分配应该在hot节点上,假设只保留三个月的数据,那么 loginmac-201905就属于历史数据了,需要迁移到warm节点上去。

  1. PUT /_template/hot_template
  2. {
  3. "template": "*",
  4. "order": 0,
  5. "version": 0,
  6. "settings": {
  7. "index": {
  8. "routing": {
  9. "allocation": {
  10. "require": {
  11. "box_type": "hot"
  12. },
  13. "exclude":{
  14. "box_type": "warm"
  15. }
  16. }
  17. },
  18. "number_of_shards": 3,
  19. "number_of_replicas": 1,
  20. "refresh_interval": "50s"
  21. },
  22. "index.unassigned.node_left.delayed_timeout": "3d"
  23. }
  24. }

关于index.routing.allocation.requireindex.routing.allocation.exclude可参考:shard-allocation-filtering

第四步 把系统上已有索引的配置全部修改成hot配置

  1. PUT _all/_settings
  2. {
  3. "index": {
  4. "routing": {
  5. "allocation": {
  6. "require": {
  7. "box_type": "hot"
  8. }
  9. }
  10. }
  11. }
  12. }

这是为了,保证当warm节点加入集群时,不要让热索引迁移到到warm节点上。

第五步 重启所有的修改了elasticsearch.yml 配置为 hot 的节点。等待所有的索引初始化完毕

第六步 启动将 elasticsearch.yml 配置为 warm 的节点,并把历史索引数据配置信息修改成 warm

比如 将loginmac-201905索引的配置 改成 box_type 属性改成 warm。(box_type就是用来标识节点属性的)

  1. PUT loginmac-201905/_settings
  2. {
  3. "index": {
  4. "routing": {
  5. "allocation": {
  6. "require": {
  7. "box_type": "warm"
  8. }
  9. }
  10. }
  11. }
  12. }

第七步 执行reroute命令,将 box_type为warm的索引迁移到 warm节点上。

其中,node-248是hot节点,node-12是warm节点。

  1. POST /_cluster/reroute
  2. {
  3. "commands": [
  4. {
  5. "move": {
  6. "index": "loginmac-201905",
  7. "shard": 2,
  8. "from_node": "node-248",
  9. "to_node": "node-12"
  10. }
  11. }
  12. ]
  13. }

最后,来一张集群冷热节点的示意图:

调整后碰到的一些问题:

在修改 node-02 节点的ES 配置文件时:node.attr.box_type: hot重启后节点并未生效,导致这台节点上的分片全部被迁移到其他节点上去了。

GET /_nodes/node-02

重启node-02(在Ubuntu16上,先用 su user_00 切换到user_00用户,然后再执行 ./bin/elasticsearch -d 启动ES进程,我用 sudo -u user_00 ./bin/elasticsearch -d 启动ES时老是报 memory not lock 错误)

再查看节点信息,可看到节点带有 box_type 为 hot 的属性了。

  1. "attributes": {
  2. "box_type": "hot",
  3. "xpack.installed": "true"
  4. }

所以,在修改了elasticsearch.yml配置文件并重启节点后,最好先GET /_nodes/node-02看一下配置是否生效,否则可能造成大量分片reroute,浪费资源。

做完冷热分离后,还可以再做一些其他的优化:

  1. 段合并

    查看索引loginmac-201905各个段的情况,并force merge

    GET /_cat/segments/loginmac-201905?v&h=shard,segment,size,size.memory

    POST /loginmac-201905/_forcemerge?max_num_segments=10&flush=true

  2. 关闭索引

    POST /loginmac-201905/_close

原文:https://www.cnblogs.com/hapjin/p/11314492.html

原文链接:http://www.cnblogs.com/hapjin/p/11314492.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号