说明:

  • 不能以root账户安装和运行ElasticSearch。我使用的是vagrant虚拟机(ip为 192.168.56.100 )的vagrant用户安装。
  • ELK版本需要保持一致。我这里使用的是6.4.3版本。

docker安装单节点

下载镜像:

  1. docker pull elasticsearch:6.4.3

创建目录:

  1. mkdir -p /opt/elasticsearch/config
  2. mkdir -p /opt/elasticsearch/data

创建配置文件/opt/elasticsearch/config/elasticsearch.yml

  1. cluster.name: es-cluster #设置集群的名称
  2. node.name: es-node #当前节点的名称
  3. bootstrap.memory_lock: false #设置 ES 节点允许内存交换
  4. bootstrap.system_call_filter: false #禁用系统调用过滤器
  5. network.host: 192.168.56.100 #设置当前主机名称
  6. discovery.zen.ping.unicast.hosts: ["192.168.56.100"] #设置集群的主机列表

运行容器

  1. docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 -v /opt/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /opt/elasticsearch/data:/usr/share/elasticsearch/data -v /opt/elasticsearch/plugins:/usr/share/elasticsearch/plugins -e "discovery.type=single-node" --name elastic -d docker.io/elasticsearch:6.4.3

注意:不同镜像中elasticsearch的安装路径可能不一样,我这里下载的是docker官方的镜像,安装路径是在/usr/share/elasticsearch。

参数说明:

  • -e:设置环境变量
  • -p:设置端口映射
  • -v:设置存储映射
  • —name:设置容器名称
  • -d:后台启动

查看日志:

  1. docker logs elastic

测试 http://192.168.56.100:9200/_cat/nodes?pretty
进入容器:

  1. docker exec -it elastic /bin/bash

docker搭建集群

安装elasticsearch

这里搭建两个节点的集群,首先创建目录:

  1. mkdir /opt/elasticsearch/data{1,2}
  2. chmod 777 /opt/elasticsearch/data{1,2}

设置防火墙:

  1. firewall-cmd --zone=public --add-port=9200/tcp --permanent
  2. firewall-cmd --zone=public --add-port=9201/tcp --permanent
  3. firewall-cmd --zone=public --add-port=9300/tcp --permanent
  4. firewall-cmd --zone=public --add-port=9301/tcp --permanent

在/opt/elasticsearch/config目录,创建es1.yml

  1. cluster.name: es-cluster
  2. node.name: es-node1
  3. network.bind_host: 0.0.0.0
  4. network.host: 192.168.56.100
  5. http.port: 9200
  6. transport.tcp.port: 9300
  7. http.cors.enabled: true
  8. http.cors.allow-origin: "*"
  9. node.master: true
  10. node.data: true
  11. #单播(unicast)协议,指定要发现的节点信息了,可以不指定端口[默认9300]
  12. discovery.zen.ping.unicast.hosts: ["192.168.56.100:9300","192.168.56.100:9301"]
  13. #默认是1,看到的具有master节点资格的最小数量,然后才能在集群中做操作。
  14. #官方的推荐值是(N/2)+1,如果只有2个节点设为1
  15. discovery.zen.minimum_master_nodes: 1
  16. bootstrap.memory_lock: false #设置 ES 节点允许内存交换
  17. bootstrap.system_call_filter: false #禁用系统调用过滤器

在/opt/elasticsearch/config目录,创建es2.yml

  1. cluster.name: es-cluster
  2. node.name: es-node2
  3. network.bind_host: 0.0.0.0
  4. network.host: 192.168.56.100
  5. http.port: 9201
  6. transport.tcp.port: 9301
  7. http.cors.enabled: true
  8. http.cors.allow-origin: "*"
  9. node.master: true
  10. node.data: true
  11. discovery.zen.ping.unicast.hosts: ["192.168.56.100:9300","192.168.56.100:9301"]

启动es01

  1. docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 \
  2. -v /opt/elasticsearch/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  3. -v /opt/elasticsearch/plugins1:/usr/share/elasticsearch/plugins \
  4. -v /opt/elasticsearch/data1:/usr/share/elasticsearch/data \
  5. --name es01 --restart=always docker.io/elasticsearch:6.4.3

启动es02

  1. docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9201:9201 -p 9301:9301\
  2. -v /opt/elasticsearch/config/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
  3. -v /opt/elasticsearch/plugins2:/usr/share/elasticsearch/plugins \
  4. -v /opt/elasticsearch/data2:/usr/share/elasticsearch/data
  5. --name es02 --restart=always docker.io/elasticsearch:6.4.3

测试 http://192.168.56.100:9200/_cat/nodes?pretty
安装elasticsearch-head插件

  1. docker pull mobz/elasticsearch-head:6

安装Kibana

下载镜像:

  1. docker pull kibana:6.4.3

创建目录:

  1. mkdir -p /opt/kibana/data
  2. mkdir -p /opt/kibana/config

创建配置文件/opt/kibana/config/kibana.yml

  1. server.name: kibana
  2. server.host: "0.0.0.0" #只能填 0.0.0.0
  3. elasticsearch.url: http://192.168.56.100:9200
  4. xpack.monitoring.collection.enabled: true

运行kibana

  1. docker run -d --name kibana -p 5601:5601 -v /opt/kibana/data:/usr/share/kibana/data \
  2. -v /opt/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
  3. --restart=always docker.io/kibana:6.4.3

查看日志:

  1. docker logs -f kibana

进入容器

  1. docker exec -it kibana /bin/bash

测试:http://192.168.56.100:5601/

安装logstash

下载镜像:

  1. docker pull logstash:6.4.3

创建目录:

  1. mkdir -p /opt/logstash/config

创建配置文件/opt/logstash/config/logstash.yml

  1. http.host: "0.0.0.0"
  2. xpack.monitoring.elasticsearch.url: http://192.168.56.100:9200
  3. xpack.monitoring.elasticsearch.username: elastic
  4. xpack.monitoring.elasticsearch.password: changeme

/opt/logstash/config/创建一个logstash的使用示例配置文件:logstash.conf,这个文件名字可以随便起

  1. input {
  2. file {
  3. type => "log"
  4. path => "/opt/logs/*.log"
  5. start_position => "beginning"
  6. }
  7. }
  8. output {
  9. stdout {
  10. codec => rubydebug { }
  11. }
  12. elasticsearch {
  13. hosts => ["192.168.56.100"]
  14. index => "log-%{+YYYY.MM.dd}"
  15. }
  16. }

说明:start_position是监听的位置,默认是end,即一个文件如果没有记录它的读取信息,则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,则不会从最开始读取。重启读取信息不会丢失。

启动:

  1. docker run -d --name logstash -p 3456:3456 \
  2. -v /opt/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
  3. --restart=always docker.io/logstash:6.4.3 logstash \
  4. -f /opt/logstash/config/logstash.conf

在 /opt/logs/ 目录下输出日志:

  1. echo 'hello world' > /opt/logs/1.log

进入容器:

  1. docker exec -it logstash /bin/bash

安装插件:

  1. docker run -it --rm logstash:6.4.3 logstash-plugin install logstash-input-jdbc
  2. docker run -it --rm logstash:6.4.3 logstash-plugin install logstash-output-elasticsearch

相关配置文件:

  1. jdbc_driver_library: jdbc mysql 驱动的路径,在上一步中已经下载
  2. jdbc_driver_class: 驱动类的名字,mysql com.mysql.jdbc.Driver 就好了
  3. jdbc_connection_string: mysql 地址
  4. jdbc_user: mysql 用户
  5. jdbc_password: mysql 密码
  6. schedule: 执行 sql 时机,类似 crontab 的调度
  7. statement: 要执行的 sql,以 “:” 开头是定义的变量,可以通过 parameters 来设置变量,这里的 sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值,这里 update_time 条件是 >= 因为时间有可能相等,没有等号可能会漏掉一些增量
  8. use_column_value: 使用递增列的值
  9. tracking_column_type: 递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
  10. tracking_column: 递增字段的名称,这里使用 update_time 这一列,这列的类型是 timestamp
  11. last_run_metadata_path: 同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以手动修改

上传mysql jar /usr/local/sql/ mysql-connector-java-5.1.46.jar
./bin/logstash -f mysql.conf 启动
多文件方式同步ES数据
一个 logstash 实例可以借助 pipelines 机制同步多个表,只需要写多个配置文件就可以了,假设我们有两个表 table1 和 table2,对应两个配置文件 sync_table1.cfg 和 sync_table2.cfg
在 config/pipelines.yml 中配置

  1. - pipeline.id: table1
  2. path.config: "config/sync_table1.cfg"
  3. - pipeline.id: table2
  4. path.config: "config/sync_table2.cfg"

./bin/logstash
logstash-input-jdbc原理
使用 logstash-input-jdbc 插件读取 mysql 的数据,这个插件的工作原理比较简单,就是定时执行一个 sql,然后将 sql 执行的结果写入到流中,增量获取的方式没有通过 binlog 方式同步,而是用一个递增字段作为条件去查询,每次都记录当前查询的位置,由于递增的特性,只需要查询比当前大的记录即可获取这段时间内的全部增量,一般的递增字段有两种,AUTO_INCREMENT 的主键 id 和 ON UPDATE CURRENT_TIMESTAMP 的 update_time 字段,id 字段只适用于那种只有插入没有更新的表,update_time 更加通用一些,建议在 mysql 表设计的时候都增加一个 update_time 字段
集成IK分词器

  1. wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.3/elasticsearch-analysis-ik-6.4.3.zip

解压:

  1. unzip elasticsearch-analysis-ik-6.4.3 -d analysis-ik

拷贝到插件目录

  1. cp -r analysis-ik plugins1/
  2. cp -r analysis-ik plugins2/

集成拼音分词器

  1. wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v6.4.3/elasticsearch-analysis-pinyin-6.4.3.zip

解压:

  1. unzip elasticsearch-analysis-pinyin-6.4.3 -d analysis-pinyin

拷贝到插件目录

  1. cp -r analysis-pinyin plugins1/
  2. cp -r analysis-pinyin plugins2/