系统架构

  • Load Balancer: 负载均衡
  • Graylog Server Cluster: 提供日志的Web管理功能和日志输入
  • MongoDB Replica Set: 存储Graylog相关的配置
  • Elasticsearch Cluster: 日志文件的持久化存储和检索
    Graylog Cluster Structure

Graylog Cluster

Graylog集群的安装部署如下表所示:

VMIPGraylog ServerMongoDBElasticsearch
vm1192.168.56.131Graylog Server主节点MongoDB主节点elasticsearch master节点
vm2192.168.56.141Graylog Server从节点MongoDB仲裁节点elasticsearch master&data节点
vm3192.168.56.142Graylog Server从节点MongoDB备选主节点elasticsearch master&data节点

MongoDB

所有节点的配置都一样,如下

# /etc/mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# Where and how to store data.
storage:
 dbPath: /var/lib/mongodb
 journal:
   enabled: true
#  engine:
#  mmapv1:
#  wiredTiger:

#replication:
#  replSetName: graylog
# where to write logging data.
systemLog:
 destination: file
 logAppend: true
 path: /var/log/mongodb/mongod.log
# network interfaces
net:
 port: 27017
 bindIp: 0.0.0.0
# how the process runs
processManagement:
#  fork: true
#  pidFilePath: /var/run/mongodb/mongod.pid
 timeZoneInfo: /usr/share/zoneinfo
#security:
#operationProfiling:
replication:
 replSetName: graylog

在任意节点,利用mongo命令登入mongodb:

rs.initiate()

# 添加主节点

rs.add({_id:0,host:‘192.168.56.131:27017’,priority:2,arbiterOnly:false})

# 添加备用节点

rs.add({_id:1,host:‘192.168.56.142:27017’,priority:1,arbiterOnly:false})

# 添加仲裁节点

rs.add({_id:2,host:‘192.168.56.141:27017’,arbiterOnly:true})

rs.conifg() # 查看节点信息

Elasticsearch

Note:Elasticsearch不能使用root用户开启,所以,需要创建一个新的用户和组别,如es.

su es
vim /usr/local/elasticsearch/config/elasticsearch.yml
分别修改以下几个配置项:
cluster.name: graylog
node.name: node-1

# node.master=true means this is a candidate master node

node.master: true

# node.data = true means this is a data node

node.data: true

# the ip of node

network.host: 0.0.0.0

# ip:host of all nodes

discovery.zen.ping.unicast.hosts: [“192.168.56.131:9300”,“192.168.56.141:9300”,“192.168.56.142:9300”]
discovery.zen.minimum_master_nodes: 2
其他节点分别修改node.name, node.master, node.data

候选主节点

一个节点启动后,就会使用Zen Discovery机制去寻找集群中的其他节点,并与之建立连接。集群中会从候选主节点中选举出一个主节点,主节点负责创建索引、删除索引、分配分片、追踪集群中的节点状态等工作。Elasticsearch中的主节点的工作量相对较轻,用户的请求可以发往任何一个节点,由该节点负责分发和返回结果,而不需要经过主节点转发。
正常情况下,集群中的所有节点,应该对主节点的选择是一致的,即一个集群中只有一个选举出来的主节点。然而,在某些情况下,比如网络通信出现问题、主节点因为负载过大停止响应等等,就会导致重新选举主节点,此时可能会出现集群中有多个主节点的现象,即节点对集群状态的认知不一致,称之为脑裂现象。为了尽量避免此种情况的出现,可以通过discovery.zen.minimum_master_nodes来设置最少可工作的候选主节点个数,建议设置为(候选主节点数 / 2) + 1, 比如,当有三个候选主节点时,该配置项的值为(3/2)+1=2,也就是保证集群中有半数以上的候选主节点。
候选主节点的设置方法是设置node.mater为true,默认情况下,node.mater和node.data的值都为true,即该节点既可以做候选主节点也可以做数据节点。由于数据节点承载了数据的操作,负载通常都很高,所以随着集群的扩大,建议将二者分离,设置专用的候选主节点。当我们设置node.data为false,就将节点设置为专用的候选主节点了。

node.master = true

node.data = false

数据节点

数据节点负责数据的存储和相关具体操作,比如CRUD、搜索、聚合。所以,数据节点对机器配置要求比较高,首先需要有足够的磁盘空间来存储数据,其次数据操作对系统CPU、Memory和IO的性能消耗都很大。通常随着集群的扩大,需要增加更多的数据节点来提高可用性。
前面提到默认情况下节点既可以做候选主节点也可以做数据节点,但是数据节点的负载较重,所以需要考虑将二者分离开,设置专用的数据节点,避免因数据节点负载重导致主节点不响应。

node.master = false

node.data = true

数据备份

参考链接:

https://blog.csdn.net/jiahao1186/article/details/81058022

官方文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

Graylog

  • 设置是否为主节点

/# If you are running more than one instances of Graylog server you have to select one of these instances as master. The master will perform some periodical tasks that non-master won’t perform.
is_master = true

  • 生成管理员密码

echo -n your_passwd | sha256sum
for example: echo -n admin1234 | sha256sum
7a96004f5149811c069f40146b08cf058db961 -

  • 将管理员密码的哈希结果添加到配置文件

sudo vim /etc/graylog/server/server.conf

root_password_sha2 = 7a96004f5149811c069f40146b08cf058db961

  • 生成并设置保护密码

sudo apt-get install pwgen

pwgen -N -1 -s 40 1

5JdTcmGgqBUNw2o9YXbuzNx58tmY

sudo vim /etc/graylog/server/server.conf

password_secret = 5JdTcmGgqBUNw2o9YXbuzNx58tmY

  • 修改mongodb的连接uri

sudo vim /etc/graylog/server/server.conf

# 如果没有登录认证信息,则无需添加user:password

mongodb_uri = mongodb://192.168.56.131:27017,192.168.56.141:27017,192.168.56.142:27017/graylog

  • 修改elasticsearch hosts

elasticsearch_hosts = http://192.168.56.131:9200,http://192.168.56.141:9200,http://192.168.56.142:9200

  • 修改http绑定地址

http_bind_address = 0.0.0.0:9000

  • 修改publish uri

# 由于外部机器只能通过主机的端口转化进行访问graylog, 所以这里需要设置为主机的IP
http_publish_uri = http://172.16.162.127:9000/

  • 设置自动启动graylog

sudo systemctl enable graylog-server.service

sudo systemctl start graylog-server.service

  • 常见错误:
    • 如果发现机器重启之后,Graylog没有启动,并在对应的日志文件上没有这次启动的日志,则可能systemd文件有错误

      查看systemd启动文件 /usr/lib/systemd/system/graylog-server.service,是否使用**/bin/bash启动graylog-server,例如:
      ExecStart=
      /bin/bash** /usr/share/graylog-server/bin/graylog-server

Filebeat

Filebeat是本地文件的日志数据采集器,可监控日志目录或特定的日志文件(tail file), 并将它们转发给Elasticsearch或logstash进行索引。

# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log 
  enalbed: true
  paths:
    - /var/log/nginx/error.log
  # Exclude lines. A list of regular expressions to match. It drops the lines that are
  # matching any regular expression from the list.
  exclude_lines: ["^$", "^this"]
#----------------------------- Logstash output --------------------------------
output.logstash:
  # The Logstash hosts
  hosts: ["192.168.56.151:12203"]

启动filebeat

sudo systemctl enable filebeat
sudo systemctl start filebeat

Note: 大家在测试file beat功能的时候,如果使用vim去编辑你的测试日志文件,这样会在Graylog管理后台看到重复的日志,原因是vim编辑并保存文件之后,文件的inode已经改变了。

Log LoadBalancer

利用Nginx(支持http, tcp和UDP数据转发)实现日志web管理访问和日志同步输入的负载均衡。例如:需要4个端口转发配置,分别为:web管理访问端口9000(TCP), service_1日志输入端口12201(UDP)、service_2日志输入端口12202(UDP)和service_3 filebeat日志输入端口12203(TCP)

web管理访问

upstream graylog_servers {
    least conn;
    server 192.168.56.131:9000;
    server 192.168.56.141:9000;
    server 192.168.56.142:9000;
}

server {
    listen        9000;
    proxy_pass    graylog_servers;
    proxy_timeout  10s;
    error_log     graylog_servers.log;
}

service_1日志输入

upstream service_1_logs {
    least conn;
    server 192.168.56.131:12201;
    server 192.168.56.141:12201;
    server 192.168.56.142:12201;
}

server {
    listen        12201 udp;
    proxy_pass    service_1_logs ;
    proxy_timeout  10s;
    error_log     service_1_logs .log;
}

service_2日志输入

upstream service_2_logs {
    least conn;
    server 192.168.56.131:12202;
    server 192.168.56.141:12202;
    server 192.168.56.142:12202;
}

server {
    listen        12202 udp;
    proxy_pass   service_2_logs ;
    proxy_timeout  10s;
    error_log     service_2_logs .log;
}

service_3 filebeat日志输入

upstream service_3_logs {
    least conn;
    server 192.168.56.131:12202;
    server 192.168.56.141:12202;
    server 192.168.56.142:12202;
}

server {
    listen        12203;
    proxy_pass    service_3_logs;
    proxy_timeout  10s;
    error_log     service_3_logs.log;
}

日志管理

进入Graylog的日志管理界面之后,根据如下信息配置好各个模块的日志输入。

日志输入源方式端口
service_1GELF UDP12201
service_2GELF UDP12202
service_3Beats12203
Logo

开源、云原生的融合云平台

更多推荐