[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 | 集群健康 |
如何避免脑裂问题
一个集群中只有一个A主节点,A主节点因为需要处理的东西太多或者网络过于繁忙,从而导致其他从节点ping不通A主节点,这样其他从节点就会认为A主节点不可用了,就会重新选出一个新的主节点B。过了一会A主节点恢复正常了,这样就出现了两个主节点,导致一部分数据来源于A主节点,另外一部分数据来源于B主节点,出现数据不一致问题,这就是脑裂。
一个基本的原则是这里需要设置成 N/2+1, N是急群中节点的数量。 例如在一个三节点的集群中, minimum_master_nodes应该被设为 3/2 + 1 = 2(四舍五入)。