范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

理论实战,详解ShardingSpherejdbc

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

美到极致的二十二个句子1我忧郁地望了望天,悲伤落下了一片一片。2。醉过才知酒浓,爱过才知情重。你不能做我的诗,正如我不能做你的梦。3如果我的结局不是你,夕阳余晖里,连背影都是对不起。4明明是我的风筝,却寂寞宁古塔已经多少年没有打开过QQ空间了,今天心血来潮翻出了我21岁生日那天写下的这篇文章。只记得那段时间我在看余秋雨的山居笔记对其中的被流放者的土地印象深刻,很长一段时间沉浸在文章中并因此心心念念的最好生活方式存钱,运动,读书,早起如果你感受到过度的焦虑与彷徨,可能是你看到他人完成了你期许的逆转。他人或是存钱的坚持和金额数字让你艳羡,或是他人运动带给了他人身体上外形的改变,或是他人一如既往地选择坚持阅读,或是人有三不说,说多损阴德说话谁都会,但要说得好就难了。有时候话说不好,反而会损阴德,带来极大的恶报,有些话我们说时一定要注意。恶语如刀不能说说话是一门艺术,有时候我们在不经意间,就会说出一些伤害别人的话,颜值控的女人为爱疯狂命归西头条创作挑战赛我要为我的朋友大哭一场,我心疼她,更思念九泉之下的她,她离开我离开这个世界已经快7年了。我想告诉颜值控她,你白死了,你辛辛苦苦买的房有人替你住了,你得了大病都舍不得花什么是自我内耗?如何改变自我内耗?接纳不完美的自己为什么总有人更快乐更积极?成长性思维和固定性思维的区别是什么?什么是自我内耗?如何改变自我内耗?如何获得高质量的快乐?什么是思维反刍?反省和思维反刍有什么区别?追求完美有错吗?比完坚持下去,全力以赴自律生活头条创作挑战赛我们这一代人什么事情都想要快从来没有把一件事坚持很久但成功需要时间我希望从今天开始,把跳绳这件事做下去。想要减脂,平常也没什么时间锻炼,跳绳对我来说算便捷的运动方式了为推动建设开放型世界经济贡献中国力量为推动建设开放型世界经济贡献中国力量国际社会期待习近平主席出席G20领导人第十七次峰会APEC第二十九次领导人非正式会议并访问泰国应印度尼西亚共和国总统佐科邀请,国家主席习近平将于南航物流双11期间承运国内外货物超28000吨中证网讯(记者王可)11月12日,记者从南方航空物流有限公司(简称南航物流)了解到,双11期间(11月1日11日),南航物流共计承运国内外货物超28000吨其中,国际货物来自天猫国吉林省的区划变动,9个地级市之一,四平市为何有5个区县?在之前的文章中,已经给大家介绍了很多东北城市的区划变迁调整,东北地区的历史悠久,每个城市的区划调整都非常有意思,今天给大家说一下吉林省四平市的区划变迁调整,看看四平市如何一步步形成顶级领导力的秘诀就在于两个字赋能优秀的员工难得,优秀的领导者更难得。我们在职场打拼的过程中,也常常关心自己有没有领导力,有没有可能晋升成为一个领导者。很显然,领导力的上限,决定了你在职场上的晋升天花板。然而,尽管
曝vivoX90标准版工程机采用1。5K分辨率屏幕,快充主摄升级IT之家9月21日消息,4月25日,vivo发布了vivoX80系列旗舰手机。此前消息显示,vivo下代旗舰vivoX90系列手机将于今年12月发布。今日,有博主曝光了vivoX9如何判断孩子是否吃饱了?在门诊经常能听到家长询问怎么判断孩子吃没吃饱呢?其实判断孩子是否吃饱有几个条件。首先,吃母乳的婴幼儿在吃饱以后,表情会有满足感,没有其他干扰也会自己停下不吃了。需要喂养辅食或者已经那些悲伤到不行的伤感歌曲(上)你听过几首呢?第十名这支烟灭了以后张静波这首歌是一首很早期,也很冷门的歌曲。讲述了青春爱情中无可奈何的离别。你说烟快灭了,烟快灭了,舍不得你走,你说再抱紧我吧,让我感觉到疼,你说走赵明剑德尔加多皆双响,昆山队51大胜广西,六连胜创队史纪录扬子晚报网9月20日讯(记者张晨瑆孙云岳张昊)北京时间9月20日,在2022赛季中甲联赛第22轮的一场比赛中,昆山队51大胜广西平果哈嘹队,取得六连胜,这也是球队队史最长连胜纪录。四川泸定地震失联17天的甘宇已找到记者刚刚获悉,四川泸定6。8级地震中失联17天的甘宇在猛虎岗找到了,被当地老乡救至家中。记者刚刚通过电话了解到,目前甘宇生命体征平稳,精神状态良好。当地正在集结救援力量将其转运至山早田希娜超越伊藤美诚,排名世界第五国乒梁俨苧杀入前509月20日,国际乒联公布了2022年第38周的世界排名,樊振东孙颖莎继续分列男单世界第一女单世界第一。日本队早田希娜来到了世界第5,超越了伊藤美诚。国乒梁俨苧排名继续创新高,来到了股市和李佳琦都回来了今晚最有意思的事是李佳琦复播了,没有大面积的造势宣传,也没有提前预告,就突然复播了。当然了,他复播这件事本身就很爆炸,所以宣传预告也是没必要的。他是6月3日直播中突然被停止节目,然笔记本最佳伴侣联合创新便携显示器到手价599元文黄保霖责编吕东兴总编唐迪笔记本屏幕太小不够用?不妨再加个便携屏幕吧,小编自用款推荐到手价599元,接上笔记本就能用,还方便携带,特别实用。有笔记本电脑办公学习的同学一定不要错过了Tiktok起步准备a)准备一台手机苹果手机建议iPhone6型号以上,手机容量在16GB以上,保障基础性能来运行TikTok的同时,也方便通过手机做一些简单剪辑。安卓手机建议安卓版本7。0及以上的手索尼将推出新款PS5,带可拆卸式磁盘带有可拆卸磁盘驱动器的PlayStation5将于明年9月左右由索尼公司推出。据insideGaming报道,这款游戏机的硬件将与目前的PS5机型几乎相同,唯一不同的是可移动驱动器小姐姐cosplay的兔女郎,还真像只小兔子今天看到网上有小姐姐装扮成兔女郎。就是论事啊,没有诱导大家往其他方面想,大家也别瞎想啊,免得等一下审核又说不行。请大家就当废话看看就算了,别多想。那么直接上图解说。图片来源网络小姐