ELK环境部署

部署的版本需要统一,否则可能会有兼容性问题,使用6.8.0.
外网访问需要放行 5601 9200 9300 三个端口
ElasticSearchLogstash不建议部署同台服务器

  • 默认中间件都安装在 /usr/local/elk下(没有的话新建目录 mkdir /usr/local/elk),点此处下载(链接: https://pan.baidu.com/s/1J-fOALTN4YzbV-gqJZ_HJQ 密码: t133

1. ElasticSearch

  • ES不能使用root用户启动,需要新建用户

useradd esuser;
chown -R esuser:esuser /usr/local/elk/elasticsearch-6.8.0;
su esuser;

  1. 上传安装包elasticsearch-6.8.0.tar.gz/usr/local/elk下,解压tar -zxvf elasticsearch-6.8.0.tar.gz
  2. 进入解压完的目录elasticsearch-6.8.0,启动ES。

sh bin/elasticsearch -d

  1. 查看启动日志有无报错信息

tail -300f logs/elasticsearch.log

  1. 上述步骤没有问题,验证环境是否正常。

服务器验证:curl localhost:9200 或者浏览器访问:ip:9200

若访问返回一个JSON串,则启动成功!

{
  "name" : "yAp2S0u",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "7z3A7GQWS0ipoMWmDSa0jw",
  "version" : {
    "number" : "6.8.0",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "65b6179",
    "build_date" : "2019-05-15T20:06:13.172855Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

若没有类似的返回结果,查看日志排查。
备注:第4步中若服务器正常,浏览器访问不了,在确认服务器防火墙对92009300的不限制的情况下,需要配置服务的host

# 配置 network.host: 0.0.0.0   
    vi config/elasticsearch.yml
  • 安装ik分词插件

可以在线/离线安装,这里使用离线安装

  • 离线安装

在线安装的 6.8.0使用过程中有问题,版本有bug,使用离线6.6.1版本可以正常使用

  1. ES安装目录下的plugins新建ik文件夹,把elasticsearch-analysis-ik-6.6.1.zip上传至文件夹中
  2. 解压上面的文件 unzip elasticsearch-analysis-ik-6.6.1.zip,需要修改版本对应信息,修改plugin-descriptor.properties
version=6.8.0
elasticsearch.version=6.8.0
  1. 重启ES

在线安装(暂时不使用在线方式安装6.x版本)

  1. 进入ES安装的目录下,执行下面的语句
    ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.8.0/elasticsearch-analysis-ik-6.8.0.zip
  2. 重启ES

sh bin/elasticsearch -d

  1. 验证
  • 创建索引
curl -XPUT http://localhost:9200/test
  • 测试分词器
curl -XPOST http://localhost:9200/test/_analyze -H 'Content-Type:application/json' -d'
{
 "analyzer": "ik_max_word",
 "text":["我是测试数据,中文分词ik!"]
}
'
  • 开启安全登录

单机部署无需去配置ssl,但配置文件需要开启,集群部署需要

  1. 查杀 elasticsearch 进程
  • jps 找到对应任务的pid
  • kill -9 ${pid}
  1. 在根目录找到config文件夹,进入该文件夹,编辑配置文件

vim elasticsearch.yml
在末尾添加
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true

  1. 重新启动 elasticsearch

sh bin/elasticsearch -d

  1. 为默认账号手动设置密码(出现y/n,选y就行),以后登录需要使用

sh bin/elasticsearch-setup-passwords interactive

2. Kibana

  1. 解压

上传安装包kibana-6.8.0-6.8.0.tar.gz/usr/local/elk下,解压tar -zxvf kibana-6.8.0-6.8.0.tar.gz点此处下载(链接: https://pan.baidu.com/s/1J-fOALTN4YzbV-gqJZ_HJQ 密码: t133

  1. 编辑配置文件,添加elasticsearch用户登录名、密码

进入解压文件夹目录,vim config/kibana.yml

elasticsearch.username: "kibana"
# 安装ES时设置的对应的账号密码
elasticsearch.password: "your_password"
  1. 启动

nohup sh bin/kibana &

  1. 验证
  • 打开浏览器,访问ip:5601,跳转kibana登录验证界面即为安装成功。输入设置的内置账号密码登录即可

内置账号:elastic、kibana、logstash_system、beats_system、apm_system、remote_monitoring_user
elastic 账号可管理用户设置(kibana->Management->Users)

  • 点击DevTools的控制台
POST test003/_doc
{
 "city2":"我和我的家乡上映!"
}

GET test003/_search

GET有返回结果,说明环境正常。

**备注:**ES服务正常,kibana启动也无ERROR日志,浏览器不能访问,5601端口也无防火墙隔离,需要设置host

# 设置 server.host: "0.0.0.0"
vi config/kibana.yml

3. Logstash

  • 安装
  1. 上传安装包logstash-6.8.0.tar.gz/usr/local/elk下,解压tar -zxvf logstash-6.8.0.tar.gz,点此处下载(链接: https://pan.baidu.com/s/1J-fOALTN4YzbV-gqJZ_HJQ 密码: t133
  2. 上传logstash-task-config-test.zip压缩文件至/usr/local/elk/logstash-6.8.0,解压文件unzip logstash-task-config-test.zip
  3. 解压完后会多次三个文件夹drivertemplatetask,需要修改task目录下所有子目录里的config.cfg
  4. 进入解压完的目录logstash-6.8.0,配置模板(主要设置分词器)
  1. 创建模板文件夹 mkdir template
  2. 创建模板配置 vi template/logstash.json
{
    "template": "*",
    "version": 60001,
    "settings": {
        "index.refresh_interval": "5s",
        "number_of_shards": 3,
        "number_of_replicas": 0
    },
    "mappings": {
        "_default_": {
            "date_detection": true,
            "numeric_detection": true,
            "dynamic_templates": [{
                "string_fields": {
                    "match": "*",
                    "match_mapping_type": "string",
                    "mapping": {
                        "type": "text",
                        "norms": false,
                        "analyzer": "ik_max_word",
                        "fields": {
                            "keyword": {
                                "type": "keyword"
                            }
                        }
                    }
                }
            }],
            "properties": {
                "@timestamp": {
                    "type": "date"
                },
                "@version": {
                    "type": "keyword"
                },
                "longContent": {
                    "type": "text"
                },
                "geoip": {
                    "dynamic": true,
                    "properties": {
                        "ip": {
                            "type": "ip"
                        },
                        "location": {
                            "type": "geo_point"
                        },
                        "latitude": {
                            "type": "half_float"
                        },
                        "longitude": {
                            "type": "half_float"
                        }
                    }
                }
            }
        }
    }
   }
  1. 在安装目录下创建任务执行的文件夹,用于存放向ES 写数据的任务
  1. 创建 task文件夹,mkdir task
  2. 按不同的搜索种类创建二级子目录,这里以创建小应用搜索搜索为例
    mkdir task/searchTest
  3. 进入task/searchTest文件夹下面,需要创建 date.datconfig.cfgexcute.sql三个文件
  • date.dat 存储增量变化的值。如按时间进行增量同步,这里就是保存最新的增量时间。在第一次呢做全量同步的时候,可以手动指定一个比当前数据都小的过去时间
--- '1970-01-01 00:00:00'
  • config.cfg 任务执行的配置文件
input {
      stdin {
      }
      jdbc {
          #数据库连接地址(需要替换地址)
          jdbc_connection_string => "jdbc:mysql://ip:3306/test"
          #用户名
          jdbc_user => "root"
          #密码
          jdbc_password => "0.123abc"
          #指定数据库驱动jar(需要替换地址)(建议使用绝对路径,相对试过没成功)
          jdbc_driver_library => "/usr/local/elk/logstash-6.8.0/driver/mysql-connector-java-5.1.44.jar"
          #驱动类名称
          jdbc_driver_class => "com.mysql.jdbc.Driver"
          #数据查询分页配置
          jdbc_paging_enabled => "true"
          jdbc_page_size => "50000"
          #时区设置
          jdbc_default_timezone => "Asia/Shanghai"
          #是否开始小写转化 false使用sql中的字段名称,不改变大小写
          lowercase_column_names => false
          #开启记录最后一次的增量字段值
          record_last_run => true
          #使用sql自定义的字段
          use_column_value => true
          #自定义增量字段名称(需要替换地址)
          tracking_column => "updateTime"
          #字段类型
          tracking_column_type => "timestamp"
          #最后一次增量字段保存的值(需要替换地址)(可以指定文件设置默认值 ---#{value})
          last_run_metadata_path => "/usr/local/elk/logstash-6.8.0/task/searchTest/date.dat"
          
          #指定执行sql文件(需要替换地址)
          statement_filepath => "/usr/local/elk/logstash-6.8.0/task/searchTest/excute.sql"
          schedule => "* * * * *"
          #任务名称(需要替换地址)(唯一性)
          type => "searchTest"
      }
    }
    output {
      elasticsearch {
          # ES服务地址(需要替换地址)
          hosts => "ip:9200"
          user => "elastic"
          # 密码 (需要替换地址)
          password => "yourPassword"
          #ES对应索引名称(没有索引会按照默认的规则新建)
          index => "searchTest"
          #文档ID属性(可以用sql语句中的字段名,若不写,系统自动创建UUID)
          document_id => "%{id}"
          #ES索引创建的模板属性(可设置默认分词器等)
          template_name => "logstash"
          template => "/usr/local/elk/logstash-6.8.0/template/logstash.json"
          template_overwrite => true
          manage_template => true
      }
      
      # 控制台输出(可省略)
      stdout {
          codec => rubydebug
      }
    }
  • excute.sql

字段需要设置别名,以驼峰方式命名。:sql_last_value 这个是在config.cfg文本中所配置的增量字段,可以是ID或者时间来标识这个数据是否是增量同步。

SELECT
        id as id,
        app_name AS appName,
        update_time as updateTime
FROM
        app
WHERE  update_time > :sql_last_value
  1. 编辑 config/pipelines.yml流水线配置,有多个任务可以配置多个流水线任务,id是唯一就行
#搜索任务流水配置
- pipeline.id: serachTest
  path.config: "/usr/local/elk/logstash-6.8.0/task/searchTest/config.cfg"
  1. 启动 sh bin/logstash

启动失败,配置没有问题,可能是配置文件格式中格式或者空格导致的