1. 程式人生 > 實用技巧 >搭建ELK叢集 實時收集 jpress 專案日誌

搭建ELK叢集 實時收集 jpress 專案日誌

ELK介紹

1.什麼是ELK

ELK是三個軟體
1.E:elasticsearch		java程式		儲存,查詢日誌
2.L: logstash			java程式		收集、過濾日誌
3.K: kibana				java程式		提供web服務,將資料頁面化

4.F: filebeat			go			收集、過濾日誌

2.ELK作用

1.收集: 收集所有伺服器的日誌
2.傳輸: 把日誌穩定的傳輸到ES或者其他地方
3.儲存: ES能有效快速的儲存日誌資料
4.分析: 通過web頁面分析資料
5.監控: 監控叢集架構

3.ELK優點

1.處理方式靈活:elasticsearch是實時全文索引,具有強大的搜尋功能
2.配置相對簡單:elasticsearch全部使用JSON 介面,logstash使用模組配置,kibana的配置檔案部分更簡單。
3.檢索效能高效:基於優秀的設計,雖然每次查詢都是實時,但是也可以達到百億級資料的查詢秒級響應。
4.叢集線性擴充套件:elasticsearch和logstash都可以靈活線性擴充套件
5.前端操作絢麗:kibana的前端設計比較絢麗,而且操作簡單

4.為什麼使用ELK

### ELK 叢集服務版本必須一致
#收集所有的日誌
web服務日誌
業務服務日誌
系統日誌

#統計、分析:
1.統計訪問量
2.統計訪問量前10的IP
3.站點訪問次數最多的URL
4.查詢一上午以上三個值
5.查詢一下午以上三個值
6.對比一下上下午使用者訪問量
7.對比這一週,每天使用者增長還是減少

環境準備

實現功能

1. tomcat部署jpress專案
2. nginx代理jpress
3. 實時獲取tomcat json格式日誌
4. 實時獲取nginx json格式日誌
5. 實現 redis 訊息佇列
主機名 IP 服務 環境要求 記憶體
jojo01 10.0.0.20 tomcat nginx logstash MySQL Redis JDK 4G
jojo02 10.0.0.21 es kibana JDK 2G
jojo03 10.0.0.22 es JDK 2G

ES叢集部署

1.時間同步
yum install -y ntpdate
ntpdate time1.aliyun.com
2.安裝Java環境
rz jdk-8u181-linux-x64.rpm
rpm -ivh jdk-8u181-linux-x64.rpm
3.安裝ES
rz elasticsearch-6.6.0.rpm
#下載地址:https://www.elastic.co/downloads/elasticsearch
rpm -ivh elasticsearch-6.6.0.rpm

# 根據提示繼續操作
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
4.配置ES
# 配置檔案
vim /etc/elasticsearch/elasticsearch.yml
# jojo02
cluster.name: escluster 
node.name: es1
path.data: /service/es/data
path.logs: /service/es/logs
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
http.port: 9200
transport.tcp.port: 9300
transport.tcp.compress: true
network.host: 10.0.0.21,127.0.0.1
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: [10.0.0.21","10.0.0.22"]  # 叢集ip
# jojo02
cluster.name: escluster 
node.name: es1
path.data: /service/es/data
path.logs: /service/es/logs
bootstrap.memory_lock: true
bootstrap.system_call_filter: false
http.port: 9200
transport.tcp.port: 9300
transport.tcp.compress: true
network.host: 10.0.0.21,127.0.0.1
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: [10.0.0.21","10.0.0.22"]  # 叢集ip
# 建立資料目錄
mkdir /service/es/{data,logs} -p
chown -R elasticsearch.elasticsearch /service/es/
5.配置啟動檔案中記憶體鎖
 vim /usr/lib/systemd/system/elasticsearch.service
[Service]
LimitMEMLOCK=infinity
5.啟動ES
systemctl daemon-reload
systemctl start elasticsearch.service

Kibana 部署(jojo02)

1. 上傳程式碼包
rz kibana-6.6.0-x86_64.rpm
rpm -ivh kibana-6.6.0-x86_64.rpm

2. 配置kibana
vim /etc/kibana/kibana.yml
#程序的埠
server.port: 5601
#監聽地址
server.host: "10.0.0.21"
#指定ES的地址
elasticsearch.hosts: ["http://10.0.0.21:9200"]
#kibana也會建立索引
kibana.index: ".kibana"

3. 啟動kibana
systemctl start kibana.service

4. 訪問頁面
http://10.0.0.20:5601

Tomcat 部署(web01)

1. 時間同步
yum install -y ntpdate
ntpdate time1.aliyun.com
2. 安裝Java環境
rz jdk-8u181-linux-x64.rpm
rpm -ivh jdk-8u181-linux-x64.rpm

3.tomcat
yum install tomcat tomcat-webapps tomcat-admin-webapps -y

4.掛載wer包
# 下載地址
https://gitee.com/fuhai/jpress/blob/alpha/wars/jpress-web-newest.war
cd /usr/share/tomcat/webapps/ rz 

4.啟動
systemctl start tomcat

# 修改tomcat 預設頁面
cp -rp /usr/share/tomcat/webapps/ /usr/share/tomcat/webapps-jpress
cd /usr/share/tomcat/webapps-jpress
rm -rf ROOT/*
mv jpress-v3.2.5/* ROOT/

# 修改預設地址及json格式
vim /usr/share/tomcat/conf/server.xml
<Service name="webapps-jpress">
<Engine name="webapps-jpress"   resourceName="UserDatabase"/>
<Host name="localhost"  appBase="webapps-jpress"

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
               prefix="tomcat_access_json" suffix=".log"
               pattern="{&quot;clientip&quot;:&quot;%h&quot;,&quot;ClientUser&quot;:&quot;%l&quot;,&quot;authenticated&quot;:&quot;%u&quot;,&quot;AccessTime&quot;:&quot;%t&quot;,&quot;method&quot;:&quot;%r&quot;,&quot;status&quot;:&quot;%s&quot;,&quot;SendBytes&quot;:&quot;%b&quot;,&quot;Query?string&quot;:&quot;%q&quot;,&quot;partner&quot;:&quot;%{Referer}i&quot;,&quot;AgentVersion&quot;:&quot;%{User-Agent}i&quot;}"/>

部署MySQL

1. 安裝依賴
yum install -y ncurses-devel libaio-devel gcc gcc-c++ glibc cmake autoconf openssl openssl-devel
2.上傳
rz
tar xf mysql-5.6.46-linux-glibc2.12-x86_64.tar.gz
3.建立目錄
mkdir /service
4.軟連結
mv mysql-5.6.46-linux-glibc2.12-x86_64 /service/
ln -s /service/mysql-5.6.46-linux-glibc2.12-x86_64 /service/mysql
5.建立使用者
useradd mysql -s /sbin/nologin -M
6.拷貝配置檔案和啟動指令碼
cd /service/mysql/support-files/
cp my-default.cnf /etc/my.cnf
cp: overwrite '/etc/my.cnf'? y   
# 主庫配置檔案
vim /etc/my.cnf
[mysqld]
basedir = /service/mysql
datadir = /service/mysql/data
port=mysql
server_id=1
skip_name_resolve
log_err=/service/mysql/data/mysql.err
log_bin=/service/mysql/data/mysql-bin

cp mysql.server /etc/init.d/mysqld
7. 初始化
cd /service/mysql/scripts/
 ./mysql_install_db --user=mysql --basedir=/service/mysql --datadir=/service/mysql/data
 8.system管理
 vim /usr/lib/systemd/system/mysqld.service
[Unit]
Description=MySQL Server
Documentation=man:mysqld(8)
Documentation=https://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
User=mysql
Group=mysql
ExecStart=/service/mysql/bin/mysqld --defaults-file=/etc/my.cnf
LimitNOFILE = 5000

 systemctl daemon-reload
 systemctl start mysqld
 9.新增環境變數
vim /etc/profile.d/mysql.sh
export PATH=/service/mysql/bin:$PATH

source /etc/profile
10.操作資料庫
mysql 
create database php;
grant all on php.* to 'lyw' identified by '123';

Nginx 部署(web01)

1. 更換官方源
vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
2. 安裝nginx
yum install -y nginx
3.修改json格式日誌
vim /etc/nginx/nginx.conf
user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';              
    log_format  json  '{"@timestamp":"$time_iso8601",'
                      '"host":"$server_addr",'
                      '"clientip":"$remote_addr",'
                      '"size":$body_bytes_sent,'
                      '"responsetime":$request_time,'
                      '"upstreamtime":"$upstream_response_time",'
                      '"upstreamhost":"$upstream_addr",'
                      '"http_host":"$host",'
                      '"url":"$uri",'
                      '"referer":"$http_referer",'
                      '"agent":"$http_user_agent",'
                      '"status":"$status"}';
    access_log  /var/log/nginx/access.log  json;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    include /etc/nginx/conf.d/*.conf;
}
4. 代理配置
vim /etc/nginx/conf.d/wp.conf
  server {
         listen 80;
         server_name jpress.com;
  location / {
    proxy_pass   http://127.0.0.1:8080;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 }
}
5. 啟動 
systemctl start nginx

Logstash 部署(jojo01)

1. 時間同步
yum install -y ntpdate
ntpdate time1.aliyun.com
2. 安裝Java環境
rz jdk-8u181-linux-x64.rpm
rpm -ivh jdk-8u181-linux-x64.rpm
3. 安裝Logstash
rz logstash-6.6.0.rpm
rpm -ivh logstash-6.6.0.rpm
4. 授權
chown -R logstash.logstash /usr/share/logstash/


# nginx 
/var/log/nginx/
access.log # json 格式
# tomcat
/usr/local/tomcat/logs/
tomcat_access # json 格式
vim /etc/logstash/conf.d/jpress_json.conf
input {
  file {
    type => "tomcat_access_json"
    path => "/usr/share/tomcat/logs/tomcat_access_json*.log"
    start_position => "beginning"
    codec => "json"
  }
}

input {
  file {
    type => "nginx_log_json"
    path => "/var/log/nginx/access.log"
    start_position => "beginning"
    codec => "json"
  }
}
output {
  elasticsearch {
    hosts => ["10.0.0.21:9200"]
    index => "%{type}_%{+YYYY-MM-dd}"
    codec => "json"
  }
}

# 啟動
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/jpress_json.conf & 

實現 Reids 訊息佇列

yum install -y redis
vim /etc/redis.conf
bind 172.16.1.20  # redis 網路埠設定 

systemctl start redis
vim /etc/logstash/conf.d/redis_json.conf
input {
  file {
    type => "nginx_log"
    path => "/var/log/nginx/access.log"
    start_position => "beginning"
    codec => "json"
  }
  file {
    type => "tomcat_log"
    path => "/usr/share/tomcat/logs/tomcat_access_json.*.log"
    start_position => "beginning"
    codec => "json"
  }
}
output {
  if [type] == "nginx_log" {
    redis {
      host => "172.16.1.20"
      port => "6379"
      data_type => "list"
      db => "0"
      key => "nginx_log"
    }
  }
  if [type] == "tomcat_log" {
    redis {
      host => "172.16.1.20"
      port => "6379"
      data_type => "list"
      db => "1"
      key => "tomcat_log"
    }
  }
}

# 啟動
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/tomcat_redis.conf & 

# 檢視
172.16.1.20:6379> SELECT 1
OK
172.16.1.20:6379[1]> KEYS *
1) "tomcat_log"
172.16.1.20:6379[1]> KEYS *
1) "tomcat_log"
172.16.1.20:6379[1]> SELECT 0
OK
172.16.1.20:6379> KEYS *
1) "nginx_log"

實現 Reids 訊息佇列 到es叢集

vim /etc/logstash/conf.d/redis_to_es.conf
input {
  redis {
    host => "172.16.1.20"
    port => "6379"
    db => "0"
    data_type => "list"
    key => "nginx_log"
  }
  redis {
    host => "172.16.1.20"
    port => "6379"
    db => "1"
    data_type => "list"
    key => "tomcat_log"
  }
}
output {
  if [type] == "nginx_log" {
    elasticsearch {
      hosts => ["10.0.0.21:9200"]
      index => "nginx_log_%{+YYYY-MM-dd}"
    }
  }
  if [type] == "tomcat_log" {
    elasticsearch {
      hosts => ["10.0.0.21:9200"]
      index => "tomcat_log_%{+YYYY-MM-dd}"
    }
  }
}

# 啟動多例項
mkdir /data/logstash/redis_es

/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/redis_to_es.conf --path.data=/data/logstash/redis_es &


# 檢視 (瞬間被消費)
172.16.1.20:6379> KEYS *
(empty list or set)
172.16.1.20:6379>