一、ShardingSphere-Proxy的外围概念
-
ShardingSphere-Proxy概念
官网地址:https://shardingsphere.apache…
ShardingSphere-Proxy就是数据库的代理,如图:
-
ShardingSphere-Proxy次要代理哪些数据库
默认代理:Mysql、PostSql
-
实现代理的目标
- 次要是为了实现分库分表
-
实现读写拆散
这两个也是ShardingSphere-Proxy的两大外围性能。
-
分库分表
-
分库的概念和目标
-
概念
数据库中的表存储到不同的数据库中;如图:
-
-
- 目标
避免一个库中多个表呈现资源竞争【CPU、内存】,导致性能降落。
-
分表的概念和目标
-
概念
将数据库中一张表分成多张表,如图:
-
- 目标
分表是解决表中数据量过大,晋升用户查问和增加数据的性能。
比方:以mysql数据库为例,当用户增加数据会通过mysql的InnoDB引擎存储到数据中,InnoDB引擎要想保证数据的性能在肯定的范畴之内,表中的数据量最大的峰值为2000w,如果超过2000W那么增加数据的性能会降落,所以咱们要将超过2000W数据量的表拆分成多个表,这样能力保障用户的体验度。
- 缺点
1. 并发量过大,表会呈现资源竞争[CPU、内存]的问题,这样导致性能降落,用户的体验度变差。
解决方案:分库
-
分库分表
-
目标
解决表资源竞争和数据量过大的问题。
-
二、ShardingSphere-Proxy的利用场景
-
场景
单体我的项目和微服务项目都能用到分库分表。
三、ShardingSphere-Proxy散布分表落地
-
工具
ShardingSphere-Proxy
-
计划
-
过程内
如图:
-
- 缺点
1. 资源竞争问题。
2. 异样影响问题。
-
过程外 【举荐】
如图:
- 缺点
1. 保护量大的问题。
2. 性能绝对过程内弱一些。
- 能够放在内网中进行通信【docker】
-
实现
-
条件
- Mysql数据库 版本:5.7
-
ShardingSphere-Proxy
-
网盘下载地址
链接:https://pan.baidu.com/s/15yUIDQOdDDwUtVLNxNa9Cg 提取码:3hp3
-
-
Java的JDK
-
网盘下载地址
链接:https://pan.baidu.com/s/1A-ksNN0YicT3hXjFscGGwA 提取码:r9e0
-
-
下载Mysql的连贯驱动 文件放到根目录 lab文件夹下
网盘下载地址:
链接:https://pan.baidu.com/s/1924iUe7wxGpStAzxxv2K3g 提取码:jy7z
-
配置
-
分表
-
配置
-
config-sharding.yaml 分片的配置文件
# 3、创立客户端连贯库 hmms:虚构的数据库名称【最好和实在的数据库名称一样】 在server.yaml命名 schemaName: hmms # 1、连贯mysql dataSources: hmmsdatasources-0: #节点名称 自定义 url: jdbc:mysql://127.0.0.1:3306/实在数据库名称?serverTimezone=UTC&useSSL=false username: 数据库用户名 password: 数据库明码 connectionTimeoutMilliseconds: 30000 idleTimeoutMilliseconds: 60000 maxLifetimeMilliseconds: 1800000 maxPoolSize: 50 # 2、分片规定 shardingRule: tables: #表 user: #逻辑表名 要对哪个表进行分表 actualDataNodes: hmmsdatasources-0.user-${0..1} #分几张表 这个是两个表 #hmmsdatasources-0:节点名称 tableStrategy: #数据分表策越 inline: shardingColumn: useid #分表字段 algorithmExpression: user-${useid % 2} #对useid取模分表 #创立多个表 #表名: #逻辑表名 要对哪个表进行分表 #actualDataNodes: hmmsdatasources-0.表名-${0..1} #分几张表 这个是两个表 #hmmsdatasources-0:节点名称
-
server.yaml
authentication: users: root: #数据库用户名 password: 数据明码 sharding: password: sharding authorizedSchemas: hmms
-
-
-
-
3. ShardingSpere-Proxy
运行命令
```
#根目录bin文件下执行命令
start.bat
```
运行后果如图:

4. MySql 数据库
- 新建实在数据库名称
```sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for user
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`useid` int(11) NOT NULL,
`usenam` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '登录名',
`usepwd` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '登录明码',
`usestate` int(11) NULL DEFAULT 2 COMMENT '-1:删除1:登记 2:失常 3:挂失',
`usekey` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户秘钥',
`usetel` varchar(11) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '用户手机',
`createbyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '增加人',
`createbytime` datetime(0) NULL DEFAULT NULL COMMENT '增加工夫',
`modifybyid` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '批改人',
`modifybytime` datetime(0) NULL DEFAULT NULL COMMENT '批改工夫',
PRIMARY KEY (`useid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
```
如图:

- 新建 3307 虚构数据库连贯
如图:

- 删除表
删除3306中hmms库的user表,并在虚构的数据库中执行新建表的脚本,运行后果如下:
虚构数据库:

实在数据库

- 增加数据
虚构数据库中增加两条数据,运行后果如下:

实在数据库 表一,运行后果如下:

实在数据库 表二,运行后果如下:

2. 分库
- 配置
```yaml
# 3、创立客户端连贯库
schemaName: hmms
# 1、连贯mysql
dataSources:
hmmsdatasources-0: #实在数据库0
url: jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false
username: 用户名
password: 明码
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
hmmsdatasources-1: #实在数据库1
url: jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false
username: 用户名
password: 明码
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
# 2、分片规定
shardingRule:
tables: #表
user: #逻辑表名
actualDataNodes: hmmsdatasources-${0..1}.user #分表
tableStrategy: #数据分表策越
inline:
shardingColumn: useid #分表字段
algorithmExpression: user-${useid % 2} #对useid取模分表
defaultDatabaseStrategy: # 数据分库策略
inline:
shardingColumn: useid #分库字段
algorithmExpression: hmmsdatasources-${useid % 2} #对Id取模分库productdatasources-0
```
3. 分库分表
- 配置
```
# 3、创立客户端连贯库
schemaName: hmms
# 1、连贯mysql
dataSources:
hmmsdatasources-0: #实在数据库0
url: jdbc:mysql://127.0.0.1:3306/hmms-0?serverTimezone=UTC&useSSL=false
username: 用户名
password: 明码
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
hmmsdatasources-1: #实在数据库1
url: jdbc:mysql://127.0.0.1:3306/hmms-1?serverTimezone=UTC&useSSL=false
username: 用户名
password: 明码
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
# 2、分片规定
shardingRule:
tables: #表
user: #逻辑表名
actualDataNodes: hmmsdatasources-${0..1}.user-${0..1} #分表
tableStrategy: #数据分表策越
inline:
shardingColumn: useid #分表字段
algorithmExpression: user-${useid % 2} #对useid取模分表
defaultDatabaseStrategy: # 数据分库策略
inline:
shardingColumn: useid #分库字段
algorithmExpression: hmmsdatasources-${useid % 2} #对Id取模分库productdatasources-0
```
四、ShardingSphere-Proxy运行原理
-
整体架构
总共6个阶段:
1、Database Adaptors:数据库的抉择
2、SQL Parser:解析sql
3、SQL Router:sql路由 去哪一个实在数据库执行
4、SQL Rewriter:sql优化重写 外围 保障性能
5、SQL Executor Engine:执行sql语句 实在数据库获取后果
6、Result Merger:后果合并 从多个表获取后果
五、ShardingSphere_Proxy 分片原理
-
分片的概念
就是将数据分片到不同的表中。
-
分片键
分片键就是表中的字段。就是依据什么字段分片的。
-
分片算法
依据规定【分片算法】按分片键将数据分到不同的表中。
-
取模算法
-
缺点
只能时数字类型
-
-
hash+取模
-
如果分片键为字符类型,就用hash+取模的形式进行分片。
Math.abs(分片键.hashCode()%2)
-
-
发表回复