NetDevOps随笔/监控与数据分析/Elastic_Stack/Elasticsearch_01

2020-05-29 00:00:00 集群 节点 端口 通信 自学

NetDevOps技能领域中网络监控与数据分析是一个大类, 如果对技能领域分类有不同见解详见:

辣不麻:NetDevOps随笔/起点zhuanlan.zhihu.com

本文着重介绍Elasticsearch入门自学需要了解的一些基础概念, 比起直接拿起文档开始啃, 或者拿起键盘一把梭, 前期建立一套完善的框架及术语的理解对后面的学习能起到事半功倍的效果.

申明:
- 本入门自学笔记基于Elasticsearch:7.6.2, 不保证实时随新版本更新.
- 本入门自学笔记包含基于辣不麻理解的中英文翻译, 不保证与官网中文文档完全匹配.

Elasticsearch集群架构

Elasticsearch本质上是一款Java软件, 大部分知道, Java的一大特点就是多平台支持, 只要有合适版本的Java运行环境, Elasticsearch就可以跑. 作为一名网络工程师, 我有爱扣底层的怪癖, 新学一款设备或者软件的时候要是不摸清楚二三四层怎么个通信的, 浑身不得劲.

  1. 和许多传统的网络设备的集群架构不一样, Elasticsearch的集群是基于仲裁(quorum)选举模式的全Active架构, 所以推荐集群节点好是奇数, 为什么要是奇数呢? 这个问题必须得问自己吧?
  2. 和许多传统的网络设备的集群架构又不一样, Elasticsearch不需要在同一个二层, 那么初始化的时候是怎么互相发现的呢?
  3. Elasticsearch对外的两个TCP接口(默认): 9200和9300分别是做啥的.

偶数节点发生通信故障

目前主流的冗余部署需要至少两个物理机房, 基于偶数节点的集群那当然就是对半分.

当两地出现网络通信故障的时候, 数据无法继续实现同步, 这个时候必须有一方放弃Active的状态退居Standby, 才能保证届时通信恢复的时候不会出现不一致而导致无法同步的两份数据. 偶数节点情况下双方都是对等的, 无法在不与对方通信的情况下做出决策.

奇数节点发生通信故障

三节点集群发生通信故障

在奇数节点数量的情况下, 假设发生通讯故障, 必定有一方的节点数大于总节点数的一半, 比如图中三节点集群, 左侧机房有一个节点, 右侧机房有两个节点, 大于总节点数的半数: 2>1.5 = 3/2. 这个时候节点间将采取仲裁投票机制, 每个节点有一票, 必须投给所有能通信的节点里面的权重大的节点, 成功获取大于半数票的节点将首先成为Master节点, 其余可以和Master通信的节点将成为非Master但是Active状态, 所有无法与主节点实现通信的节点会进入Standby状态.

自主思考: 基于上述的三节点架构如果2和3所在的右侧机房整个挂了, 左侧会不会成为Active的状态?

TCP 9200 与 TCP 9300

默认情况下, Elasticsearch会监听系统上loopback IP的TCP 9300端口, 这个端口是用来进行节点间的发现, 同步等通信.
默认情况下, Elasticsearch会监听系统上loopback IP的TCP 9200端口, 这个端口就是API 对外服务端口了. 对外服务端口采用的是REST API, 也就是HTTP request, 后文会有用法案例.

Bootstrap自检

这里辣不麻还想提一下大家做实验时候很大概率会遇到道坎: Bootstrap自检.

题外话: Bootstrap原意是指鞋后跟的一根带子, 让用户可以更方便的穿鞋子. 后来这个词衍生成了'不靠他人, 自力更生'的意思. 再后来被计算机界引用用来描述计算机自主加载系统启动的过程.

当用户更改了通信与服务端口的监听接口, Elasticsearch就认为自己有可能不是实验用而是生产环境用, 为了保证生产环境下重要配置的正确性, 会执行一系列的自检, 主要包含:
- 与性能相关的自检: 比如Java虚拟机内存分配大小, Unix的文件描述符等
- 与功能相关的自检: 比如节点间初始发现等

Elasticsearch实验集群

有了上述的基本理解之后, 辣不麻就开始搭建自己的个集群了. 思考再三, 决定用docker-compose, 高效干净无残留.

申明: 本入门自学笔记不涵盖docker以及docker-compose的基础知识与安装方法, 请移步自学
辣不麻的实验环境

docker-compose与elasticsearch配置文件

申明: 配置文件为yaml格式, 后缀为.yaml或.yml. 本入门自学笔记不涵盖yaml语法基础知识, 请移步自学

docker-compose是基于配置文件来创建container的, 我们把这份配置文件叫elasticlab.yml

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - network.host=_site_
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data01:/usr/share/elasticsearch/data
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 32771:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - network.host=_site_
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data02:/usr/share/elasticsearch/data
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 32772:9200
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.6.2
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - network.host=_site_
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - data03:/usr/share/elasticsearch/data
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 32773:9200
    networks:
      - elastic
volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local
networks:
  elastic:
    driver: bridge

相关文章