想要生产验证过的完整文档的加 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万不难