文章内容输出来源:拉勾教育Java高薪训练营
学习心得
课程介绍
第四阶段 大型分布式存储系统架构进阶
模块二 MySQL海量数据存储与优化(下)
本模块主要对MySQL海量数据处理中的分库分表架构、ShardingSphere、MyCat中间件实战应用、数据库实战规范、以及一些运维分析工具等内容进行讲解。
作业内容
采⽤Sharding-JDBC实现c_order表分库分表+读写分离
基于user_id对c_order表进⾏数据分⽚
- 分别对master1和master2搭建⼀主⼆从架构
- 基于master1和master2主从集群实现读写分离
- c_order建表SQL如下:
CREATE TABLE `c_order`(
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`is_del` bit(1) NOT NULL DEFAULT 0 COMMENT '是否被删
除',
`user_id` int(11) NOT NULL COMMENT '⽤户id',
`company_id` int(11) NOT NULL COMMENT '公司id',
`publish_user_id` int(11) NOT NULL COMMENT 'B端⽤户id',
`position_id` int(11) NOT NULL COMMENT '职位ID',
`resume_type` int(2) NOT NULL DEFAULT 0 COMMENT '简历类型:
0附件 1在线',
`status` varchar(256) NOT NULL COMMENT '投递状态 投递状态
WAIT-待处理 AUTO_FILTER-⾃动过滤 PREPARE_CONTACT-待沟通 REFUSE-拒绝
ARRANGE_INTERVIEW-通知⾯试',
`create_time` datetime NOT NULL COMMENT '创建时间',
`update_time` datetime NOT NULL COMMENT '处理时间',
PRIMARY KEY (`id`),
KEY `index_userId_positionId` (`user_id`, `position_id`),
KEY `idx_userId_operateTime` (`user_id`, `update_time`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
课程目录及观看建议
2倍速模式
- 课程:1小时
需要观看Sharding-JDBC的分库配置内容。 - 作业:2小时
主要花费在搭建虚拟机系统环境上,可以沿用上次作业环境或者克隆已经搭建好的虚拟机镜像,提高速度。
***
必看
**
建议看
*
可不看
任务一:分库分表实战
略
任务二:ShardingSphere实战
- ShardingSphere项目介绍(14:59)
*
- Sharding-JDBC之功能介绍(07:54)
*
- Sharding-JDBC之内部结构剖析(18:55)
- Sharding-JDBC之分片核心概念(20:40)
- Sharding-JDBC之分片算法和策略剖析(22:29)
- Sharding-JDBC之分片流程剖析(08:35)
- Sharding-JDBC之分片SQL使用规范(13:54)
- Sharding-JDBC之分片分页优化方案(07:55)
- Sharding-JDBC之Inline行表达式解析(14:38)
- Sharding-JDBC之主键生成原理(08:42)
- Sharding-JDBC实战之案例环境搭建(15:26)
***
- Sharding-JDBC实战之职位分库业务(17:23)
***
- Sharding-JDBC实战之职位分库测试(07:50)
***
- Sharding-JDBC实战之职位主键生成器(16:43)
***
- Sharding-JDBC实战之职位拆表+分库(17:01)
***
- Sharding-JDBC实战之城市广播表(07:50)
- Sharding-JDBC实战之订单分库分表(25:18)
***
- 读写分离和数据分片概念回顾(11:21)
- 读写分离应用架构方案(07:21)
- Sharding-JDBC之读写分离功能介绍(09:10)
- Sharding-JDBC实战之读写分离应用(16:33)
***
- Sharding-JDBC之Hint强制路由剖析(15:04)
- Sharding-JDBC实战之Hint强制路由应用(15:07)
- Sharding-JDBC之数据脱敏实现架构剖析(07:38)
- Sharding-JDBC之数据脱敏配置剖析(07:26)
- Sharding-JDBC之数据脱敏处理流程剖析(06:05)
- Sharding-JDBC之加密策略解析(12:37)
- Sharding-JDBC实战之用户密码加密(20:30)
- 分布式事务之CAP和BASE回顾(06:46)
- 分布式事务之2PC和3PC模式回顾(20:43)
- 分布式事务之XA模式剖析(10:38)
- 分布式事务之TCC模式剖析(11:57)
- 分布式事务之基于消息队列的TCC模式剖析(10:58)
- 分布式事务之基于Saga模式剖析(10:04)
- 分布式事务之基于Seata框架AT模式剖析(11:55)
- Sharding-JDBC整合XA原理(11:55)
- Sharding-JDBC整合Saga原理(10:10)
- Sharding-JDBC整合Seata原理(11:05)
- Sharding-JDBC分布式事务实战(20:59)
- Sharding-JDBC之SPI加载解析(10:39)
- Sharding-JDBC之编排治理解析(15:01)
- Sharding-Proxy之功能和使用介绍(05:49)
- Sharding-Proxy之职位表分库实战(16:56)
- Sharding-Proxy之SpringBoot+Proxy实战(10:49)
任务三:Mycat实战
略
任务四:运维工具
略
注意点:
需要准备多个虚拟机环境,如果磁盘空间不足,每个分片至少保证1主1从(已与导师确认)。
克隆虚拟镜像的场合,需要重新生成MySQL的UUID,否则会有冲突。
$ mv /var/lib/mysql/auto.cnf /var/lib/mysql/auto.cnf.bak
$ systemctl start mysqld.service
配置文件推荐采用properties格式,便于参考课程demo,快速完成作业。如需使用yml格式,需要去官网查阅具体内容(和properties内容不一致,但是官网内容可能有版本冲突)。
官网提示:行表达式标识符可以使用
${...}
或$->{...}
,但前者与Spring本身的属性文件占位符冲突,因此在Spring环境中使用行表达式标识符建议使用$->{...}
。{0..1}表示分库分表的编号开始和结束范围,选择值由
inline.algorithm-expression
的计算结果决定。比如:
- {0..1}的计算表达式为
inline.algorithm-expression=master$->{user_id % 2}
- {1..2}的计算表达式为
inline.algorithm-expression=master$->{user_id % 2 + 1}
- 官网内容不一定是最新的,有可能有版本冲突。所以尽量不参考官网配置,避免踩坑。
例如:
- maven依赖包
应该为sharding-jdbc-spring-boot-starter
,不是官网的shardingsphere-jdbc-core
,否则提示找不到。
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.0</version>
</dependency>
- 数据库的配置
目前apache sharding-jdbc 4.1.0配合springboot 2.3.0、hikari应该为jdbc-url
,不是官网的url
,
spring.shardingsphere.datasource.ds0.jdbc-url=xxx
- 需要的环境依赖
$ yum -y install wget
$ cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak
$ yum -y install wget
$ wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
$ wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
$ yum clean all
$ yum makecache
$ yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager -y
观后感
可以直接看课程资料中的pdf笔记。
作业说明
作业思路
- 使用宿主机(安装虚拟机的真实机器)创建具有读写功能的演示项目,并使用Sharding-JDBC进行分库的设置。
- 先在宿主机的MySQL环境中测试代码和配置,实现分库分表效果。
- 再使用虚拟机搭建两组主从架构的MySQL环境。
- 最后在宿主机中使用该工程访问虚拟机中MySQL环境,分库分表的基础上再实现读写分离。
实现步骤
创建SpringBoot项目
a. 引入Sharding-JDBC相关依赖。
b. 使用JPA实现读写数据库操作。
c. 在Test方法中调用dao层方法,进行数据的插入和查询。配置Sharding-JDBC属性文件
a. 先配置分库分表的效果,参考课程【17. Sharding-JDBC实战之订单分库分表】。
b. 再配置读写分离的效果,参考课程【21. Sharding-JDBC实战之读写分离应用】。搭建虚拟机环境
a. 主从架构搭建步骤见上次作业内容。
b. 可以使用上次作业的环境,或者搭建好一个虚拟机环境后使用克隆(记得重新生成MySQL的UUID),快速完成。
c. 因为机器磁盘空间不足,只搭建了两个从节点,分别为slave1
和slave3
(已与导师确认过)。
d. 最后使用四个虚拟机环境,分别是master1
、master2
、slave1
、slave3
(见架构图)。进行测试
a. 运行插入数据的测试方法,确认数据是否分别插入到master1
和master2
两个数据库中,是否再次进行了分表处理。
b. 运行查询数据的测试方法,确认是否是从slave1
和slave3
中取得数据,是否实现读写分离的效果。
作业参考
班主任要求直播后才能开放