说明:
- 不能以root账户安装和运行ElasticSearch。我使用的是vagrant虚拟机(ip为 192.168.56.100 )的vagrant用户安装。
- ELK版本需要保持一致。我这里使用的是6.4.3版本。
docker安装单节点
下载镜像:
docker pull elasticsearch:6.4.3
创建目录:
mkdir -p /opt/elasticsearch/config
mkdir -p /opt/elasticsearch/data
创建配置文件/opt/elasticsearch/config/elasticsearch.yml
cluster.name: es-cluster #设置集群的名称
node.name: es-node #当前节点的名称
bootstrap.memory_lock: false #设置 ES 节点允许内存交换
bootstrap.system_call_filter: false #禁用系统调用过滤器
network.host: 192.168.56.100 #设置当前主机名称
discovery.zen.ping.unicast.hosts: ["192.168.56.100"] #设置集群的主机列表
运行容器
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:后台启动
查看日志:
docker logs elastic
测试 http://192.168.56.100:9200/_cat/nodes?pretty
进入容器:
docker exec -it elastic /bin/bash
docker搭建集群
安装elasticsearch
这里搭建两个节点的集群,首先创建目录:
mkdir /opt/elasticsearch/data{1,2}
chmod 777 /opt/elasticsearch/data{1,2}
设置防火墙:
firewall-cmd --zone=public --add-port=9200/tcp --permanent
firewall-cmd --zone=public --add-port=9201/tcp --permanent
firewall-cmd --zone=public --add-port=9300/tcp --permanent
firewall-cmd --zone=public --add-port=9301/tcp --permanent
在/opt/elasticsearch/config目录,创建es1.yml
cluster.name: es-cluster
node.name: es-node1
network.bind_host: 0.0.0.0
network.host: 192.168.56.100
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
#单播(unicast)协议,指定要发现的节点信息了,可以不指定端口[默认9300]
discovery.zen.ping.unicast.hosts: ["192.168.56.100:9300","192.168.56.100:9301"]
#默认是1,看到的具有master节点资格的最小数量,然后才能在集群中做操作。
#官方的推荐值是(N/2)+1,如果只有2个节点设为1
discovery.zen.minimum_master_nodes: 1
bootstrap.memory_lock: false #设置 ES 节点允许内存交换
bootstrap.system_call_filter: false #禁用系统调用过滤器
在/opt/elasticsearch/config目录,创建es2.yml
cluster.name: es-cluster
node.name: es-node2
network.bind_host: 0.0.0.0
network.host: 192.168.56.100
http.port: 9201
transport.tcp.port: 9301
http.cors.enabled: true
http.cors.allow-origin: "*"
node.master: true
node.data: true
discovery.zen.ping.unicast.hosts: ["192.168.56.100:9300","192.168.56.100:9301"]
启动es01
docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9200:9200 -p 9300:9300 \
-v /opt/elasticsearch/config/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /opt/elasticsearch/plugins1:/usr/share/elasticsearch/plugins \
-v /opt/elasticsearch/data1:/usr/share/elasticsearch/data \
--name es01 --restart=always docker.io/elasticsearch:6.4.3
启动es02
docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 9201:9201 -p 9301:9301\
-v /opt/elasticsearch/config/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
-v /opt/elasticsearch/plugins2:/usr/share/elasticsearch/plugins \
-v /opt/elasticsearch/data2:/usr/share/elasticsearch/data
--name es02 --restart=always docker.io/elasticsearch:6.4.3
测试 http://192.168.56.100:9200/_cat/nodes?pretty
安装elasticsearch-head插件
docker pull mobz/elasticsearch-head:6
安装Kibana
下载镜像:
docker pull kibana:6.4.3
创建目录:
mkdir -p /opt/kibana/data
mkdir -p /opt/kibana/config
创建配置文件/opt/kibana/config/kibana.yml
server.name: kibana
server.host: "0.0.0.0" #只能填 0.0.0.0
elasticsearch.url: http://192.168.56.100:9200
xpack.monitoring.collection.enabled: true
运行kibana
docker run -d --name kibana -p 5601:5601 -v /opt/kibana/data:/usr/share/kibana/data \
-v /opt/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
--restart=always docker.io/kibana:6.4.3
查看日志:
docker logs -f kibana
进入容器
docker exec -it kibana /bin/bash
测试:http://192.168.56.100:5601/
安装logstash
下载镜像:
docker pull logstash:6.4.3
创建目录:
mkdir -p /opt/logstash/config
创建配置文件/opt/logstash/config/logstash.yml
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.url: http://192.168.56.100:9200
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: changeme
/opt/logstash/config/创建一个logstash的使用示例配置文件:logstash.conf,这个文件名字可以随便起
input {
file {
type => "log"
path => "/opt/logs/*.log"
start_position => "beginning"
}
}
output {
stdout {
codec => rubydebug { }
}
elasticsearch {
hosts => ["192.168.56.100"]
index => "log-%{+YYYY.MM.dd}"
}
}
说明:start_position是监听的位置,默认是end,即一个文件如果没有记录它的读取信息,则从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,则不会从最开始读取。重启读取信息不会丢失。
启动:
docker run -d --name logstash -p 3456:3456 \
-v /opt/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml \
--restart=always docker.io/logstash:6.4.3 logstash \
-f /opt/logstash/config/logstash.conf
在 /opt/logs/ 目录下输出日志:
echo 'hello world' > /opt/logs/1.log
进入容器:
docker exec -it logstash /bin/bash
安装插件:
docker run -it --rm logstash:6.4.3 logstash-plugin install logstash-input-jdbc
docker run -it --rm logstash:6.4.3 logstash-plugin install logstash-output-elasticsearch
相关配置文件:
jdbc_driver_library: jdbc mysql 驱动的路径,在上一步中已经下载
jdbc_driver_class: 驱动类的名字,mysql 填 com.mysql.jdbc.Driver 就好了
jdbc_connection_string: mysql 地址
jdbc_user: mysql 用户
jdbc_password: mysql 密码
schedule: 执行 sql 时机,类似 crontab 的调度
statement: 要执行的 sql,以 “:” 开头是定义的变量,可以通过 parameters 来设置变量,这里的 sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值,这里 update_time 条件是 >= 因为时间有可能相等,没有等号可能会漏掉一些增量
use_column_value: 使用递增列的值
tracking_column_type: 递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column: 递增字段的名称,这里使用 update_time 这一列,这列的类型是 timestamp
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 中配置
- pipeline.id: table1
path.config: "config/sync_table1.cfg"
- pipeline.id: table2
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分词器
wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v6.4.3/elasticsearch-analysis-ik-6.4.3.zip
解压:
unzip elasticsearch-analysis-ik-6.4.3 -d analysis-ik
拷贝到插件目录
cp -r analysis-ik plugins1/
cp -r analysis-ik plugins2/
集成拼音分词器
wget https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v6.4.3/elasticsearch-analysis-pinyin-6.4.3.zip
解压:
unzip elasticsearch-analysis-pinyin-6.4.3 -d analysis-pinyin
拷贝到插件目录
cp -r analysis-pinyin plugins1/
cp -r analysis-pinyin plugins2/