logstash+redis收集负载均衡模式下多台服务器的多个web日志
一、logstash的简介
一般我们看日志来解决问题的时候要么 tail+grep 要么 把日志下载下来再搜索,可以应付不多
的主机和应用不多的部署场景。但对于多机多应用部署就不合适了。这里的多机多应用指的是
同一种应用程序被部署到几台服务器上,每台服务器上又部署着不同的多个应用程序。可以想
象,在这种场景下,为了监控或者搜索某段日志,需要登陆多台服务器,执行多个tail -F和grep
命令来分析日志。一方面这很被动。另一方面,效率非常低,数次操作下来,程序员的心情也
会变糟,所以就有了logstash的出现。
logstash 是解决分布式系统的日志问题管理的一种工具。其基本原理是后台跑着一个logstash的
程序,这个程序负责汇总所有日志到一个本地文件中。只要执行tail -f这个文件就可以做到监控
多台应用服务的日志了。因为所有日志都汇总在一个目标文件里了,所以做日志搜索的时候只要针
对这一个文件搜索就可以了
下面我们来讲一下logstash+redis是如何实现多服务器且每台服务器多应用日志收集到日志服务器的
logstash+redis的这种方式其实和els+kabina+logstash的作用差不多,只不过第二种方式多了个可视
化日志的界面,但是第一种方式比较简单,第二种方式比较有逼格一点
二、logstash部署架构

解释术语:
Shipper:日志收集者。负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来,输出到Redis暂存。
Indexer:日志存储者。负责从Redis接收日志,写入到本地文件。
Broker :日志管理者。redis用来连接多个Shipper和多个Indexer。
三、开始搭建logstash+redis
服务器环境:
web1服务器 192.168.11.3
web2服务器 192.168.11.4
日志服务器 192.168.11.5
logstash 在web1服务器 、 web2服务器 、日志服务器都要安装
redis 为了取消你的多疑心里,redis咱就安装在日志服务器好了(其实redis安装在哪一台都可以)
角色划分:
web1服务器 logstash
web2服务器 logstash
日志服务器 logstash 、redis(redis之前就已经在日志服务器安装好了,我这里就不介绍redis的安装了)redis的安装请跳转至https://www.cnblogs.com/ouyangfei/p/12091102.html
说明:三台服务器的logstash指的是logstash-7.4.2.tar.gz这个安装包,这个包在三台服务器都要安装
------------------------------------------------------------------------------------------------------------------------
web1服务器安装:192.168.11.3
安装Java :
下载JDK压缩包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/
配置JAVA_HOME环境变量
vim /etc/profile 下面的内容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH
:wq 保存退出
java -version 查看java的版本信息并确认是否安装成功
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
安装Logstash :
去官网下载Logstash的压缩包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 创建软连接
完了之后咱先不着急启动logstash,请接着往下看
现在我们收集web1服务器下某个应用服务的日志如 website.log website-error.log,咋们web应用服务主要就是收集这两个日志
mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf 创建website.log的logstash启动配置文件,添加如下内容
input {
file {
path => [
"/wefintek/education/website/logs/website.log" (这里填写你需要收集的本服务器路径下的web日志文件)
]
type => "website-log" (名字随意取,但必须下面的保持一致)
}
}
output {
if [type] == "website-log" {
redis {
host => "192.168.11.5" redis主机IP地址
port => 7890 redis端口号
db => 12 redis的12号库(如果你的redis是专门给logstash用的话,这里1-15号库随便填,但要和日志服务器的保持一致)
password => "Yang_20191118" redis的密码
data_type => "channel" 会话模式,channel模式
key => "/wefintek/education/website/logs/website-log" (key的名字随便取但是要和日志服务器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.3"] 按自定义的这种格式输出到日志
}
}
:wq 保存退出
data_type的可选值有channel和list两种。用过Redis的人知道,channel是Redis的发布/订阅通信模式,而list是Redis的队列数据结构。两者都可以用来实现系统间有序的消息异步通信。channel相比list的好处是,解除了发布者和订阅者之间的耦合。举个例子,一个Indexer在持续读取Redis中的记录,现在想加入第二个Indexer,如果使用list,就会出现上一条记录被第一个Indexer取走,而下一条记录被第二个Indexer取走的情况,两个Indexer之间产生了竞争,导致任何一方都没有读到完整的日志。channel就可以避免这种情况。这里Shipper角色的配置文件和下面将要提到的Indexer角色的配置文件中都使用了channel。
vim web-error.conf 创建website-error.log的logstash启动配置文件,添加如下内容
input {
file {
path => [
"/wefintek/education/website/logs/website-error.log" 这里填写你需要收集的本服务器路径下的文件。
]
type => "website-error-log"
}
}
output {
if [type] == "website-error-log" {
redis {
host => "192.168.11.5"
port => 7890
db => 12
password => "Yang_20191118"
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" (key的名字随便取但是要和日志服务器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.3"] 按自定义的这种格式输出到日志
}
}
:wq 保存退出
现在启动配置文件website-log.conf和website-error.conf都准备好了,但是咱还是不要着急启动
说明:启动logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改为 http.host: "0.0.0.0" (127.0.0.1只能本地连接,0.0.0.0表示所有服务器都可以连接)
为了安全着想,可以在云控制台的安全规则里面添加端口的授权IP(logstash的端口9600)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
web2服务器:192.168.11.4
安装Java :
下载JDK压缩包。
tar -zxvf jdk-8u121-linux-x64.tar.gz
mv jdk1.8 /usr/local/
配置JAVA_HOME环境变量
vim /etc/profile 下面的内容添加到文件的最后一行
export JAVA_HOME=/usr/local/jdk1.8
export PATH=${JAVA_HOME}/bin:$PATH
:wq 保存退出
java -version 查看java的版本信息并确认是否安装成功
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)
安装Logstash :
去官网下载Logstash的压缩包。https://www.elastic.co/cn/downloads/past-releases#logstash
tar -zxvf logstash-7.4.2.tar.gz
mv logstash-7.4.2 /usr/local/
ln -s logstash-7.4.2 logstash 创建软连接
完了之后咱先不着急启动logstash,请接着往下看
现在我们收集web2服务器下的应用服务的日志 website.log website-error.log (web1和web2部署的服务都是一模一样的,用nginx做的负载均衡)
mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf 创建website.log的logstash启动配置文件,添加如下内容
input {
file {
path => [
"/wefintek/education/website/logs/website.log" (这里填写你需要收集的本服务器路径下的web日志文件)
]
type => "website-log" (名字随意取,但必须下面的保持一致)
}
}
output {
if [type] == "website-log" {
redis {
host => "192.168.11.5" redis主机IP地址
port => 7890 redis端口号
db => 12 redis的12号库(如果你的redis是专门给logstash用的话,这里1-15号库随便填,但要和日志服务器的保持一致)
password => "Yang_20191118" redis的密码
data_type => "channel" 会话模式,channel模式
key => "/wefintek/education/website/logs/website-log" (key的名字随便取但是要和日志服务器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.4"] 按自定义的这种格式输出到日志
}
}
:wq 保存退出
vim web-error.conf 创建website-error.log的logstash启动配置文件,添加如下内容
input {
file {
path => [
"/wefintek/education/website/logs/website-error.log" 这里填写你需要收集的本服务器路径下的文件。
]
type => "website-error-log"
}
}
output {
if [type] == "website-error-log" {
redis {
host => "192.168.11.5"
port => 7890
db => 12
password => "Yang_20191118"
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" (key的名字随便取但是要和日志服务器的input保持一致)
}
}
}
filter {
mutate {
replace => ["host", "192.168.11.4"] 按自定义的这种格式输出到日志
}
}
:wq 保存退出
现在启动配置文件website-log.conf和website-error.conf都准备好了,但是咱也不要着急启动
说明:启动logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改为 http.host: "0.0.0.0" (127.0.0.1只能本地连接,0.0.0.0表示所有服务器都可以连接)
为了安全着想,可以在云控制台的安全规则里面添加端口的授权IP(logstash的端口9600)
--------------------------------------------------------------------------------------------------------------------------
日志服务器:192.168.11.5
mkdir -p /etc/logstash/conf
cd /etc/logstash/conf
vim web-log.conf
input {
redis {
type => "website-log"
host => "192.168.11.5"
port => 7890
password => "Yang_20191118"
db => 12
data_type => "channel"
key => "/wefintek/education/website/logs/websitelog" 和web服务器配置的key保持一致
}
}
output {
if [type] == "website-log" {
file {
path => "/root/logs/website-log/website-%{+YYYY.MM.dd}.log" 将日志输出到本服务器的规定目录下并自带日期
flush_interval => 0
}
}
}
:wq
vim web-error.conf
input {
redis {
type => "website-error-log"
host => "192.168.11.5"
port => 7890
password => "Yang_20191118"
db => 12
data_type => "channel"
key => "/wefintek/education/website/logs/website-error-log" 和web服务器配置的key保持一致
}
}
output {
if [type] == "website-error-log" {
file {
path => "/root/logs/website-log/website-error-%{+YYYY.MM.dd}.log"
flush_interval => 0
}
}
}
:wq
现在启动配置文件website-log.conf和website-error.conf都准备好了,但是咱也还是不要着急启动
说明:启动logstash之前需要更改下配置文件logstash.yml
vim /usr/local/logstash/config/logstash.yml
http.host: "127.0.0.1" 改为 http.host: "0.0.0.0" (127.0.0.1只能本地连接,0.0.0.0表示所有服务器都可以连接)
为了安全着想,可以在云控制台的安全规则里面添加端口的授权IP(logstash的端口9600)
--------------------------------------------------------------------------------------------------------------------------------------------------------------
是时候该着急了,咋们总算能启动logstash了
先在Web1服务器上启动:
cd /root
mkdir logs
touch logs/logstash.log (logstash的启动是在当前终端上的,ctrl + C就停止logstash的进程了,所以创建日志文件以后台的方式启动)
vim logstart.sh 启动脚本(logstash本身是没有脚本的,一般都是手敲命令启动,所以要创建脚本)
#!/bin/bash
a=`ps -elf | grep logstash | grep /usr/java/jdk1.8.0_121/bin/java | awk '{print $4}'`
if [ "$a" > "0" ]
then
echo "logstash is really running"
else
cd /usr/local/logstash
nohup /usr/local/logstash/bin/logstash -f /etc/logstash/conf &>/root/logs/logstash.log &
fi
:wq
chmod 755 logstart.sh
vim logstop.sh 停止脚本
#!/bin/bash
a=`ps -elf | grep logstash | grep /usr/java/jdk1.8.0_121/bin/java | awk '{print $4}'`
if [ $a > 0 ]
then kill -9 $a
else
echo "logstash is really stop"
fi
:wq
chmod 755 logstop.sh
sh logstart.sh
tail -f logs/logstash.log 查看是否报错
---------------------------------------------------
将启动和停止脚本复制到web2服务器的/root/下面,然后再启动
cd /root
mkdir logs
touch logs/logstash.log
vim logstart.sh
复制粘贴过来
:wq 保存退出
vim logstop.sh
复制粘贴过来
:wq 保存退出
chmod 755 logstart.sh logstop.sh
sh logstart.sh
tail -f logs/logstash.log 查看是否报错
--------------------------------------------
将脚本复制到日志服务器的/root/下面,然后再启动
cd /root
mkdir logs
touch logs/logstash.log
mkdir logs/website-log
vim logstart.sh
复制粘贴过来
:wq 保存退出
vim logstop.sh
复制粘贴过来
:wq 保存退出
chmod 755 logstart.sh logstop.sh
sh logstart.sh
tail -f logs/logstash.log 查看是否报错
--------------------------------------------------
最后在r日志服务器观察相应web的集合日志
cd /root
tail -f logs/web-log/website.log
--------------------------------------------------
我们也可以手动测试一下,模拟日志产生
在web1服务器
echo "Hello World" >> /wefintek/education/website/logs/website.log
如果日志服务器tail -f /root/logs/web-log/website.log 出现: 192.168.11.3 B[1] Hello World,说明web1服务器的website.log收集成功。
--------------------------------------------------
为了保险起见,web2服务器我们也可以手动测试
echo "I want to your home" >> /wefintek/education/website/logs/website.log
如果日志服务器tail -f /root/logs/web-log/website.log 出现: 192.168.11.4 B[1] I want to your home,说明web2服务器的website.log收集成功。
如果你愿意你也可以把web1服务器、web2服务器的website-error.log 也测试一下
到此logstash+redis安装完成了
说明:生产中可能会看到重复的日志,你可以到源服务器去看下源日志是否有重复,一般都是原日志有重复,所以我们
收集的日志里面才会有重复,网上很多人说数据有重复,其实是你没有安装好,网上的搭建写的都不全,只要按照我这
种安装的方式是不会有重复日志数据的问题的。
logstash+redis收集负载均衡模式下多台服务器的多个web日志的更多相关文章
- 负载均衡配置下的不同服务器【Linux】文件同步问题
负载均衡配置下的不同服务器[Linux]文件同步问题2017年04月13日 22:04:28 守望dfdfdf 阅读数:2468 标签: linux负载均衡服务器 更多个人分类: 工作 问题编辑版权声 ...
- Dubbo学习(二) Dubbo 集群容错模式-负载均衡模式
Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...
- Nginx+Tomcat+Redis实现负载均衡、资源分离、session共享
Nginx+Tomcat+Redis实现负载均衡.资源分离.session共享 CentOS安装Nginx http://centoscn.com/CentosServer/www/2013/0910 ...
- openstry lua redis实现负载均衡
需求: 通过URI地址http://10.0.0.148/test2?uuid=123的uuid参数值的第一位,去实现redis的负载均衡 若uuid第一位为1,那么去10.0.0.148的redis ...
- CephRGW 在多个RGW负载均衡场景下,RGW 大文件并发分片上传功能验证
http://docs.ceph.com/docs/master/radosgw/s3/objectops/#initiate-multi-part-upload 根据分片上传的API描述,因为对同一 ...
- keepalived+nginx+tomcat+redis实现负载均衡和session共享(原创)
keepalived+nginx+tomcat+redis实现负载均衡和session共享 直接上链接,码了一天,就不再重写了,希望能帮到大家,有问题欢迎留言交流.
- Spring Cloud - 切换Ribbon的负载均衡模式
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现.通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模 ...
- linux下两台服务器文件实时同步方案设计和实现
inux下两台服务器文件实时同步方案设计和实现 假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器 有目录 /opt/test/ 192.168.0.2 目标服务器 有目录 /o ...
- Nginx 负载均衡条件下 Redis 共享Session (Java)(二)
关于Session的问题 网上有各个方面的针对,有在nginx 上处理: ip_hash的session,有在 tomcat 做处理:修改Context文件,有针对项目做处理.本篇就是对项目处理 1. ...
随机推荐
- PyQt5学习一---环境的安装和配置
PyQt5环境安装 1.Python环境(我在练习的时候是用的Python3.6.8) 2.PyQt5安装 首先安装sip pip install sip 然后安装PyQt5-tools pip in ...
- Centos 安装 FTP
安装教程: 基于 CentOS 搭建 FTP 文件服务 搭建完成后,使用windows文件夹访问FTP报错,请确保输入的文件名是否正确,并且您有权访问此文件. 先确认ftp服务正常 修改: 设 ...
- oracle-只读数据文件的备份与恢复
11 只读数据文件的备份与恢复 只读数据文件是只读表空间的数据文件,数据块包括文件头在内部允许更改 SQL> alter tablespace yhqt read only; SQL> a ...
- is_displayed()检查元素是否可见
返回的结果是bool类型,以百度首页为案例,来验证"©2019 Baidu 使用百度前必读意见反馈京ICP证030173号 "是否可见,见实现的代码: from selenium ...
- 刘铁猛-深入浅出WPF-系列资源汇总
首先奉上原作者刘铁猛博客地址:http://www.cnblogs.com/prism/ 作者讲的很不错,没有之一,另外作者出了一本书,希望大家支持. 送上全套高清晰视频教程(我注册了3个51cto的 ...
- WCF书籍
<WCF 服务编程> <WCF 全面解析> <WCF全面解析(套装上下册)>
- [DS+Algo] 008 查找
1. 常见搜索方法 顺序查找 最优时间复杂度:O(1) 最坏时间复杂度:O(n) 二分法 最优时间复杂度:O(1) 最坏时间复杂度:O(logn) 二叉树 若是"二叉搜索树" 最优 ...
- Python入门之format()方法
在此列出format()方法的一些基本使用: >>> '{}{}{}'.format('圆周率是',3.1415926,'...') '圆周率是3.1415926...' >& ...
- Java Springboot 根据图片链接生成图片下载链接 及 多个图片打包zip下载链接
现有一些图片在服务器上的链接,在浏览器中打开这些链接是直接显示在浏览器页面的形式. 现在需要生成这些图片的单独下载以及打包下载链接,即在浏览器中打开下载链接后弹出下载框提示下载.由于前端存在跨域问题, ...
- PHP排序函数sort、rsort、asort、arsort、ksort、krsort
1.sort函数用于对数组元素值从低到高排序,去除原始索引元素,重新生成0,1,2..的键2.rsort函数用于对数组元素值从高到低排序,去除原始索引元素,重新生成0,1,2..的键3.asort函数 ...