Linux安装系列:Canal搭建并实时同步MySQL数据到ES

应用

端口

版本

MySQL

3306

5.7.34

Elasticsearch

9200

7.3.0

Kibanba

5601

7.3.0

canal-server

11111

1.1.15

canal-adapter

8081

1.1.15

canal-admin

8089

1.1.15

介绍
canal-deploy:可以直接监听MySQL的binlog,把自己伪装成MySQL的从库,只负责接收数据,并不做处理。
canal-adapter:相当于canal的客户端,会从canal-server中获取数据,然后对数据进行同步,可以同步到MySQL、Elasticsearch和HBase等存储中去。
canal-admin:为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作。

# 组件下载canal-deploy、canal-adapter、canal-admin
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.adapter-1.1.5-SNAPSHOT.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.admin-1.1.5-SNAPSHOT.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-2/canal.deployer-1.1.5-SNAPSHOT.tar.gz

# 启动elasticsearch
docker run -di --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" -e ES_JAVA_OPTS="-Xms512m -Xmx512m" elasticsearch:7.3.0

# 启动kibana 
docker run -di --name kibana -e ELASTICSEARCH_URL=http://192.168.5.12:9200 -p 5601:5601 kibana:7.3.0
# 进入容器
docker exec -it --user root kibana bash
# 配置修改
vi config/kibana.yml 
elasticsearch.hosts: [ "http://192.168.5.12:9200" ]
 # 退出重启
docker restart kibana 
# 测试访问
http://192.168.5.12:5601/

# 启动MySQL
docker run -p 3306:3306 --name mysql -v /data/mysql/log:/var/log/mysql -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7.34

vi /data/mysql/conf/my.cnf
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101 
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql  
## 开启二进制日志功能
log-bin=mall-mysql-bin  
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M  
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=row  
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7  
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

docker restart mysql

docker exec -it mysql bash
# 进入MySQL容器查看设置状态
mysql -uroot -p 123456
show variables like '%log_bin%';
show variables like 'binlog_format%'; 

# 创建的账号为canal:canal
CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;

# 创建好测试用的数据库canal-test,之后创建一张商品表product
create database canal_test character set utf8 collate utf8_bin;
create table `product`  (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sub_title` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `price` decimal(10, 2) NULL DEFAULT NULL,
  `pic` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

# 解压文件
mkdir canal-deployer
cd canal-deployer
tar -zxvf canal.deployer-1.1.5-SNAPSHOT.tar.gz
# 修改配置文件
vi conf/example/instance.properties

# 需要同步数据的MySQL地址
canal.instance.master.address=192.168.5.12:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=
# 用于同步数据的数据库账号
canal.instance.dbUsername=canal
# 用于同步数据的数据库密码
canal.instance.dbPassword=canal
# 数据库连接编码
canal.instance.connectionCharset = UTF-8
# 需要订阅binlog的表过滤正则表达式
canal.instance.filter.regex=.*\\..*

# 启动
sh bin/startup.sh
# 查看日志
tail -f logs/example/example.log 

# 解压文件
mkdir canal-adapter
cd canal-adapter
tar -zxvf canal.adapter-1.1.5-SNAPSHOT.tar.gz -C canal-adapter
# 修改配置文件
vi conf/application.yml
canal.conf:
  mode: tcp # 客户端的模式,可选tcp kafka rocketMQ
  flatMessage: true # 扁平message开关, 是否以json字符串形式投递数据, 仅在kafka/rocketMQ模式下有效
  zookeeperHosts:    # 对应集群模式下的zk地址
  syncBatchSize: 1000 # 每次同步的批数量
  retries: 0 # 重试次数, -1为无限重试
  timeout: # 同步超时时间, 单位毫秒
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    canal.tcp.server.host: 192.168.5.12:11111 #设置canal-server的地址
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:

  srcDataSources: # 源数据库配置
    defaultDS:
      url: jdbc:mysql://192.168.5.12:3306/canal_test?useUnicode=true&useSSL=false
      username: canal
      password: canal
  canalAdapters: # 适配器列表
  - instance: example # canal实例名或者MQ topic名
    groups: # 分组列表
    - groupId: g1 # 分组id, 如果是MQ模式将用到该值
      outerAdapters:
      - name: logger # 日志打印适配器
      - name: es7 # ES同步适配器
        hosts: 192.168.5.12:9200 # ES连接地址
        properties:
          mode: rest # 模式可选transport(9300) 或者 rest(9200)
          # security.auth: test:123456 #  only used for rest mode
          cluster.name: elasticsearch # ES集群名称
		  
# 添加文件
vi /conf/es7/product.yml
dataSourceKey: defaultDS # 源数据源的key, 对应上面配置的srcDataSources中的值
destination: example  # canal的instance或者MQ的topic
groupId: g1 # 对应MQ模式下的groupId, 只会同步对应groupId的数据
esMapping:
  _index: canal_product # es 的索引名称
  _id: _id  # es 的_id, 如果不配置该项必须配置下面的pk项_id则会由es自动分配
  sql: "SELECT
        	p.id AS _id,
        	p.title,
        	p.sub_title,
        	p.price,
        	p.pic
        FROM
        	product p"        # sql映射
  etlCondition: "where a.c_time>={}"   #etl的条件参数
  commitBatch: 3000   # 提交批大小
  
# 启动
sh bin/startup.sh
# 查看日志
tail -f logs/adapter/adapter.log


# kibana 设置索引
PUT canal_product
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "sub_title": {
        "type": "text"
      },
      "pic": {
        "type": "text"
      },
      "price": {
        "type": "double"
      }
    }
  }
}
GET canal_product/_mapping
# 插入数据测试
INSERT INTO product ( id, title, sub_title, price, pic ) VALUES ( 5, '华为80', ' 全面屏游戏智能手机 6GB+64GB', 1999.00, NULL );
GET canal_product/_search

###########################################################配置 canal-admin,canal-deployer,canal-adapter###############################################################################
# 解压文件
mkdir canal-admin
cd canal-admin
tar -zxvf canal.admin-1.1.5-SNAPSHOT.tar.gz -C canal-admin

# 获取脚本并进行建表
canal-admin/conf/canal_manager.sql

# 修改配置文件
vi conf/application.yml
server:
  port: 8089
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

spring.datasource:
  address: 192.168.5.12:3306
  database: canal_manager
  username: root
  password: 123456
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
  hikari:
    maximum-pool-size: 30
    minimum-idle: 1

canal:
  adminUser: admin
  adminPasswd: admin
  
# canal-deployer配置文件修改
vi canal-deployer/conf/canal_local.properties
# register ip
canal.register.ip =

# canal admin config
canal.admin.manager = 192.168.5.12:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441
# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster = 
# 修改完之后重启canal-deployer
sh bin/startup.sh local

# canal-adapter配置文件修改
vi conf/bootstrap.yml
canal:
  manager:
    jdbc:
      url: jdbc:mysql://192.168.5.12:3306/canal_manager?useUnicode=true&characterEncoding=UTF-8&useSSL=false
      username: root
      password: 123456

vi conf/application.yml
srcDataSources:
defaultDS:
  url: jdbc:mysql://192.168.5.12:3306/canal_test?useUnicode=true&useSSL=false
  username: canal
  password: canal
canalAdapters:
- instance: example # canal instance Name or mq topic name
groups:
- groupId: g1
  outerAdapters:
  - name: logger
  - name: rdb
	# key的值需要和rdb里yml文件里outerAdapterKey的值相同
	key: mysql1
	properties:
	  jdbc.driverClassName: com.mysql.jdbc.Driver
	  # 目的地址
	  jdbc.url: jdbc:mysql://192.168.5.12:3306/canal_manager?useUnicode=true&useSSL=false
	  jdbc.username: root
	  jdbc.password: 123456

# 修改文件名并修改配置
cd  /conf/rdb/
mv mytest_user.yml canal_manager.yml

vi canal_manager.yml
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  database: canal_test
  table: canal_user
  targetTable: canal_manager.canal_user
  targetPk:
    id: id
  mapAll: true
#  targetColumns:
#    id:
#    name:
#    role_id:
#    c_time:
#    test1:
#  etlCondition: "where c_time>={}"
  commitBatch: 3000 # 批量提交的大小
# 修改完之后重启canal-adapter  


# 启动canal-admin
sh bin/startup.sh
# 查看日志
tail -f logs/admin.log

# 测试访问 
http://192.168.5.12:8089
账号密码admin:123456

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值