当前位置: 首页 > 后端技术 > Java

ShardingSphere-Proxy分库分表(一)

时间:2023-04-01 21:42:23 Java

一、ShardingSphere-Proxy核心概念ShardingSphere-Proxy概念官方地址:https://shardingsphere.apache...ShardingSphere-Proxy是代理的数据库,如图:ShardingSphere-Proxy主要代理哪些数据库默认代理:Mysql、PostSql代理的目的主要是完成分库分表,实现读写分离。这两个也是ShardingSphere-Proxy的两个核心功能。分库、分表、分库的概念及用途如图:-Purpose防止同一个数据库中多个表竞争资源[CPU,memory],导致性能下降。分表概念的概念和目的将数据库中的一个表分成多个表,如图:-目的分表是为了解决表中数据量过大,提高用户查询的性能并添加数据。例如:以mysql数据库为例,当用户添加数据时,会通过mysqlInnoDB引擎存储到数据中。InnoDB引擎为了保证数据在一定范围内的性能,表中数据的最大峰值为2000w。如果超过2000W的话,添加数据的性能会下降,所以我们需要将超过2000W数据的表拆分成多个表,这样才能保证用户体验。-缺陷1.并发量过大,表中会出现资源竞争[CPU,memory],导致性能下降,用户体验差。解决方案:分库分表的目的是为了解决表资源竞争和数据量过大的问题。2.ShardingSphere-Proxy的应用场景单体项目和微服务项目都可以使用分库分表。三、ShardingSphere-Proxy分发分表登陆工具ShardingSphere-Proxy解决流程如图:-缺陷1.资源竞争问题。2、异常影响问题。进程外[建议]如图:-缺陷1.大维护的问题。2.性能弱于进程内。-可放在内网进行通信[docker]实现条件Mysql数据库版本:5.7ShardingSphere-Proxy网盘下载链接:https://pan.baidu.com/s/15yUIDQOdDDwUtVLNxNa9Cg提取码:3hp3JavaJDK网盘下载地址链接:https://pan.baidu.com/s/1A-ksNN0YicT3hXjFscGGwA提取码:r9e0下载Mysql连接驱动文件,放在根目录lab文件夹下。网盘下载地址:链接:https://pan.baidu.com/s/1924iUe7wxGpStAzxxv2K3g提取码:jy7z配置表配置config-sharding.yaml分片配置文件#3.创建客户端连接库hmms:虚拟数据库名【最好是与真实数据库名称相同]在服务器.yamlnamedschemaName:hmms#1.连接mysqldataSources:hmmsdatasources-0:#Nodenamecustomurl:jdbc:mysql://127.0.0.1:3306/realdatabasename?serverTimezone=UTC&useSSL=falseusername:databaseusernamepassword:DatabasepasswordconnectionTimeoutMilliseconds:30000idleTimeoutMilliseconds:60000maxLifetimeMilliseconds:1800000maxPoolSize:50#2.分片规则shardingRule:tables:#Tableuser:#LogicaltablenamewhichtabletoshardactualDataNodes:hmmsdatasources-0.user-${0..1}#几张表,这是两张表#hmmsdatasources-0:节点名tableStrategy:#数据表策略inline:shardingColumn:useid#table字段algorithmExpression:user-${useid%2}#useid取模分表#创建多个表#表名:#分表的逻辑表名#actualDataNodes:hmmsdatasources-0.表名-${0..1}#Severaltables这是两个表#hmmsdatasources-0:节点名server.yamlauthentication:users:root:#数据库用户名password:数据密码sharding:password:shardingauthorizedSchemas:hmms3.ShardingSpere-Proxy运行命令```#在根目录下的bin文件中执行命令start.bat```运行结果如图:x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)4.MySql数据库-新的真实数据库名```sqlSETNAMESutf8mb4;------------------------------用户表结构--------------------------如果存在`user`则删除表;CREATETABLE`user`(`useid`int(11)NOTNULL,`usenam`varchar(50)CHARACTERSETutf8COLLATEutf8_general_ciNOTNULLCOMMENT'loginname',`usepwd`varchar(100)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAUNULLCOMMENT'登录密码',`usestate`int(11)NULLDEFAULT2COMMENT'-1:删除1:注销2:正常3:挂失',`usekey`varchar(100)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'Usersecretkey',`usetel`varchar(11)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'Userphone',`createbyid`varchar(50)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENTby'添加人时间',`create`datetime(0)NULLDEFAULTNULLCOMMENT'addtime',`modifybyid`varchar(50)CHARACTERSETutf8COLLATEutf8_general_ciNULLDEFAULTNULLCOMMENT'modifiedby',`modifybytime`datetime(0)NULLDEFAULTNULLCOMMENT'modified时间',PRIMARYKEY(`使用id`)USINGBTREE)ENGINE=InnoDBCHARACTERSET=utf8COLLATE=utf8_general_ciROW_FORMAT=Dynamic;设置FOREIGN_KEY_CHECKS=1;```如图:![此处插入图片描述](https://img-blog.csdnimg.cn/99ed8284c8814b4bb333d5e8ab7e7250.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQEDnpZ7lhpw=,size_20,color_FFFFFF,t_70,g_se,x_16#Virtualconnection307图片在此:【此处插入新数据库】说明】(https://img-blog.csdnimg.cn/c1008a094b154af79b0f986068da842b.png#pic_center)-删除表删除用户表3306中hmms库,执行虚拟数据库新建表脚本,运行结果如下:虚拟数据库:![此处插入图片描述](https://img-blog.csdnimg.cn/8721d0a8e37b4ddfb4a98edde3739e27.png#pic_center)真实数据库![此处插入图片描述](https://img-blog.csdnimg.cn/f56fd16ea02047948046d7a2685fb3f9.png#pic_center)-添加数据虚拟数据库添加两条数据,以及运行结果如下:![此处插入图片描述](https://img-blog.csdnimg.cn/f2973fa5d3f94d90a1f33427a7350ca7.png#pic_center)真实数据库表1,运行结果如下:结果如下:![Insertpicturedescriptionhere](https://img-blog.csdnimg.cn/e95432d9f2464909bdf7ae25fb8123ff.png#pic_center)2.Sub-library-configuration```yaml#3.创建客户端连接库schemaName:hmms#1.连接mysqldataSources:hmmsdatasources-0:#realdatabase0url:jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=falseusername:usernamepassword:passwordconnectionTimeoutMilliseconds:30000idleTimeoutMilliseconds:60000maxLifetimeMilliseconds:1800000maxPoolSize:50hmmsdatasources-1:#realdatabases1url:jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false用户名:用户名密码:密码connectionTimeoutMilliseconds:30000idleTimeout:60毫秒0maxLifetimeMilliseconds:1800000maxPoolSize:50#2.分表规则shardingRule:tables:#Tableuser:#LogicaltablenameactualDataNodes:hmmsdatasources-${0..1}.user#SplittabletableStrategy:#Datasplittablestrategyinline:shardingColumn:useid#ShardingfieldalgorithmExpression:user-${useid%2}#对useid取模分表defaultDatabaseStrategy:#Datashardingstrategyinline:shardingColumn:useid#ShardingfieldalgorithmExpression:hmmsdatasources-${useid%2}#TakeId的模型和划分数据库productdatasources-0```3。分库分表配置```#3.创建客户端连接数据库schemaName:hmms#1.连接mysqldataSources:hmmsdatasources-0:#Realdatabase0url:jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false用户名:用户名密码:密码connectionTimeoutMilliseconds:30000idleTimeoutMilliseconds:60000maxLifetimeMilliseconds:1800000maxPoolSize:50hmmsdatasources-1:#realdatabase1url:jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false用户名:用户名密码:密码connectionTimeoutMilliseconds:30000idleTimeoutMilliseconds:60000maxLifetimeMilliseconds:1800000:maxPoolSize#2.分片规则shardingRule:tables:#Tableuser:#LogicaltablenameactualDataNodes:hmmsdatasources-${0..1}.user-${0..1}#SplittabletableStrategy:#Datasplittablestrategyinline:shardingColumn:useid#ShardingfieldalgorithmExpression:user-${useid%2}#对useid和分表取模defaultDatabaseStrategy:#Datashardingstrategyinline:shardingColumn:useid#ShardingfieldalgorithmExpression:hmmsdatasources-${useid%2}#取模Id取模,划分数据库productdatasources-0```四、ShardingSphere-Proxy的工作原理整体架构一共有6个阶段:1.DatabaseAdaptors:数据库选择2.SQLParser:解析sql3,SQLRouter:sql路由到哪个真实数据库执行4.SQLRewriter:SQL优化重写核心保证性能5.SQLExecutorEngine:执行SQL语句,从真实数据库中获取结果6.ResultMerger:合并结果,从多个表中获取结果5.ShardingSphere_Proxy分片原理sharding的概念就是将数据分片到不同的表中。分片键是表。中的字段。是按照什么领域来分片的。分片算法将数据按照分片键按照规则【分片算法】分片到不同的表中。取模算法的缺陷只能是数字类型的hash+取模。如果shardingkey是字符类型,则采用hash+modulus的方式进行sharding。Math.abs(shardkey.hashCode()%2)