Elasticsearch
常见的集群部署方式
节点类型
- 不同角 色的节点
- Master eligible / Data / Ingest / Coordinating / Machine Learning
- 在开发环境中,一个节点可承担多种角色
- 在生产环境中,
- 根据数据量, 写入和查询的吞吐量,选择合适的部署方式
- 建议设置单一角色的节点(dedicated node)
节点参数配置
一个节点在默认情况会下同时扮演: master eligible, data node和ingest node
节点类型 | 配置参数 | 默认值 |
---|---|---|
maste eligible | node. master | true |
data | node. data | true |
ingest | node. ingest | true |
coordinating only | 无 | 设置.上面三个参数全部为false . |
machine 1 earning | node. ml | true (需 要enable x-pack) |
单一职责的节点
一个节点只承担一个角色
单一角色:职责分离的好处
- Dedicated master eligible nodes: 负责集群状态(cluster state) 的管理
- 使用低配置的 CPU, RAM和磁盘
- Dedicateddatanodes:负责数据存储及处理客户端请求
- 使用高配置的 CPU, RAM和磁盘
- Dedicated ingest nodes:负责数据处理
- 使用高配置CPU;中等配置的RAM;低配置的磁盘
Dedicate Coordinating Only Node (Client Node)
-
配置:将Master, Data,Ingest 都配置成False
- Medium/High CUP; Medium/High RAM; Low Disk
-
生产环境中,建议为一些大的集群配置Coordinating 0nly Nodes
- 扮演Load Balancers。 降低Master 和Data Nodes 的负载
- 负 责搜索结果的Gather/Reduce
- 有时候无法预知客户端会发送怎么样的请求
- 大量 占用内存的结合操作,一个深度聚合可能会引发ooM
Dedicate Master Node
-
从高可用 &避免脑裂的角度出发
- 一般在生产环境中配置3台
- 一个集群只有1台活跃的主节点
- 负责分片管理,索引创建,集群管理等操作
-
如果和数据节点或者Coordinate节点混合部署
- 数据 节点相对有比较大的内存占用
- Coordinate 节点有时候可能会有开销很高的查询,导致00M
- 这些都有可能影响Master 节点,导致集群的不稳定
基本部署:增加节点,水平扩展
- 当磁盘容量无法满足需求时,可以增加数据节点;磁盘读写压力大时,增加数据节点
水平扩展: Coordinating Only Node
- 当系统中有大量的复杂查询及聚合时候,增加Coordinating节点,增加查询的性能
读写分离
在集群中部署Kibana
异地多活的部署
集群处在三个数据中心;数据三写; GTM分发读请求
Hot&Warm架构与ShardFiltering
日志类应用的部署架构
什么是Hot & Warm Archi tecture
-
Hot & Warm Archi tecture
- 数据通常不会有Update操作;适用于Time based 索引数据(生命周期管理),同时数据量比较大的
场景。 - 引入 Warm 节点,低配置大容量的机器存放老数据,以降低部署成本
- 数据通常不会有Update操作;适用于Time based 索引数据(生命周期管理),同时数据量比较大的
-
两类数据节点,不同的硬件配置
- Hot节点(通常使用SSD) :索引有不断有新文档写入。通常使用SSD
- Warm节点(通常使用HDD):索引不存在新数据的写入;同时也不存在大量的数据查询
Hot Nodes
- 用于数据的写入
- Indexing对CPU和I0都有很高的要求。所以需要使用高配置的机器
- 存储的性能要好。建议使用SSD
Warm Nodes
- 用于保存 只读的索引,比较旧的数据
- 通常使用大容量的磁盘(通常是Spinning Disks)
配置Hot & Warm Architecture
- 使用 Shard Filtering, 步骤分为以下几步
- 标记节点 (Tagging)
- 配置索引到 Hot Node
- 配置索引到 Warm节点
标记节点
配置Hot 数据
- 创建索引时候, 指定将其创建在hot节点上
旧数据移动到Warm 节点
- Index. routing. allocation是一个索引级的dynamic setting,可以通过API在后期进行设定
- Curator / Index Life Cycle Management Tool
Rack Awareness
标记Rack节点+配置集群
Rack Awareness
Forced Awareness
Shard Filtering
- Shard Filtering
- node. attr” 一标记节点
- “index. routing. allocation”- 分配索引到节点
设置 | 分配索引到节点,节点的属性规则 |
---|---|
Index.routing. allocation.includefatt | 至少包含一个值 |
Index.routing. allocation exclude.fatt} | 不能包含任何一个值 |
Index.routingallocation.require.{attr} | 所有值都需要包含 |
demo API
# 标记一个 Hot 节点
bin/elasticsearch -E node.name=hotnode -E cluster.name=geektime -E path.data=hot_data -E node.attr.my_node_type=hot
# 标记一个 warm 节点
bin/elasticsearch -E node.name=warmnode -E cluster.name=geektime -E path.data=warm_data -E node.attr.my_node_type=warm
# 查看节点
GET /_cat/nodeattrs?v
# 配置到 Hot节点
PUT logs-2019-06-27
{
"settings":{
"number_of_shards":2,
"number_of_replicas":0,
"index.routing.allocation.require.my_node_type":"hot"
}
}
PUT my_index1/_doc/1
{
"key":"value"
}
GET _cat/shards?v
# 配置到 warm 节点
PUT PUT logs-2019-06-27/_settings
{
"index.routing.allocation.require.my_node_type":"warm"
}
# 标记一个 rack 1
bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data -E node.attr.my_rack_id=rack1
# 标记一个 rack 2
bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data -E node.attr.my_rack_id=rack2
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.awareness.attributes": "my_rack_id"
}
}
PUT my_index1
{
"settings":{
"number_of_shards":2,
"number_of_replicas":1
}
}
PUT my_index1/_doc/1
{
"key":"value"
}
GET _cat/shards?v
DELETE my_index1/_doc/1
# Fore awareness
# 标记一个 rack 1
bin/elasticsearch -E node.name=node1 -E cluster.name=geektime -E path.data=node1_data -E node.attr.my_rack_id=rack1
# 标记一个 rack 2
bin/elasticsearch -E node.name=node2 -E cluster.name=geektime -E path.data=node2_data -E node.attr.my_rack_id=rack1
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.awareness.attributes": "my_rack_id",
"cluster.routing.allocation.awareness.force.my_rack_id.values": "rack1,rack2"
}
}
GET _cluster/settings
# 集群黄色
GET _cluster/health
# 副本无法分配
GET _cat/shards?v
GET _cluster/allocation/explain?pretty