专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

看完这一篇,ShardingSpherejdbc实战再也不怕

  谈到分库分表中间件时,我们自然而然的会想到ShardingSphereJDBC。
  这篇文章,我们聊聊ShardingSphereJDBC相关知识点,并实战演示一番。
  1ShardingSphere生态
  ApacheShardingSphere是一款分布式的数据库生态系统,它包含两大产品:ShardingSphereProxyShardingSphereJDBC
  一、ShardingSphereProxy
  ShardingSphereProxy被定位为透明化的数据库代理端,提供封装了数据库二进制协议的服务端版本,用于完成对异构语言的支持。
  代理层介于应用程序与数据库间,每次请求都需要做一次转发,请求会存在额外的时延。
  这种方式对于应用非常友好,应用基本零改动,和语言无关,可以通过连接共享减少连接数消耗。
  二、ShardingSphereJDBC
  ShardingSphereJDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身,我们经常简称之为:shardingjdbc。
  它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
  当我们在Proxy和JDBC两种模式选择时,可以参考下表对照:
  JDBC
  Proxy
  数据库
  任意
  MySQLPostgreSQL
  连接消耗数
  高
  低
  异构语言
  仅Java
  任意
  性能
  损耗低
  损耗略高
  无中心化
  是
  否
  静态入口
  无
  有
  越来越多的公司都在生产环境使用了shardingjdbc,最核心的原因就是:简单(原理简单,易于实现,方便运维)。2基本原理
  在后端开发中,JDBC编程是最基本的操作。不管ORM框架是Mybatis还是Hibernate,亦或是springjpa,他们的底层实现是JDBC的模型。
  shardingjdbc的本质上就是实现JDBC的核心接口。
  接口
  实现类
  DataSource
  ShardingDataSource
  Connection
  ShardingConnection
  Statement
  ShardingStatement
  PreparedStatement
  ShardingPreparedStatement
  ResultSet
  ShardingResultSet
  虽然我们理解了shardingjdbc的本质,但是真正实现起来还有非常多的细节,下图展示了Prxoy和JDBC两种模式的核心流程。
  1。SQL解析
  分为词法解析和语法解析。先通过词法解析器将SQL拆分为一个个不可再分的单词。再使用语法解析器对SQL进行理解,并最终提炼出解析上下文。
  解析上下文包括表、选择项、排序项、分组项、聚合函数、分页信息、查询条件以及可能需要修改的占位符的标记。
  2。执行器优化
  合并和优化分片条件,如OR等。
  3。SQL路由
  根据解析上下文匹配用户配置的分片策略,并生成路由路径。目前支持分片路由和广播路由。
  4。SQL改写
  将SQL改写为在真实数据库中可以正确执行的语句。SQL改写分为正确性改写和优化改写。
  5。SQL执行
  通过多线程执行器异步执行。
  6。结果归并
  将多个执行结果集归并以便于通过统一的JDBC接口输出。结果归并包括流式归并、内存归并和使用装饰者模式的追加归并这几种方式。
  本文的重点在于实战层面,shardingjdbc的实现原理细节我们会在后续的文章一一给大家呈现。3实战案例
  笔者曾经为武汉一家O2O公司订单服务做过分库分表架构设计,当企业用户创建一条采购订单,会生成如下记录:订单基础表tentorder:单条记录订单详情表tentorderdetail:单条记录订单明细表tentorderitem:N条记录
  订单数据采用了如下的分库分表策略:订单基础表按照entid(企业用户编号)分库,订单详情表保持一致;订单明细表按照entid(企业用户编号)分库,同时也要按照entid(企业编号)分表。
  首先创建4个库,分别是:ds0、ds1、ds2、ds3。
  这四个分库,每个分库都包含订单基础表,订单详情表,订单明细表。但是因为明细表需要分表,所以包含多张表。
  然后springboot项目中配置依赖:dependencygroupIdorg。apache。shardingspheregroupIdshardingjdbcspringbootstarterartifactIdversion4。1。1versiondependency
  配置文件中配置如下:
  配置数据源,上面配置数据源是:ds0、ds1、ds2、ds3;配置打印日志,也就是:sql。show,在测试环境建议打开,便于调试;配置哪些表需要分库分表,在shardingsphere。datasource。sharding。tables节点下面配置:
  上图中我们看到配置分片规则包含如下两点:
  1。真实节点
  对于我们的应用来讲,我们查询的逻辑表是:tentorderitem。
  它们在数据库中的真实形态是:tentorderitem0到tentorderitem7。
  真实数据节点是指数据分片的最小单元,由数据源名称和数据表组成。
  订单明细表的真实节点是:ds{0。。3}。tentorderitem{0。。7}。
  2。分库分表算法
  配置分库策略和分表策略,每种策略都需要配置分片字段(shardingcolumns)和分片算法。4基因法自定义复合分片算法
  分片算法和阿里开源的数据库中间件cobar路由算法非常类似的。
  假设现在需要将订单表平均拆分到4个分库shard0,shard1,shard2,shard3。
  首先将〔01023〕平均分为4个区段:〔0255〕,〔256511〕,〔512767〕,〔7681023〕,然后对字符串(或子串,由用户自定义)做hash,hash结果对1024取模,最终得出的结果slot落入哪个区段,便路由到哪个分库。
  看起来分片算法很简单,但我们需要按照订单ID查询订单信息时依然需要路由四个分片,效率不高,那么如何优化呢?
  答案是:基因法自定义复合分片算法。
  基因法是指在订单ID中携带企业用户编号信息,我们可以在创建订单orderid时使用雪花算法,然后将slot的值保存在10位工作机器ID里。
  通过订单orderid可以反查出slot,就可以定位该用户的订单数据存储在哪个分片里。IntegergetWorkerId(LongorderId){LongworkerId(orderId12)0x03ff;returnworkerId。intValue();}
  下图展示了订单ID使用雪花算法的生成过程,生成的编号会携带企业用户ID信息。
  解决了分布式ID问题,接下来的一个问题:shardingjdbc可否支持按照订单ID,企业用户ID两个字段来决定分片路由吗?
  答案是:自定义复合分片算法。我们只需要实现ComplexKeysShardingAlgorithm类即可。
  复合分片的算法流程非常简单:
  1。分片键中有主键值,则直接通过主键解析出路由分片;
  2。分片键中不存在主键值,则按照其他分片字段值解析出路由分片。5扩容方案
  既然做了分库分表,如何实现平滑扩容也是一个非常有趣的话题。
  在数据同步之前,需要梳理迁移范围。
  1。业务唯一主键;
  在进行数据同步前,需要先梳理所有表的唯一业务ID,只有确定了唯一业务ID才能实现数据的同步操作。
  需要注意的是:业务中是否有使用数据库自增ID做为业务ID使用的,如果有需要业务先进行改造。另外确保每个表是否都有唯一索引,一旦表中没有唯一索引,就会在数据同步过程中造成数据重复的风险,所以我们先将没有唯一索引的表根据业务场景增加唯一索引(有可能是联合唯一索引)。
  2。迁移哪些表,迁移后的分库分表规则;
  分表规则不同决定着rehash和数据校验的不同。需逐个表梳理是用户ID纬度分表还是非用户ID纬度分表、是否只分库不分表、是否不分库不分表等等。
  接下来,进入数据同步环节。
  整体方案见下图,数据同步基于binlog,独立的中间服务做同步,对业务代码无侵入。
  首先需要做历史数据全量同步:也就是将旧库迁移到新库。
  单独一个服务,使用游标的方式从旧库分片select语句,经过rehash后批量插入(batchinsert)到新库,需要配置jdbc连接串参数rewriteBatchedStatementstrue才能使批处理操作生效。
  因为历史数据也会存在不断的更新,如果先开启历史数据全量同步,则刚同步完成的数据有可能不是最新的。
  所以我们会先开启增量数据单向同步(从旧库到新库),此时只是开启积压kafka消息并不会真正消费;然后在开始历史数据全量同步,当历史全量数据同步完成后,在开启消费kafka消息进行增量数据同步(提高全量同步效率减少积压也是关键的一环),这样来保证迁移数据过程中的数据一致。
  增量数据同步考虑到灰度切流稳定性、容灾和可回滚能力,采用实时双向同步方案,切流过程中一旦新库出现稳定性问题或者新库出现数据一致问题,可快速回滚切回旧库,保证数据库的稳定和数据可靠。
  增量数据实时同步的大体思路:
  1。过滤循环消息
  需要过滤掉循环同步的binlog消息;
  2。数据合并
  同一条记录的多条操作只保留最后一条。为了提高性能,数据同步组件接到kafka消息后不会立刻进行数据流转,而是先存到本地阻塞队列,然后由本地定时任务每X秒将本地队列中的N条数据进行数据流转操作。此时N条数据有可能是对同一张表同一条记录的操作,所以此处只需要保留最后一条(类似于redisaof重写);
  3。update转insert
  数据合并时,如果数据中有insertupdate只保留最后一条update,会执行失败,所以此处需要将update转为insert语句;
  4。按新表合并
  将最终要提交的N条数据,按照新表进行拆分合并,这样可以直接按照新表纬度进行数据库批量操作,提高插入效率。
  扩容方案文字来自《256变4096:分库分表扩容如何实现平滑数据迁移》,笔者做了些许调整。6总结
  shardingjdbc的本质是实现JDBC的核心接口,架构相对简单。
  实战过程中,需要配置数据源信息,逻辑表对应的真实节点和分库分表策略(分片字段和分片算法)
  实现分布式主键直接路由到对应分片,则需要使用基因法自定义复合分片算法。
  平滑扩容的核心是全量同步和实时双向同步,工程上有不少细节。
  实战代码地址:
  https:github。commakemyownlifeshardingspherejdbcdemo
  参考资料:256变4096:分库分表扩容如何实现平滑数据迁移?黄东旭:分布式数据库历史、发展趋势与TiDB架构
  如果我的文章对你有所帮助,还请帮忙点赞、在看、转发一下,你的支持会激励我输出更高质量的文章,非常感谢!

你真的会选手机吗?临近年关,身边有几个朋友正准备给自己换个新手机,但是在两个型号上面拿不定主意让我帮忙出主意。大家购买新手机的时候最在意的是什么呢?会怎么选呢?品牌?手机像素?高刷新率?要我说最应该微信红包,暴露了你的情商这个春节,你抢红包了吗?每逢节假日,都是微信红包的活跃期。在简单的收发红包之间,一个人的情商也暴露了出来。不信,一起来看微信红包,是亲朋好友表达心意的一种载体。过年发红包,是为了调vivoS17摄像头缩小影像却大提升,5000mAh80W快充,2699起现在的年轻人们追求新鲜感,所以手机厂商们也不断的更新换代,为了迎合大众的口味,可以说手机厂商是使出了浑身解数,直面屏,3D微曲面屏,挖孔设计,刘海屏,三摄,四摄等层出不穷,但是一款在换装GDDR6X显存后,RTX3060Ti获得了一点点性能提升其实早在去年10月,NVIDIA就推出了搭载GDDR6X显存的RTX3060Ti显卡,新版RTX3060Ti使用GA104202GPU,而原版的RTX3060Ti的GPU编号是GA新意满满!北京市属媒体邀您线上定制春节电子贺卡律回春晖渐,万象始更新又是一年春节来临迎春纳福怎么能少得了新意满满的祝福近日,市属媒体纷纷推出各具特色的春节送祝福互动小程序快来定制专属于你的电子贺卡吧记得转发给亲朋好友兔个好彩头设计本如何选择?杭州来福士戴尔告诉你答案给大家推荐这款高性能品类笔记本电脑戴尔灵越16Plus看看它的性能到底怎么样?可以到杭州市上城区新业路228号杭州来福士购物中心五楼我之前剪视频做设计时经常遇到这种问题,忘机设置自机构2022年印度智能手机出货量下降6集微网消息,近日国外调研机构Canalys数据显示,2022年印度智能手机出货量较2021年下降6,在印度主要手机品牌中小米年度份额降幅最大,达到26。图片来源Canalys202部分Win1110打开开始菜单搜索和UWP应用时存在问题IT之家1月25日消息,微软透露了影响最新Windows版本的已知问题的详细信息。微软表示,运行Windows10和Windows11(版本介于20H2和22H2之间)的用户可能会全球最赚钱的十大公司世界上最赚钱的公司,你们肯定想不到是哪几家,反正他们基本都不在五百强潜力,这可能就是越富有的反而越低调吧。未来10年最好的投资是什么如果你有钱了,第一件事干什么钱,究竟有多重要第1七颗类地行星,三颗可能位于宜居带!这个恒星系与太阳系很像在2016年的时候,天文学家在距地球40光年的宝瓶座方位发现了一个很有意思的系外世界,可以说这是目前最像太阳系的一个世界,不过是缩小版的,它由一颗恒星和七颗行星组成,这七颗行星的大特斯拉车主特地刷鸿蒙?智能出行不断发展,魅族紧跟时代脚步回顾汽车的发展史,会发现一开始是动力优先,到后来的节能低碳都顺应着时代的发展。如今汽车行业再度迎来变革,除了硬件配置上的升级,车机系统带来的体验也不可忽视。最近就有一位特斯拉车主前
肝脏最爱3种食物,中老年每周吃2次,平肝火,补脾虚,助睡眠俗话说百病不离肝,肝主疏泄,调节脏腑气血津液,一旦肝出现问题,疏泄失常五脏六腑内外气机都会被遏制,人不生病才怪。中医讲究春养肝,夏养心,肝主绿,多吃绿色食物有助于养肝排毒。三月正是家庭托育走向规范,促进幼儿照料社会化为规范发展多种形式的托育服务,近日,国家卫生健康委人口家庭司发布家庭托育点管理办法(试行)(征求意见稿)(以下简称办法),对家庭托育点的定义与要求等进行了详细规定。家庭托育点,指的中山大学一研究论文被撤回基础数据和伦理批件与论文不匹配由于基础数据和伦理审查批件与论文中的数据不匹配,位于广东省广州市的华南肿瘤学国家重点实验室中山大学肿瘤防治中心项目组长(PI)病理科副主任肿瘤分子标志物和诊疗实验室主任谢丹和中山大中山大学历时八年研发眼科手机医生,宝宝不开口也能查眼病(人民日报健康客户端记者周学津赵萌萌)韩奕(化名)最近发现两岁的儿子眨眼比以往频繁,担心自己和丈夫600多度的近视会给孩子的眼健康埋雷。朋友推荐了一位手机医生,只要让0到4岁的小朋美国不孕夫妇通过试管生下一对双胞胎,20年后又有三胞胎找上了门2021年的1月,住在美国德州休斯顿的布鲁克女士突然接到了表弟的电话。(布鲁克女士)表弟在电话里说,有个自称托马斯的年轻人联系到了他,说他们是亲戚,但他根本不认识这个人,所以让布鲁为什么有些人很难入睡,如何调整自己的睡眠习惯?睡眠是人类生命中必不可少的一部分,对于我们的身体和心理健康都有着非常重要的作用。然而,有些人却很难入睡,这可能会导致许多问题,如精神疲惫情绪不稳定焦虑抑郁等。那么为什么有些人会很难有没有一种可能,你并不适合跑步?春水初生,春林渐盛,春风十里。又到了尽情进行户外活动的好季节了,好多小伙伴开始进行跑步运动了。有利健康管理身材赶走emo积极向美好的自己奔赴。(死宅女小胖子馨歌开始焦虑了,不跑步不李梦的事儿李梦与中国篮协与姚明文叶雨秋就事论事,这事跟篮协和姚明关系大吗?个人私生活跟工作要分开看,这毕竟跟会员们不一样?张不是离了婚了吗?李梦和离了婚的人谈恋爱很正常,干啥也正常,别人无权女性脸黄无光泽,8种饮食方法改善蜡黄脸色,拯救你的蜡黄脸想要改善蜡黄脸色,饮食对于皮肤的健康也是至关重要的。以下是几种饮食方法,帮助你从内部改善肤色有皮肤问题的年轻女性Youngwomanhavingskinproblems1。多吃富含蜂王浆养胃还是伤胃?胃不好的人能吃蜂王浆吗不得不说,关于蜂王浆的传说太多了,对于蜂王浆的功效也是五花八门,有人说它可以强身健体,有人说它可以滋阴润燥,有人说它可以驻颜长青,也有人说它可以起死回生,众说纷纭之中确实有夸大的成快速区分不同类型耳鸣,这几种治疗方法收藏好!耳鸣分为不同的类型,相关的脏腑不止有肾,还有心肝脾肺等,找到脏腑就是找到耳鸣的病根。而每种不同类型的耳鸣,都有与之相对应的解决方法。接下来我给大家一一介绍。肾阴虚型耳鸣症状耳鸣声音
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网