这几天,老东家要求对现有系统做优化,我所在的项目组主要负责免疫疫苗接种平台的研发工作,目前该平台已经应用到多个省市的疾病预防中心或者是医院中。由于这两年口罩的原因,公司的业务数据量在不断的增大,特别是用户个人档案以及疫苗的接种记录数据已经达到上亿级别。前期时候,我们通过加缓存,加索引,做读写分离等方式来提高系统的性能,但是到了现在,这些方式已经满足不了当前的需求了。经过上层的讨论决定,引入SharingJdbc,对部分数据表做分表处理。当听到这个消息时,真的是难以掩饰心中喜悦啊,终于让我等到了,真的一次难得的学习机会啊。
在学习新的技术之前,先要了解这个技术是什么,能够解决什么样的问题。Sharding-Jdbc是ShardingSphere的一个组成部分,而ShardingSphere是从Apache毕业的一款分布式的数据库生态系统, 可以将任意数据库转换为分布式数据库,并通过数据分片、弹性伸缩等能力对原有数据库进行增强。Sharding-Jdbc被官方定义为一个轻量级的Java框架,在原Jdbc做了额外的封装并提供服务,在使用时,只需要引入对应的jar包即可。目前支持MySQL,PostgreSQL,Oracle等多种数据库,支持Mybatis,JPA等多种ORM框架,支持c3p0,DBCP,Druid等多种数据库连接池。目前Sharding-Jdbc的功能有很多,包括数据分片,分布式事务,读写分离等,其中使用最多的就是数据分片。
从性能上讲,在MySQL单一节点部署的情况下,当数据量达到一定的级别时,性能会大大下降。我们都知道MySQL的索引采用B+Tree的数据结构进行实现的,当存储大数据量时,B+Tree的深度就会增加,树的深度增加,那就意味着磁盘IO的次数也在增加,有关索引的介绍在前面的文章中也有所介绍。从运维成本上讲,单机数据库的数据备份或迁移会随着数据量的增加而增加。而数据分片,就是通过某种规则,将数据分发到不同的数据库或数据表中,从而提高数据库性能的一种解决方式。通过分库和分表进行数据的拆分来使得各个表的数据量保持在阈值以下,以及对流量进行疏导应对高访问量,是应对高并发和海量数据系统的有效手段。数据分片按照拆分方式可以分为垂直分片和水平分片
垂直分片可以分为垂直分库和垂直分表,可以理解为专库专用,专表专用。这种垂直分表方式应该在项目开始前或者建表前就应该考虑,否则后期改动很大。以我司的部分业务为例,用户在接种疫苗前,可以在手机上进行预约,这时预约信息会存储在预约表中(app_user_appointment),当接种完成后会生成一条接种记录并存储在记录表中(app_user_vaccinate_record)。
水平分片可以分为水平分库和水平分表。水平分片在于多个库或多张表结构相同并且命名存在一定的规律,这样在存储数据时,可以根据一个或多个字段并结合一定的规则,将数据存储到不同的数据库或数据表中。通过自己的实践发现,水平分片在扩容方面,要比垂直分片来的容易。
在后面的例子中将会采用水平分片的方式,具体使用的相关技术有SpringBoot+MybatisPlus+Mysql5.7+ShardingJdbc+Druid。那么现在来模拟这样一个需求,用户在注册时会选择所在的省市,注册完成后会进行疫苗预约操作。后台在存储数据时,根据用户选择的省份编码来进行水平分库,用户预约疫苗时根据所在的市区编码进行水平分表。假设现在有两个省,分别为江苏省(310000),浙江省(320000)。其中江苏省下有两个市开通了预约功能,分别为南京市(310010)和苏州市(310020)。浙江省下有两个开通了预约功能,分别为杭州(320010)和宁波(320020)
根据上面的案例可以确定出需要针对于江苏省的数据库shardingjdbc_1和浙江省的数据库shardingjdbc_2,以及对应的数据表。
-- 模拟用户表(江苏) --
CREATE TABLE `app_user` (
`user_id` bigint(20) NOT NULL,
`prov_code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- yule263.com 版权所有 湘ICP备2023023988号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务