使用Logstash复制MySQL数据到ElasticSearch

461 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

前几天接到了个任务,为了解决文本搜索慢的问题,要搭建一个全文搜索平台。技术选型决定使用Elastic search,此外还要解决将数据库数据同步到es的问题,技术调研后打算先试用logstash同步数据到Es。

logstash介绍

logstash是具有实时流水线能力的开源的数据收集引擎。logstash灵活性高,提供了大量插件,可帮助我们解析,丰富,转换和缓冲任何类型的数据,可以方便快捷的应用于多种场景。它的不足之处在于性能和资源消耗,与其他替代者相比还是有一定的劣势。

docker部署es

docker的安装这里就不再叙述了,不清楚的同学自行搜索。先使用docker启动es服务,测试logstash同步数据方案。

// docker启动es
docker run -d --name es -p 9200:9200 -p 9300:9300 -v D:\work\iio\dockerFile\es\data:\usr\share\elasticsearch -e "discovery.type=single-node" -m 512M docker.elastic.co/elasticsearch/elasticsearch:7.11.2

参数说明

-d: 后台运行容器,并返回容器ID;

-i: 以交互模式运行容器,通常与 -t 同时使用;

-P: 随机端口映射,容器内部端口随机映射到主机的端口,格式为:主机(宿主)端口:容器端口

-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用

--name="nginx-lb": 为容器指定一个名称

-e username="ritchie": 设置环境变量

-m :设置容器使用内存最大值

--volume , -v: 绑定一个卷

es安装ik分词

下载地址

// 与容器交互 es为容器名称(也可以使用容器Id)
docker exec -it es /bin/bash

// 容器内创建目录
mkdir /usr/share/elasticsearch/plugins/ik

// 将文件导入指定容器内目录下 es为容器名称(也可以使用容器Id)
docker cp C:\Users\admin\Downloads\elasticsearch-analysis-ik-7.11.2.zip es:/usr/share/elasticsearch/plugins/ik

// 容器内解压压缩包
unzip elasticsearch-analysis-ik-7.11.2.zip

退出容器,重启容器

测试ik分词


GET _analyze?pretty
 
{
 
  "analyzer": "ik_max_word",
 
  "text":"我们是中国人啊"
 
}
{
    "tokens": [
        {
            "token": "我们",
            "start_offset": 0,
            "end_offset": 2,
            "type": "CN_WORD",
            "position": 0
        },
        {
            "token": "是",
            "start_offset": 2,
            "end_offset": 3,
            "type": "CN_CHAR",
            "position": 1
        },
        {
            "token": "中国人",
            "start_offset": 3,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 2
        },
        {
            "token": "中国",
            "start_offset": 3,
            "end_offset": 5,
            "type": "CN_WORD",
            "position": 3
        },
        {
            "token": "国人",
            "start_offset": 4,
            "end_offset": 6,
            "type": "CN_WORD",
            "position": 4
        },
        {
            "token": "啊",
            "start_offset": 6,
            "end_offset": 7,
            "type": "CN_CHAR",
            "position": 5
        }
    ]
}

注意:如果没有生效,进入容器检查ik分词插件是否存在,如果不存在应该是容器挂在本地磁盘异常,具体原因自行百度。

docker部署logstash

logstash和es版本要一致

// docker启动logstash
docker run --name logstash -d -p 5044:5044 -v D:\work\iio\dockerFile\logstash\data:\usr\share\logstash logstash:7.11.2

修改logstash配置

1、复制mysql驱动到logstash容器中

2、进入logstash容器中修改配置文件

1)修改/config/logstash.yml 中的es地址
2)修改/pipeline/logstash.conf 中的相关配置(inputoutput、filler)
input {
	jdbc {
        jdbc_connection_string => "jdbc:mysql://mysql地址:端口/数据库名"
        jdbc_user => "账号"
        jdbc_password => "密码"
        #mysql驱动位置
        jdbc_driver_library => "/usr/share/logstash/driver/mysql-connector-java-8.0.23.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
        lowercase_column_names => false
        # statement_filepath => "filename.sql"
        statement => "sql语句"
        #定时器(每分钟执行一次)
        schedule => "* * * * *"
        type => "product"
    }
}

output {

     if[type]=="product"{
        elasticsearch {
            hosts => ["es地址:9200"]
            #manage_template => false
            #template_name => "myik"
            #template => "/usr/share/logstash/template/test_template.json"
            #template_overwrite => true
            #document_id => "%{id}"
            #索引名称
            index => "logstash-test"
        }

     }
}

注意:type关键字可以用于区分数据源,做一些逻辑操作,但是如果查询的数据有type字段,会覆盖掉input中定义的type