Docker安装使用ES

安装

elasticsearch安装

  1. docker.elastic.co仓库查找springboot对应的es版本,,eg:

    1
    2
    3
    4
    # springboot 2.7.18
    docker pull docker.elastic.co/elasticsearch/elasticsearch:7.17.22
    #如果上面的拉取太慢了,可以用下面的dockerhub的镜像
    docker pull elastic/elasticsearch:7.17.22
  2. 创建配置文件,执行vim /workspace/elasticsearch.yml写入如下内容

    1
    2
    3
    4
    5
    6
    cluster.name: "docker-cluster"
    network.host: 0.0.0.0
    http.port: 9200
    http.cors.enabled: true
    http.cors.allow-origin: "*"
    xpack.security.enabled: false
  3. 安装elasticsearch7.17,执行

    1
    2
    3
    4
    5
    6
    7
    mkdir /workspace/v_es_data/
    chmod -R 777 /workspace/v_es_data/
    # -m限制使用内存1g
    docker run -d -m 1g -p 9200:9200 -e "discovery.type=single-node" --name es \
    -v /workspace/v_es_data:/usr/share/elasticsearch/data \
    -v /workspace/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \
    docker.elastic.co/elasticsearch/elasticsearch:7.17.22
  4. 测试,执行下面命令

    1
    2
    3
    ➜  ~ curl -X GET "127.0.0.1:9200/_cat/nodes?v=true&pretty"
    ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
    172.18.0.2 35 84 5 0.06 0.09 0.13 cdfhilmrstw * eeeedfa1ed88

kibana安装(没采用)

可视化查看工具,类似dbeaver,非必需

  1. 执行下面命令进行安装

    1
    2
    3
    docker run -d --name kibana -p 5601:5601 \
    -e "ELASTICSEARCH_HOSTS=http://127.0.0.1:9200" \
    docker.elastic.co/kibana/kibana:7.17.22
  2. 访问http://localhost:5601/

  3. 然后进行各种操作,比较复杂

本地采用es-client插件

数据同步方案

应用层同步

在应用层面进行数据同步,即在应用代码中同时写入 MySQL 和 Elasticsearch。

优点:依赖少,自定义同步逻辑。

缺点:数据一致性和可靠性方面存在一些挑战,特别是在高并发的场景下。

MySQL binlog(数据库日志)

借助于数据库日志(如 MySQL binlog)来捕获数据变化,并将其同步到 Elasticsearch。这种方法通常能够实时同步数据,并且不会对数据库性能造成太大影响。

优点:实时同步数据,不会对数据库性能造成太大影响。

缺点:性能开销,binlog 会占用额外的磁盘空间。

Debezium(重量级别)

优点:功能强大,支持复杂的配置和扩展,社区活跃。

缺点:需要 Kafka,配置相对复杂。

Maxwell(轻量级别)

Maxwell是一种开源的MySQL数据库同步工具,它可以将MySQL数据库的binlog转化为JSON格式,并将其发送到消息队列中。

需要mq和kafka等中间件

优点:轻量级,配置简单,适合快速实现。

缺点:功能相对简单,不支持复杂的场景

canal

Canal是阿里巴巴开发的一款数据库同步工具,它可以实现MySQL数据库的binlog解析和日志抓取。模拟mysql的从节点实现。

springboot接入ES

  1. 在pom.xml添加依赖

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    </dependency>

maxwell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
version: '3.8'

services:
mysql:
image: mysql:8.0
container_name: mysql
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: maxwell
MYSQL_USER: maxwell
MYSQL_PASSWORD: maxwellpassword
ports:
- "3306:3306"
command: --server-id=1 --log-bin=mysql-bin --binlog-format=row --binlog-row-image=full
volumes:
- mysql-data:/var/lib/mysql

maxwell:
image: zendesk/maxwell:1.33.0
container_name: maxwell
environment:
- MAXWELL_MYSQL_HOST=mysql
- MAXWELL_MYSQL_USER=maxwell
- MAXWELL_MYSQL_PASSWORD=maxwellpassword
- MAXWELL_MYSQL_DATABASE=maxwell
- MAXWELL_PRODUCER=es
- MAXWELL_OUTPUT_DDL=true
- MAXWELL_ES_HOST=http://119.91.96.139:9200
depends_on:
- mysql

volumes:
mysql-data:

参考

4种数据同步到Elasticsearch方案