ログ管理システムの導入方法

18151 ワード

原文:http://www.cnblogs.com/shantu/p/4589822.html
会社のデータセキュリティと分析の必要性のため、GlusterFS+lagstash+elasticsearch+kibana 3+redisを統合したログ管理アプリケーションを調査した.
インストール、構成プロセス、使用状況など
一、glusterfs分布式ファイルシステムの配置:説明:会社はウェブサイトの業務ログとシステムログの統一収集と管理をしたいと思って、mfs、fastdfsなどの分布式ファイルシステムの調査研究を経て、最後にglusterfsを選んだ.Glusterは高い拡張性、高性能、高い可用性、横方向に拡張できる弾力性の特徴を持っているからだ.メタデータのないサーバーの設計はglusterfsに単一の故障の危険性がなくて、公式サイト:www.gluster.org
1.システム環境準備:
Centos 6.4サービス:192.168.10.101 192.168.10.102 192.168.10.188 192.168.10.189クライアント:192.168.10.103 EPELソースとGlusterFSソースEPELソースとGLusterFSソースを追加し、EPELソースにはGLusterFSが含まれており、バージョンは比較的古く、比較的安定しており、今回のテストでは最新の3.5.0バージョンを採用した.
     rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
     wget -P /etc/yum.repos.dhttp://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo

2.導入プロセス
          :

     yum -y install glusterfs glusterfs-fuseglusterfs-server
     chkconfig glusterd on
     service glusterd start
          :
      4          ,          ,           ok。

     [root@db1 ~]# gluster peer probe192.168.10.102
     probe successful
     [root@db1 ~]# gluster peer probe192.168.10.188
     probe successful
     [root@db1 ~]# gluster peer probe 192.168.10.189
     probe successful
              :

     [root@db1 ~]# gluster peer status
     number of peers: 3
     hostname: 192.168.10.102
     uuid:b9437089-b2a1-4848-af2a-395f702adce8
     state: peer in cluster (connected)
     hostname: 192.168.10.188
     uuid: ce51e66f-7509-4995-9531-4c1a7dbc2893
     state: peer in cluster (connected)
     hostname: 192.168.10.189
     uuid:66d7fd67-e667-4f9b-a456-4f37bcecab29
     state: peer in cluster (connected)
      /data/gluster     ,    test-volume  ,    2:

      sh cmd.sh "mkdir /data/gluster"
     [root@db1 ~]#  gluster volume create test-volume replica 2192.168.10.101:/data/gluster 192.168.10.102:/data/gluster192.168.10.188:/data/gluster 192.168.10.189:/data/gluster
     creation of volume test-volume has beensuccessful. please start the volume to access data.
        :

     [root@db1 ~]# gluster volume starttest-volume
     starting volume test-volume has beensuccessful
          :

     [root@db1 ~]# gluster volume info
     volume name: test-volume
     type: distributed-replicate
     status: started
     number of bricks: 2 x 2 = 4
     transport-type: tcp
     bricks:
     brick1: 192.168.10.101:/data/gluster
     brick2: 192.168.10.102:/data/gluster
     brick3: 192.168.10.188:/data/gluster
     brick4: 192.168.10.189:/data/gluster

3.クライアントのインストール構成:
       :

     yum -y installglusterfs glusterfs-fuse
       :

     mount -t glusterfs 192.168.10.102:/test-volume/mnt/ (          )       。

     mount -t nfs -o mountproto=tcp,vers=3192.168.10.102:/test-volume /log/mnt/ (  nfs  ,     rpcbind      )
     echo "192.168.10.102:/test-volume/mnt/ glusterfs defaults,_netdev 0 0" >> /etc/fstab (      )

4.テスト
            

     dd if=/dev/zero of=/mnt/1.img bs=1Mcount=1000 #             
     cp /data/navy /mnt/  #         

         。
       glusterfs-fuse  ,         ,        。 NFS        ,               halt      !

     #              service glusterd stop
     service glusterfsd stop#             
     rm -fv /mnt/navy#         ,         navy     。      :serviceglusterd start#    ,navy       。        !

5.運用メンテナンスの一般的なコマンド:
        
     gluster volume stop test-volume
     gluster volume delete test-volume
            
     gluster peer detach 192.168.10.102
        172.28.0.0     glusterfs
     gluster volume set test-volumeauth.allow 192.168.10.*
                 (        2,     2(4、6、8..)   )
     gluster peer probe 192.168.10.105
     gluster peer probe 192.168.10.106
     gluster volume add-brick test-volume192.168.10.105:/data/gluster 192.168.10.106:/data/gluster
        
     #     gluster            
     gluster volume remove-brick test-volume192.168.10.101:/data/gluster/test-volume192.168.10.102:/data/gluster/test-volume start
     #       
     gluster volume remove-brick test-volume192.168.10.101:/data/gluster/test-volume192.168.10.102:/data/gluster/test-volume status
     #        
     gluster volume remove-brick test-volume192.168.10.101:/data/gluster/test-volume192.168.10.102:/data/gluster/test-volume commit
        
     #  192.168.10.101      ,  192.168.10.107    
     gluster peer probe 192.168.10.107
     gluster volume replace-bricktest-volume 192.168.10.101:/data/gluster/test-volume192.168.10.107:/data/gluster/test-volume start
     #       gluster volume replace-brick test-volume192.168.10.101:/data/gluster/test-volume192.168.10.107:/data/gluster/test-volume status
     #          gluster volume replace-brick test-volume192.168.10.101:/data/gluster/test-volume192.168.10.107:/data/gluster/test-volume commit
     #     192.168.10.101          ,          gluster        
     gluster volume replace-bricktest-volume 192.168.10.101:/data/gluster/test-volume192.168.10.102:/data/gluster/test-volume commit -force
     gluster volume heal test-volumes full
     24007

二.ログ収集システムの配置
説明:
         
Logstash:   log  ,     。          ,                 .    shipper  log  、indexer  log  .
Logstash shipper  log   log   redis   
Logstash indexer redis         elasticsearch
redis:   db,logstash shipper log   redis      。Logstash indexer redis         elasticsearch。
kafka:     redis   kafka,             ,    ,     ,        
Elasticsearch:         ,      ,     ,                  http://chenlinux.com/categories.html#logstash-ref   logstash  .        ,    。 redis     ,    kibana 
Kibana:   web  。

ログ収集システムアーキテクチャ図:
日志管理系统部署方法_第1张图片
 
仮想サーバの準備:
    192.168.10.143    logstash  shipper               
    192.168.10.144   logstash indexer  kafka              elasticsearch  
    192.168.10.145    elasticsearch-node1  kibana3   kibana  elasticsearch    
    192.168.10.146   elasticsearch-node2

1.3台のホストにjdk 1.7をインストールする必要がありますoracle jdk 1.7+バージョンjava-version javaの環境変数を設定することを推奨します.たとえば
    vim ~/.bashrc

    >>
    JAVA_HOME=/usr/java/jdk1.7.0_55
    PATH=$PATH:/$JAVA_HOME/bin
    CLASSPATH=.:$JAVA_HOME/lib
    JRE_HOME=$JAVA_HOME/jre
    export JAVA_HOME PATH CLASSPATH JRE_HOME 
    >>
    source ~/.bashrc

2.kafka(192.168.10.144)wgetをインストールするhttp://mirrors.hust.edu.cn/apache/kafka/0.8.1.1/kafka2.9.2-0.8.1.1.tgz tar zxvf kafka2.9.2-0.8.1.1.tgz ln –s kafka_2.9.2-0.8.1.1/usr/local/kafka vim/usr/local/kafka/config/server.properties broker.id=10-144 host.name=kafka-10-144 echo"192.168.10.144 kafka-10-144">/etc/hosts kafka起動zookeeperより怠惰で、zookeeper-server cdh 5をインストールする必要があることに注意する.2ソースにはyumソースを配置すればよいyum install zookeeper-server–y vim/etc/zookeeper/conf/zoo.cfg dataDir=/data/zookeeper zookeeperデータ格納経路を設定zookeeperとkafka/etc/initを起動する.d/zookeeper-server start nohup/usr/local/kafka/bin/kafka-server-start.sh/usr/local/kafka/config/server.properties &
3.Elasticsearchの取り付け(192.168.10.145)
    wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.4.1.tar.gz 
    elasticsearch          ,          ,    ES  ,   elasticsearch  ,  bin  elasticsearch
    tar zxvf elasticsearch-1.4.1.tar.gz
    ln –s elasticsearch-1.4.1 /usr/local/es
    cd  /usr/local/es/
    vim config/elasticsearch.yml        ,   kibana es    (es 1.4  kibana 3.1.2     )
    cluster.name: elasticsearch         
    node.name: "G1-logs-es02"        ,       ,   
    http.cors.enabled: true
    http.cors.allow-origin: "*"

    nohup bin/elasticsearch &
         9200  

    curl -X GET http://localhost:9200

        Elasticsearch(192.168.10.146)     :

4.インストールlogstash(192.168.10.143192.168.10.144)生産側と消費側はインストールするここで参考にしますhttp://blog.csdn.net/xzwdev/article/details/41278033 https://github.com/joekiller/logstash-kafka git clone https://github.com/joekiller/logstash-kafka
                    cd  /usr/local/src/logstash-kafka
                    make tarball      kakfa  logstash      ,      
                      /usr/local/src/logstash-kafka/build/     logstash-1.4.2.tar.gz   ,
                logstash-1.4.2.tar.gz                   ,

本番ログの構成と起動(192.168.10.143)
    haproxy    :
                tar zxvf logstash-1.4.2.tar.gz
                ln –s logstash-1.4.2 /usr/local/logstash

                vim /usr/local/logstash/conf/ logstash_shipper_haproxy.conf
                input{

                    file{
            path => "/data/application/haproxy-1.4.18/logs/haproxy.log"               
            type => "haproxylog"                                                
        }
    }

    output{
        kafka{
        broker_list => "192.168.10.144:9092"    kafka    
        topic_id => "logstash-haproxylog"              id
        }

    }
                               
                nohup  /usr/local/logstash/bin/logstash –f /usr/local/logstash/conf/ logstash_shipper_haproxy.conf &

コンシューマサーバの構成:
    tar zxvf logstash-1.4.2.tar.gz
    ln –s logstash-1.4.2 /usr/local/logstash
    vim /usr/local/logstash/consumer_conf/logstash_haproxylog_es.conf
    input{
        kafka{
            zk_connect => "192.168.10.144:2181"
            group_id  => 'logstash-haproxylog'
            topic_id  => 'logstash-haproxylog'
        }
    }

    output{
        elasticsearch{
        host => "192.168.10.145"
        port => "9300"
        index => "haproxy-5-13-%{+YYYY.MM.dd}"
        }
    }

コンシューマサービスの開始
    nohup /usr/local/logstash/bin/logstash –f /usr/local/logstash/consumer_conf/logstash_haproxylog_es.conf  &    

補足の最適化:
    1,es          ,   if  ,    logstash      
     : 
    input{
        kafka{
            zk_connect => "192.168.35.130:2181"
            group_id => "g1.api.test.com"
            topic_id => 'g1.api.test.com'

        }
        kafka{
            zk_connect => "192.168.35.130:2181"
            group_id => "go.clientinner.test.com"
            topic_id => "go.clientinner.test.com"
        }
        kafka{
            zk_connect => "192.168.35.130:2181"
            group_id => "api7.mobile.test.com_app"
            topic_id => "api7.mobile.test.com_app"
        }

    }

    filter {

            ruby {
            init => "@kname = ['time','uid','ip','uname','stime','etime','exec_time','url','ua','module','response_status','http_status','query_string']"
            code => "event.append(Hash[@kname.zip(event['message'].split('|'))])"
            }

            mutate {
            convert => ["exec_time", "float"]
            }
            geoip {
            database => "/data/application/logstash/patterns/GeoLiteCity.dat"
            source => "ip"
            fields => ["country_name","city_name"]
            }
            useragent {
            source => "ua"
            target => "useragent"
            }


        }

    output{

        if [type] == "go.clientinner.test.com"{
            elasticsearch{
            template => "/usr/local/logstash/conf/logstash.json"
            template_overwrite => true       #  url       ,
            host => "192.168.35.131"
            port => "9300"
            index => "go.clientinner.test.com-%{+YYYY.MM.dd}"
            }

        } else if [type] == "g1.api.test.com"{
            elasticsearch{
            template => "/usr/local/logstash/conf/logstash.json"
            template_overwrite => true
            host => "192.168.35.131"
            port => "9300"
            index => "g1.api.test.com-%{+YYYY.MM.dd}"
            }


        }else if [type] == "api7.mobile.test.com_app"{
            elasticsearch{
            template => "/usr/local/logstash/conf/logstash.json"
            template_overwrite => true
            host => "192.168.35.131"
            port => "9300"
            index => "api7.mobile.test.com_app-%{+YYYY.MM.dd}"
            }

        }

    }

2,logstashはesにデータを保存して、毎日時間のインデックスを創立して、デフォルトはutc時間を使って、朝8時にやっと創立して、現在のログのデータが昨日のインデックスの中に保存することをもたらして、以下の修正をする必要があります:
      logstash/lib/logstash/event.rb         

     226 
    .withZone(org.joda.time.DateTimeZone::UTC)
       

    .withZone(org.joda.time.DateTimeZone.getDefault())

5 kibanaのインストール(192.168.10.145)
    logstash        kibana,        kibana。kibana3   JavaScript+html    ,         http    。
    wget http://download.elasticsearch.org/kibana/kibana/kibana-latest.zip
    unzip kibana-latest.zip
    cp -r  kibana-latest /var/www/html
        config.js   elasticsearch      。
         。
    elasticsearch: "http://192.168.10.145:9200",

6、最終的に以下の図を実現する.
7、ログシステムのメンテナンス:
    1,elsasticsearch     
               es   
    Es   elsasticsearch      ,
          ,        
    1)       shard    :
         
    curl -XPUT http://192.168.35.131:9200/_cluster/settings -d '{"transient" : {"cluster.routing.allocation.enable" : "none"}}'
              :  :
    curl -XPOST http://192.168.35.132:9200/_cluster/nodes/_local/_shutdown
    curl -XPOST http://192.168.35.131:9200/_cluster/nodes/_local/_shutdown
    2)      ,      ,
    3)      ,            
    2,kafka+zookeeper    :
       :kafka_2.9.2-0.8.1.1.tgz   elasticsearch-1.4.1.tar.gz
    Kafka+zookeeper    :

    Cat kafka/config/server.properties      
    broker.id=35125
    host.name=192.168.35.125
    advertised.host.name=192.168.35.125
    log.dirs=/data/kafka-logs
    zookeeper.connect=192.168.35.130:2181,192.168.35.124:2181,192.168.35.125:2181

    cat /etc/zookeeper/conf/zoo.cfg

    dataDir=/data/zookeeper            
    clientPort=2181
    # zookeeper cluster
    server.35130=G1-logs-kafka:2888:3888
    server.35124=bj03-bi-pro-tom01:2888:3888
    server.35125=bj03-bi-pro-tom02:2888:3888
            
    Chown zookeeper.zookeeper /data/zookeeper -R
    /etc/init.d/zookeeper-server init              /data/zookeeper  
    Echo “35130” > /data/zookeeper/myid
    Chown zookeeper.zookeeper /data/zookeeper -R
    /etc/init.d/zookeeper-server start     zookeeper
    nohup ./bin/kafka-server-start.sh config/server.properties > /data/kafka-logs/kafka.log &    kafka

8,kibanaログイン認証インストール構成:
        :
        Nginx:      , es       
    Nodejs:   kibana-authentication-proxy
    Kibana:    kibana     kibana-authentication-proxy  
    kibana-authentication-proxy:         es,

8.1,nginxインストール構成#wgethttp://nginx.org/download/nginx-1.2.9.tar.gz # yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel #tar zxvf nginx-1.2.9.tar.gz # cd nginx-1.2.9 # ./configure --prefix=/usr/local/nginx #make && make install
        :
    #cat /usr/local/nginx/conf/nginx.conf

            user  web;
    worker_processes  4;

    error_log  logs/error.log  info;

    pid        logs/nginx.pid;

    events {
    worker_connections  1024;
    use epoll;
    }



    http {


    include       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"';

    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;
    upstream kianaca {
        server 192.168.35.131:9200 fail_timeout=30s;
        server 192.168.35.132:9200 fail_timeout=30s;
        server 192.168.35.125:9200 fail_timeout=30s;
        }

    server {
        listen       8080;
        server_name  192.168.35.131;


        location / {
        root   /var/www/html/kibana-proxy;
        index  index.html index.htm;
        proxy_next_upstream error timeout invalid_header http_500 http_503 http_404;  
        proxy_pass http://kianaca;  
        proxy_set_header Host lashou.log.com;  
        proxy_set_header X-Real-IP $remote_addr;  
        proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
        root   /var/www/html/kibana-proxy;
        }

    }

    }

        # /usr/local/nginx/sbin/nginx -t  
                #/usr/local/nginx/sbin/nginx   

8.2 kibana-authentication-proxyのインストール
    #cd /var/www/html/
    #git clone https://github.com/wangganyu188/kibana-authentication-proxy.git
    #mv kibana-authentication-proxy kibana-proxy
    # cd kibana-proxy
    #yum install npm
    #npm install express
    #git submodule init
    #npm install
    #node app.js
       kibana-proxy/config.js

               :

    es_host      #   nginx  
    es_port      #nginx 8080
    listen_port      #node     , 9201
    listen_host  #node   IP,   0.0.0.0
    cas_server_url  

8.3要求パス
    node(9201) <=> nginx(8080) <=> es(9200)