本章内容只讲解Logstash的搭建,需要搭建Elasticsearch与Kibana服务请跳转至Elasticsearch与Kibana服务搭建
首先我们需要下载并安装公共签名密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
创建我们的yum关于Logstash的源文件
vim /etc/yum.repos.d/logstash.rep
请将下面的内容复制到文本中,目前版本最新为7,本文章创建时间为2020-02-27日,如果版本升级需要将[logstash-7.x]中的7改为新版本号
[logstash7-.x]
name=Elastic repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
开始安装logstash,如果发现镜像下载太慢,请采用手动安装
yum -y install logstash
Logstash与其他相关插件地址下载
这里我们选择最新版本-7.5.2,下载完成后将文件拷入到我们的linux主机中
运行我们的logstash安装包,即可完成安装
rpm -ivh logstash-7.5.2.rpm
解压压缩包 tar -xvf logstash-7.5.2.tar.gz
yum install -y gem
设置源
添加清华镜像源并移除默认源(其他国内镜像已经用不了了,比如taobao,ruby-china,aliyuncs)
gem sources --add https://mirrors.tuna.tsinghua.edu.cn/rubygems/ --remove https://rubygems.org/
列出已有源,一般情况下只会显示一个,如果有多的请删除
gem sources -l
两者只是进入地址上的不同。
vim /usr/share/logstash/Gemfile #
将sources至修改为https://mirrors.tuna.tsinghua.edu.cn/rubygems/
source “https://mirrors.tuna.tsinghua.edu.cn/rubygems/”
保存并退出
vim /opt/logstash-7.5.2/Gemfile #
将sources至修改为https://mirrors.tuna.tsinghua.edu.cn/rubygems/
source “https://mirrors.tuna.tsinghua.edu.cn/rubygems/”
保存并退出
两者只是进入地址上的不同。
进入Logstash目录
cd /usr/share/logstash
安装logstash-input-jdbc插件
bin/logstash-plugin install logstash-input-jdbc
安装logstash-output-elasticsearch插件
bin/logstash-plugin install logstash-output-elasticsearch
进入Logstash目录
cd /opt/logstash-7.5.2
安装logstash-input-jdbc插件
bin/logstash-plugin install logstash-input-jdbc
安装logstash-output-elasticsearch插件
bin/logstash-plugin install logstash-output-elasticsearch
我们需要放入Mysql驱动(jar包),放入位置随意,我这放在了Logstash的文件目录下,使用的版本为
mysql-connector-java-8.0.18.jar
mkdir /etc/logstash/mysql_config
采用压缩包形式安装的请往这里看
mkdir /opt/logstash-7.5.2/mysql_config
配置文件说明
jdbc_driver_library: jdbc mysql 驱动的路径
jdbc_driver_class: 驱动类的名字,mysql 填 com.mysql.jdbc.Driver 或 com.mysql.cj.jdbc.Driver
jdbc_connection_string: mysql 地址
jdbc_user: mysql 用户名
jdbc_password: mysql 密码
schedule: 执行 sql 时机,类似 crontab 的调度--------------->>>>>>在线crontab表达转换网址
statement: 要执行的 sql语句,以 “:” 开头是定义的变量,可以通过 parameters 来设置变量,这里的 sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值,这里 update_time 条件是 >= 因为时间有可能相等,没有等号可能会漏掉一些增量,如果SQL语句较长可指定SQL文件
use_column_value: 使用递增列的值
statement_filepath:是基于文件形式存储的SQL。这里存放的是路径
tracking_column_type: 递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column: 递增字段的名称,这里使用 update_time 这一列,这列的类型是 timestamp
last_run_metadata_path: 同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以手动修改
jdbc_paging_enabled:是否开启分页查询
jdbc_page_size:每次分页多少条数据
type:为多数据表/源做准备,作为区分条件
新建ES与Mysql同步文件
vim /etc/logstash/mysql_config/table_1.conf
vim /opt/logstash-7.5.2/mysql_config/table_1.conf
添加文本内容
input {
stdin {}
jdbc {
#mysql 驱动的路径
jdbc_driver_library => "/etc/logstash/mysql-connector-java-8.0.18.jar"
#驱动类的名字
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
#mysql 地址,这里重点说个问题,这个时间,一定要校准,serverTimezone=UCT或者serverTimezone=Asia/Shanghai一定要校准,否则同步数据会产生错误
jdbc_connection_string => "jdbc:mysql://192.168.114.136/speed?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UCT"
#时区校准
jdbc_default_timezone =>"Asia/Shanghai"
#mysql 用户
jdbc_user => "root"
#mysql 密码
jdbc_password => "root"
#执行 sql 时机,类似 crontab 的调度,每一分钟执行一次
schedule => "* * * * *"
#要执行的 sql语句,以 “:” 开头是定义的变量,sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值,这里的字段名,根据数据库的配置,是存在大小写敏感的
statement => "select * from user where UPDATE_TIME >= :sql_last_value"
#是否使用递增列的值
use_column_value => true
#递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column_type => "timestamp"
#使用递增列的值,这里的字段名大小写不敏感
tracking_column => "update_time"
#同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以自定义
last_run_metadata_path => "/etc/logstash/metadata/user_table"
#是否分页查询
jdbc_paging_enabled => "true"
#每次分页的数量
jdbc_page_size => "100"
#为多数据表/源做准备,作为区分条件
type => "type_user"
}
}
output {
elasticsearch {
# ES的IP地址及端口
hosts => ["192.168.114.136:9200"]
# 索引名称 可自定义
index => "user"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{user_id}"
# 文档类型(不建意使用,因为elasticsearch 7.0.0以后将不建议使用,8.0.0 以后完全不支持。我是直接删除了)
document_type => "user"
}
stdout {
# 以JSON格式输出至elasticsearch
codec => json_lines
}
}
保存并退出。
这里含有多个JDBC,然后再下方使用if进行判断,区分ES存储
input {
stdin {}
jdbc {
#mysql 驱动的路径
jdbc_driver_library => "/etc/logstash/mysql-connector-java-8.0.18.jar"
#驱动类的名字
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
#mysql 地址,这里重点说个问题,这个时间,一定要校准,serverTimezone=UCT或者serverTimezone=Asia/Shanghai一定要校准,否则同步数据会产生错误
jdbc_connection_string => "jdbc:mysql://192.168.114.136/speed?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UCT"
#时区校准
jdbc_default_timezone =>"Asia/Shanghai"
#mysql 用户
jdbc_user => "root"
#mysql 密码
jdbc_password => "root"
#执行 sql 时机,类似 crontab 的调度,每一分钟执行一次
schedule => "* * * * *"
#要执行的 sql语句,以 “:” 开头是定义的变量,sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值,这里的字段名,根据数据库的配置,是存在大小写敏感的
statement => "select * from user where UPDATE_TIME >= :sql_last_value"
#是否使用递增列的值
use_column_value => true
#递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column_type => "timestamp"
#使用递增列的值,这里的字段名大小写不敏感
tracking_column => "update_time"
#同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以自定义
last_run_metadata_path => "/opt/metadata/product_table"
#是否分页查询
jdbc_paging_enabled => "true"
#每次分页的数量
jdbc_page_size => "100"
#为多数据表/源做准备,作为区分条件
type => "type_user"
}
jdbc {
#mysql 驱动的路径
jdbc_driver_library => "/etc/logstash/mysql-connector-java-8.0.18.jar"
#驱动类的名字
jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
#mysql 地址,这里重点说个问题,这个时间,一定要校准,serverTimezone=UCT或者serverTimezone=Asia/Shanghai一定要校准,否则同步数据会产生错误
jdbc_connection_string => "jdbc:mysql://192.168.114.136/speed?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UCT"
#时区校准
jdbc_default_timezone =>"Asia/Shanghai"
#mysql 用户
jdbc_user => "root"
#mysql 密码
jdbc_password => "root"
#执行 sql 时机,类似 crontab 的调度,每一分钟执行一次
schedule => "* * * * *"
#要执行的 sql语句,以 “:” 开头是定义的变量,sql_last_value 是内置的变量,表示上一次 sql 执行中 update_time 的值,这里的字段名,根据数据库的配置,是存在大小写敏感的
statement => "select * from expert where UPDATE_TIME >= :sql_last_value"
#是否使用递增列的值
use_column_value => true
#递增字段的类型,numeric 表示数值类型, timestamp 表示时间戳类型
tracking_column_type => "timestamp"
#使用递增列的值,这里的字段名大小写不敏感
tracking_column => "update_time"
#同步点文件,这个文件记录了上次的同步点,重启时会读取这个文件,这个文件可以自定义
last_run_metadata_path => "/opt/metadata/product_table"
#是否分页查询
jdbc_paging_enabled => "true"
#每次分页的数量
jdbc_page_size => "100"
#为多数据表/源做准备,作为区分条件
type => "type_expert"
}
}
output {
if [type] == "type_user" {
elasticsearch {
# ES的IP地址及端口
hosts => ["192.168.114.136:9200"]
# 索引名称 可自定义
index => "user"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{user_id}"
# 文档类型(不建意使用,因为elasticsearch 7.0.0以后将不建议使用,8.0.0 以后完全不支持。我是直接删除了)
document_type => "user"
}
}
if [type] == "type_expert" {
elasticsearch {
# ES的IP地址及端口
hosts => ["192.168.114.136:9200"]
# 索引名称 可自定义
index => "product"
# 需要关联的数据库中有有一个id字段,对应类型中的id
document_id => "%{id}"
# 文档类型(不建意使用,因为elasticsearch 7.0.0以后将不建议使用,8.0.0 以后完全不支持。我是直接删除了)
document_type => "expert"
}
}
stdout {
# 以JSON格式输出至elasticsearch
codec => json_lines
}
}
- pipeline.id: table1
path.config: "/etc/logstash/mysql_config/table_1.conf"
chown -R cuu:es_user /etc/logstash
chown -R cuu:es_user /usr/share/logstash
systemctl daemon-reload
systemctl start logstash.service
采用压缩包形式安装的请往这里看
/opt/logstash-7.5.2/bin/logstash -f /opt/logstash-7.5.2/mysql_config/table_1.conf
nohup /opt/logstash-7.5.2/bin/logstash -f /opt/logstash-7.5.2/mysql_config/table_1.conf &
vim /opt/logstash-7.5.2/config/pipelines.yml
- pipeline.id: table1
path.config: "/opt/logstash-7.5.2/mysql_config/table_1.conf"
- pipeline.id: table2
path.config: "/opt/logstash-7.5.2/mysql_config/table_2.conf"
- pipeline.id: table3
path.config: "/opt/logstash-7.5.2/mysql_config/table_3.conf"
/opt/logstash-7.5.2/bin/logstash
nohup /opt/logstash-7.5.2/bin/logstash &
使用yum与rpm新式安装的可以通过systemctl stop logstash.service命令进行关闭
关闭命令
systemctl stop logstash.service
重启命令
systemctl restart logstash.service
目前,使用压缩包安装的,未找到可以关闭的命令,目前已知使用Kill杀死进程
kill -9 [进程号]
systemctl enable logstash.service
对新用户开放logstash文件位置权限
chown -R cuu:es_user /opt/logstash-7.5.2
刷新服务配置
systemctl daemon-reload
使用压缩包安装的logstash需要在/etc/init.d 创建脚本文件
vim /etc/init.d/logstash
输入代码块,需要修改的地方为logstash的安装位置与用户切换
#!/bin/sh
#chkconfig: 2345 80 05
#description: logstash-7
case "$1" in
start)
su - cuu<<!
cd /opt/logstash-7.5.2/bin
#这里启动方式可以根据实际的配置来设置启动命令
# 例如:nohup ./logstash -f /opt/logstash-7.5.2/mysql_config/table_1.conf &
nohup ./logstash &
!
echo "logstash startup"
;;
stop)
logstash_pid=`ps aux|grep logstash | grep -v 'grep logstash' | awk '{print $2}'`
kill -9 logstash_pid
echo "logstash stopped"
;;
restart)
logstash_pid=`ps aux|grep logstash | grep -v 'grep logstash' | awk '{print $2}'`
kill -9 logstash_pid
echo "logstash stopped"
su - cuu<<!
cd /opt/logstash-7.5.2/bin
#这里启动方式可以根据实际的配置来设置启动命令
# 例如:nohup ./logstash -f /opt/logstash-7.5.2/mysql_config/table_1.conf &
nohup ./logstash &
!
echo "logstash startup"
;;
*)
echo "start|stop|restart"
;;
esac
exit $?
写入完毕后,保存退出。
在 /etc/init.d 目录下赋予新创建的logstash文件执行权限
chmod +x /etc/init.d/logstash
添加到开机启动任务
chkconfig --add logstash
重启验证是否成功启动,如果失败请验证用户是否切换正确,logstash地址是否正确
ps -ef|grep logstash