使用logstash将mysql/sql server数据自动导入elasticsearch

当一个网站的信息不断增长的情况下,各种数据直接检索从数据库遇到瓶颈时,我们常常会使用elasticsearch来做全文索引,从而提高用户的检索体验。我下面使用当下流行的docker容器来实现这一切,当然用户可以直接在服务器上安装对应的软件包,无需使用docker方式,大同小异。

1. 下载需要用到的镜像
$ docker pull elasticsearch
$ docker pull logstash

2. 准备组件与配置文件
我们将数据库的插件和配置文件挂载进去,方便配置,下面我要用到的文件列出如下:

Sql Server的组件,logstash使用这个插件来访问Sql server
/docker/logstash/plugin/sqljdbc42.jar

配置文件
/docker/logstash/conf/logstash.conf
input {
jdbc {
jdbc_driver_library => "/plugin/sqljdbc42.jar"
jdbc_driver_class => "com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc_connection_string => "jdbc:sqlserver://192.168.1.15:1433;DatabaseName=iissy;"
jdbc_user => "iamuser"
jdbc_password => "iampassword"
jdbc_paging_enabled => "true"
jdbc_page_size => "10"
use_column_value => true
tracking_column => "id"
schedule => "* * * * *"
statement => "SELECT Id,Title,Body,AddPost from Article where id > :sql_last_value"
}
}

output {
elasticsearch {
hosts => ["172.17.0.2:9200"]
manage_template => false
index => "iissy"
document_type => "article"
document_id => "%{id}"
}
stdout { codec => rubydebug }
}

3. 启动容器
$ chcon -Rt svirt_sandbox_file_t /docker/elasticsearch/data/
$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \
-v /docker/elasticsearch/data:/usr/share/elasticsearch/data -d elasticsearch

输入:http://192.168.236.132:9200/ 你安装机器的IP地址,这个地址是我本地地址,如果成功的话,将如下图所示

我们前面配置文件(logstash.conf)中指定的IP可以这样获取:
$ docker inspect --format='{{.NetworkSettings.IPAddress}}' elasticsearch

然后,我们再来启动我们的另外一个容器logstash,我把名字取为logstash,与镜像一直,这是可以的:
$ docker run --name logstash \
-v /docker/logstash/conf:/config-dir \
-v /docker/logstash/plugin:/plugin \
-d logstash -f /config-dir/logstash.conf

4. 查看数据
到第3部完成,数据就会马上启动导入,我们这时可以查看,输入:http://192.168.236.132:9200/_cat/indices?v

数据已经成功导入,后面发布的文章,也会被自动索引,sql_last_value会自动保存执行到的行,周期性的从Sql server对应的表取新的数据。mysql的使用方式一样,唯一不同的就是配置文件与数据库访问组件不同,我下面给出配置文件内容,mysql的数据库访问组件自己根据我下面的配置文件的名字去下载,官方网站有下载。
input {
jdbc {
jdbc_driver_library => "/plugin/mysql-connector-java-5.1.43-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://172.17.0.3:3306/iPayask?characterEncoding=utf8&useSSL=false"
jdbc_user => "root"
jdbc_password => "123456"
schedule => "* * * * *"
statement => "SELECT Id,Title,Body,AddPost from Article where id > :sql_last_value"
}
}

output {
elasticsearch {
hosts => ["172.17.0.2:9200"]
manage_template => false
index => "iissy"
document_type => "article"
}
stdout { codec => rubydebug }
}

总结:我们可能还会遇到编辑的情况如何自动索引,这个可以自己做个策略,添加辅助的字段,在sql语句上做些修改可以做到,读者自己去尝试。
Posted by 何敏 on 2017-09-18 08:50:45