使用sharding-scaling和sharding-proxy做分库分表数据迁移

news2024/9/28 11:22:49

背景:

 现在有一个有一张表被分成了两张表,t_score1 ,t_score2,但后期数据量激增,两张表不能满足业务需求,扩张为2个库每个库2张表,即数据库 ds_0下有t_score1 ,t_score2 ,数据库ds1下有t_score1 ,t_score2两张表,需要将数据平滑的迁移,这时便用到了scaling做数据的同步,proxy做数据的路由分发(发散性,可以将2个库中分别64张表同步到10个库中分别128张表中,这时需要启动多个scaling来并发同步,一个scaling同步一个库或者多个库的,proxy可以使用nginx做负载均衡)

1.使用版本4.1.1系列
全系列版本地址

ps:建议使用4.1.1后版本,之前的版本问题比较多
注意mysql数据库版本5.1-5.7,使用8.0版本会提示没有系统字段query_cache_size

4.1.1示例图

 2.使用文档

官方文档地址

解压后目录均是

启动文件只需要到bin目录启动start文件

  

2.1 sharding-proxy

2.1.1配置文件列表

2.1.2 server.yaml配置

如果用到了zk配置中心可以配置orchestration属性,需要注意得是其中的

orchestrationName和namespace分别对应了zk中的节点信息

 其中的authentication.sharding.authorizedSchemas=order2代表给用户sharding密码123456授权order2的使用权限

2.1.3 config-sharding.yaml 数据分片配置

#对外暴露的数据库名称
schemaName: order2

dataSources:
  ds_0:
    url: jdbc:mysql://175.178.7.16:3307/test1?serverTimezone=UTC&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 300
  ds_1:
    url: jdbc:mysql://175.178.9.16:3309/test2?serverTimezone=UTC&useSSL=false
    username: root
    password: 123456
    connectionTimeoutMilliseconds: 30000
    idleTimeoutMilliseconds: 60000
    maxLifetimeMilliseconds: 1800000
    maxPoolSize: 300
    

shardingRule:
  tables:
    t_score:
      actualDataNodes: ds_${0..1}.t_score${1..2}
      databaseStrategy:
        inline:
          shardingColumn: id
          algorithmExpression: ds_${id % 2}
      tableStrategy:
        inline:
          shardingColumn: score
          algorithmExpression: t_score${score % 2 +1}
      keyGenerator:
        type: SNOWFLAKE
        column: id

2.2 sharding-scaling

scaling没有过多的配置,只需要启动bin目录下的start文件即可,默认使用
http://localhost:8080/  进行访问

2.2.1 数据同步

curl 'http://localhost:18088/api/shardingscaling/job/start' \
  -H 'Connection: keep-alive' \
  -H 'Content-Type: application/json;charset=UTF-8' \
  --data-raw $'{"ruleConfiguration":{"sourceDatasource":"ds_1: \u0021\u0021org.apache.shardingsphere.orchestration.core.configuration.YamlDataSourceConfiguration\\n  dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n  properties:\\n    jdbcUrl: jdbc:mysql://175.178.97.186:3308/test2?serverTimezone=UTC&useSSL=false\\n    username: root\\n    password: \'123456\'\\n    connectionTimeout: 30000\\n    idleTimeout: 60000\\n    maxLifetime: 1800000\\n    maxPoolSize: 300\\n    minPoolSize: 1\\n    maintenanceIntervalMilliseconds: 30000\\n    readOnly: false\\nds_0: \u0021\u0021org.apache.shardingsphere.orchestration.core.configuration.YamlDataSourceConfiguration\\n  dataSourceClassName: com.zaxxer.hikari.HikariDataSource\\n  properties:\\n    jdbcUrl: jdbc:mysql://175.178.97.186:3308/test?serverTimezone=UTC&useSSL=false\\n    username: root\\n    password: \'123456\'\\n    connectionTimeout: 30000\\n    idleTimeout: 60000\\n    maxLifetime: 1800000\\n    maxPoolSize: 300\\n    minPoolSize: 1\\n    maintenanceIntervalMilliseconds: 30000\\n    readOnly: false\\n","sourceRule":"tables:\\n  t_score:\\n    actualDataNodes: ds_${0..1}.t_score${1..2}\\n    databaseStrategy:\\n      inline:\\n        algorithmExpression: ds_${id % 2}\\n        shardingColumn: id\\n    keyGenerator:\\n      column: id\\n      type: SNOWFLAKE\\n    logicTable: t_score\\n    tableStrategy:\\n      inline:\\n        algorithmExpression: t_score${score % 2 +1}\\n        shardingColumn: score\\n","destinationDataSources":{"username":"root","password":"123456","url":"jdbc:mysql://127.0.0.1:3308/order2?serverTimezone=UTC&useSSL=false"}},"jobConfiguration":{"concurrency":"1"}}' \
  --compressed

2.2.2 查看同步的状态

列表

curl -X GET http://localhost:8888/shardingscaling/job/list

详情

curl -X GET http://localhost:8888/shardingscaling/job/progress/1

2.3.3 停止同步

curl -X POST \
  http://localhost:8888/shardingscaling/job/stop \
  -H 'content-type: application/json' \
  -d '{
   "jobId":1
}'

2.3.4 scaling同步原理与优化

启动scaling时,首先是做全量的同步,并且会记录此时的数据库的binlog位置点,做完全量的同步会做增量的同步

原有的4.1.1版本代码自认为是存在两个问题

1.mysql限制不能两个相同serverid同时读取binlong(场景在同一个实例下部署了两个数据库,且要做数据的迁移)

A slave with the same server_uuid/server_id as this slave has connected to the master

源码调整

org.apache.shardingsphere.shardingscaling.mysql.MySQLBinlogReader#read

将此处的123456 改成 new Random().nextInt(10000)

2.对于同步中断,然后重启scaling间的不一致数据,scaling的全量插入时insert into,导致旧数据不能被更新

源码调整

org.apache.shardingsphere.shardingscaling.core.execute.executor.writer.AbstractSqlBuilder#buildInsertSQLInternal

将此处的 INSERT INTO 改成 REPLACE INTO,至于为啥执行有重复数据还以继续执行insert into 是因为前面catch住了这样的异常

2.3 sharding-ui

2.3.1 首先配置配置中心

2.3.2 配置好的效果

 2.3.3 启动proxy后的效果

2.3.4 注册中心和配中心一样的配置

 2.3.5 启动proxy后可以控制这个代理是否可用

如果需要做集群,可以用nginx做负载均衡

 

  2.3.6 使用界面操作scaling

建立任务

查看任务

 

任务详情

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/503749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

浏览器插件的使用

善于使用浏览器插件,能起到高效上网的作用。 Microsoft Edge 是全球广受欢迎的浏览器,浏览器本身具有快速、简单和轻量级的特点。一流的性能系统和访问速度极大提升您的浏览体验。 对于浏览器的用户来说,安装一些实用的插件,能让…

Navicat设置Oracle数据库主键自增1的方法步骤

一、 创建如下表 Oracle数据库不同于Mysql、Sql Server数据库,Oracle数据库主键自增不能在建表时直接设置,而是需要通过序列和触发器进行设置! 二、创建序列 1 2 3 4 5 6create sequence SEQ_DEVICEDATAINFO start with 1 …

iOS可视化动态绘制连通图

上篇博客《iOS可视化动态绘制八种排序过程》可视化了一下一些排序的过程,本篇博客就来聊聊图的东西。在之前的博客中详细的讲过图的相关内容,比如《图的物理存储结构与深搜、广搜》。当然之前写的程序是比较抽象的。上篇博客我们以可视化的方式看了一下各…

数据库(Sql server语言)(一)

例题:(不介绍创建和插入) star表 ●查询每个组合的名称及其成员个数 select g.name,count(*) 成员个数 from star s,stargroup g where s.gid g.gid group by g.name 如果不写where s.gidg,gid会出现成员个数重复 ●查询身高最高的团…

UG NX二次开发(C#)-建模-反向片体(SheetBody)的法向矢量

文章目录 1、前言2、在UG NX中构建一个片体3、在UG NX中查看片体的法向矢量4、采用UFun函数来实现法向反向5、代码实现6、测试效果1、前言 在UG NX中,一张曲面获取其所属的片体(SheetBody)对象,其在构建时有默认的法向矢量,有时处于功能的需求,比如加工时工件的材料去除方…

探秘信息检索:原理、实现与应用

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

(一)如何使用Spring Boot和MyBatis框架实现即时通信系统中的用户注册功能

文章目录 一、引言二、Spring Boot和MyBatis框架介绍三、注册1. 前端界面实现2. 后端数据持久化操作3. 代码示例 四、实现效果四、个人经验分享五、结语 一、引言 本文将介绍基于Spring Boot和MyBatis框架开发的注册功能实现,该功能是基于Linux的即时通信系统的一个…

二挡起步——pythonweb开发Django框架,前端原生+Django后端框架002(附带小案例)

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

ERROR: Could not find a valid gem ‘cocoapods‘ (>= 0) in any repository

Flutter启动的时候报错 需要重新安装cocoapods,那就重装,可是结果装不上 这是需要梯子的,我开了梯子也是一样安装不上 所以需要指定一下你的http代理ip和端口 你可以找一下你梯子的端口,找找代理命令,比如我的如下…

人工智能概述、发展历程及主要分支

人工智能概述 人工智能发展必备三要素: 数据 算法 计算力 ,硬件支撑 CPU、GPU、TPU 计算力之CPU、GPU对比: CPU主要适合I\O密集型的任务 GPU主要适合计算密集型任务 什么类型的程序适合在GPU上运行? (1&#…

数据库的逻辑组织

目录 一、数据库构架 二、系统数据库 1.master数据库 2. tempdb数据库 3. model数据库 4. msdb数据库 三、用户数据库 用户数据库在sysdatabases表中的记录 一、数据库构架 数据库存储是按物理方式在磁盘上作为两个或更多的文件实现。用户使用数据库时使…

java学习之异常三

目录 一、throws 一、基本说明 二、使用细节 二、自定义异常 一、 基本概念 ​编辑二、自定义异常的步骤 三、实例 四、练习 三、throw和throws的区别 四、本章作业 第一道 第二题 第三题 第四题 一、throws 一、基本说明 package com.hspedu.throws_;import java.i…

Linux常用命令(2)

文章目录 Linux常用命令(2)拷贝 cp语法拷贝hello.txt生成一个新文件hello1.txt拷贝hello.txt文件到hello目录里面去拷贝hello目录生成一个新目录hello1拷贝hello1目录到主目录里面去并且命名为hello2目录 更名/移动 mv删除 rm管理员命令echo / cat将信息…

JVM 程序计数器(PC 寄存器)

PC Register 介绍 JVM中的程序计数寄存器( Program Counter Register) 中,Register 的命名源于 CPU 的寄存器, 寄存器存储指令相关的现场信息。 CPU 只有把数据装载到寄存器才能够运行JVM 中的 PC 寄存器是对物理 PC 寄存器的一种抽象模拟PC 寄存器用来存储指向下一…

Vue 子组件触发父组件事件,传递多个参数以及异常情况处理

Start 今天这篇文章记录一下子组件调用父组件事件&#xff0c;传参的逻辑。以及一些特殊的情况。 1. 示例 1.1 父组件 <template><div>我是父组件<hr /><child to-say"toSay" /></div> </template><script> import ch…

toFixed()*100保留的小数位数和预想的不一致

目录 一、问题 二、原因及解决方法 三、总结 一、问题 1.因为演示需要&#xff0c;要造一些假数据&#xff0c;一些数据要求保留2位小数。这需求真的不难&#xff0c;不就是parseFloat().toFixed()不就完了。 2.所以很快就写了如下代码&#xff1a; let aMath.random()*(1…

ChatGPT国内镜像网站大盘点(国内可用免费ChatGPT镜像站点)

目录 ChatGPT国内镜像网站 很多网友想要国内可用免费ChatGPT镜像站点&#xff0c;ChatGPT可以说是最近大火的AI工具&#xff0c;但是国内的小伙伴是无法使用ChatGPT的&#xff0c;要想在国内直接使用ChatGPT的话不仅需要通过技术手段让网络满足要求&#xff0c;还需要国外的手…

搭建ESP-12E外围电路

搭建ESP-12E外围电路 原理图&#xff1a; PCB&#xff1a; 参考的原理图: 扩展知识&#xff1a; USB转串口部分电路设计&#xff08;CH340N&#xff09;&#xff1a; CH340N引脚封装 参考文章 CH340C的ESP8266一键下载电路设计_ch340c esp8266_坚持努力&#xff0c;冲~的博客…

Binlog日志详解

binlog基本概念 binlog是一个二进制格式的文件&#xff0c;用于记录用户对数据库更新的SQL语句信息&#xff0c;例如&#xff1a;更改数据库表和更改内容的SQL语句都会记录到binlog里&#xff0c;但是不会记录SELECT和SHOW这类操作 binlog的特点 binlog在MySQL的Server层实现…

电路基础(第一章电路模型和电路定律)

第一章 电路模型和电路定律 简介&#xff1a; 电路基础第一篇知识笔记&#xff0c;在书上抄&#xff0c;在网上找&#xff0c;总之把基础的东西搞懂。近期要恶补一下基础了&#xff0c;谁想工作的时候天天被骂啊&#xff0c;弄啥啥不会。开卷。 学习教程参考教材《电路》——邱…