使用canal+sharding-proxy搭建分库分表环境,平滑迁移数据

使用canal+sharding-proxy搭建分库分表环境,平滑迁移数据_第1张图片

  • deployer组件负责解析binlog日志
  • adapter负责适配各种存储

实际使用过程中的例子:

使用canal+sharding-jdbc 进行分表, 并对之前的数据进行迁移

1. 操作步骤:

1. 使用mysqldump导出数据

mysqldump -t --databases test -uroot -pxxxxxxxxxx --skip-add-drop-table  --single-transaction --master-data=2 --tables goods>D:\goods.sql

-- 注:

-- 1.全表备份where条件可删除

-- 2.使用single-transaction master-data=2 防止数据库锁表

-- 3.导出后的日志中有相关的binlog开始文件和位置

 

查看goods.sql文件

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000093', MASTER_LOG_POS=455856543;

2. 创建分库分表的sql, 由于需要创建32张表这里使用脚本生成。*.groovy

// 必须先定义i,否则程序会报错

def i = 0

def sql="""

drop table if exists user_${-> i};

CREATE TABLE `user_${-> i}` (

`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',

  `user_id` int(11) NOT NULL COMMENT '用户ID',

  `name` varchar(30) DEFAULT NULL COMMENT '名字',

) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;

"""

def file = new File("1.sql")

file.write("","utf-8")

for (j in 0..7){

  i=j

  file.append(sql,"utf-8")

}

println "write 1.sql finished! "

 

3. sql文件通过sharding-jdbc导入mysql

2. 配置

2.1. canal deployer配置

#instance.properties

#canal.instance.filter.regex=.*\\..*

canal.instance.filter.regex=test.goods

# table black regex

canal.instance.filter.black.regex=

2.2. canal adapter配置

# server.yml

srcDataSources:

    defaultDS:

      url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8

      username: root

      password: 123456

  canalAdapters:

  - instance: example # canal instance Name or mq topic name

    groups:

    - groupId: g1

      outerAdapters:

      - name: logger

      - name: rdb

        key: mysql1

        properties:

          jdbc.driverClassName: com.mysql.jdbc.Driver

          jdbc.url: jdbc:mysql://127.0.0.1:3307/sharding_db?serverTimezone=UTC&useSSL=false&useUnicode=true&characterEncoding=UTF-8

          jdbc.username: root

          jdbc.password: root

 

dataSourceKey: defaultDS

destination: example #canal instance Name or mq topic name

groupId: g1

outerAdapterKey: mysql1

concurrent: true

dbMapping:

  database: test

  table: user

  targetTable: sharding_db.user

  targetPk:#可配置多个key

    id: id

    name:name

  mapAll: true #不能忽略,必须配置

2.3 sharding-proxy配置

# vi conf/server.yaml

authentication:

  users:

    root:

      password: root  #代理密码

props:

  executor.size: 16

  sql.show: true

 

# vi conf/config-sharding.yaml
schemaName: sharding_db
 
dataSources:
  test:
    url: jdbc:mysql://127.0.0.1:3308/test?serverTimezone=UTC&useSSL=false # 目标数据源
    username: root  #用户名
    password: 123456 #密码
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 50
 
shardingRule:# 分表规则
  tables:
    user:   # 表名
      actualDataNodes: test.user_${0..32} #表range
      tableStrategy:
        inline:
          shardingColumn: id  #分表字段
          algorithmExpression: user_${id % 32} #分表规则
      keyGenerator: #key生成算法
        type: SNOWFLAKE
        column: id
  bindingTables:
    - user
  defaultDatabaseStrategy:
    none:
  defaultTableStrategy:
    none:

 

你可能感兴趣的:(java,canal,sharding)