0%

【分布式系统实例】elasticsearch集群之集群搭建

[TOC]

概述

基本参数

  • node.master
    是否为主节点,选项为true或false,当为true时在集群启动时该节点为主节点,在宕机或任务挂掉之后会选举新的主节点,恢复后该节点依然为主节点

  • node.data
    是否处理数据,选项为true或false。负责数据的相关操作

  • http.port
    对外访问的端口号,默认为9200,所以外界访问该节点一般为http://ip:9200/

  • transport.tcp.port
    集群间通信的端口号,默认为9300

集群规划

两类应用场景:

A. 用于构建业务搜索功能模块,且多是垂直领域的搜索。数据量级几千万到数十亿级别。一般2-4台机器的规模。

B. 用于大规模数据的实时 OLAP(联机处理分析),经典的如ELK Stack,数据规模可能达到千亿或更多。几十到上百节点的规模。

集群中的节点角色如何分配?

角色

  • Master
    • node.master: true 节点可以作为主节点
  • DataNode
    • node.data: true 默认是数据节点。
  • Coordinate node 协调节点
    • ​ 如果仅担任协调节点,将上两个配置设为false。

如何分配

A. 小规模集群,不需严格区分。

B. 中大规模集群(十个以上节点),应考虑单独的角色充当。特别并发查询量大,查询的合并量大,可以增加独立的协调节点。角色分开的好处是分工分开,不互影响。如不会因协调角色负载过高而影响数据节点的能力。

docker 搭建集群

参看: go-mod/k8s/docker/elsaitcsearch/cluster

验证集群

1
2
3
4
5
6
7
8
# 集群健康
curl -X GET "localhost:9200/_cat/health?v"

# 集群配置
curl -X GET "localhost:9200/_cluster/settings?include_defaults"

# 节点信息
curl "http://127.0.0.1:9200/_cat/nodes?v"

如何避免脑裂问题

一个集群中只有一个A主节点,A主节点因为需要处理的东西太多或者网络过于繁忙,从而导致其他从节点ping不通A主节点,这样其他从节点就会认为A主节点不可用了,就会重新选出一个新的主节点B。过了一会A主节点恢复正常了,这样就出现了两个主节点,导致一部分数据来源于A主节点,另外一部分数据来源于B主节点,出现数据不一致问题,这就是脑裂

一个基本的原则是这里需要设置成 N/2+1, N是急群中节点的数量。 例如在一个三节点的集群中, minimum_master_nodes应该被设为 3/2 + 1 = 2(四舍五入)。

索引应该设置多少个分片

参考

docker搭建elasticsearch

docker 搭建 elasticsearch7