MYSQL篇:
1.安装logstash,略
2.logstash -f sync_game.conf --path.settings=/etc/logstash
3.tail -f /var/log/logstash/* ==> 同步成不成功,仔细查看你的日志
特殊名词解释:
:sql_last_value 代表你上次插入的 id 最大值,用于增量同步数据。
友情提醒:
mysql-connector-java-8.0.14.jar 可以从maven仓库下载
最新的 ==> https://mvnrepository.com/artifact/mysql/mysql-connector-java/8.0.15
配置文件:
### sync_game.conf
input {
stdin {}
jdbc {
# 需要连接的数据库
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/engine"
jdbc_user => "root"
jdbc_password => "root"
# jdbc驱动所在的路径
jdbc_driver_library => "/root/install/mysql-connector-java-8.0.14.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "130000"
# 需要执行的sql文件
statement_filepath => "game.sql"
# 设置监听间隔 各字段含义(分、时、天、月、年),全部为*默认含义为每分钟更新一次
schedule => "* * * * *"
# elasticsearch索引类型名
type => "main"
record_last_run => true
use_column_value => true
tracking_column => "id"
last_run_metadata_path => "/etc/logstash/run_metadata.d/my_info"
}
}
output {
elasticsearch {
# elasticsearch索引名
index => "game"
# 使用input中的type作为elasticsearch索引下的类型名
#document_type => "%{type}"
document_type => "main"
# elasticsearch的ip和端口号
hosts => "172.26.192.107:9200"
# 同步mysql中数据uuid作为elasticsearch中文档id
document_id => "%{uuid}"
}
stdout {
codec => json_lines
}
}
### game.sql
SELECT * FROM game_merge where id > :sql_last_value
MONGO篇:
(1) 输入,输出流mongo插件装上
./logstash-plugin install logstash-output-mongodb
./logstash-plugin install logstash-input-mongodb
(2)在你的mongodb交互式环境中创建一个root用户,一定要use 数据库哦,因为账户是针对库的,每个库都能创建一个root
-> use engine
-> db.createUser({user:"root",pwd:"root",roles:[{role:"userAdminAnyDatabase", db:"admin"}]})
(Mongo::Auth::Unauthorized 如果你在日志看到这个报错,说明你没use数据库,创建root用户)
(3) logstash -f mongo_map.conf --path.settings=/etc/logstash
### 1,确保你的logstash配置文件路径正确,也可以尝试不加path,可能不会报错。
### 2.确保你的mongo_map.conf配置文件路径对的,这里用的是相对路径
(3) 监控你的日志
有报错的在日志里面能看到,如果看到 Attempting to install template 说明正在els安装模板 应该是没啥问题了。
配置文件:
### mongo_map.conf
# 如果重新导入需要删除game_map_process.db文件和索引,才能重新导入
input {
stdin {}
mongodb {
uri => "mongodb://root:root@127.0.0.1:27017/engine"
placeholder_db_dir => "/root/logstash"
placeholder_db_name => "game_map_process.db"
collection => "game_map"
batch_size => 5000
}
}
filter {
mutate {
remove_field => [ "_id", "log_entry" ]
}
}
output {
elasticsearch {
hosts => ["172.26.192.107:9200"]
document_type => "gmap"
index => "main"
document_id => "%{uuid}"
}
stdout {
codec => json_lines
}
### demo2 2019年05月10日
input {
stdin {}
mongodb {
uri => "xxx"
placeholder_db_dir => "/root/script/logstash"
placeholder_db_name => "game_map_process.db"
collection => "game_map"
batch_size => 5000
}
}
filter {
mutate {
remove_field => [ "_id", "log_entry" ]
}
}
output {
elasticsearch {
hosts => ["10.0.10.155:9200"]
document_type => "gmap"
index => "main"
document_id => "%{uuid}"
}
stdout {
codec => rubydebug
}
}
注意事项:
这玩意有点坑的就是,每个组件的版本不一样同步可能会失败,我也没办法枚举所有的场景,这里展示我当前的配置。
logstash 5.6.14
elastic search 6.5
### END
亲试按照此流程应该是可以跑通的,遇到特别报错的同学,可以看下英文文档(看清楚els版本)寻求帮助 https://www.elastic.co/guide/en/logstash/6.5/plugins-outputs-mongodb.html#plugins-outputs-mongodb-database
或者给我留言
###
### 特别提醒:
我们同步els的时候,如果没有在els里面创建模板,同步的时候会自动创建(默认是standard分词器),当然分词器有的时候可能不是我们满意的,我们可以预先在els里面安装模板,这里提供创建模板指定分词器的代码,如果过时了,请参考官方文档。ik_smart是一个中文分词器,需要你预先装下。有问题可以给我提。
PUT main
{
"settings":{
"index":{
"number_of_shards" : 5,
"number_of_replicas" : 0,
"analysis":{
"analyzer":{
"analyzer_keyword":{
"tokenizer":"ik_smart",
"filter":"lowercase"
}
}
}
}
}
}
PUT main/_mapping/gmap
{
"properties" : {
"name": {
"type": "text",
"analyzer": "ik_smart"
},
"uuid" : {
"type" : "text"
},
"feature" : {
"type": "text",
"analyzer": "ik_smart"
},
"mass" : {
"type" : "text",
"analyzer": "ik_smart"
},
"near" : {
"type": "text"
}
}
}
----------
2019年05月10日更新:
发现centos用官网方式安装的logstash 没有/etc/logstash目录,导致没办法指定配置文件,就没办法看日志,所以这里贴出配置文件的代码:
/etc/logstash/logstash.yml:
path.logs: /var/log/logstash
/etc/logstash/log4j2.properties:
status = error
name = LogstashPropertiesConfig
appender.rolling.type = RollingFile
appender.rolling.name = plain_rolling
appender.rolling.fileName = ${sys:ls.logs}/logstash-${sys:ls.log.format}.log
appender.rolling.filePattern = ${sys:ls.logs}/logstash-${sys:ls.log.format}-%d{yyyy-MM-dd}.log
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 1
appender.rolling.policies.time.modulate = true
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = [%d{ISO8601}][%-5p][%-25c] %-.10000m%n
appender.json_rolling.type = RollingFile
appender.json_rolling.name = json_rolling
appender.json_rolling.fileName = ${sys:ls.logs}/logstash-${sys:ls.log.format}.log
appender.json_rolling.filePattern = ${sys:ls.logs}/logstash-${sys:ls.log.format}-%d{yyyy-MM-dd}.log
appender.json_rolling.policies.type = Policies
appender.json_rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.json_rolling.policies.time.interval = 1
appender.json_rolling.policies.time.modulate = true
appender.json_rolling.layout.type = JSONLayout
appender.json_rolling.layout.compact = true
appender.json_rolling.layout.eventEol = true
rootLogger.level = ${sys:ls.log.level}
rootLogger.appenderRef.rolling.ref = ${sys:ls.log.format}_rolling
注意事项:
连接mongo的时候 一定要确定你在那个数据库库有 admin的用户,不然连不上的,而且logstash很可能不会报错。
use 数据库名
db.createUser(
{
user: "admin",
pwd: "admin",
roles:
[
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
}
)