热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

shardingjdbc_ShardingJdbc之水平分库和读写分离(二)

欢迎关注头条号:老顾聊技术精品原创技术分享,知识的组装工前言前几天老顾与小伙伴们分享了sharding-jdbc的水平分表功能,今天我们继

欢迎关注头条号:老顾聊技术

精品原创技术分享,知识的组装工

前言

前几天老顾与小伙伴们分享了sharding-jdbc的水平分表功能,今天我们继续分享一些水平分库,以及读写分离的功能,以及如何解决读写延迟问题。小伙伴就继续往下看吧。

分库分表业务需求

分片规则

在做分库分表时,首先要定义好我们的分片规则,从业务逻辑上面要思路清晰。我们基于上一篇文章的案例,继续进行分库:

分库规则:根据用户user_id为偶数时将数据添加到course_db1中;为奇数时将数据添加到course_db2中。

分表规则:根据课程cid为偶数时将数据添加到course_1中;为奇数时将数据添加到course_2中

f5750968821242ebafe9cee06010e2c7

创建数据库

创建数据库以及表,和上一篇文章的一样。

82e32546132e415b8b51d2890a94ed33

配置分片

我们在基于上一篇的配置文件中,进行分库的需求改造

定义数据源
d2112879740046a78f29baad60c3b0e4

上图的配置就是配置了2个数据库源,并定义名称m1、m2。

分布节点
e976d691eaa643949d14fed1f506244c

上面重新定义了course逻辑表的真实的分布节点,根据表达式course分布在m1、m2数据库中,并且表名为course_1、course_2

分库规则
0aacf10605b445eda9eadea3ed916d31

上面在原来的基础上面,增加了分库的策略规则。分片配置就此结束。

改造测试代码
cf002e49b82340bdac44be5440551229

测试代码对userId进行了改造。

执行测试

我们可以看到执行日志,符合我们之前定义的分片策略

ef229dde23fa47918a3166c9dc5e1073
118827a2a89a486099c11a36b31e2860
771d01e2d5704631bb5b37b79dcdc37c

读写分离概念

一般熟知 Mysql 数据库的朋友知道,当表的数据量达到千万级时,SQL 查询会逐渐变的缓慢起来,往往会成为一个系统的瓶颈所在。为了提升程序的性能,除了在表字段建立索引(如主键索引、唯一索引、普通索引等)、优化程序代码以及 SQL 语句等常规手段外,利用数据库主从读写分离(Master/Slave)架构:

就是为了缓解数据库压力,将写入和读取操作分离为不同数据源,写库称为主库,读库称为从库,一主库可配置多从库。

f968683753fb443db4f644e8efd5b885

上图所表达的:读都落在从库,写落在主库

读写分离配置

mysql的主从配置,这里老顾就不讲了,小伙伴们可以去上网查看。我们这里就给出读写分离的配置

4c334602972047e9aea13c63e5ffb985

上面的spring.shardingsphere.masterslave是核心配置,配置还是相对简单的。

select查询代码测试,走的是slave库

[ main] ShardingSphere-SQL : Rule Type: master-slave[ main] ShardingSphere-SQL : SQL: SELECT cid,cname,userId,status FROM course ::: DataSources: slave

insert新增、update修改、delete删除,走的是master库

[ main] ShardingSphere-SQL : Rule Type: master-slave[ main] ShardingSphere-SQL : SQL: delete from course where cid=1 ::: DataSources: master

读写分离延迟问题

读写分离架构中经常出现,那就是读延迟的问题如何解决?

刚插入一条数据,然后马上就要去读取,这个时候有可能会读取不到?

归根到底是因为主节点写入完之后数据是要复制给从节点的,读不到的原因是复制的时间比较长,也就是说数据还没复制到从节点,你就已经去从节点读取了,肯定读不到。

mysql5.7 的主从复制是多线程了,意味着速度会变快,但是不一定能保证百分百马上读取到,这个问题我们可以有两种方式解决:

(1)业务层面妥协,是否操作完之后马上要进行读取

(2)对于操作完马上要读出来的,且业务上不能妥协的,我们可以对于这类的读取直接走主库,当然Sharding-JDBC也是考虑到这个问题的存在,所以给我们提供了一个功能,可以让用户在使用的时候指定要不要走主库进行读取。在读取前使用下面的方式进行设置就可以了:

public List getCourse() { // 强制路由主库 HintManager.getInstance().setMasterRouteOnly(); return this.list();}

核心的代码就是

HintManager.getInstance().setMasterRouteOnly();

总结

今天老顾介绍了分库策略,以及读写分离、和主从延迟的问题。希望能够帮助小伙伴;谢谢!!!

---End---



推荐阅读
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 标题: ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
author-avatar
王德筠宛吟玟华
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有