mysql/mongo同步elastic search

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:[email protected]: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"
      }
    ]
  }
)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章