graylog集群搭建(mongodb+elasticsearch+graylog)-自定义

想要生产验证过的完整文档的加 w,目前生产5台graylog集群,为几百个应用提供日志监控服务,自定义埋点、预警,负载,需要生产完整文档的可以联系我

想要更多资料的call me,各种大厂视频,加薪80%,40万不难

Graylog官方架构图

参考

https://cloud.tencent.com/developer/article/1628850

https://www.jianshu.com/p/6c88d749c725

https://www.cnblogs.com/levi125/p/13685855.html#Graylog%E9%9B%86%E7%BE%A4%E5%AE%89%E8%A3%85

https://docs.graylog.org/en/3.2/pages/architecture.html

https://github.com/osiegmar/logback-gelf

Mongodb副本集搭建

Mongodb(M)表示主节点,Mongodb(S)表示备节点,Mongodb(A)表示仲裁节点。主备节点存储数据,仲裁节点不存储数据。客户端同时连接主节点与备节点,不连接仲裁节点。

    默认设置下,主节点提供所有增删查改服务,备节点不提供任何服务。但是可以通过设置使备节点提供查询服务,这样就可以减少主节点的压力,当客户端进行数据查询时,请求自动转到备节点上。这个设置叫做Read Preference Modes,同时Java客户端提供了简单的配置方式,可以不必直接对数据库进行操作。

    仲裁节点是一种特殊的节点,它本身并不存储数据,主要的作用是决定哪一个备节点在主节点挂掉之后提升为主节点,所以客户端不需要连接此节点。这里虽然只有一个备节点,但是仍然需要一个仲裁节点来提升备节点级别。我开始也不相信必须要有仲裁节点,但是自己也试过没仲裁节点的话,主节点挂了备节点还是备节点,所以咱们还是需要它的。

安装配置

准备

mkdir  -p  /usr/local/mongodb4

mkdir -p /data/mongodb/27017/{data,logs,tmp,etc,keyfile}

#解压

tar zxvf mongodb-linux-x86_64-4.0.4.tgz -C /usr/local/mongodb4/

#创建环境变量

export PATH=/usr/local/mongodb4/mongodb-linux-x86_64-4.0.4/bin:$PATH

#创建配置文件,并添加对应的配置信息

vi  /data/mongodb/mongod.conf

#配置如下

dbpath=/data/mongodb/27017/data

logpath=/data/mongodb/27017/logs/mongod.log

logappend=true

noprealloc=true

bind_ip=0.0.0.0

port=27017

fork=true

replSet=graylog

启动服务

/usr/local/mongodb4/mongodb-linux-x86_64-4.0.4/bin/mongod -f /data/mongodb/mongod.conf

#初始化副本集初始化副本集,指定各节点id及角色。

rs.initiate( {

  _id: "graylog",

  members:[

        {_id:1, host:'192.168.3.253:27017',priority:2},

        {_id:2, host:'192.168.3.254:27017',priority:1},

        {_id:3, host:'192.168.3.251:27017',arbiterOnly:true}

] })

#选一台连接

mongo 192.168.3.253:27017

#查看状态  PRIMARY  SECONDARY 优先级 ARBITER投票

#三台机器状态分别为"stateStr" : "PRIMARY"  "stateStr" : "SECONDARY" "stateStr" : "ARBITER"

rs.status()

创建graylog数据库,并添加graylog用户,赋予readWrite和dbAdmin权限

rs0:PRIMARY> use graylog

switched to db graylog

rs0:PRIMARY> db.createUser( {

    user: "graylog",

     pwd: "1",

     roles: [ { role: "readWrite", db: "graylog" } ]

   });

rs0:PRIMARY> db.grantRolesToUser( "graylog" , [ { role: "dbAdmin", db: "graylog" } ])

rs0:PRIMARY> show users

rs0:PRIMARY> db.auth("graylog","1")

异常

mongodb副本集集群中节点出现recovering状态解决办法(关机后出现)

Log日志:Fatal assertion 50666 UnrecoverableRollbackError: not willing to roll back more than 86400 sec

解决办法:

官方给出两种方式:第一种是停掉数据库,直接删除本地数据,然后启动mongo数据库,启动之后存在一个同步的过程,会非常耗时。再一种方式是停掉数据库,直接拷贝主节点上的数据,然后再启动mongo,这样就不存在数据同步的过程了,但是拷贝主节点上的数据,也有一个问题,就是数据时刻在变化,拷贝过程中难免会漏掉一些数据。这里采用第一种方式,先关闭数据库,删除本地数据,然后启动。删除出现同步错误的节点上的数据,然后重启。

cd /data/mongodb/27017/data

rm -rf ./*

/usr/local/mongodb4/mongodb-linux-x86_64-4.0.4/bin/mongod -f /data/mongodb/mongod.conf

Elasticsearch集群搭建

官方推荐master数设置为集群数/2+1,这里我们三台ES服务器,配置最少需要两台master,整个集群才可正常运行。在三个节点都参与选举的情况下,一个节点宕机了这个集群还是可用的。

安装配置

一、基本配置

1、准备三台虚拟机,root密码 root ;IP地址:

192.168.xxx.xxx worker1

192.168.xxx.xxx worker2

192.168.xxx.xxx worker3

并在对应的机器的/etc/hosts文件中设置对应的ip和机器名映射

2、每台机器上创建用户mq并设置密码(es无法用root用户启动)

useradd es

passwd es 密码输入:Anji@1024

3、系统配置

1)免密登录,切换es用户,在worker1、worker2、worker3上分别生成密钥:

su es

ssh-keygen

2)同步公钥到其他服务器

ssh-copy-id worker1

ssh-copy-id worker2

ssh-copy-id worker3

3) 通过命令验证免密登录配置是否成功

ssh worker1

ssh worker2

ssh worker2

4、在三台机器上分别配置JAVA环境

1)上传jdk8的tar包并解压到/app/jdk1.8目录

tar -zxvf jdk-8u171-linux-x64.tar.gz

mv jdk1.8.0_171/ /app/jdk1.8

2)配置环境变量。使用 vi ~/.bash_profile编辑文件,添加一下配置,并使用source ~/.bash_profile使环境变量生效,输入java -version查看是否配置成功

export JAVA_HOME=/app/jdk1.8/

PATH=$JAVA_HOME/bin:$PATH:$HOME/.local/bin:$HOME/bin

export PATH

搭建三节点ES集群,具体搭建步骤如下:

#创建文件夹

su es

mkdir /usr/elasticsearch

#上传Elasticsearch 到/usr/elasticsearch,并解压安装包

cd /usr/elasticsearch

tar xvf elasticsearch-6.8.13.tar.gz

#修改机器的配置文件,如下:

#1:修改jvm启动参数

cd /usr/elasticsearch/elasticsearch-6.8.13/config

vim jvm.options

-Xms2g #根据自己机器情况修改、设置为物理内存一半最佳,可根据服务器内存去选择调

-Xmx2g

#2:一个进程在VMAs(虚拟内存区域)创建内存映射最大数量

vim /etc/sysctl.conf

vm.max_map_count=655360

sysctl -p #配置生效

#修改配置文件

cd /usr/elasticsearch/elasticsearch-6.8.13/config

vi elasticsearch.yml

#node01的配置:

cluster.name: es-cluster

node.name: node01

node.master: true

node.data: true

network.host: 0.0.0.0  

http.port: 9200

discovery.zen.ping.unicast.hosts: ["192.168.50.150","192.168.50.151","192.168.50.152"]

discovery.zen.minimum_master_nodes: 2

http.cors.enabled: true

http.cors.allow-origin: "*"

#node02的配置:

cluster.name: es-cluster

node.name: node02

node.master: true

node.data: true

network.host: 0.0.0.0

http.port: 9200

discovery.zen.ping.unicast.hosts: ["192.168.50.150","192.168.50.151","192.168.50.152"]

discovery.zen.minimum_master_nodes: 2

http.cors.enabled: true

http.cors.allow-origin: "*"

#node03的配置:

cluster.name: es-cluster

node.name: node03

node.master: true

node.data: true

network.host: 0.0.0.0

http.port: 9200

discovery.zen.ping.unicast.hosts: ["192.168.50.150","192.168.50.151","192.168.50.152"]

discovery.zen.minimum_master_nodes: 2

http.cors.enabled: true

http.cors.allow-origin: "*"

#配置文件重点参数解析

(1)cluster.name

集群名字,三台集群的集群名字都必须一致

(2)node.name

节点名字,三台ES节点字都必须不一样

(3)discovery.zen.minimum_master_nodes:2

表示集群最少的master数,如果集群的最少master数据少于指定的数,将无法启动,官方推荐node master数设置为集群数/2+1,我这里三台ES服务器,配置最少需要两台master,整个集群才可正常运行,

(4)node.master该节点是否有资格选举为master,如果上面设了两个mater_node 2,也就是最少两个master节点,则集群中必须有两台es服务器的配置为node.master: true的配置,配置了2个节点的话,如果主服务器宕机,整个集群会不可用,所以三台服务器,需要配置3个node.masdter为true,这样三个master,宕了一个主节点的话,他又会选举新的master,还有两个节点可以用,只要配了node master为true的ES服务器数正在运行的数量不少于master_node的配置数,则整个集群继续可用,我这里则配置三台es node.master都为true,也就是三个master,master服务器主要管理集群状态,负责元数据处理,比如索引增加删除分片分配等,数据存储和查询都不会走主节点,压力较小,jvm内存可分配较低一点

(5)node.data

存储索引数据,三台都设为true即可

(6)bootstrap.memory_lock: true

锁住物理内存,不使用swap内存,有swap内存的可以开启此项

(7)discovery.zen.ping_timeout: 3000s

自动发现拼其他节点超时时间

(8)discovery.zen.ping.unicast.hosts: ["172.16.0.8:9300","172.16.0.6:9300","172.16.0.22:9300"]

设置集群的初始节点列表,集群互通端口为9300

启动elasticsearch

su es

/usr/elasticsearch/elasticsearch-6.8.13/bin/elasticsearch -d

#安装过程可能出现的问题及解决方案

[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at

least [65536]

#解决:切换到root用户,编辑limits.conf 添加类似如下内容

vi /etc/security/limits.conf

添加如下内容:

* soft nofile 65536

* hard nofile 131072

* soft nproc 2048

* hard nproc 4096

[2]: max number of threads [1024] for user [elsearch] is too low, increase to at least

[4096]

#解决:切换到root用户,进入limits.d目录下修改配置文件。

vi /etc/security/limits.d/90-nproc.conf

#修改如下内容:

* soft nproc 1024

#修改为

* soft nproc 4096

[3]: system call filters failed to install; check the logs and fix your configuration

or disable system call filters at your own risk

#解决:Centos6不支持SecComp,而ES5.2.0默认bootstrap.system_call_filter为true

cd /usr/elasticsearch/elasticsearch-6.8.13/config;

vim elasticsearch.yml

添加:

bootstrap.system_call_filter: false

[4]java.nio.file.AccessDeniedException: /usr/elasticsearch/elasticsearch-6.4.2/config/jvm.options

切换到root,给es授权

su root;  #输入密码

chown -R es /usr/elasticsearch/elasticsearch-6.4.2

Graylog

安装Graylog

目前用的单机,集群请参考https://www.jianshu.com/p/6c88d749c725

rpm -Uvh https://packages.graylog2.org/repo/packages/graylog-3.2-repository_latest.rpm

yum install graylog-server

如果您不希望安装集成插件或企业版插件,则只需运行yum install gralog-server

如果比较非常慢,也可以直接到官网下载rpm包来安装

下载地址:https://packages.graylog2.org/el/stableServer/3.2/x86_64

上传包后直接安装即可

yum -y install graylog-server-3.3.8-1.noarch.rpm graylog-enterprise-plugins-3.3.8-1.noarch.rpm graylog-integrations-plugins-3.3.8-1.noarch.rpm graylog-enterprise-integrations-plugins-3.3.8-1.noarch.rpm

修改Graylog相关配置文件

cp /etc/graylog/server/server.conf /etc/graylog/server/server.conf_default

生成密钥,并加密Graylog的登陆密码(这里为admin)

pwgen -N 1 -s 96

echo -n  admin  |  sha256sum |cut -d" " -f1

编辑Graylog配置文件

vi /etc/graylog/server/server.conf

#主节点is_master = true,其他两个节点的配置文件中设置为is_master = false

#is_master = true

#这里我们graylog做单机

#密钥,生成后填入

password_secret = fs1wDzw7Vh3I0SE9WzQCngtzAbAHtlVKD12iVVNG9cJyPhwN9HSSqAxJntlVxxx0cJe4VQ25Mhx4QI5ZykVzSAkz3sbzRUzW

#加密后的登陆密码,生成后填入

root_password_sha2 = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918

#时区

root_timezone = Asia/Shanghai

# 网络访问相关,重要

http_bind_address = 0.0.0.0:9000

#高亮

allow_highlighting = true

#mongodb

mongodb_uri = mongodb://graylog:1@192.168.3.253:27017,192.168.3.254:27017,192.168.3.251:27017/graylog?replicaSet=graylog

#elasticsearch

elasticsearch_hosts = http://192.168.3.253:9200,http://192.168.3.254:9200,http://192.168.3.251:9200

启动

systemctl daemon-reload

systemctl enable graylog-server.service

systemctl start graylog-server.service

systemctl --type=service --state=active | grep graylog

Graylog创建输入入口,选择协议gelf_udp(别选错,当时选了其他协议,日志一直乱码),选择node(机器节点,集群会有多个),

输入端口(logbak-gelf配置时需要输入ip和端口)

异常

如果日志乱码请修改elasticsearch  jvm.options配置文件

-Dfile.encoding=GBK

Spring整合graylog

导入依赖

<dependency>

    <groupId>de.siegmar</groupId>

    <artifactId>logback-gelf</artifactId>

    <version>2.0.0</version>

</dependency>

配置logback(参考https://github.com/osiegmar/logback-gelf

logback-spring.xml

<configuration>
    <springProperty name="APP_NAME" source="spring.application.name"/>
    <conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <!--<appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
        <graylogHost>192.168.3.253</graylogHost>
        <graylogPort>12201</graylogPort>
    </appender>-->
    <appender name="GELF" class="de.siegmar.logbackgelf.GelfUdpAppender">
        <graylogHost>192.168.3.253</graylogHost>
        <graylogPort>12201</graylogPort>
        <maxChunkSize>508</maxChunkSize>
        <useCompression>true</useCompression>
        <!--<messageIdSupplier class="de.siegmar.logbackgelf.MessageIdSupplier"/>-->
        <encoder class="de.siegmar.logbackgelf.GelfEncoder">
            <originHost>192.168.3.253</originHost>
            <includeRawMessage>false</includeRawMessage>
            <includeMarker>true</includeMarker>
            <includeMdcData>true</includeMdcData>
            <includeCallerData>false</includeCallerData>
            <includeRootCauseData>false</includeRootCauseData>
            <includeLevelName>false</includeLevelName>
            <shortPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%m%nopex</pattern>
            </shortPatternLayout>
            <fullPatternLayout class="ch.qos.logback.classic.PatternLayout">
                <pattern>%m%n</pattern>
            </fullPatternLayout>
            <!--<numbersAsString>false</numbersAsString>-->
            <staticField>app_name:${APP_NAME}</staticField>
            <staticField>os_arch:${os.arch}</staticField>
            <staticField>os_name:${os.name}</staticField>
            <staticField>os_version:${os.version}</staticField>
        </encoder>
    </appender>

    <!-- 控制台输出日志级别 -->
    <root level="info">
        <appender-ref ref="GELF" />
        <appender-ref ref="STDOUT" />
    </root>
</configuration>
 

正常使用log4j就会输入到graylog

private final Logger logger = LoggerFactory.getLogger(ElasticController.class);

logger.info("测试");

Graylog与ELK对比

Graylog需要把日志源采集到graylog-server,经过处理后的数据,使用ES进行存储。
Graylog提供了Web端,相当于Kibana。

想要更多资料的call me,各种大厂视频,加薪80%,40万不难

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
log4j是一个Java编程语言的日志记录工具,它可以帮助开发人员在程序中方便地生成和管理日志信息。它提供了多种日志级别,包括调试、信息、警告和错误等级,开发人员可以根据需要选择适当的日志级别进行记录。 MongoDB是一个流行的开源非关系型数据库,它使用文档模型存储数据。与传统的关系型数据库相比,MongoDB具有更高的可扩展性和灵活性。它使用JSON类似的BSON格式存储数据,可以存储复杂的数据结构,可以方便地进行数据查询和索引。 log4j和MongoDB可以很好地配合使用,以记录应用程序的日志信息。通过使用log4j的MongoDB Appender,我们可以将应用程序的日志信息直接写入MongoDB数据库,而不是传统的日志文件。这样做的好处是,可以更方便地使用MongoDB的功能进行日志信息的查询、分析和统计。 在使用log4j和MongoDB进行应用程序日志记录时,我们首先需要在Java项目中引入log4j和MongoDB的相关依赖库,并在log4j配置文件中配置MongoDB Appender。然后我们可以在应用程序中使用log4j的API来记录日志信息,同时指定日志级别和要记录的内容。log4j会自动将这些日志信息写入到MongoDB中指定的集合(collection)中。 除了日志记录之外,我们还可以使用MongoDB的查询语法来查询和分析日志信息,例如根据时间范围、日志级别、线程等条件来筛选日志信息。这样我们可以更方便地进行故障排查、性能优化等工作。 总而言之,log4j和MongoDB的结合可以提供更便捷的应用程序日志记录和分析方式,使开发人员能够更好地了解和监控应用程序的运行状况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值