Elasticsearch集群规划

集群规划

        在Elasticsearch集群规划中,如何规划集群,合理的规划集群可以防止Elasticsearch出现脑裂,
        为避免Elasticsearch集群出现脑裂,Elasticsearch的的config目录下elasticsearch.yml文件中配置避免脑裂的参数,常见的参数是discovery.zen.minimum_master_nodes,该参数决定主节点选择工程中至少需要有多少个master节点,默认配置1。基本的参数原则是N/2+1,如在一个3个节点的集群中,discovery.zen.minimum_master_nodes应该设置为2。
        如果在2个集群节点中,如果吧discovery.zen.minimum_master_nodes设置为2,当两个节点通信失败时,节点1会失去它的主状态,同时节点2也不会被选举为主节点。这种情况下可以配置另外一个参数来防止脑裂,discovery.zen.ping.timeout,默认值时3秒,用该参数来决定节点之间通信的等待时间。如在网络较差的环境里面可以调大该值。但该参数是适用于高网络延迟的情况。建议配置至少3节点的集群。

分布式集群

        Elasticsearch集群中的节点一般分为3中角色,如何区别这种角色,取决于在搭建分布式集群以前需要在配置文件中指定节点角色。
        节点简介

  • master 节点: master节点主要负责元数据的处理;比如索引的新增、删除、分片分配等,每当元数据有更新时,master节点负责同步到其他节点上。
  • data 节点: data节点上保存了数据分片,负责数据相关的操作,如分片的增删改查以及搜索和整个操作。
  • client 节点: client节点起到路由请求作用,可以看作为负载均衡,适用于高并发访问的业务场景。

列子

        3台Elasticsearch服务器(172.21.1.10,172.21.1.11,172.21.1.12),为避免脑裂,3台机器master节点为2(172.21.1.10,172.21.1.11),同时也为data节点。172.21.1.12为client节点,三个ip对应hostname为:node-10,node-11,node-12。

  • 172.21.1.10 节点
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cluster.name: test1
    node.name: node-10
    network.host: 0.0.0.0
    http.port: 9200
    node.master: true
    node.data: true
    discovery.zen.minimum_master_nodes: 2
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    discovery.zen.ping.unicast.hosts: ["172.21.1.10", "172.21.1.11"]
    http.cors.enable: true
    http:cors.allow-origin: "*"

注释:

  • http.cors.enable: true,http:cors.allow-origin: “*”: 该两个参数为如果要使用head来进行监控Elasticsearch集群,需要配置此参数。elasticsearch-head
  • 172.21.1.11 节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cluster.name: test1
    node.name: node-11
    network.host: 0.0.0.0
    http.port: 9200
    node.master: true
    node.data: true
    discovery.zen.minimum_master_nodes: 2
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    discovery.zen.ping.unicast.hosts: ["172.21.1.10", "172.21.1.11"]
    http.cors.enable: true
    http:cors.allow-origin: "*"
  • 172.21.1.12 节点

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cluster.name: test1
    node.name: node-12
    network.host: 0.0.0.0
    http.port: 9200
    node.master: false
    node.data: talse
    discovery.zen.minimum_master_nodes: 2
    path.data: /var/lib/elasticsearch
    path.logs: /var/log/elasticsearch
    discovery.zen.ping.unicast.hosts: ["172.21.1.10", "172.21.1.11"]
    http.cors.enable: true
    http:cors.allow-origin: "*"

        启动各节点进行head验证

        Elasticsearch集群监控查看elasticserch日常维护,监控插件可以参考logstash监控末尾。

Elasticsearch集群api

        利用Elasticsearch 集群健康api查看当前集群的健康信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
curl http: //127.0.0.1:9200/_cluster/health
{
"cluster_name": "test1",
"status": "green",
"timed_out": false,
"number_of_nodes": 3,
"number_of_data_nodes": 3,
"active_primary_shards": 162,
"active_shards": 324,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 0,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 100.0
}

参数解释

  • cluster_name: 集群名称
  • status: 集群健康状态;green为所有的主分片和从分片都可以用,yellow所有主分片可用,但存在不可用的从分片,red存在不可用的主分片
  • timed_out: 是否超时
  • number_of_nodes: 节点数,包括master和data。
  • number_of_data_nodes: data节点数
  • active_primary_shards: 活动的主分片
  • active_shards: 所有活动分片数,包括主分片和副本
  • relocating_shards: 正在发生迁移的分片
  • initializing_shards: 正在初始化的分片
  • unassigned_shards: 没有被分配的分片
  • delayed_unassigned_shards: 延迟未被分配的分片
  • number_of_pending_tasks: master节点任务队列中的任务数
  • number_of_in_flight_fetch: 正在进行迁移的分片数
  • task_max_waiting_in_queue_millis: 队列中任务的最大等待时间
  • active_shards_percent_as_number: 活动分片的百分比

Elasticsearch容量评估

存储容量评估

        Elasticsearch服务存储空间大小影响因素如下:

  • 副本数量:副本有利于增加数据的可靠性,但同时会增加存储成本。默认和建议的副本数量为 1。
  • 索引开销:除原始数据外,ES 需要存储索引等数据,一般情况下数据膨胀为10% (_all等未计算)。
  • 内部任务开销:ES 自身会占用约 20% 的磁盘空间用于段合并、日志等,因此要预留20%的此部分空间。
  • 操作系统预留:操作系统也会占用5%的磁盘空间,用于关键流程处理、防止磁盘碎片化问题等。
  • 安全阈值。通常至少预留15%的安全阈值。

ES的实际空间可通过下面公式估算:

1
2
3
实际空间 = 源数据 * (1 + 副本数量) * (1 + 索引开销) / (1-操作系统预留)/(1 - 内部任务开销) 
= 源数据 * (1 + 副本数量) * 1.45
= 源数据 *2.9
  • 对于_all这项参数,如果不需要在业务上使用,通常建议您禁止或者有选择性地添加。
  • 如果您需要开启_all参数的索引,磁盘容量的开销也会随之增大。建议在上述评估的基础上,增加空间至原来的1.5倍。
    1
    2
    磁盘总大小 = 源数据 * (1 + 副本数) * 1.7 * (1 + 0.5) 
    = 源数据 * 5.1

        为了保证服务能稳定运行,建议在上述评估的基础上至少预留50%的存储空间,因此建议申请的存储容量为:

1
2
存储容量 = 源数据 * (1 + 副本数量) * 1.45 * (1 + 0.5)
= 源数据 * 4.35

服务配置评估

  • 建议您至少选择 3 个节点,保证集群具有较高的节点故障容错能力。
  • 如有非常大的存储容量需求,建议主机配置规格更高,有助于提升集群性能和稳定性。
  • 可以通过观察 CPU 使用率、集群查询QPS、集群写入QPS等监控指标,判断配置是否足够

分片数量评估

        shard大小和数量是影响ES集群稳定性和性能的重要因素之一。ES集群中任何一个索引都需要有一个合理的shard规划(默认为5个)。索引分片的数量会影响集群稳定性和性能,且通常确定后无法轻松更改,需要提前规划:

  • 建议单个分片大小在小规格节点下不超过30GB,在高规格节点下不超过50GB。分片过大会导致ES故障的恢复速度慢,分片过小会导致内存不足等问题。
  • 分片数量要尽量匹配节点数,分片数可以等于节点数,也可以是节点数的整数倍,方便分片在所有数据节点均匀分布。
  • 对于日志分析或者超大索引场景,建议单个shard大小不要超过100GB。
  • 单个节点上同一索引的shard个数不要超5个。

        利用ansible来安装Elasticsearch集群,

坚持原创技术分享,您的支持将鼓励我继续创作!
0%