如果要完全实现高可用,那么Graylog三个组件都需要做到。官方并没有给出具体实施细节,但是官方给出了指导方案
MongoDB
需要做成复制集,并且使用Graylog连接MongoDB的URI修改成复制集的连接方式
Elasticsearch
Elasticsearch原生就是分布式的,没什么难度。增加discovery.zen.ping.unicast.hosts属性,指定节点组成集群
Graylog Server
多个Graylog时,只能有一个Master。
前期准备
- 
新节点修改内核参数,以满足Elasticsearch要求
1
2
3
4
5
6
7
8
  | 
# 1.修改limits.conf
vi /etc/security/limits.conf
root - nofile 165536
*    - nofile 165536
# 2.增加内核参数
echo "vm.max_map_count = 262144" > /etc/sysctl.d/es.conf
sysctl -p /etc/sysctl.d/es.conf
  | 
 
 
- 
新老节点安装NTP服务。公有云不需要,一般默认会时间同步
1
2
3
  | 
yum install ntp -y
systemctl enable ntpd
systemctl start ntpd
  | 
 
 
- 
【可选】关闭Elasticsearch全局负载均衡.可使用原来的索引还在原来节点上,这样新添加的ES节点可以下线,不影响老数据
1
2
3
4
5
  | 
curl -XPUT -H "Content-type: application/json" http://es:9200/_cluster/settings -d '{
  "transient" : {
      "cluster.routing.rebalance.enable" : "none"
  }
}'
  | 
 
 
可用YAML
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
  | 
# 这里不做Mongo复制集,所以不需要运行MongoDB
# version: "3.3"
# MongoDB: https://hub.docker.com/_/mongo/
#mongodb:
#  image: mongo:3
#  restart: always
#  container_name: graylog-db
#  net: host
#  volumes:
#    - ./mongo_data:/data/db
#  # Elasticsearch: https://www.elastic.co/guide/en/elasticsearch/reference/6.6/docker.html
elasticsearch:
  image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1
  restart: always
  container_name: graylog-es
  net: host
  volumes:
    - ./elas_data:/usr/share/elasticsearch/data
    - ./plugins:/usr/share/elasticsearch/plugins
  environment:
    - TZ=Asia/Shanghai
    - cluster.name=graylog
    - node.name=255.80
    - indices.fielddata.cache.size=20%
    # 指定本机IP
    - network.host=128.0.255.80
    # 增加ENV,指定前一个ES,这样ES组成集群
    - "discovery.zen.ping.unicast.hosts=128.0.255.10,128.0.255.80"
    # JAVA_OPTS一定要放在ENV的最后
    - "ES_JAVA_OPTS=-Xms3000m -Xmx3000m"
  ulimits:
    memlock:
      soft: -1
      hard: -1
  mem_limit: 6g
# Graylog: https://hub.docker.com/r/graylog/graylog/
graylog:
  image: graylog/graylog:3.0
  restart: always
  net: host
  container_name: graylog-server
  environment:
    - TZ=Asia/Shanghai
    # 同Elasticsearch的net.host值一样,指定本机IP
    - GRAYLOG_ELASTICSEARCH_HOSTS=http://128.0.255.80:9200
    # 注意,这里的Mongo使用第一个的。因为要配置共享
    - GRAYLOG_MONGODB_URI=mongodb://128.0.255.10:27017/graylog
    # 不指定为Master
    - GRAYLOG_IS_MASTER=false
    # echo -n "admin" | sha256sum
    - GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
    # IP设置成主Graylog的API地址
    - GRAYLOG_HTTP_EXTERNAL_URI=http://128.0.255.10:9000/
    - GRAYLOG_TRANSPORT_EMAIL_ENABLED=true
    - GRAYLOG_TRANSPORT_EMAIL_HOSTNAME=smtp.sina.com
    - GRAYLOG_TRANSPORT_EMAIL_PORT=25
    - GRAYLOG_TRANSPORT_EMAIL_USE_AUTH=true
    - GRAYLOG_TRANSPORT_EMAIL_USE_TLS=false
    # 用以邮件告警,填写真实相关信息
    - GRAYLOG_TRANSPORT_EMAIL_AUTH_USERNAME=user@domain
    - GRAYLOG_TRANSPORT_EMAIL_AUTH_PASSWORD=user@pass
    - GRAYLOG_TRANSPORT_EMAIL_SUBJECT_PREFIX=GraylogAlert
    - GRAYLOG_TRANSPORT_EMAIL_FROM_EMAIL=user@domain
    # IP设置成主Graylog的API地址
    - GRAYLOG_TRANSPORT_EMAIL_WEB_INTERFACE_URL=http://128.0.255.10:9000/
    - GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
    - "JAVA_OPTS=-Xms512m -Xmx512m"
  | 
 
然后执行
1
2
3
  | 
docker-compose up -d
chmod -R 777 elas_data
docker-compose restart
  | 
 
老节点Elassticearch参数修改
因为增加了新节点,当老节点启动时,它不主动连接老节点时,会导致脑残,它自己成为主节点。
在docker-compose.yml中的elasticsearch项中,增加
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
  | 
....
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.6.1
restart: always
container_name: graylog-es
net: host
volumes:
  - ./elas_data:/usr/share/elasticsearch/data
  - ./plugins:/usr/share/elasticsearch/plugins
environment:
  ...
  # 增加配置,指定新增加的节点
  - "discovery.zen.ping.unicast.hosts=128.0.255.10,128.0.255.80"
  ... 
  | 
 
检查
- 
调用ES的http://es:9200/_cluster/state?prettyHTTP API,确认新加入的节点已经位于集群中
 
- 
进入Graylog的WEB,进入System–>nodes,正常应该会显示二个节点
 
- 
往新节点输入日志,应该可以在主节点的WEB上展示出来
 
客户端配置
两台主机都可以接受日志了,并且可以统一展现出来。这样增加吞吐量