1、现在服务器上传logstash 和mysql驱动。 logstash 要与es版本一致。
2、将logstash 解压到 /usr/local 将mysql 驱动复制到 /usr/local
命令: tar -zxvf logstash-6.4.3.tar.gz -C /usr/local/
命令: cp mysql-connector-java-5.1.41.jar /usr/local/
3、进去/usr/local/logstash-6.4.3 创建一个文件夹 叫sync , 所有的配置都放在sync里面
命令: mkdir sync
4、进去 sync 创建:logstash-db-sync.conf 文件夹
命令:vim logstash-db-sync.conf
:wq 保存。
5、将以下内容 复制到 logstash-db-sync.conf 文件里面 , 再保存
input {
jdbc {
#设置 mysql/mariaDB 数据库url及数据库名称
jdbc_connection_string => "jdbc:mysql://IP:3306/数据库?useUnicode=true&characterEncoding=UTF-8&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"
#用户名
jdbc_user => "用户名"
#密码
jdbc_password => "密码"
#数据库驱动所在的位置,可以是绝对路径或者相对路径
jdbc_driver_library => "/usr/local/logstash-6.4.3/sync/mysql-connector-java-5.1.41.jar"
#驱动类名
jdbc_driver_class => "com.mysql.jdbc.Driver"
# 开启分页
jdbc_paging_enabled => "true"
#分页每页数量,可以自定义
jdbc_page_size => "10000"
# 执行的sql文件路径
statement_filepath => "/usr/local/logstash-6.4.3/sync/data.sql"
# 设置定时任务间隔,含义 分,时,天,月,年,全部为* 默认含义为每分钟跑一次
schedule => "* * * * *"
# 索引类型
type => "_doc"
# 是否开启记录上次追踪的结果,也就是上次更新的时间,这个会记录到 last_run_metadata_path 的文件
use_column_value => true
#记录上一次追踪的结果值
last_run_metadata_path => "/usr/local/logstash-6.4.3/sync/track_time"
# 如果 use_column_value 为true, 配置本参数,追踪的column 名,可以是自增id或者时间
tracking_column => "updated_time"
# tracking_column 对应字段的类型
tracking_column_type => "timestamp"
# 是否清除 last_run_metadata_path 的记录,true 则每次都从头开始查询所有
clean_run => false
# 数据库字段名称大写转小写
lowercase_column_names => false
}
}
output {
elasticsearch {
# es 地址配置
hosts => ["es IP:9200"]
#同步的索引名
index => "索引库名称"
# 设置_doc的 id 和数据相同
document_id => "%{id}"
}
#日输出
stdout {
codec => json_lines
}
}
6. 在sync 创建:data.sql 文件夹,
复制同步数据的语句,
比如: select itemsId, name,create_time,updated_time from 表名 where updated_time >=:sql_last_value
再保存: wq
7、在sync 创建:logstash-ik.json 文件
vim logstash-ik.json
将以下内容 复制到 logstash-ik.json 文件里面 , 再保存
{
"template": "*",
"version": 1,
"settings": {
"index.refresh_interval": "5s"
},
"mappings": {
"_default_": {
"_all": {
"enabled": true,
"norms": false
},
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false
}
}
},
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false,
"analyzer": "ik_max_word",#只需要添加这一行即可设置分词器为ik_max_word
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
],
"properties": {
"@timestamp": {
"type": "date",
"include_in_all": false
},
"@version": {
"type": "keyword",
"include_in_all": false
}
}
}
}
}
8、在 logstash-db-sync.conf 文件添加
template_name => "ik"
template => "/usr/local/logstash-6.4.3/sync/logstash-ik.json"
template_overwrite => true
manage_template => false
9、cd bin目录:执行命令: ./logstash -f /usr/local/logstash-6.4.3/sync/logstash-db-sync.conf
10:创建了索引为ik分词
可以参考文章: https://www.pianshen.com/article/7085303599/
11、启动的时出现报错:Native memory allocation (mmap) failed to map 986513408 bytes for committing reserved memory.
解决方案:
vi /etc/security/limits.conf 修改如下:
* hard nofile 65536
* soft nofile 65536
vi /etc/security/limits.d/20-nproc.conf修改如下:
* soft nproc 4096
root soft nproc unlimited
vi /etc/sysctl.conf添加:
vm.max_map_count = 655360
并执行:
[root@localhost security]# sysctl -p
vm.overcommit_memory = 1
vm.max_map_count = 655360
再次启动: ./logstash -f /usr/local/logstash-6.4.3/sync/logstash-db-sync.conf
问题一:logstash启动报配置文件错误Expected one of #, input, filter, output at line 1, column 1 (byte 1)
可以参考改文章:https://blog.csdn.net/weixin_39183543/article/details/90547342
具体操作:其中文件里面前面不能使用 tab键移动,需要按空格才可以。
最后运行成功:
问题二:同步时候发现只有同步一条数据,并且id的值为 %{id}
解决是id的值为 %{id}
将logstash-db-sync.conf 文件里面的
#document_id => "%{id}" 改为 document_id => "%{itemsId}" itemsId 是data.sql 文件SQL预计id
解决只有一条数据同步的问题:
通过SQL语句:UPDATE 表名 SET updated_time = DATE_ADD(updated_time,INTERVAL 12 MONTH)
问题三,在启动logstash时候,提示报错:
报错:An unknown error occurred sending a bulk request to Elasticsearch. We will retry indefinitely {:error_message=>"\"\\xAD\" from ASCII-8BIT to UTF-8", :error_class=>"LogStash::Json::GeneratorError",
An unknown error occurred sending a bulk request to Elasticsearch. We will retry indefinitely {:error_message=>"\"\\xE6\" from ASCII-8BIT to UTF-8", :error_class=>"LogStash::Json::GeneratorError",
解决办法是:
在logstash-db-sync.conf里面设置每个字段为UTF-8,在es官网有说明:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-jdbc.html#plugins-inputs-jdbc-columns_charset 设置columns_charset 参数。
columns_charset => {
"id"=> "UTF-8"
"name"=> "UTF-8"
等等
}