ES和MySQL数据同步(简略版)

一、在docker配置elasticsearch和kibana

1.注:elasticsearch和kibana的版本要一致

elesticsearch
--拉取镜像
docker pull docker.elastic.co/elasticsearch/elasticsearch:7.1.0
    
--运行容器
docker run -it --name elasticsearch --restart=always -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" docker.elastic.co/elasticsearch/elasticsearch:7.1.0
kibana
--拉取镜像
docker pull docker.elastic.co/kibana/kibana:7.1.0
    
--运行容器
docker run --name kibana  -p 5601:5601 --link elasticsearch -d kibana:7.1.0

2.验证elesticsearch和kibana是否配置成功(输入url,出现界面则成功)

elasticsearch   localhost:9200
kibana          localhost:5601

二、修改mysql的配置

注:我的mysql版本号是:8.0.18

1.mysql的binlog日志主要用于数据库的主从复制和数据恢复。要通过mysql binlog将数据同步到ES集群中,要使用ROW模式(ROW模式可知道mysql中数据的修改内容)

--在dos窗口更改配置
#查看binlog模式
    mysql> show variables like "%binlog_format%";
#开启binlog
    mysql>set global log-bin=mysql-bin;
#修改binlog模式
    mysql> set global binlog_format='ROW';
# 配置MySQL replaction需要定义
    mysql>server_id=1;
--查看配置是否成功
    mysql> show variables like 'log_bin';
    mysql> show variables like "%binlog_format%";
    mysql> show master status;

 

 

2.创建连接mysql的账号canal

CREATE USER canal IDENTIFIED BY ‘canal’;

3.授予权限

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’;

4.刷新权限

FLUSH PRIVILEGES;

5.查看mysql数据库中的user表(成功如下)

 

三、canal-server

1.在docker中配置canal-server

--拉取镜像
docker pull canal/canal-server:v1.1.5
    
--运行容器
docker run --name canal-server -p 11111:11111 --link mysql:mysql -id canal/canal-server:v1.1.5

2.修改配置文件instance.properties

--进入canal-server容器
docker exec -it canal-server bash
    
--把instance.properties配置文件拷贝到桌面
docker cp canal-server:/home/admin/canal-server/conf/example/instance.properties C:\Users\Administrator\Desktop
​
--获取mysql容器/镜像的元数据:用于下一步数据库地址的填写(另开一个Windows PowerShell)
docker inspect mysql
    
--修改instance.properties配置文件中的内容
(1)# position info
    canal.instance.master.address=172.17.0.3:3306 
(2)# username/password
    canal.instance.dbUsername=canal #你的数据库账号
    canal.instance.dbPassword=canal #你的数据库密码
    canal.instance.connectionCharset = UTF-8
    # enable druid Decrypt database password
    canal.instance.enableDruid=false
​
--将原有的instance.properties配置文件移除
(先进入到conf目录下,一路cd xxx...即可)
rm instance.properties #linux中只需输入首字母,再按Tab键即可生成完整文件名
        
--把桌面的instance.properties配置文件放回conf路径下
docker cp C:\Users\Administrator\Desktop\instance.properties canal-server:/home/admin/canal-server/conf/example
    
--重新启动canal-server容器
docker restart canal-server

四、canal-adapter

1.在docker中配置canal-adapter

--拉取镜像
docker pull slpcat/canal-adapter:v1.1.5
    
--运行容器
docker run --name canal-adapter -p 8081:8081 -d --link mysql:mysql --link elasticsearch:elasticsearch slpcat/canal-adapter:v1.1.5

2.修改配置文件

--进入canal-adapter容器
docker exec -it canal-adapter bash
--修改application.yml配置文件
    
--拷贝到桌面(在另开的Windows PowerShell中输入)
docker cp canal-adapter:/opt/canal-adapter/conf/application.yml C:\Users\Public\Desktop
    
--查canal-server、elesticsearch的元数据
    canal-server:172.17.0.5
    elesticsearch:172.17.0.2
        
--修改文件内容
consumerProperties:
    # canal tcp consumer
    canal.tcp.server.host: 172.17.0.5:11111
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
srcDataSources:
    defaultDS:
      url: jdbc:mysql://172.17.0.3:3306/jeecg-boot?useUnicode=true # 自己数据库的地址
      username: canal #步骤二中新建的用户
      password: canal
canalAdapters:
  - instance: example 
    groups:
    - groupId: g1
      outerAdapters:
      - name: es7
        hosts: 172.17.0.2:9200 
        properties:
          mode: rest 
          # security.auth: test:123456 #  only used for rest mode
          cluster.name: docker-cluster
              
--将原有的application.yml配置文件移除
(先进入到conf目录下,一路cd xxx...即可)
rm application.yml #linux中只需输入首字母,再按Tab键即可生成完整文件名
        
--把桌面的application.yml配置文件放回conf路径下
docker cp C:\Users\Public\Desktop\application.yml canal-adapter:/opt/canal-adapter/conf
--修改mytest_user.yml配置文件
    
--拷贝到桌面(在另开的Windows PowerShell中输入)
docker cp canal-adapter:/opt/canal-adapter/conf/es7/mytest_user.yml C:\Users\Public\Desktop
        
--修改文件内容
dataSourceKey: defaultDS
destination: example
groupId: g1
esMapping:
  _index: pm_index #此处是elesticsearch中建立的索引名(先建索引再改此配置文件)
  _id: _id
  _type: _doc
  upsert: true
  pk: id
  #下方是想要同步的字段
  sql: "select p.id as _id, 
        p.project_code, 
        p.pid, 
        p.project_name,
        from pm p"
  commitBatch: 3000
              
--将原有的mytest_user.yml配置文件移除
(先进入到conf目录下,一路cd xxx...即可)
rm mytest_user.yml #linux中只需输入首字母,再按Tab键即可生成完整文件名
        
--把桌面的mytest_user.yml配置文件放回conf路径下
docker cp C:\Users\Public\Desktop\mytest_user.yml canal-adapter:/opt/canal-adapter/conf/es7
    
--重新启动canal-adapter容器
docker restart canal-adapter

3.在kibana中如何新建索引(备注)

PUT pm
{
 "mappings" : {
      "properties" : {
        "id" : {
          "type" : "text"
        },
        "pid" : {
          "type" : "text"
        },
        "project_code" : {
          "type" : "text"
        },
        "project_name" : {
          "type" : "text"
        }
      }
    }
}
--查看索引结构是否创建成功
GET pm/_mapping

五、操作对应数据库

观察canal-adapter的日志,往数据库中插入数据,若log能监测到则证明es和mysql数据同步成功。

--同步完后,去kibana中查看
GET pm/_search
  

六、数据同步的时候可能出现的问题
1、es7.1如何新增字段(不删除索引的前提下新增字段)
#更改索引的配置(pm是我的索引的名字,自行更改)
PUT pm/_settings
{
  "index.blocks.read_only_allow_delete":null
}

#新增字段
PUT pm/_mapping
{
    "properties":{
       "client_name":{
         "type":"keyword"
        }
    }
}

#新增完之后查看索引的结构,若新字段在结构中,则代表更改成功了
GET pm/_mapping
  2、隔了几天再次启动canal-server和canal-adapter,想同步别的数据,此时报了如下错误:
com.alibaba.otter.canal.protocol.exception.CanalClientException: java.net.ConnectException: Connection refused

解决办法:

#在PowerShell获取canal-server镜像元数据,查看IPAddress
docker inspect canal-server

#再找到canal-adapter中的配置文件application.yml,查看如下一行
canal.tcp.server.host: xxxx:11111

#xxxx处就是第一步获得的IPAddress(一般都是此处出错才导致连接失败,IPAddress会改变的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值