使用HAProxy来构建高可用的Elasticsearch集群

這篇文章是 TUT CDSL Advent Calendar 2019 – Adventar 裡的第18篇。

首先

我在实验室中的ESXi上构建了一个Elasticsearch集群。
由于老师提出了冗余构建的建议,所以我们的目标是消除单点故障。

設定文件位於以下位置。

虚拟机规格

在查阅文件后,以下是最低规格。

    • メモリ: 8GB以上(快適に使うなら16GB)

 

    • CPU: 2-8コア

 

    ストレージ: SSDのような早いやつを使う(15k RPM)

我們已根據上述參考分配了以下內容。

    • ロードバランサ: 2台

CPU: 2 [core]
RAM: 2 [GB]
Storage: 50[GB]

Elasticsearchノード: 4台

CPU: 4 [core]
RAM: 12 [GB]
Storage: 120[GB]

vm-spec

负载均衡器虚拟机

HAProxy是一种开源的负载均衡软件。

在负载均衡器中,我们使用了HAProxy。HAProxy可以细致地设置健康检查条件,并且因为在互联网上有很多相关信息,所以我们选择了它。此外,我们使用Metricbeat来收集HAProxy的统计信息,并将其发送到Elasticsearch中。

以下是HAProxy针对Elasticsearch的配置。

##
# Elasticsearch
##

defaults
    timeout connect  5000
    timeout client  10000
    timeout server  10000

frontend elastic
    bind :9200
    mode http
    acl is_delete method DELETE
    http-request deny if is_delete
    default_backend elastic

backend elastic
    mode http
    option forwardfor
    balance roundrobin
    option httpclose
    server elasticsearch-j1 elasticsearch-j1.a910.tak-cslab.org:9200 weight 1 check inter 1000 rise 5 fall 1
    server elasticsearch-j2 elasticsearch-j2.a910.tak-cslab.org:9200 weight 1 check inter 1000 rise 5 fall 1
    server elasticsearch-m1 elasticsearch-m1.a910.tak-cslab.org:9200 weight 1 check inter 1000 rise 5 fall 1
    server elasticsearch-m2 elasticsearch-m2.a910.tak-cslab.org:9200 weight 1 check inter 1000 rise 5 fall 1

保活或保持存活

为了实现负载均衡器的冗余化,我们引入了keepalived。由于热备份的资源利用效率较低,我们一直保持2台服务器一直运行。我们参考了以下文章。

有关使用keepalived进行服务器冗余的内容,请参考GMO合作伙伴集团技术博客

! Configuration File for keepalived
vrrp_script chk_haproxy {
    script "systemctl is-active haproxy"
}

vrrp_instance VI_1 {
    state MASTER
    ! もう1台では以下を50に設定
    priority 100
    interface ens160
    garp_master_delay 10
    virtual_router_id 31
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass XXXXXXXXXX
    }
    virtual_ipaddress {
        192.168.100.10
    }
}

vrrp_instance VI_2 {
    state BACKUP
    ! もう1台では以下を100に設定
    priority 50
    interface ens160
    virtual_router_id 32
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass XXXXXXXXXX
    }
    virtual_ipaddress {
        192.168.100.11
    }
    track_script {
        chk_haproxy
    }
}

进一步,我们引入了DNS轮询以便通过单个FQDN引用多个资源。

$ nslookup elasticsearch-edge
192.168.100.11
$ nslookup elasticsearch-edge
192.168.100.10

弹性搜索节点虚拟机。

每个节点都安装了Kibana、Elasticsearch和Logstash。在Logstash中,允许从Beats和Syslog接收数据。

architecture

弹性搜索

每个节点既是主节点候选节点,也是数据节点。

cluster.name: logging-main
node.name: ${HOSTNAME}
node.master: true
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts:
- elasticsearch-m1.a910.tak-cslab.org
- elasticsearch-m2.a910.tak-cslab.org
- elasticsearch-j1.a910.tak-cslab.org
- elasticsearch-j2.a910.tak-cslab.org
cluster.initial_master_nodes:
- elasticsearch-m1
- elasticsearch-m2
- elasticsearch-j1
- elasticsearch-j2

http.cors.enabled: true
http.cors.allow-origin: "*"

日志堆取

我已经创建了以下的配置文件(摘录),以便使用Logstash接收Syslog。

input {
  tcp {
    port => 5000
    type => syslog
  }
  udp {
    port => 5000
    type => syslog
  }
}

filter {
  if [type] == "syslog" {
    grok {
      patterns_dir => ["/etc/logstash/pattern.d"]
      match => { "message" => "%{MYSYSLOG}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  if [type] == "syslog" {
    elasticsearch {
      hosts => ["localhost:9200"]
      index => "syslog-%{+YYYY.MM.dd}"
    }
  }
}

以下是grok模式。

MYSYSLOG %{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}

请您提供参考链接。

    • Elasticsearch クラスタ概説

 

    Hardware | Elasticsearch: The Definitive Guide [2.x] | Elastic
bannerAds