ShardingSphere(分库分表)
ShardingSphere
高性能架构模式
读写分离架构:
基本原理是将数据库读写操作分散到不同的节点上,主库负责处理事务性的增删改操作,从库负责处理查询操作。避免由数据更新导致的行锁,来提升性能。
一主一从:可以将查询请求均匀的分散到多个数据副本,提交性能。
多主多从:提升系统的吞吐量,还提升系统的可用性,当一台数据库宕机,备机启动,业务也正常执行。
CAP 理论:
在一个分布式系统中
,当涉及读写操作时,只能保证一致性(Consistence)、可用性(Availability)、分区容错性(Partition Tolerance)三者中的两个,另外一个必须被牺牲。
- AP:保证一致性,当N1 节点上的数据已经更新到 y,由 N1 和 N2 之间的通断中断,N2 节点上的数据还是 x,这时客户端访问N2节点,客户端提示发生了错误,这种处理方式,就违背了可用性。
- CP:保证可用性,当N1 节点上的数据已经更新到 y,由 N1 和 N2 之间的通断中断,N2 节点上的数据还是 x,这时客户端访问N2节点,会返回 x,虽然不是一个“正确”的结果,但是一个“合理”的结果,因为 x 是旧的数据,并不是一个错乱的值。
数据库分片
- 读写分离:读写分离分散了数据库读写操作的压力,但没有分散存储压力。
- 数据分片:将存放在单一数据库中的数据分散地存放至多个数据库或表中,数据分片的拆分方式又分为:垂直分片和水平分盘。
垂直分片
当我们单表行数,如果超过500万或者超过2GB,建议分库分表操作。
垂直分库:按照业务拆分的方式称为垂直分片,又称为(纵向拆分),一个数据库由多个数据表构成,每个表对应着不同的业务。而拆分之后,则是按照业务将表进行归类,分布到不同的数据库中。
例子:
-- 用户表、订单表...放在同一个数据库中。
select * from 用户表;
select * from 订单表;-- 用户表、放一个数据库中。 select * from 用户表;
-- 订单表、放一个数据库中。 select * from 订单表;
垂直拆分可以缓解数据量和访问量带来的问题,但不能解决存储压力。
垂直分表:
例子:
-- 一个用户表,拆分用户详情表,它们的关系是一对一的关系,就是垂直分表。
-- 当我们表很大的时候,需要垂直分表。
-- 水平分表适合表行数特别大的表,水平分表属于水平分片`
水平分片
水平分片又称为横向拆分,当单表超过500万条,需要考虑水平分片,分为水平分表和水平分库;不再将数据根据业务逻辑分类,而是根据某个字段,根据某种规则将数据分散至多个库或表中。
-
**水平分表:**单表切分为多表后,新的表在同一个数据库服务器中。
-
**水平分库:**如果单表拆分为多表后,单台服务器依然无法满足性能要求,需要将多个表分散在不同的数据库服务器中。
例子:
-- 水平分表。
select * from 用户表 where id = 1;
-- id % 2 = 1 存一个表, (同一个数据库)
-- id % 2 = 0 存另一个表,(同一个数据库)-- 水平分库。
select * from 用户表 where id = 1;
-- id % 2 = 1 存一个表, (不同一个数据库)
-- id % 2 = 0 存另一个表,(不同一个数据库)
常用解决方案:
-
Apache ShardingSphere(程序级别和中间件级别)
-
MyCat(数据库中间件) - 中间件封装指的是独立一套系统出来
ShardingSphere
官网:https://shardingsphere.apache.org/index_zh.html
文档:https://shardingsphere.apache.org/document/5.1.1/cn/overview/
- ShardingSphere-JDBC:代码封装,在JDBC层提供的框架,客户端直连接数据库,以jar包形式提供服务。
- ShardingSphere-Proxy:中间件封装,目前提供 MySQL 和 PostgreSQL版本。
前提要求
一. 数据库配置
需要准备3台Mysql数据库,完成一主多的配置;
配置文档:https://blog.csdn.net/yanshengren520/article/details/136771432
- 主服务器:容器名
mysql-master
,端口3306
- 从服务器:容器名
mysql-slave1
,端口3307
- 从服务器:容器名
mysql-slave2
,端口3308
二. 创建项目
创建个SpringBoot项目
<!-- 依赖包 -->
<dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId><version>5.1.1</version>
</dependency>
完成基本的SpringBoot项目配置(Mapper和实体的创建)
三. 配置读写分离
对应的文档配置说明:https://shardingsphere.apache.org/document/5.1.1/cn/user-manual/shardingsphere-jdbc/
配置文件:
#----------------------第一部分:模式配置 ---------------------
# 这里使用:内存模式
spring.shardingsphere.mode.type=Memory
# 以内存的模式进行配置,内存模式,该配置文件存的是(源数据信息)信息,
# 在集群模式下,该配置文件(源数据信息)会被持久化,在多个服务之间共享数据。内存模式就是将该配置文件加载到内存中。
# 打印SQl
spring.shardingsphere.props.sql-show=true#----------------------第二部分:数据源配置 ---------------------
# 配置真实数据源 (这里只是分别起名)
# master代表主库,slave1,slave2是从库(完成一主多从的配置)
spring.shardingsphere.datasource.names=master,slave1,slave2# 配置第 1 个数据源
# 这里的 master与上面的master第一个名字对应
spring.shardingsphere.datasource.master.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.master.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
spring.shardingsphere.datasource.master.username=root
spring.shardingsphere.datasource.master.password=123456# 配置第 2 个数据源
# 同上,需要注意:slave1与上面名字保持一致
spring.shardingsphere.datasource.slave1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave1.jdbc-url=jdbc:mysql://xxxIP地址:3307/db
spring.shardingsphere.datasource.slave1.username=root
spring.shardingsphere.datasource.slave1.password=123456# 配置第 3 个数据源
spring.shardingsphere.datasource.slave2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.slave2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave2.jdbc-url=jdbc:mysql://xxxIP地址:3308/db
spring.shardingsphere.datasource.slave2.username=root
spring.shardingsphere.datasource.slave2.password=123456#----------------------第三部分:规则配置 ---------------------
# 【规则配置】 - 读写分离的配置
# 读写分离类型,如: Static (上面的数据源配置是写死,不是动态获取的,写Static),Dynamic
# 读写分离的数据源名字 ,
# 例子:spring.shardingsphere.rules.readwrite-splitting.data-sources.<这里可起该数据源的名字>.type=Static
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.type=Static
# 写数据源名称有哪些:(master代表)
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.write-data-source-name=master
# 读数据源名称,多个从数据源用逗号分隔
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.props.read-data-source-names=slave1,slave2
# 负载均衡算法名称 (可以自己起名字,然后根据下面的算法配置,选择要使用的算法)
spring.shardingsphere.rules.readwrite-splitting.data-sources.myds.load-balancer-name=yan_random# 负载均衡算法配置:算法有:ROUND_ROBIN 轮询算法 、RANDOM 随机访问算法、WEIGHT 权重访问算法。
# 例子:spring.shardingsphere.rules.readwrite-splitting.load-balancers.<这里写上面起的算法名字>.type=ROUND_ROBIN
# 轮询算法配置
spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_robin.type=ROUND_ROBIN
# 随机访问算法配置
spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_random.type=RANDOM
# 权重访问算法配置
spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_weight.type=WEIGHT
spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_weight.props.slave1=1
spring.shardingsphere.rules.readwrite-splitting.load-balancers.yan_weight.props.slave2=2
四. 配置垂直分片
#----------------------第一部分:模式配置 ---------------------
# 这里使用:内存模式
spring.shardingsphere.mode.type=Memory
# 打印SQl
spring.shardingsphere.props.sql-show=true#----------------------第二部分:数据源配置 ---------------------
# 配置真实数据源 (这里只是分别起名) (代表不同的数据库)
spring.shardingsphere.datasource.names=server-order,server-user
# 配置第 1 个数据源
# 这里的 master与上面的master第一个名字对应
spring.shardingsphere.datasource.server-order.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
spring.shardingsphere.datasource.server-order.username=root
spring.shardingsphere.datasource.server-order.password=123456
# 配置第 2 个数据源
# 同上,需要注意:slave1与上面名字保持一致
spring.shardingsphere.datasource.server-user.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-user.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-user.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
spring.shardingsphere.datasource.server-user.username=yan
spring.shardingsphere.datasource.server-user.password=123456#----------------------第三部分:规则配置 ---------------------
#【规则配置】 - 垂直分片的配置
# 标准分片表配置
# 值由:数据源名 + 表名组成,以小数点分隔。 <table-name>:逻辑表名由:在实体类的@TableName注解,就是逻辑表
# 支持 inline 表达式。在水平分片里,有配置
# 例子:spring.shardingsphere.rules.sharding.tables.<逻辑表名>.actual-data-nodes=数据源.真实的表
spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order.t_order
spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=server-user.t_user# 垂直分片:相当于一个服务,多各数据源
五. 配置水平分片
水平分库的配置
#----------------------第一部分:模式配置 ---------------------
# 这里使用:内存模式
spring.shardingsphere.mode.type=Memory
# 打印SQl
spring.shardingsphere.props.sql-show=true
#----------------------第二部分:数据源配置 ---------------------
# 配置真实数据源 (这里只是分别起名)
# (代表不同的数据库)
spring.shardingsphere.datasource.names=server-user,server-order1,server-order2
# 配置第 1 个数据源
# 这里的 master与上面的master第一个名字对应
spring.shardingsphere.datasource.server-order1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order1.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
spring.shardingsphere.datasource.server-order1.username=root
spring.shardingsphere.datasource.server-order1.password=123456
# 配置第 2 个数据源
# 同上,需要注意:slave1与上面名字保持一致
spring.shardingsphere.datasource.server-order2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-order2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-order2.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
spring.shardingsphere.datasource.server-order2.username=yan
spring.shardingsphere.datasource.server-order2.password=123456
# 配置第 3 个数据源
spring.shardingsphere.datasource.server-user.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.server-user.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.server-user.jdbc-url=jdbc:mysql://xxxIP地址:3306/db
spring.shardingsphere.datasource.server-user.username=root
spring.shardingsphere.datasource.server-user.password=123456#----------------------第三部分:规则配置 ---------------------
# 【规则配置】 - 水平分片的配置
# 标准分片表配置
# 值由:数据源名 + 表名组成,以小数点分隔。 <table-name>:逻辑表名由:在实体类的@TableName注解,就是逻辑表
# 例子:spring.shardingsphere.rules.sharding.tables.<逻辑表名>.actual-data-nodes=数据源.真实的表
#spring.shardingsphere.rules.sharding.tables.t_user.actual-data-nodes=server-user.t_user# 准备:server-order1数据源中有2个表(t_order1 和 t_order2)和 server-order2数据源中有2个表(t_order1 和 t_order2)# 测试 - server-order1的数据源是否ok
#spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order1.t_order1# 测试 - server-order2的数据源是否ok
#spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order2.t_order1# 测试 - 全部配置
#spring.shardingsphere.rules.sharding.tables.t_order.actual-data-nodes=server-order1.t_order1,server-order1.t_order2,server-order2.t_order1,server-order2.t_order2
行表达式的inline 表达式配置
规则地址:https://shardingsphere.apache.org/document/5.1.1/cn/features/sharding/concept/inline-expression/
取模分片
# 测试 水平分库的配置
# 第一部分和第二部分,同上
#----------------------第三部分:规则配置 ---------------------
# 【规则配置】 - 水平分片的配置
# 测试 - 该配置支持 inline 表达式。注意:t_c_order是逻辑表
# 测试 - 解析数据节点是:server-order1和server-order2,他们分别有t_order1的表
spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order$->{1..2}.t_order1
# 测试 - 水平分库:
# 分片规则:表中`user_id`为偶数时,数据插入`server-order1数据源`,`user_id`为奇数时,数据插入`server-order2数据源`
# 分库策略 - 取模分片算法
# 分片列名称,以什么字段
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id# 分库策略:
# 分片列名称,以什么字段
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
# 分片算法名称 (可以自己起名字,然后根据下面的算法配置,选择要使用的算法)
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-algorithm-name=alg_mod
#
# 分片算法类型 (alg_inline_userid)名字与上面的(分片算法名称)保持一致
# 算法1: - 行表达式分片算法: INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.type=INLINE
# 分片算法属性配置 ,值:是表达式,规则是:数据源.某个字段进行(取模分片算法),因为server-order数据源从1开始,需要+1操作
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.props.algorithm-expression=server-order$->{user_id % 2 +1}
#
# 算法2: - 取模分片算法: MOD
# 分片算法类型
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.type=MOD
# 分片算法属性配置。这个配置,需要数据源从0开始
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_mod.props.sharding-count=2
哈希取模分片
# 测试 水平分库+分表的配置
# 第一部分和第二部分,同上
#----------------------第三部分:规则配置 ---------------------
# 【规则配置】 - 水平分片的配置
# 测试 - 该配置支持 inline 表达式。注意:t_c_order是逻辑表
spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order$->{1..2}.t_order$->{0..1}
# 测试 - 水平分库:分片规则:表中`user_id`为偶数时,数据插入`server-order1数据源`,
# `user_id`为奇数时,数据插入`server-order2数据源`
# - 水平分表:分片规则:表中`order_no`是字符串,进行哈希取模,
# 哈希值为偶数时,插入到t_order0中,
# 奇数插入到t_order1表中。
# --------- 分库策略:
# 分片列名称,以什么字段(进行分库).逻辑表.database-xxx
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
# 分片算法名称 (可以自己起名字,然后根据下面的算法配置,选择要使用的算法)
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-algorithm-name=alg_inline
#
# 分片算法类型 (alg_inline_userid)名字与上面的(分片算法名称)保持一致
# 算法1: - 行表达式分片算法: INLINE
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.type=INLINE
# 分片算法属性配置 ,值:是表达式,规则是:数据源.某个字段进行(取模分片算法),因为server-order数据源从1开始,需要+1操作
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_inline.props.algorithm-expression=server-order$->{user_id % 2 +1}
#
# --------- 分表策略:
# 分片列名称,以什么字段(进行分表).逻辑表.table-xxx
spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-column=order_no
## 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-algorithm-name=alg_hash_mod
#
## 算法:哈希取模分片算法: HASH_MOD
## 分表策略,以哈希取模分片算法(与上面的算法名称保持一致)
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.type=HASH_MOD
## 分片算法属性配置,有2个,配置2个分片数量
spring.shardingsphere.rules.sharding.sharding-algorithms.alg_hash_mod.props.sharding-count=2
分片算法
分片算法有很多,官网地址:https://shardingsphere.apache.org/document/5.1.1/cn/user-manual/shardingsphere-jdbc/builtin-algorithm/sharding/#%E8%A1%8C%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%88%86%E7%89%87%E7%AE%97%E6%B3%95
有:取模分片算法、哈希取模分片算法、基于分片容量的范围分片算法、基于分片边界的范围分片算法、自动时间段分片算法、标准分片算法、时间范围分片算法、复合分片算法、Hint 分片算法、自定义类分片算法
六 分布式主键
雪花算法:
方式1:基于MyBatisPlus的id策略,在实体注解,添加该注解
@TableId(type = IdType.ASSIGN_ID)
private Long id;
方式2:ShardingSphere-JDBC的全局序列配置
# 在配置文件中配置:
# --------- 分布式主键配置 ---- 需要在实体配置对应注解 @TableId(type = IdType.AUTO)
# 分布式序列列名称(逻辑表)中的主键是:
spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.column=id
# 分布式序列算法名称
spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.key-generator-name=alg_snowflake
# 分布式序列算法类型(alg_snowflake)的名字,于上面一致
spring.shardingsphere.rules.sharding.key-generators.alg_snowflake.type=SNOWFLAKE
七 多表关联
# 测试 水平分库+分表的配置
# 第一部分和第二部分,同上
#----------------------第三部分:规则配置 ---------------------
# 标准分片表配置(数据节点配置)
spring.shardingsphere.rules.sharding.tables.t_c_order.actual-data-nodes=server-order$->{1..2}.t_order$->{0..1}
spring.shardingsphere.rules.sharding.tables.t_order_item.actual-data-nodes=server-order$->{1..2}.t_order_item$->{0..1}
#
# --------- 分库策略:
# 分片列名称
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.tables.t_c_order.database-strategy.standard.sharding-algorithm-name=alg_mod
# 配置t_order_item的逻辑表的 分库策略,(与t_c_order一致)
spring.shardingsphere.rules.sharding.tables.t_order_item.database-strategy.standard.sharding-column=user_id
spring.shardingsphere.rules.sharding.tables.t_order_item.database-strategy.standard.sharding-algorithm-name=alg_mod
#
# --------- 分表策略:
# 分片列名称
spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-column=order_no
# 分片算法名称
spring.shardingsphere.rules.sharding.tables.t_c_order.table-strategy.standard.sharding-algorithm-name=alg_hash_mod
# 配置t_order_item的逻辑表的 分表策略,(与t_c_order一致)
spring.shardingsphere.rules.sharding.tables.t_order_item.table-strategy.standard.sharding-column=order_no
spring.shardingsphere.rules.sharding.tables.t_order_item.table-strategy.standard.sharding-algorithm-name=alg_hash_mod
#
# --------- 分布式主键配置:
# 分布式序列列名称
spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.column=id
# 分布式序列算法名称
spring.shardingsphere.rules.sharding.tables.t_c_order.key-generate-strategy.key-generator-name=alg_snowflake
# 配置t_order_item的逻辑表的 主键策略,(与t_c_order一致)
spring.shardingsphere.rules.sharding.tables.t_order_item.key-generate-strategy.column=id
spring.shardingsphere.rules.sharding.tables.t_order_item.key-generate-strategy.key-generator-name=alg_snowflake
八 绑定表
在原来水平分片配置的基础上添加如下配置:
#------------------------绑定表
spring.shardingsphere.rules.sharding.binding-tables[0]=t_order,t_order_item
如果不配置绑定表,查询是有多少数据库,每张表查询不同的表,配置绑定表,查询根据配置规则去查询,从而效率提升。
九 广播表
所有的分片数据源中都存在的表,表结构及其数据在每个数据库中均完全一致。
# 测试 水平分库+分表的配置
# 第一部分和第二部分,同上,字典表 - t_dict
#----------------------第三部分:规则配置 ---------------------
# --------- 配置广播表 (每个数据源,都要添加,去掉相同的数据源)
spring.shardingsphere.rules.sharding.tables.t_dict.actual-data-nodes=server-order$->{1..2}.t_dict
# 广播表配置
spring.shardingsphere.rules.sharding.broadcast-tables[0]=t_dict
# 这样保证,添加数据,每个库都有该表,同样的数据; 查询数据,随机负载均衡规则,只从一个节点获取数据
ShardingSphere-Proxy
获取方式:
-
二进制发布包
地址:https://shardingsphere.apache.org/document/5.1.1/cn/downloads/
-
Docker
-
Helm
使用二进制发布包安装
步骤1:下载解压包
该apache-shardingsphere-5.1.1-shardingsphere-proxy-bin.tar.gz
可以Linux系统运行,又可以在windows系统运行。
Linux:将文件上传至/opt目录,并解压
tar -zxvf apache-shardingsphere-5.1.1-shardingsphere-proxy-bin.tar.gz
windows:使用解压软件解压文件,就可以
步骤2:添加MySQL驱动
解压文件后,在bin的同目录下,创建ext-lib目录,放Mysql的驱动包
mysql-connector-java-8.0.22.jar
步骤3:修改配置文件
该配置文件:conf/server.yaml
# 放开这里,AUTHORITY是用户认证相关配置
# root@%:root 用户名和密码,%代表任何服务器都可以访问
# provider 下的 ALL_PRIVILEGES_PERMITTED 代表所有的访问权限
rules:- !AUTHORITYusers:- root@%:root
# - sharding@:shardingprovider:type: ALL_PRIVILEGES_PERMITTED
# ...
# 开启这个,sql-show: true 打印SQL语句
props:
# max-connections-size-per-query: 1
# ...sql-show: false
步骤4:进行启动
Linux 操作系统请运行 bin/start.sh
Windows 操作系统请运行 bin/start.bat
指定端口号和配置文件目录:bin/start.bat ${proxy_port} ${proxy_conf_directory}
# windows里启动方式,双击,关闭就关闭窗口就可以 --- start.bat
# Linux里启动方式,-- start.sh
# Linux里关闭服务 -- stop.sh
# --------------
# 在bin目录进行cmd运行windows启动,默认端口是3307
start.bat
启动成功
进行访问,就像登录mysql数据库一样
mysql -h127.0.0.1 -P3307 -uroot -p
# 输入密码
使用Docker安装
步骤1:启动容器
docker run -d \
-v /xxx/server/proxy-a/conf:/opt/shardingsphere-proxy/conf \
-v /xxx/server/proxy-a/ext-lib:/opt/shardingsphere-proxy/ext-lib \
-e ES_JAVA_OPTS="-Xmx256m -Xms256m -Xmn128m" \
-p 3321:3307 \
--name server-proxy-a \
apache/shardingsphere-proxy:5.1.1
# 宿主机映射,conf是配置文件目录,ext-lib是添加MySQL驱动的目录
# -e 是由于需要大量的内存,调试阶段,可以把内存设置小点
# server-proxy-a 是该容器的名字
# 3321 映射的端口号,对外连接的端口号
步骤2:配置MySQL驱动
将MySQl驱动包上传到/xxx/server/proxy-a/ext-lib
目录下。
步骤3:修改配置文件
该配置文件:conf/server.yaml
,该配置文件上传到/xxx/server/proxy-a/conf
目录下。
# 放开这里,AUTHORITY是用户认证相关配置
# root@%:root 用户名和密码,%代表任何服务器都可以访问
# provider 下的 ALL_PRIVILEGES_PERMITTED 代表所有的访问权限
rules:- !AUTHORITYusers:- root@%:root
# - sharding@:shardingprovider:type: ALL_PRIVILEGES_PERMITTED
# ...
# 开启这个,sql-show: true 打印SQL语句
props:
# max-connections-size-per-query: 1
# ...sql-show: false
步骤4:重启容器
docker restart server-proxy-a
步骤5:远程连接
mysql -h对应的IP地址 -P3321 -uroot -p
常见问题
容器可以成功的创建并启动,但是无法远程连接,排除防火墙和网络等问题后,可能是容器可分配内存不足导致。
# 进入容器
docker exec -it server-proxy-a env LANG=C.UTF-8 /bin/bash
# 查看日志,如果有`cannot allocate memory`代表容器内存不足
cd /opt/shardingsphere-proxy/logs
# 查看日志
tail stdout.log
配置读写分离
修改配置:config-readwrite-splitting.yaml
# 虚拟中间件的表
schemaName: readwrite_splitting_dbdataSources:write_ds:url: jdbc:mysql://xxxIP地址:3306/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: yanshengrenconnectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1read_ds_0:url: jdbc:mysql://xxxIP地址:3307/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1read_ds_1:url: jdbc:mysql://xxxIP地址:3308/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1rules:
- !READWRITE_SPLITTINGdataSources:readwrite_ds:type: Staticprops:write-data-source-name: write_dsread-data-source-names: read_ds_0,read_ds_1
实时查看日志
# 默认的日志文件,可以查看具体sql语句
tail -f /xxx/shardingsphere-proxy/logs/stdout.log
应用程序访问Proxy
跟其他服务访问mysql一样
# 对应的配置文件
# 应用名称
spring.application.name=sharding-proxy-xxx
# 开发环境设置
spring.profiles.active=dev#mysql数据库连接(proxy)
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
# 虚拟中间件的表,跟上面的配置一样 - readwrite_splitting_db
spring.datasource.url=jdbc:mysql://127.0.0.1:3307/readwrite_splitting_db?serverTimezone=GMT%2B8&useSSL=false
spring.datasource.username=root
spring.datasource.password=root#mybatis日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
垂直分片
修改配置config-sharding.yaml
schemaName: sharding_dbdataSources:ds_0:url: jdbc:mysql://xxxIP地址:3301/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_1:url: jdbc:mysql://xxxIP地址:3302/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1rules:
- !SHARDINGtables:t_user:actualDataNodes: ds_0.t_usert_order:actualDataNodes: ds_1.t_order
水平分片
修改配置config-sharding.yaml
schemaName: sharding_dbdataSources:ds_user:url: jdbc:mysql://xxxIP地址:3301/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_order0:url: jdbc:mysql://xxxIP地址:3310/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1ds_order1:url: jdbc:mysql://xxxIP地址:3311/db?serverTimezone=UTC&useSSL=falseusername: rootpassword: 123456connectionTimeoutMilliseconds: 30000idleTimeoutMilliseconds: 60000maxLifetimeMilliseconds: 1800000maxPoolSize: 50minPoolSize: 1# 具体配置,跟ShardingSphere一样
rules:
- !SHARDINGtables:t_user:actualDataNodes: ds_user.t_usert_order:actualDataNodes: ds_order${0..1}.t_order${0..1}databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: alg_modtableStrategy:standard:shardingColumn: order_noshardingAlgorithmName: alg_hash_modkeyGenerateStrategy:column: idkeyGeneratorName: snowflaket_order_item:actualDataNodes: ds_order${0..1}.t_order_item${0..1}databaseStrategy:standard:shardingColumn: user_idshardingAlgorithmName: alg_modtableStrategy:standard:shardingColumn: order_noshardingAlgorithmName: alg_hash_modkeyGenerateStrategy:column: idkeyGeneratorName: snowflakebindingTables:- t_order,t_order_itembroadcastTables:- t_dictshardingAlgorithms:alg_inline_userid:type: INLINEprops:algorithm-expression: server-order$->{user_id % 2}alg_mod:type: MODprops:sharding-count: 2alg_hash_mod:type: HASH_MODprops:sharding-count: 2keyGenerators:snowflake:type: SNOWFLAKE
相关文章:
ShardingSphere(分库分表)
ShardingSphere 高性能架构模式 读写分离架构: 基本原理是将数据库读写操作分散到不同的节点上,主库负责处理事务性的增删改操作,从库负责处理查询操作。避免由数据更新导致的行锁,来提升性能。 一主一从:可以将查…...
Visual Studio Code(VS Code)配置C/C++环境
一、Visual Studio Code安装 Visual Studio Code,下文中简称为VS Code的详细安装方法请参考VSCode安装教程(超详细)-CSDN博客 二、MinGW编译器下载与配置 1、MinGW介绍 MinGW(Minimalist GNU for Windows)是一款用于Windows 平台的轻…...
使用 OpenCV 在图像中添加文字
在图像处理任务中,我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数,可以很方便地在图像上绘制文本,支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字,介绍 cv2.putTe…...
高校网络安全_网络安全之道
需要对学校的网络进行安全防护,主要有这么几个痛点: 传统本地化产品难以及时更新情报库,应对新型攻击。 近年来,黑客和黑产团伙攻击手 段呈现多样化实战化,除传统僵木蠕外,各类新型、复杂甚至未知威胁高发…...
『大模型笔记』评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释
评估大型语言模型的指标:ELO评分,BLEU,困惑度和交叉熵介绍以及举例解释 文章目录 一. ELO Rating大模型的elo得分如何理解1. Elo评分的基本原理2. 示例说明3. 大模型中的Elo得分总结3个模型之间如何比较计算,给出示例进行解释1. 基本原理扩展到三方2. 示例计算第一场: A A…...
kafka的配置
server.properties server.properties模板 # broker id,多个broker服务器的话,每个broker id必须不同 broker.id1# kafka broker所在节点的 hostnamehostname10.1.1.1.3:9092# 处理网络请求的线程数 num.network.threads 8# 执行磁盘IO的线程数 num.io…...
Linux下Java通过JNI调用C++
以下为Demo流程 1.创建Java文件 public class HelloWord {// 声明本地方法public native void sayHello();static {// 加载本地库System.loadLibrary("hello");}public static void main(String[] args) {new HelloWord().sayHello();} } 2.编译生成.h头文件 在H…...
家政预约小程序数据库设计
目录 1 如何设计表结构1.1 用户表1.2 服务分类表1.3 服务表1.4 服务规格表1.5 订单表1.6 服务人员表1.7 评价表1.8 促销活动表1.9 投诉表1.10 年卡表1.11 派单表1.12 支付记录表1.13 通知记录表1.14 优惠券表1.15 用户优惠券表1.16 消息模板表1.17 积分记录表 经过一系列的设计…...
【Git学习】windows系统下git init后没有看到生成的.git文件夹
[问题] git init 命令后看不到.git文件夹 [原因] 文件夹设置隐藏 [解决办法] Win11 win10...
云手机群控能用来做什么?
随着云手机的发展,云手机群控技术逐渐从小众的游戏多开工具,发展为涵盖多个领域的智能操作平台。不论是手游搬砖、短视频运营,还是账号养成等场景,云手机群控都展现出了强大的应用潜力。本文将为大家详细解析云手机群控的应用场景…...
go下载依赖提示连接失败
1、现象 Go下载模块提示连接失败 dial tcp 142.251.42.241:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.…...
在线excel编辑(luckysheet)
项目地址:Luckysheet: 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 可以下载项目使用npm安装运行,也可以用cdn 加载excel文件(使用luckyexcel): …...
2024国赛A题第一问
第一问 板凳龙等距螺线匀速运动模型的建立 坐标系的建立 根据题意,舞龙队沿螺距为55cm的螺线顺时针进入,进入位置为螺线第16圈点A处,即整个螺线的最外侧点,设定其为 ( x 0 , y 0 ) (x_0,y_0) (x0,y0)。为了便于计算出题目要…...
【魅力golang】之-反射
1、引言 反射(Reflection)在 Golang中用于运行时检查和操作变量的类型和值。通过反射,可以实现动态类型处理,这在构建泛型代码、框架、序列化工具和动态代理等场景中非常有用。 2、什么是反射 反射是指程序在运行时能够动态地检…...
Java在 聊天管理系统中的应用
聊天管理系统已经成为人们日常沟通不可或缺的一部分。无论是企业内部的即时通讯,还是社交媒体平台的聊天功能,聊天管理系统都扮演着至关重要的角色。 Java 作为一种广泛应用的编程语言,凭借其强大的功能、良好的跨平台性以及丰富的类库&…...
记一次rac故障原因分析(虚拟化平台)
一 现象描述 XX客户于1月14号凌晨业务中断,检查数据库发现数据库集群宕机。 XX客户于2月14号春节初五早上业务异常,连接数据库无响应。 二 问题详细诊断 1月14号故障 1月14号凌晨2点,客户反馈业务中断,发现节点1无法连接&…...
opencv中的各种滤波器简介
在 OpenCV 中,滤波器是图像处理中的重要工具,用于对图像进行平滑、去噪、边缘检测等操作。以下是几种常见滤波器的简单介绍。 1. 均值滤波 (Mean Filter) 功能: 对图像进行平滑处理,减少噪声。 应用场景: 去除图像…...
文本数据处理
文本数据处理 一、数据转换与错误处理 (一)运维中的数据转换问题 在计算机审计及各类数据处理场景中,数据转换是关键步骤,涉及将被审计单位或其他来源的数据有效装载到目标数据库,并明确标示各表及字段含义与关系。…...
ThinkPHP 8开发环境安装
【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《ThinkPHP 8高效构建Web应用 夏磊 编程与应用开发丛书 清华大学出版社》【摘要 书评 试读】- 京东图书 1. 安装PHP8 Windows系统用户可以前往https://windows.php.net/downloads/releases/archives/下载PHP 8.0版本&am…...
php怎么去除数点后面的0
在PHP中,我们可以使用几种方法来去除数字小数点后的0。 方法一:使用intval函数 intval函数可以将一个数字转化为整数,另外,它也可以去除小数点后面的0。 “php $number 123.4500; $number intval($number); echo $number; // 输…...
Database.NET——一款轻量级多数据库客户端工具
文章目录 Database.NET简介下载使用使用场景总结 Database.NET简介 Database.NET 是一个功能强大且易于使用的数据库管理工具,适用于多种数据库系统。它为开发者和数据库管理员提供了一个统一的界面,可以方便地管理和操作不同类型的数据库。 支持的数据…...
Unittest02|TestSuite、TestRunner、HTMLTestRunner、处理excel表数据、邮件接收测试结果
目录 八、测试套件TestSuite和测试运行器TestRunner 1、基本概念 2、创建和使用测试套件 3、 自动发现测试用例、创建测试套件、运行测试 4、生成html的测试报告:HTMLTestRunner 1️⃣导入HTMLTestRunner模块 2️⃣运行测试用例并生成html文件 九、unittest…...
protobuf学习使用
1、概述 protobuf是Google开发的一种语言中立、平台无关、可扩展的序列化结构数据格式。允许定义一次数据结构,然后可以使用各种支持的语言来生成代码,以轻松地读写这些结构到一个二进制流中,如网络传输或文件,Protobuf支持多种编…...
跟我学c++中级篇——C++中的缓存利用
一、缓存 学习过计算机知识的一般都知道缓存这个概念,大约也知道缓存是什么。但是如果是程序员,如何更好的利用缓存,可能就有很多人不太清楚了。其实缓存的目的非常简单,就是了更高效的操作数据。大家都听说过“局部性原理”&…...
Goland 安装与使用
GoLand安装 官方网址: JetBrains GoLand:不只是 Go IDE 1. 进入官网,点击下载: 2. 如下图一步步安装 3. 如下图一步步安装...
cesium通过经纬度获取3dtiles 得feature信息
找到这里3dtiles的两种访问方式: 1.1 3DTileContent#getFeature 这里涉及3DTile 数据结构,暂不了解3DTile 数据结构,因此暂不使用。 1.2 scene.pick 本次使用 scene表示虚拟场景中所有 3D 图形对象和状态的容器;scene中…...
spring cloud gateway 3
**Spring Cloud Gateway 3** 是 Spring Cloud 生态系统中的一个重要组件,用于构建 API 网关,提供路由、监控、安全等关键功能。以下是关于 Spring Cloud Gateway 3 的详细介绍: ## 1. 什么是 Spring Cloud Gateway? **Spring Clou…...
青少年编程与数学 02-005 移动Web编程基础 03课题、流式布局
青少年编程与数学 02-005 移动Web编程基础 03课题、流式布局 一、流式布局二、网页示例HTML (index.html)CSS (styles.css) 三、精灵图精灵图的工作原理精灵图的优点精灵图的缺点精灵图的适用场景 四、轮播图HTML (index.html)CSS (styles.css)JavaScript (script.js) 课题摘要…...
【数据可视化复习方向】
1.数据可视化就是数据中信息的可视化 2.数据可视化主要从数据中寻找三个方面的信息:模式、关系和异常 3.大数据可视化分类:科学可视化、信息可视化、可视分析学 4.大数据可视化作用:记录信息、分析推理、信息传播与协同 5.可视化流程&…...
Spring Security 6 系列之九 - 集成JWT
之所以想写这一系列,是因为之前工作过程中使用Spring Security,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0,关键是其风…...
大数据实验三
Python and anaconda 实验三数据预处理和轨迹聚类参考地址: https://www.hifleet.com/wp/communities/data/hangyundashujujishukechengshiyanzhinanshujuyuchulijiguijijuleichixugengxinzhong#post-2212https://www.hifleet.com/wp/communities/data/hangyundas…...
《计算机网络(第7版)-谢希仁》期末考试复习题和答案(总结整理)
目录 前言: 一、选择题。 二、填空题。 三、名词解释。 四、简答题。 前言: 这个自动标题自己带了序号,一开始想全部选项和题号都改过来的,结果一看一百多个全是,懒得改了 一、选择题。 1、广域网覆盖的地理范围…...
学习笔记 --C#基础其他知识点(持续更新)
C#中的同步和异步《一》 以下理解借鉴博客:借鉴博客地址1 异步编程(Asynchronous) 允许任务在后台执行,而不会阻塞调用线程。C#使用async和await关键字 async Task AsynchronousMethod() {// 等待异步操作完成await Task.Delay…...
STM32 高级 谈一下IPV4/默认网关/子网掩码/DNS服务器/MAC
首先可以通过 winr->输入cmd->输入ipconfig 命令可以查看计算机的各种地址 IPV4:是互联网协议第 4 版(Internet Protocol version 4)所使用的地址。它是一个 32 位的二进制数字,通常被分为 4 个 8 位的部分ÿ…...
智能家居实训室中,STC单片机驱动的“互联网+”智能家居系统设计
一、引言 随着经济的快速发展,人们对家居环境的智能化、网络化需求日益增强,智能家居的研究也因此受到了国内外相关机构的广泛关注。STC单片机凭借其卓越的性能和广泛的应用领域,成为了智能家居系统设计的优选方案。作为一种先进的微控制器&…...
esp32学习:用虫洞ESP32S3-EYE开发板快速实现USB摄像头(UVC免驱)
直接上干货:实现一个USB摄像头,免驱UVC设备。 硬件准备: 乐官方推荐的Cam开发板就是乐鑫带摄像头OV2604的esp32-s3-eye,我们虫洞esp32-s3-eye完全兼容这个板子哦,虫洞ESP32-S3-EYE 人脸识别 esp-cam升级 OpenCV LVGL …...
Python 面向对象编程 五(结束)组合
Python 面向对象编程 五(结束)组合 组合 组合 组合是面向对象编程中另一个流行的概念,它与封装也有一定关系。简单地说,组成是指在一个对象中包含一个或多个对象,从而形成一个真实世界的对象。包含其他类对象的类称为…...
基于微信小程序的校园访客登记系统
基于微信小程序的校园访客登记系统 功能列表 用户端功能 注册与登录 :支持用户通过手机号短信验证码注册和登录。个人资料管理 :允许用户编辑和更新个人信息及其密码。站内信消息通知:通知公告。来访预约:提交来访预约支持车牌…...
docker 部署mysql8
在Docker中部署MySQL 8是一个相对简单的过程。以下是基本的步骤: 拉取MySQL 8镜像: 使用Docker命令拉取最新的MySQL 8镜像: docker pull registry.openanolis.cn/openanolis/mysql:8.0.30-8.6创建并运行MySQL容器: 创建并运行MySQ…...
聊一聊 C#前台线程 如何阻塞程序退出
一:背景 1. 讲故事 这篇文章起源于我的 C#内功修炼训练营里的一位朋友提的问题:后台线程的内部是如何运转的 ? ,犹记得C# Via CLR这本书中 Jeffery 就聊到了他曾经给别人解决一个程序无法退出的bug,最后发现是有一个 Backgrond…...
【编译原理】往年题汇总(山东大学软件学院用)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀编译原理_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. …...
【原创学习笔记】近期项目中使用的西门子V20变频器总结(上篇)
现场V20 22kW变频器如图所示 进线分别为L1,L2,L3,PE线,出现分别为U,V,W接电机 在西门子官网查询手册后,查询可知可以通过多种方式控制变频器,比如:面板(BOP)控制,端子(NPN/PNP&…...
IndexOf Apache Web For Liunx索引服务器部署及应用
Apache HTTP Server 是一款广泛使用的开源网页服务器软件,它支持多种协议,包括 HTTP、HTTPS、FTP 等 IndexOf 功能通常指的是在一个目录中自动生成一个索引页面的能力,这个页面会列出该目录下所有的文件和子目录。比如网上经常看到的下图展现的效果,那么接下来我们就讲一下…...
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击
Pytorch | 利用PI-FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集PI-FGSM介绍背景和动机算法原理算法流程 PI-FGSM代码实现PI-FGSM算法实现攻击效果 代码汇总pifgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器: Pytorch | 从零构建AlexN…...
Casino Royale靶场wp
0x00 下载安装 https://download.vulnhub.com/casinoroyale/CasinoRoyale.ova 导入vmware启动 0x01 主机信息收集 0x02目录扫描 index.php 获取到一个域名 修改本地hosts 添加一行 路径:C:\Windows\System32\drivers\etc 192.168.2.20 casino-royale.local 点击…...
c/c++ 无法跳转定义
背景 对于嵌入式开发离不开交叉编译工作,采用vccode远程到虚拟机开发来说,总会遇到一个函数跳转问题。下面针对运用开发如何设置vscode保证函数能正确跳转大函数定义。 一、安装c/c插件 安装C/C Extension Pack插件,这插件包含有几个插件。…...
4.5 数据表的外连接
本次课程我们将继续的学习数据表的连接。因为数据表的连接是分为内连接和外连接的。内连接的语法,还有一些练习,我们都是学习到了。那么本次课程咱们就开始学习数据表的外连接语法。首先我来解释一下为什么要使用外连接这种语法。咱们首先看一条记录&…...
请购单一直提示需求部门不能为空无法提交
终于发现了它的逻辑。用户很多次反馈,提交请购单时,提示需求部门不能为空,既使选择了需求部门,保存时,神奇的是会清空掉部门的信息,提交时就会有错误提示出来。 原因:光选择单头上的需求部门是…...
Jenkins基础教程
Jenkins介绍 Jenkins 是一款开源的持续集成(CI)和持续交付(CD)工具,在软件开发和自动化部署流程中发挥着关键作用。 1.背景和起源 它最初是由 Sun Microsystems 公司的一名工程师开发的 Hudson 项目,后来…...
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
目录 一、什么是 Java 环境变量? 二、配置 Java 环境变量 1. 下载并安装 JDK 2. 配置 JAVA_HOME Windows 系统 Linux / macOS 系统 3. 配置 PATH Windows 系统 Linux / macOS 系统 4. 验证配置 三、常见问题与解决方案 1. 无法识别 java 或 javac 命令 …...