使用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]

负载均衡器虚拟机
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接收数据。

弹性搜索
每个节点既是主节点候选节点,也是数据节点。
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