elasticsearch-冷热分离
冷热分离是目前ES非常火的一个架构,它充分的利用的集群机器的优劣来实现资源的调度分配。ES集群的索引写入及查询速度主要依赖于磁盘的IO速度,冷热数据分离的关键点为使用固态磁盘存储数据。若全部使用固态,成本过高,且存放冷数据较为浪费,因而使用普通机械磁盘与固态磁盘混搭,可做到资源充分利用,性能大幅提升的目标。因此我们可以将实时数据(5天内)存储到热节点中,历史数据(5天前)的存储到冷节点中,并且可以利用ES自身的特性,根据时间将热节点的数据迁移到冷节点中,这里因为我们是按天建立索引库,因此数据迁移会更加的方便
步骤:
- 设置节点冷热标签
- 从热节点将数据迁移至冷节点
设置节点标签
目标:设置node0和node1为热节点,node2为冷节点
在node0和node1的elasticsearch.yml配置文件中设置:
node.attr.<attr_name>: <value>
node.attr.box_type: hot
在 node2中设置为冷节点:
node.attr.box_type: cold
查看节点标签:
GET _cat/nodeattrs?v&h=node,attr,value&s=attr:desc
node attr value
node2 box_type cold
node1 box_type hot
node0 box_type hot
创建索引, 并指定为热节点
PUT /my-index
{
"settings": {
"number_of_replicas": 1,
"number_of_shards": 5,
//指定刚创建的索引分配至热节点
"index.routing.allocation.require.box_type":"hot"
},
"mappings": {
"properties": {
"context":{
"type": "text"
}
}
}
}
此时查看 索引分配在哪些节点:
GET _cat/shards/my-index?v&h=index,shard,prirep,node&s=node
index shard prirep node
my-index 3 r
my-index 1 r
my-index 4 r
my-index 2 r
my-index 0 r
my-index 3 p node0
my-index 1 p node0
my-index 4 p node1
my-index 2 p node1
my-index 0 p node1
迁移至冷节点
PUT /my-index/_settings
{
"index.routing.allocation.require.box_type": "cold"
}
结果:
index shard prirep node
my-index 3 p node0
my-index 1 p node0
my-index 4 p node1
my-index 2 p node1
my-index 0 p node1
my-index 3 r node2
my-index 1 r node2
my-index 4 r node2
my-index 2 r node2
my-index 0 r node2
感觉和我想的不一样,数据是迁移至node2节点,但是node0和node1节点为什么还有数据?
查询
POST /my-index/_search?preference=_only_nodes:box_type:cold
{
"query": {
"match": {
"name": "helo5"
}
}
}