文章目录
一、ShardingSphere
1.1、官网地址说明
官网地址: https://shardingsphere.apache.org/index_zh.html
Sharding-proxy官网手册地址
1.2、为什么分库分表
- 单纯的主从模式,无法保证mysql的高可用
- 在单表大数据的情况下,会让mysql的检索性能大幅度下降
- 分库分表会减轻压力,提高检索速度
- 分库分表,读写分离
架构图:
二、官网整合说明
1.1、下载sharding-proxy
- 我用的版本是4.0.0
- 官网目前最新版本5.1.0
Sharding-Proxy下载地址
1.2、sharding-proxy集成注册中心
- 这个默认使用zk
- 这个就看文档搞就可用了
1.3、查看配置手册
1.3.1、官网数据分片说明
其他的也一样,看官网
官网配置说明:
schemaName: sharding_db
dataSources: #定义数据源
ds0: #数据源1
url: jdbc:postgresql://localhost:5432/ds0
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
ds1: #数据源2
url: jdbc:postgresql://localhost:5432/ds1
username: root
password:
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 65
shardingRule: #配置分片规则
tables:
t_order: #需要分片的表-订单表
# 真实数据节点。 ds${0..1}.t_order${0..1} 表示 分成2个库ds0,ds1,2张表t_order0,t_order1
actualDataNodes: ds${0..1}.t_order${0..1}
databaseStrategy:#数据库的分库策略
inline:
shardingColumn: user_id #按 user_id 这一列来分
algorithmExpression: ds${user_id % 2} #指定算法 user_id对2取余,余数0取ds0库,余数1取ds1库
tableStrategy: #分表策略
inline:
shardingColumn: order_id #用order_id 这个列来分
algorithmExpression: t_order${order_id % 2} # 指定算法
keyGenerator: #id自动生成
type: SNOWFLAKE # 雪花算法
column: order_id #雪花算法的id存在order_id
t_order_item: #需要分片的表-订单项表
actualDataNodes: ds${0..1}.t_order_item${0..1}
databaseStrategy:
inline:
shardingColumn: user_id
algorithmExpression: ds${user_id % 2}
tableStrategy:
inline:
shardingColumn: order_id
algorithmExpression: t_order_item${order_id % 2}
keyGenerator:
type: SNOWFLAKE
column: order_item_id
bindingTables:#指定关联表
- t_order,t_order_item
defaultTableStrategy: #默认分表规则
none:
1.3.2、配置文件说明
三、开始整合
1. 引入mysql的驱动
4.0版本需要引入
- 5.0版本不需要了,看配置文件的注解就行
如图:
2. 配置认证授权信息 server.yaml
server.yaml
#服务治理模块的配置
#orchestration:
# name: orchestration_ds
# overwrite: true
# registry:
# type: zookeeper
# serverLists: localhost:2181
# namespace: orchestration
#
#配置2个用户 用户1[账号密码都是:root] 用户2[账号密码都是:sharding]
authentication:
users:
root:
password: root
sharding:
password: sharding
#用户sharding的权限只能操作 sharding_db
authorizedSchemas: sharding_db
#配置属性 线程数、sql打印、最大连接...
props:
# max.connections.size.per.query: 1
acceptor.size: 16
executor.size: 16
# proxy.frontend.flush.threshold: 128 # The default value is 128.
# # LOCAL: Proxy will run with LOCAL transaction.
# # XA: Proxy will run with XA transaction.
# # BASE: Proxy will run with B.A.S.E transaction.
# proxy.transaction.type: LOCAL
# proxy.opentracing.enabled: false
# query.with.cipher.column: true
sql.show: false
3. 配置分库分表 config-sharding.yaml
config-sharding.yaml
######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################
#数据库名称-随便叫【前提环境MySQL主从同步的配置已经搞好了】
schemaName: sharding_db
#配置数据源
dataSources:
ds_0: #第一个主mysql,连接 demo_ds_0库
url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
ds_1: #第2个主mysql[因为没搞第二个主,就连同一个主了] 连接 demo_ds_1 库
url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#==============================================
#定义规则
shardingRule:
tables:
#订单表
t_order:
# ds_${0..1}和上面配置的数据源(ds_0,ds_1)对应。表划分成t_order_1、t_order_2 ,一个库里面2张表
actualDataNodes: ds_${0..1}.t_order_${0..1}
# 分表策略
tableStrategy:
inline:
# 用order_id来分表
shardingColumn: order_id
# 算法->求余
algorithmExpression: t_order_${order_id % 2}
# order_id生成的算法,用雪花算法
keyGenerator:
type: SNOWFLAKE
column: order_id
#-------------------------
#订单项表
t_order_item:
#分成2个库,2张表
actualDataNodes: ds_${0..1}.t_order_item_${0..1}
#指定分表策略
tableStrategy:
inline:
#用order_id来分
shardingColumn: order_id
#算法-->求余
algorithmExpression: t_order_item_${order_id % 2}
# order_item_id 自动生成用雪花算法
keyGenerator:
type: SNOWFLAKE
column: order_item_id
#-------------------------
#绑定表(表有关系)-好处:省得跨库找,不会产生笛卡儿积,速度快,效率高
bindingTables:
- t_order,t_order_item
#-------------------------
#数据库策略-分库策略====>流程:先用user_id进行了分库。然后在根据order_id来分表
defaultDatabaseStrategy:
inline:
# 用user_id 列来分
shardingColumn: user_id
# 算法 -->求余数
algorithmExpression: ds_${user_id % 2}
#默认的分表策略。共用部分
defaultTableStrategy:
none:
4. 配置读写分离 config-master_slave.yaml
config-master_slave.yaml
######################################################################################################
#
# If you want to connect to MySQL, you should manually copy MySQL driver to lib directory.
#
######################################################################################################
#这个名称在配置里面必须唯一,不能相同
schemaName: sharding_db_1
#配置数据源
dataSources:
#第一个库的主从--连接demo_ds_0库
#主节点数据源
master_0_ds:
url: jdbc:mysql://192.168.56.10:3307/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#从节点数据源
slave_0_ds:
url: jdbc:mysql://192.168.56.10:3317/demo_ds_0?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#---------------------------------
#第2个库的主从--连接demo_ds_1库
#主节点数据源
master_1_ds:
url: jdbc:mysql://192.168.56.10:3307/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#从节点数据源
slave_1_ds:
url: jdbc:mysql://192.168.56.10:3317/demo_ds_1?serverTimezone=UTC&useSSL=false
username: root
password: root
connectionTimeoutMilliseconds: 30000
idleTimeoutMilliseconds: 60000
maxLifetimeMilliseconds: 1800000
maxPoolSize: 50
#配置数据库的主从规则
shardingRule:
masterSlaveRules:
ms_ds0:
masterDataSourceName: master_0_ds
slaveDataSourceNames:
- slave_0_ds
loadBalanceAlgorithmType: ROUND_ROBIN
ms_ds1:
masterDataSourceName: master_1_ds
slaveDataSourceNames:
- slave_1_ds
loadBalanceAlgorithmType: ROUND_ROBIN
5、mysql的主从同步加入demo_ds_0,demo_ds_1库
mysql主从同步看
==> mysql集群主从复制1主多从 (一)
停止mysql容器
docker stop mysql-master01 mysql-slaver01
编辑主mysql文件
#切换到数据挂载目录
cd /mydata/mysql/master01/conf/
# 编辑
vi my.cnf
# 内容
#Sharding-proxy测试的库
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1
编辑从mysql文件
#切换到数据挂载目录
cd /mydata/mysql/master01/conf/
# 编辑
vi my.cnf
# 内容
#Sharding-proxy测试的库
binlog-do-db=demo_ds_0
binlog-do-db=demo_ds_1
启动mysql容器
#启动
docker start mysql-master01 mysql-slaver01
#查看
docker ps
如图:
6、主mysql创建出demo_ds_0,demo_ds_1库
如图:
7、启动Sharding-proxy
指定端口启动:
启动成功:
8、navicat连接Sharding-proxy操作数据库
- 端口上面指定的13777
- 账号的server.yaml里面配置的
- 账号root
- 密码root
这边不能使用navicat15来连接不然会报错
如图:
8.1、建表测试
运行sql-刷新
#订单
CREATE TABLE `t_order` (
`order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
#订单项
CREATE TABLE `t_order_item` (
`order_item_id` bigint(20) NOT NULL, `order_id` bigint(20) NOT NULL, `user_id` int(11) NOT NULL, `content` varchar(255) COLLATE utf8_bin DEFAULT NULL, `status` varchar(50) COLLATE utf8_bin DEFAULT NULL, PRIMARY KEY (`order_item_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
连接Sharding-proxy后台会屏蔽0.1这些分成的库
如图:
8.2、插入数据测试
流程 根据user_id取余,选择库,在根据,生成的order_id取余选择表
效果:
会发现数据自动分到了2个库里面的不同表
这个是根据我们指定的规则,取余数计算出来的
如图:
四、mysql集群的高可用
- 不推荐使用多主模式选举,例如MHA
- 使用主从复制+分库分表(多分库就可以。数据源多配置几个)
- 高可用也可以配置上
1个keeplived+2个Sharding-proxy
来保证高可用 - mysql本身就很稳定,除非你超负载了
- 多主模式带来的问题,个人感觉会更大,个人不推荐使用。他也是小日子开发的…