1. 程式人生 > 其它 >docker mysql自動同步到es

docker mysql自動同步到es

測試版本: mysql:5.7 ; es:5.6.4 ; elasticsearch-head:5 ;kibana:5.6.4 ;go-mysql-elasticsearch(mysql 資料自動同步到es的工具)

重要的事情說三遍:

  • es 的東西,版本一點都不能差。
  • es 的東西,版本一點都不能差。
  • es 的東西,版本一點都不能差。

kibana版本對應上

docker search kibana:5.6.4 
這種方式一般就能找到版本

IK (es 的中文分詞,版本對應上)

 https://github.com/medcl/elasticsearch-analysis-ik

go-mysql-elasticsearch

 所支援的MySQL版本小於8.0. 所支援的ES版本小於6.0.mysqlbinlog的格式必須為row格式.

docker-compose file 構建如下(內部的XXX 替換成實際的值):

version: "3"
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:5.6.4
    container_name: es5.6
    environment:
      - TZ=Asia/Shanghai
    restart: always
    environment:
      - cluster.name=elastomer5.6
      - bootstrap.memory_lock=true
      - discovery.type=single-node
      - xpack.monitoring.enabled=false
      - xpack.security.enabled=false
      - xpack.watcher.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - XXX/ik:/usr/share/elasticsearch/plugins/ik
      - XXX/data:/usr/share/elasticsearch/data
      - XXX/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - "9200:9200"
  es-head:
    image: mobz/elasticsearch-head:5
    container_name: es-head
    restart: always
    ports:
      - "9100:9100"
  kibana:
    image: docker.elastic.co/kibana/kibana:5.6.4
    container_name: kibana
    restart: always
    ports:
      - "5601:5601"
    depends_on:
      - elasticsearch
      - mysql
  go-mysql-elasticsearch:
    image: eaglechen/go-mysql-elasticsearch
    container_name: mysql2es
    restart: always
    volumes:
      - XXX/river.toml:/go_mysql_river.toml:ro
    depends_on:
      - elasticsearch
  mysql:
    container_name: mysql5.7
    restart: always
    build: mysql5.7
    command:
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_general_ci
      --explicit_defaults_for_timestamp=true
      --lower_case_table_names=1
      --max_allowed_packet=128M
      --sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO"
    environment:
      TZ: Asia/Shanghai
      MYSQL_ROOT_PASSWORD: XXX
    ports:
      - "3306:3306"
    volumes:
      - XXX/data:/var/lib/mysql 

相關配置檔案:

river.toml 配置見  https://github.com/go-mysql-org/go-mysql-elasticsearch/blob/master/etc/river.toml
ik:下載見 https://github.com/medcl/elasticsearch-analysis-ik
elasticsearch.yml:
cluster.name: "docker-cluster"
network.host: 0.0.0.0

# minimum_master_nodes need to be explicitly set when bound on a public IP
# set to 1 to allow single node clusters
# Details: https://github.com/elastic/elasticsearch/pull/17288
discovery.zen.minimum_master_nodes: 1
# 開啟前端訪問的跨域. (使用es-head 工具訪問的時候,前端有跨域問題,這裡允許跨域)
http.cors.enabled: true
http.cors.allow-origin: "*"

mysql5.7的Dockerfile:

FROM mysql:5.7

COPY mysqld.cnf /etc/mysql/mysql.conf.d/

mysqld.cnf檔案示例:

#
# The MySQL  Server configuration file.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

[mysqld]
pid-file	= /var/run/mysqld/mysqld.pid
socket		= /var/run/mysqld/mysqld.sock
datadir		= /var/lib/mysql
#log-error	= /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address	= 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

#以下是啟動log-bin的配置
log-bin = binlog
server-id=1
binlog-format = ROW
binlog_rows_query_log_events = off

  寫在後面的話:

1、canal 等工具沒有go-mysql-elasticsearch 部署、配置簡單。

2、不要隨便嘗試build es,那可能會讓你鬱悶一天。退而求其次,使用-v 掛載吧

3、docker-compose 檔案書寫注意事項:

  • 每個services 下面的key 名,隨便命名。
  • container_name 隨便命名
  • build 後面的值,寫含Docker file 的資料夾名。
  • depends_on 寫services 下面的key 名。詳見docker-compose 檔案規範。
附:es中關於type(就是5.X之前的table 的意思。就是es 的高版本,不支援table 了,只支援db) 的版本迭代 5.x 及以前版本,一個 index 有一個或者多個 type 6.x 版本,一個 index 只有一個 type 7.x 版本移除了 type,type 相關的所有內容全部變成 Deprecated,為了相容升級和過渡,所有的 7.x 版本 es 資料寫入後 type 欄位都預設被置為 “_doc” 8.x 版本完全廢棄 type