冷热分离是目前ES非常火的一个架构,它充分的利用的集群机器的优劣来实现资源的调度分配。ES集群的索引写入及查询速度主要依赖于磁盘的IO速度,冷热数据分离的关键点为使用固态磁盘存储数据。若全部使用固态,成本过高,且存放冷数据较为浪费,因而使用普通机械磁盘与固态磁盘混搭,可做到资源充分利用,性能大幅提升的目标。因此我们可以将实时数据(5天内)存储到热节点中,历史数据(5天前)的存储到冷节点中,并且可以利用ES自身的特性,根据时间将热节点的数据迁移到冷节点中,这里因为我们是按天建立索引库,因此数据迁移会更加的方便。
案例:
使用冷热分离的时候,我们需要将索引库建立在热节点中,等到一定的时间时间在将该索引库迁移冷节点中。因此这里我们需要更加热节点的量来进行设置分片数。
比如,我们拥有6个热节点,9个冷节点,索引库的主分片的数据量500G左右,那么该索引库建立18个分片并且都在在热节点中,此时该索引库的分片的分布是,热节点:18,冷节点0;等到该数据不是热数据之后,将该索引库的分片全部迁移到冷节点中,索引库的分片的分布是, 热节点:0,冷节点18。
ElasticSearch冷热分离架构是一种思想,其实现原理是使用ElasticSearch的路由完成,在data节点(master data两种类型的节点)设置对应的路由,然后在创建索引库时指定分布到那些服务器,过一段时间之后,根据业务要求在将这些索引库的数据进行迁移到其他data节点中
节点名称 |
节点端口映射(宿主机:容器) |
标签 |
备注 |
es01 | 9200:9200 9300:9300 |
hot | |
es02 | 9201:9200 9301:9300 |
hot | |
es03 | 9202:9200 9302:9300 |
hot | |
es04 | 9203:9200 9303:9300 |
cold | |
es05 | 9204:9200 9304:9300 |
cold | |
es06 | 9205:9200 9305:9300 |
cold | |
kibana | 5601:5601 | 图形化管理工具 | |
cerebro | 9000:9000 | 监控工具 | |
eshead | 9100:9100 | eshead工具 |
#docker-compose.yml
version: '3.7'
services:
es01:
image: elasticsearch:7.17.3-ik
container_name: es01
#restart: always
environment:
- node.name=es01
- network.publish_host=es01
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es01,es02,es03,es04,es05,es06
- "discovery.seed_hosts=es02,es03,es04,es05,es06"
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256M -Xmx256M"
- node.attr.box_type=hot
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/es1:/usr/share/elasticsearch/data
ports:
- 9200:9200
- 9300:9300
es02:
image: elasticsearch:7.17.3-ik
container_name: es02
#restart: always
environment:
- node.name=es02
- network.publish_host=es02
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es01,es02,es03,es04,es05,es06
- "discovery.seed_hosts=es01,es03,es04,es05,es06"
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256M -Xmx256M"
- node.attr.box_type=hot
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/es2:/usr/share/elasticsearch/data
ports:
- 9201:9200
- 9301:9300
es03:
image: elasticsearch:7.17.3-ik
container_name: es03
#restart: always
environment:
- node.name=es03
- network.publish_host=es03
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es01,es02,es03,es04,es05,es06
- "discovery.seed_hosts=es01,es02,es04,es05,es06"
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256M -Xmx256M"
- node.attr.box_type=hot
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/es3:/usr/share/elasticsearch/data
ports:
- 9202:9200
- 9302:9300
es04:
image: elasticsearch:7.17.3-ik
container_name: es04
#restart: always
environment:
- node.name=es04
- network.publish_host=es04
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es01,es02,es03,es04,es05,es06
- "discovery.seed_hosts=es01,es02,es03,es05,es06"
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256M -Xmx256M"
- node.attr.box_type=cold
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/es4:/usr/share/elasticsearch/data
ports:
- 9203:9200
- 9303:9300
es05:
image: elasticsearch:7.17.3-ik
container_name: es05
#restart: always
environment:
- node.name=es05
- network.publish_host=es05
- cluster.name=es-docker-cluster
- cluster.initial_master_nodes=es01,es02,es03,es04,es05,es06
- "discovery.seed_hosts=es01,es02,es04,es03,es06"
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256M -Xmx256M"
- node.attr.box_type=cold
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/es5:/usr/share/elasticsearch/data
ports:
- 9204:9200
- 9304:9300
es06:
image: elasticsearch:7.17.3-ik
container_name: es06
environment:
- node.name=es06
- cluster.initial_master_nodes=es01,es02,es03,es04,es05,es06
- "discovery.seed_hosts=es01,es02,es04,es03,es05"
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms256M -Xmx256M"
- node.attr.box_type=cold
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
- /data/es6:/usr/share/elasticsearch/data
ports:
- 9205:9200
- 9305:9300
kibana:
image: kibana:7.17.3
container_name: kibana
#restart: always
environment:
- SERVER_NAME=192.168.80.100
- I18N_LOCALE=zh-CN
ports:
- 5601:5601
ulimits:
nproc: 65535
memlock:
soft: -1
hard: -1
volumes:
- /data/config/kibana.yml:/usr/share/kibana/config/kibana.yml
eshead:
image: mobz/elasticsearch-head:5-alpine
container_name: eshead
ports:
- 9100:9100
cerebro:
image: lmenezes/cerebro:latest
container_name: cerebro
ports:
- 9000:9000
command:
- -Dhosts.0.host=http://es01:9200
#elasticsearch.yml 配置文件
cluster.name: "es-docker-cluster"
network.host: 0.0.0.0
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.minimum_master_nodes: 3
node.max_local_storage_nodes: 5
#kibana.yml配置文件
server.host: "0.0.0.0"
server.shutdownTimeout: "10s"
elasticsearch.hosts: ["http://192.168.80.100:9200","http://192.168.80.100:9201"]
monitoring.ui.container.elasticsearch.enabled: true
#创建目录
mkidr -p /data/config /data/es{1..6}
chmod -R 777 /data/es* /data/config
#启动es集群验证
docker-compose up -d
#查看所有输出日志
docker-compose logs -f
#查看指定容器的日志
docker-compose logs -f es03
#查看集群状态
curl -XGET http://192.168.80.100:9200/_cluster/health
curl -XGET http://192.168.80.100:9200/_cat/health
#查看集群节点冷热分布
curl -XGET http://192.168.80.100:9200/_cat/nodeattrs
#查看集群节点状态
curl -XGET http://192.168.80.100:9200/_cat/nodes
#查看所有索引
curl -XGET http://192.168.80.100:9200/ _cat/indices?pertty
#防火墙端口开发
firewall-cmd --zone=public --add-port=9000/tcp --permanent
firewall-cmd --zone=public --add-port=9100/tcp --permanent
firewall-cmd --zone=public --add-port=9200-9205/tcp --permanent
firewall-cmd --zone=public --add-port=9300-9305/tcp --permanent
firewall-cmd --reload
#web访问监控
http://192.168.80.100:9000
#web访问head工具
http://192.168.80.100:9100
#谷歌浏览器插件elasticsearch-head比较好用,可自行去谷歌的应用商店添加扩展
docker镜像【已添加中文分词插件】:es:7.17.3-ik.tar.gz-Java文档类资源-CSDN下载
--------------------------------------------------------------------------------------------------------------------------------
对Elasticsearch生命周期的思考 - 走看看
学习一下这篇博客
生命周期
配置索引生命周期管理(ILM)策略,以根据您的性能、弹性和保留需求自动管理索引。比如当索引达到一定大小或文档数量时,旋转新索引,每天、每周或每月创建一个新索引,并归档以前的索引,删除过时的索引以执行数据保留标准。可以通过API配置和kibana配置进行生命周期的管理。
ES索引生命周期管理分为4个阶段:hot、warm、cold、delete,其中hot主要负责对索引进行rollover操作,warm、cold、delete分别对rollover后的数据进一步处理(前提是配置了hot)
那这些索引是根据什么条件去从一个阶段转到另一个阶段的呢?比如可以根据时间呀,文档数据呀,索引大小呀作为判断条件转到下一个阶段。
1、当索引达到50GB时,将鼠标移至新索引。 2、将旧索引移至热阶段,将其标记为只读,然后将其缩小为单个碎片。 3、7天后,将索引移至冷阶段,然后将其移至较便宜的硬件上。 4、达到所需的30天保留期后,删除索引
那我们在索引的每一个阶段可以做什么样的操作呢,比如增加索引的设置,修改副本数量等
我们知道索引生命的周期的阶段,也知道根据什么条件从一个周期跳转到另一个阶段,也知道在每一个阶段可以做什么操作了,那么就成了呀,更具自己的业务场景设计索引的生命周期吧!!!接下来就看看什么实用呢?
Configure a lifecycle policy | Elasticsearch Guide [7.17] | Elastic
Tutorial: Automate rollover with ILM | Elasticsearch Guide [7.17] | Elastic
摘抄的博客部分原文
--------------------------------------------------------------------------------------------------------------------------------
参考资料:
ILM: Manage the index lifecycle | Elasticsearch Guide [7.17] | Elastic
Index lifecycle actions | Elasticsearch Guide [7.17] | Elastic