sharding-sphere
1 高性能架构模式
1)读写分离
- 主表写,从表读
- 可以解决海量用户访问的问题
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。
2)数据分片
- 读写分离分散了读写的压力,但是还是有存储的压力
- 可以将存储分散到多台数据库服务器上
垂直分片
- 按照业务拆分的方式,专库专用
- 单表的数据量依然超过单节点能承载的阈值
水平分片
- 根据某个字段,按某种规则分散到多个库表中
2 主从同步
原理
slave 会从 master 读取 binlog 来进行数据同步
复制的基本原则
- 每个 slave 只有一个 master
- 每个 slave 只有一个唯一的服务器 id
- 每个 master 可以有多个 slave
一主一从常见配置
mysql 版本一致
配置 mysqld 下配置文件
主机配置
# 服务器 id
server-id=1
# 启用二进制文件
log-bin=D:/mysql/data/mysqlbin
# 启用错误日志
log-err=D:/mysql/data/mysqlerr
# 根目录
basedir=D:/mysql/
# 临时目录
tmpdir=D:/mysql/tmp/
# 数据目录
datadir=D:/mysql/data/data
# 设置不要复制的数据库
binlog-ignore-db=mysql
# 设置需要复制的数据库
binlog-do-db=mysql
从机配置
# 服务器 id,需要与主机不同
server-id=2
# 启用二进制文件
log-bin=D:/mysql2/data/mysqlbin
重启mysql 服务 在主服务器上建立账户并授权 slave
grant replication slave on *.* TO 'username'@'从机ip' identified by 'password';
flush privileges;
查看主机状态
show master status;
FILE POSITION BINLOG_DO_DB BINLOG_IGNORE_DB
bin日志文件名 偏移量 需要复制的db 无需复制的db
记录 file 和 position
从机执行复制指令
# 设置相关配置
change master to master_host='主机 ip' ,
master_user='username' ,
master_password='password',
master_log_file='fileName',
master_log_pos='position';
启动 slave 复制
start slave;
查看从机状态
show slave status;
# slave_io_runnning,slave_sql_running 均为 yes
停止复制服务
stop slave
停止后,master 的 file 和 position 可能会变,再次启动时需要注意改变
sharding-sphere 测试
读写分离
# 主从,读写分离
#整合mybatis
mybatis.type-aliases-package=com.bruce.mapper
# 配置不同的数据源
spring.shardingsphere.datasource.names=ds1,ds2
#配置ds1数据源的基本信息
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/db_master?serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
#配置ds2数据源的基本信息
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/db_slave?serverTimezone=UTC
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root
#主库从库逻辑定义
spring.shardingsphere.masterslave.name=ms
spring.shardingsphere.masterslave.master-data-source-name=ds1
spring.shardingsphere.masterslave.slave-data-source-names=ds2
# 负载均衡策略
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
#打开sql输出日志
spring.shardingsphere.props.sql.show=true
注意:如果添加了事务注解,为了保证主从库间事务的一致性,避免跨服务的分布式事务,事务中的读写均用主库
垂直分片
# 实现垂直分库 db_master ,db_slave 两个库,一个存 user,一个存 customer
#整合mybatis
mybatis.type-aliases-package=com.bruce.mapper
# 配置不同的数据源
spring.shardingsphere.datasource.names=ds1,ds2
#配置ds1数据源的基本信息
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/db_master?serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
#配置ds2数据源的基本信息
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/db_slave?serverTimezone=UTC
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root
#配置orders表所在的数据节点
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds1.user
#配置customer表所在的数据节点
spring.shardingsphere.sharding.tables.customer.actual-data-nodes=ds2.customer
#customer表的主键生成策略
spring.shardingsphere.sharding.tables.customer.key-generator.column=id
spring.shardingsphere.sharding.tables.customer.key-generator.type=SNOWFLAKE
#指定分片的策略
spring.shardingsphere.sharding.tables.customer.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.customer.table-strategy.inline.algorithm-expression=customer
#打开sql输出日志
spring.shardingsphere.props.sql.show=true
水平分片
分表
# 实现水平分表 db_master 库,里面有 user_1,user_2 两张表
#整合mybatis
mybatis.type-aliases-package=com.bruce.mapper
#配置数据源的名称
spring.shardingsphere.datasource.names=ds1
#配置数据源的具体内容,
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/db_master?serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
#指定orders表的分布情况,配置表在哪个数据库中,表名称是什么
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds1.user_$->{1..2}
#指定orders表里主键id生成策略
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
#指定分片策略。根据id的奇偶性来判断插入到哪个表
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_${id%2+1}
#打开sql输出日志
spring.shardingsphere.props.sql.show=true
分库
# 实现水平分库 db_master ,db_slave 两个库,里面都有 user_1,user_2 两张表
#整合mybatis
mybatis.type-aliases-package=com.bruce.mapper
# 配置不同的数据源
spring.shardingsphere.datasource.names=ds1,ds2
#配置ds1数据源的基本信息
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/db_master?serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
#配置ds2数据源的基本信息
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/db_slave?serverTimezone=UTC
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root
#指定数据库的分布情况
spring.shardingsphere.sharding.tables.user.actual-data-nodes=ds$->{1..2}.user_$->{1..2}
#指定user表的主键生成策略
spring.shardingsphere.sharding.tables.user.key-generator.column=id
spring.shardingsphere.sharding.tables.user.key-generator.type=SNOWFLAKE
#指定表分片策略,根据id的奇偶性来添加到不同的表中
spring.shardingsphere.sharding.tables.user.table-strategy.inline.sharding-column=id
# 需要满足groovy语法
spring.shardingsphere.sharding.tables.user.table-strategy.inline.algorithm-expression=user_${(id.intdiv(2))%2+1}
#指定库分片策略,根据tenant_id的奇偶性来添加到不同的库中
spring.shardingsphere.sharding.tables.user.database-strategy.inline.sharding-column=tenant_id
spring.shardingsphere.sharding.tables.user.database-strategy.inline.algorithm-expression=ds$->{tenant_id%2+1}
#打开sql输出日志
spring.shardingsphere.props.sql.show=true
广播表
- 各个节点都有,插入更新操作会实时在各个节点执行,保持各个分片的数据一致性
- 查询操作,只从一个节点获取
- 可以和任何一个表做关联操作
# 公共表
#整合mybatis
mybatis.type-aliases-package=com.bruce.mapper
# 配置不同的数据源
spring.shardingsphere.datasource.names=ds1,ds2
#配置ds1数据源的基本信息
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://127.0.0.1:3306/db_master?serverTimezone=UTC
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root
#配置ds2数据源的基本信息
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/db_slave?serverTimezone=UTC
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root
#配置公共表
spring.shardingsphere.sharding.broadcast-tables=dict_order_type
spring.shardingsphere.sharding.tables.dict_order_type.key-generator.column=id
spring.shardingsphere.sharding.tables.dict_order_type.key-generator.type=SNOWFLAKE
#打开sql输出日志
spring.shardingsphere.props.sql.show=true