Mycat
一MyCat 简介
1.1 mycat历史
2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,经过Mycat发起人第一次改良,第一代改良版——Mycat诞生。 Mycat开源以后,一些Cobar的用户参与了Mycat的开发,最终Mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。
2014年Mycat首次在上海的《中华架构师》大会上对外宣讲,更多的人参与进来,随后越来越多的项目采用了Mycat。
2015年5月,由核心参与者们一起编写的第一本官方权威指南《Mycat权威指南》电子版发布,累计超过500本,成为开源项目中的首创。
2015年10月为止,Mycat项目总共有16个Committer。
截至2015年11月,超过300个项目采用Mycat,涵盖银行、电信、电子商务、物流、移动应用、O2O的众多领域和公司。
截至2015年12月,超过4000名用户加群或研究讨论或测试或使用Mycat。
Mycat是基于开源cobar演变而来,我们对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本cobar内核,结合Mycat集群管理、自动扩容、智能优化,成为高性能的中间件。我们致力于开发高性能数据库中间而努力。永不收费,永不闭源,持续推动开源社区的发展。
Mycat吸引和聚集了一大批业内大数据和云计算方面的资深工程师,Mycat的发展壮大基于开源社区志愿者的持续努力,感谢社区志愿者的努力让Mycat更加强大,同时我们也欢迎社区更多的志愿者,特别是公司能够参与进来,参与Mycat的开发,一起推动社区的发展,为社区提供更好的开源中间件。
Mycat还不够强大,Mycat还有很多不足,欢迎社区志愿者的持续优化改进。
1.2 MyCat的作用
遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。
基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。
支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster
基于Nio实现,有效管理线程,高并发问题。
支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数。
支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。
支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。
支持多租户方案。
支持分布式事务(弱xa)。
支持全局序列号,解决分布式下的主键生成问题。
分片规则丰富,插件化开发,易于扩展。
强大的web,命令行监控。
支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。
支持密码加密
支持服务降级
支持IP白名单
支持SQL黑名单、sql注入攻击拦截
支持分表(1.6)
集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。
二Mycat 术语与原理
2.1 垂直分片
2.2 水平分片
如上所示是我们所说的数据库分片。单表可以进行水平分片或者垂直分片。具体的一般来说字段比较多,经常查询的字段集中在某几个字段的大表。我们可能需要进行垂直分片,用来提高查询的性能。但是如果是数据量比较大的话,我们尽量采用水平分片,解决单表数据量过大造成的查询基数过大,或者并发访问比较大,造成数据库连接销售比较大的场景。
关于垂直分表,一般按照常用的字段分一张表,即可。至于水平分表,这个就可以自定义分表规则来进行分表了。按照具体的业务来进行具体的分表。水平分表有两种方式,一般是分库分表,和库内分表两种。
2.2.1 分库分表
如上图所示是分库分表的示意图,如图所示我们把一张很大的表拆分到不同的数据库中,相对于应用程序来说,应用程序能够看到的就是前面的逻辑库,然而真实的却是后面的三个物理库与表。分库分表又涉及到一个问题。是一台主机一个库,还是一台主机N个库的问题。这里就涉及到一个问题了,如果我们把一个库叫做一个节点的话,实际上一台物理机上是可以有多个节点的。也就是说我们既可以一台物理机N个节点,也可以一台物理机一个节点。
如上图所示的配置,在mycat中的配置展示如下所示,可以看到dataNode代表的就是数据库,然而dataHost表示的是数据库所在的主机,这也充分的说明了分库分表节点与主机的关系。
“ writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
select user()
“ password="123456">
“ password="123456" />
如图是mycat的工作流程,指定mycat的分片字段,再指定mycat的分片规则,按照指定的分片规则把对应的数据放到不同的节点中去。
如上分别是schema.xml配置文件中配置的表分片到两个节点上,调用了rule.xml中具体的分片规则进行分片。
2.2.2 数据库表
(1)非分片表
非分片表是指普通的业务表,在我们的整个业务系统中,实际上毕竟也不是每一个表的数据量都很大的。这就行成了我们普通的业务表,也就是我们的非分片表。非分片表可以指定放在一个主库中,作为我们读写数据的主库用。数据量不会随着系统使用年限的暴增而暴增的那种。
分片表
也就是我们所说的大表,也就是说单表数据量超过1000万的表,在系统开发阶段,如果逾期单表数据量会超过1000万的表,将来一定会成为系统的鸡肋,这种情况下要对这种容易形成大表的表做分表处理,避免单表数据量过大,影响系统的查询性能。
E-R表
普通E-R
级联E-R层级关系配置
对于单层的E-R关系表的分表,字表可以通过父表的主键来进行分表。
对于多层的E-R关系表的分表,可以在第三层,或者更深层次的子表中增加祖先表的id,作为冗余字段,这样的话分表的时候
就可以通过祖先表的id来作为分表的条件。这就是级联分表的方案。
多对多关系处理
有一类业务场景是”主表A + 关系表 + 主表B”,举例来说就是商户会员 + 订单 + 商户,对应这类业务,如果切分: 从会员的角度,如果需要查询会员购买的订单,那按照会员进行切分即可,但是如果查询商户当天售出的订单,那又需要按照商户做切分,可以是如果按照会员又要按照商户切分,几乎是无法实现,这类业务如何选择切分规则非常难。目前还暂时无法很好支持这种模式下的3个表之间的关联。目前总的原则是需要从业务角度来看,关系表更偏向哪个表,即”A的关系”还是”B的关系”,来决定关系表跟从那个方向来存储,未来MyCat版本中将考虑将中间表进行双向复制,以实现从A-关系表以及B-关系表的双向关联查询如下图所示:
存在父子表的数据插入的过程中,mycat会把与主表存在关联关系的子表数据路由到父表所在的节点。从而父子表关系的查询可以下推到各个节点去完成。这就是高效的跨节点join技术。
(4)全局表
每个节点同时并发插入数据,更新数据,每个节点都可以同时读取数据,提升读性能的同时,解决跨节点join的效率。
select user()
如上所示配置分别有全局表,分片级联表,多对多关系表的处理配置的实例。
(5)全局主键
由于采用了,分片的方式进行了数据的存储,所以无法保证主键的唯一性,要保证主键的唯一性,我们就要借助一张表来单独生成主键的序列。
在数据库中建立一张表,存放sequence名称(name),sequence当前值(current_value),步长(increment) int类型每次读取多少个sequence,假设为K)等信息
2.2.3 库内分表
如上图所示我们把一张表在同一个库中拆成N分这样子。
三 主从复制
如上图所示mycat可以帮助实现主从的架构, 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中。
假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端口,通过网络发给MYSQL-B。 MYSQL-B收到后,写入本地日志系统B,然后一条条的将数据库事件在数据库中完成。那么,MYSQL-A的变化,MYSQL-B也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication。
在上面的模型中,MYSQL-A就是主服务器,即master,MYSQL-B就是从服务器,即slave。
日志系统A,其实它是MYSQL的日志类型中的二进制日志,也就是专门用来保存修改数据库表的所有动作,即bin log。【注意MYSQL会在执行语句之后,释放锁之前,写入二进制日志,确保事务安全】
日志系统B,并不是二进制日志,由于它是从MYSQL-A的二进制日志复制过来的,并不是自己的数据库变化产生的,有点接力的感觉,称为中继日志,即relay log。 可以发现,通过上面的机制,可以保证MYSQL-A和MYSQL-B的数据库数据一致,但是时间上肯定有延迟,即MYSQL-B的数据是滞后的。【即便不考虑什么网络的因素,MYSQL-A的数据库操作是可以并发的执行的,但是MYSQL-B只能从relay log中读一条,执行下。因此MYSQL-A的写操作很频繁,MYSQL-B很可能跟不上。】
四 读写分离
如上图所示是mycat 支持读写分离的架构的示意图,如图所示我们通过binlog实现了主从复制以后,使得主库与从库有了相同的数据副本。我们可以配置mycat从一个数据库中写数据,并且从另一个数据库中对数据进行读取。
如上图所示我们应用程序直接对接,我们的数据库中间件mycat,后台的mycat采用了一主多从,读写分离的存储部署架构。可以提高数据库的读写性能与系统的并发。
事务内的SQL,默认走写节点,以注释/*balance*/开头,则会根据balance=“1”或“2”去获取
非事务内的SQL,开启读写分离默认根据balance=“1”或“2”去获取,以注释/*balance*/开头则会走写解决部分已经开启读写分离,但是需要强一致性数据实时获取的场景走写
负载均衡类型,目前的取值有3种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1" ,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式 (M1->S1 , M2->S2 ,并且 M1 与 M2 互为主备 ) ,正常情况下, M2,S1,S2 都参与 select 语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3" ,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行, writerHost 不负担读压力
五 数据连接池
如上图所示以前一个应用,或者多个应用连接同一个库,分享一个库的2000个最大连接,引入mycat的以后,我们可以设置每个应用最大连接2000个。mycat后台有一个数据库连接的连接池可以用。
Mycat 基于MySQL实例而非database的连接池复用机制,可以让每个应用最大程度共享一个MySQL实例的所有连接池,让数据库的并发访问能力大大提升。
六 分片规则
数据库分片的规则分两个大类,一种是连续的分片也就是我们说的范围分片,一种是离散的分片也就是我们说的取模分片。
6.1连续分片
扩容无需迁移数据,范围查询消耗资源少。
存在数据热点的可能性,并发访问能力受限于单一或少量的dataNode。
6.2离散分片
并发访问能力强,范围条件查询性能提升。
数据扩容比较困难,涉及数据迁移问题。
数据库连接消耗比较多。
6.3 二次分片
如上图所示,先进行范围分片,再进行离散分片,既解决了热点数据,资源受限的问题。又解决了,并发访问能力的问题,也比较进行数据扩容,避免了数据迁移。
6.4 常用mycat分片
6.4.1 自定义范围分片
自定义数字范围分片,提前规划好分片字段某个范围属于哪个分片
autopartition-long.txt
0
defaultNode 超过范围后的默认节点。
此配置非常简单,即预先制定可能的id范围到某个分片
0-500M=0
500M1-1000M=1
1000M1-1500M=2
或
0-10000000=0
10000001-20000000=1
注意: 所有的节点配置都是从0开始,及0代表节点1
6.4.2 按日期分片
从开始日期算起,按照天数来分片
例如,从2014-01-01,每10天一个分片
注意事项:需要提前将分片规划好,建好,否则有可能日期超出实际配置分片数
yyyy-MM-dd
2014-01-01
10
6.4.3 按自然月分片
每个自然月一个分片。需要提前将分片数规划好,建好,否则有可能日期超出实际配置分片数。
yyyy-MM-dd
2014-01-01
dateFormat : 日期字符串格式
sBeginDate : 开始日期
6.4.4 十进制求模分片
规则为对分片字段十进制取模运算,数据分布最均匀。
3
6.4.5 一致性hash分片
此规则优点在于扩容时迁移数据量比较少,前提分片节点比较多,虚拟节点分配多些。
虚拟节点少的缺点是会造成数据分布不够均匀。
一致性hash算法大致的意思是,创建一条2的32次幂的时间轴,跟正式的物理机一样创建N个正式的物理机节点,环上形成CN个虚拟节点,在换上实现一个虚拟的映射。在命中的时候,根据距离环最近的虚拟节点,落到真实的节点上即可。按照分片规则应该描述为寻找最近的虚拟分片,插入到真实的物理分片中。
此规则优点在于扩容时迁移数据量比较少,前提分片节点比较多,虚拟节点分配多些。虚拟节点少的缺点是会造成数据分布不够均匀,如果实际分片数量比较少,迁移量会比较多。
class="org.opencloudb.route.function.PartitionByMurmurHash">
0
2
160
6.4.6 范围求模分片
先进行范围分片计算出分片组,组内再求模优点可以避免扩容时的数据迁移,又可以一定程度上避免范围分片的热点问题分片组内使用求模可以保证组内数据比较均匀,分片组之间是范围分片可以兼顾范围查询。
最好事先规划好分片的数量,数据扩容时按分片组扩容,则原有分片组的数据不需要迁移。由于分片组内数据比较均匀,所以分片组内可以避免热点数据问题。
partition-range-mod.txt
21
partition-range-mod.txt
以下配置一个范围代表一个分片组,=号后面的数字代表该分片组所拥有的分片的数量。
0-200M=5 //代表有5个分片节点
200M1-400M=1
400M1-600M=4
600M1-800M=4
800M1-1000M=6
6.4.7 日期范围hash分片
日期范围hash分片:
思想与范围求模一致,当由于日期在取模会有数据集中问题,所以改成hash方法。
要求日期格式尽量精确些,不然达不到局部均匀的目的
sPartionDay代表多少天分一个分片
groupPartionSize代表分片组的大小
6.4.8 分片场景策略与总结
根据表数据量判断是否需要切分,确保切分后单分片表数据量为1000W左右
根据业务的情况选择合适的分片字段:最频繁的或者最重要的查询条件,需要考虑扩容数据迁移问题(范围类,范围取模类不需要迁移,哈希类需要迁移)
有关联关系的表配置相同分片规则(ER思想,为了应用join等复杂sql),一对多对应关系一般按多的那一方切分
如果配置类数据,更新频率比较少,考虑全局表
七 查询
7.1 跨分片查询
在跨分片进行查询的时候,mycat是基于内存进行分片的分页与排序的,所以呢如果数据量比较大的情况下,会比较消耗mycat的整体性能。
如上图是mycat对后台的查询分页的操作,如图所示mycat把查询下发到具体的mysql节点,这个过程sql的执行是并发的执行的,也就是mycat执行一次,下发到下面的n台mysql的物理机上对应的去查询。
7.2 跨分片排序
Mycat排序采用的是堆排序,具体堆排序怎么玩的,自行看算法的书籍。
7.3 跨分片连接
在每一个分片库里,参与join的,多个表数据符合join的分片规则。简单的说就是E-R表分片在不同的数据库中的时候。就是单独查询那个数据库的信息了。
八 高可用
如上图所示可以用keepalived,映射一个VIP的IP地址来实现高可用的架构。
九 mycat使用经验分享
不支持语法 select 跨分片的交叉查询,两个表中的分片字段不同 跨结点的联合查询 insert 插入的字段不包含分片字段 插入的分片找不到对应的分片 复制插入,insert into ... select ... update 更新列包含分片列 delete 删除语句不能起别名,delete user_info a where a.main_user_id=1
全表扫描 1、复杂的sql会分发到所有库上执行,并且在mycat中进行比较、合并,要尽量避免。 2、insert/replace 必须要包含分库字段 3、select/update/delete语句如果where没有包含分库字段,会进行全表扫描。 4、支持in(...)语法,mycat 内部将其视为多个条件值的OR。
聚合函数 1、如果目标表分库,mycat可以支持任何聚合函数,实际上DRDS 是直接把原sql 传递到后端mysql 执行 2、sql语句经过mycat路由后,直接发送到后端单个mysql 库上执行。如分库字段在where条件中都是= 关系,同样可以支持任何聚合函数。 3、全表扫描:目前支持聚合函数有:count,max,min,sum 另外在全表扫描时同样支持like,order by,limit ,不支持group by。
1、order by 1)order by 中出现的列名,保证在select 后出现, 如:select c1 from tb order by c2 写成:select c1,c2 from db order by c2 2)当语句中同时有order by 和 limit 分页时,mycat 执行order by 的内部逻辑是将所有的limit offset 之前的数据从mysql 加载到mycat 服务器内存中进行排序。所以不要对大量数据进行order by + limit 翻页。 3、对于非count,max,min,sum的聚合函数,在全表扫描的场景下执行不一定会返回错误,但是执行的结果很可能是错误的。 4、mycat 支持like 查询,会进行全表扫描
mycat 的HINT支持 mycat 对自身不支持的sql 语句提供了一种解决方案,即在要执行的sql 语句前添加额外的一段注解sql,这样sql 就能正确执行,这段sql 称为“注解sql”。其作用就是通过“注解sql”找到最终执行的sql数据节点,把要执行的sql发送到节点执行。 使用方式:/*!mycat:sql=注解sql*/要执行的sql
示例: 前提:表tb_user 分片字段为user_id。 操作:通过mysql 命令连接到 mycat(连接命令mysql -h192.168.192.133 -utest -ptest -P8066 -DTESTDB) 执行sql mysql>select * from tb_user; ERROR 1105 (HY000): backend connect: java.net.NoRouteToHostException: No route to host 可以看到错误信息为找不到目标host 使用注解,查询某一个结点的所有tb_user 数据,查询user_id=227 上分片的所有user_id,使用注解如下: mysql>/*!mycat:sql=select * from `bill_log` where member_id=10*/SELECT * FROM `bill_log`; 注解查询出来的数据在那个结点,就把sql 发送到那一个结点执行并返回。
事物支持 没有跨分片的事物强一致性支持,单库内部可以保证事务的完事性。如果跨库事物,在执行的时候任何分片出错所有分片都会加滚,但是只要应用发起commit,不能保证所有的分片都能commit。
你可能感兴趣的:(分库,分表)
【TIDB】了解,MySQL和TiDB的取舍,差异
{⌐■_■}
tidb mysql 数据库
一句话总结:MySQL好用,但扩展性差;TiDB像MySQL,但能轻松应对大数据、高并发。为什么用TiDB而不是MySQL?场景MySQLTiDB数据量很大(几百GB~TB)容易卡顿、查询慢水平扩展,性能稳定业务快速增长、分库分表难维护需要人工做分库分表自动水平扩展,无需分库分表高并发写入(比如秒杀、交易)主从延迟、写入瓶颈多副本写入,强一致性,吞吐更高高可用要求需要额外搭建主从/集群内建高可用(
分库分表之-ShardingJDBC技术详解
ShardingJDBC技术详解一、ShardingJDBC简介ShardingJDBC是一款轻量级的分布式数据库中间件,定位为在Java的JDBC层提供额外服务。它以客户端直连数据库的方式,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。适用于任何基于JDBC的ORM框架,如JPA、Hibernate、Mybatis、SpringJDB
OceanBase 的探索与实践
奔向理想的星辰大海
图解技术 oceanbase
一、背景vivo作为一家以设计驱动创造伟大产品,以智能终端和智慧服务为核心的科技公司,服务全球5亿+用户,用户持续增长,同时数据量也持续增长,在数据库运维过程中遇到如下问题:分库分表:随着业务数据量的不断增长,MySQL实例数据量超过了单机容量限制,业务分库分表的需求越来越多,分库分表的改造成本和风险比较高,需要能够兼容MySQL的分布式数据库解决分库分表的问题。成本压力:业务用户基数比较大,每年
一招搞定网页用户评论查询!SQL实战大全,从排序到分页轻松掌握
引言揭开评论系统的数据面纱当你在网页上看到一条条精彩评论时,是否好奇这些数据如何存储和管理?事实上,一个完整的评论系统背后是精心设计的数据库架构。用户评论通常被拆解存储在多个关联表中:comments表存储核心内容(评论ID、内容、时间)users表存储用户信息(用户ID、用户名、头像)posts表关联所属文章(文章ID、标题)comment_meta表存储附加数据(点赞数、举报状态等)这种分表设
Sharding-Sphere,Sharding-JDBC_介绍_Sharding-Sphere,Sharding-JDBC分布式_分库分表工作笔记001
添柴程序猿
技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152因为公司最近在做多租户的智慧城市相关的产品,这里,偶然看到这个框架,应该是可以用到,所以就看了一些,记录下来.先看一下我们要看的内容.去网站看看shardingsphere,是一套开源的分布式数据库中间件,解决方案包括3个产品点击了解更多去看一下
MongoDb 有必要分库么
旷野说
数据库 mongodb 数据库
在MongoDB中,数据分散在多个数据库(DB)中查询与集中在单个数据库中查询的性能差异主要取决于资源分配、并发操作和系统负载。以下是关键区别:资源隔离vs.资源共享多个数据库:优势:每个数据库拥有独立的文件、锁和内存缓存(WiredTiger缓存)。在高并发场景下,不同数据库的查询可减少资源竞争(如锁争用)。劣势:若物理资源(CPU、内存、磁盘I/O)有限,多个数据库可能分散缓
Oracle数据库表分区
我不许人间见白头
oracle 数据库
Oracle数据库表分区表分区按月分区分表按照天分区分表:按照指定的数据分区表分区数据采集的表结构,打算按月分表,按天分区。这样在查询的时候会大大的减少工作量。按月分区分表createtablefq_test(idnumber,namevarchar2(32),create_timedate)partitionbyrange(create_time)interval(numtoyMinterval
分库分表之数据库分片分类
软件编程在线接单(需要可私)
分库分表 数据库 sql mysql
大家好,我是工藤学编程一个正在努力学习的小博主,期待你的关注实战代码系列最新文章C++实现图书管理系统(QtC++GUI界面版)SpringBoot实战系列【SpringBoot实战系列】Sharding-Jdbc实现分库分表到分布式ID生成器Snowflake自定义wrokId实战环境搭建大集合环境搭建大集合(持续更新)分库分表分库分表之优缺点分析前情摘要:本文章目录(一)垂直分库分表优化方案一
分库分表之策略
软件编程在线接单(需要可私)
分库分表 数据库 后端 spring boot
大家好,我是工藤学编程一个正在努力学习的小博主,期待你的关注实战代码系列最新文章C++实现图书管理系统(QtC++GUI界面版)SpringBoot实战系列【SpringBoot实战系列】Sharding-Jdbc实现分库分表到分布式ID生成器Snowflake自定义wrokId实战环境搭建大集合环境搭建大集合(持续更新)分库分表分库分表之数据库分片分类前情摘要:1、数据库性能优化2、分库分表之优
Sharding-JDBC分库分表之SpringBoot分片策略
JingAi_jia917
Sharding-JDBC ShardingJDBC 分库分表 Spring分库分表 分库分表策略 自定义分片策略 Sharding JDBC
Sharding-JDBC系列1、Sharding-JDBC分库分表的基本使用2、Sharding-JDBC分库分表之SpringBoot分片策略3、Sharding-JDBC分库分表之SpringBoot主从配置前言前一篇以一个示例分享了Sharding-JDBC的基本使用。在进行分库分表时,可以设置分库分表的分片策略,在示例中,使用的是最简单的inline分片策略。本篇详细的给大家分享一下Sh
分库分表下的 ID 冲突问题与雪花算法讲解
软件编程在线接单(需要可私)
分库分表 面试 数据库 mysql 分布式
大家好,我是工藤学编程一个正在努力学习的小博主,期待你的关注实战代码系列最新文章C++实现图书管理系统(QtC++GUI界面版)SpringBoot实战系列【SpringBoot实战系列】Sharding-Jdbc实现分库分表到分布式ID生成器Snowflake自定义wrokId实战环境搭建大集合环境搭建大集合(持续更新)分库分表分库分表技术栈讲解-Sharding-JDBC前情摘要:1、数据库性
ShardingJdbc分库分表+连表查询(超简单)
宇宙超级勇猛无敌暴龙战神
spring boot
下载依赖这边建议所有的依赖版本都和我同步,因为我被版本冲突折磨了好久...org.springframework.bootspring-boot-starter-parent2.2.1.RELEASEorg.springframework.bootspring-boot-starter-weborg.springframework.bootspring-boot-starterorg.spring
代码随想录Day49 42. 接雨水,84.柱状图中最大的矩形。
get_zhang_
代码随想录训练营 单调栈 算法 数据结构 leetcode 笔记 单调栈
1.接雨水力扣题目链接(opensnewwindow)给定n个非负整数表示每个宽度为1的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。示例1:输入:height=[0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组[0,1,0,2,1,0,1,3,2,1,2,1]表示的高度图,在这种情况下,可以接6个单位的雨水(蓝色部分表示雨水)。示例2:输入:height=[4
MySQL分库分表完全实战指南
目录什么是分库分表️基本概念生活化理解为什么需要分库分表性能瓶颈场景1.数据量爆炸式增长2.查询性能急剧下降3.并发压力过大✅分库分表带来的收益分库分表的类型垂直拆分(按业务功能划分)垂直分库实例垂直分表实例↔️水平拆分(按数据量划分)水平分库实例水平分表实例分库分表策略详解分片键选择原则1.查询频率分析2.数据分布均匀性分片算法详解1.取模算法(适用于均匀分布数据)2.范围算法(适用于有明显范围
connect-multiparty中间件用法以及实例--文件上传中间件(保姆级别教学)
盛夏绽放
中间件
connect-multiparty中间件的用法包括安装和引入、基本设置、路由应用、文件处理以及安全和优化等步骤。connect-multiparty是一个专为Connect和Express框架设计的文件上传中间件,它基于multiparty库,用于处理多部分表单数据,尤其针对文件上传进行了优化。以下将详细探讨该中间件的具体用法:一.connect-multiparty中间件用法1.安装和引入(1
高性能数据库设计:Java开发者的实战指南
hy9523
数据库 java 开发语言
关键词:#数据库性能优化#索引优化#分库分表#分布式架构#Java开发实践一、引言在Java开发的日常工作中,数据库性能优化是必不可少的一部分。大部分应用系统的性能瓶颈往往出现在数据库层面。如何设计一个高效的数据库,对于提升系统响应速度、降低运营成本、提升用户体验有着至关重要的作用。本文将结合Java开发者的实际场景,从索引优化、事务锁机制、分库分表到分布式架构等多个方面,深入探讨如何在Java项
分库分表查询实现方案详解
ldwtxwh
深度JAVA学习 java
一、分库分表查询的挑战与解决方案1.1分库分表查询的核心挑战数据路由问题:如何确定数据在哪个库哪个表跨库查询问题:需要查询多个库/表时的数据合并分页排序问题:跨库分页和排序的复杂性事务一致性:跨库事务保证聚合计算:跨库的SUM、COUNT等聚合操作1.2分库分表查询方案对比方案实现方式优点缺点适用场景客户端分片应用层实现路由逻辑简单直接,无额外依赖业务耦合度高,维护成本高简单分片场景代理中间件My
MySql读写分离部署(一主一从,双主双从,Mycat)
PH = 7
mysql 数据库
参考资料:参考视频参考博客视频参考资料及安装包:https://pan.baidu.com/s/1xT_WokN_xlRv0h06b6F3yg提取码:aag3Mysql主从复制部署指南(一主一从)NotePad++编辑Linux服务器文档Mysql高版本(8.0及以后)Linux安装Mysql分库分表(基于Mycat)的基本部署MySQL垂直分库(基于MyCat)
数据库第一章复习:数据库的三级模式
精神病不行计算机不上班
数据库SQL Server 数据库 sqlserver
一、数据库三级模式结构概述数据库系统采用三层抽象结构,目的是分离数据的逻辑结构与物理存储,提高独立性和灵活性:1.外模式(ExternalSchema)定义:也称子模式或用户模式,是用户与数据库系统的接口,描述用户可见的数据视图。特点:面向具体用户(如应用程序、终端用户),反映用户对数据的需求。可以是概念模式的子集(如仅暴露部分表或字段),也可通过视图(View)等方式定制。不同用户可能有不同的外
透视 2024 新能源汽车市场:消费趋势驱动,企业如何突围
QYResearch市调
人工智能 大数据
据QYResearch调研预测,当下汽车市场里,新能源汽车领域活力满满、潜力巨大。2024年,全球新能源汽车销量达到1823.6万辆,较上一年增长24.4%。其中,中国新能源汽车销量飙升至1288.8万辆,同比增长35.7%,在全球销量中的占比从2023年的64.8%提升到70.7%,全年新能源汽车渗透率成功突破40%。这些亮眼数据充分表明,新能源汽车行业正处于快速发展的上升期。不过,行业前行的道
09_03_ShardingJDBC分布式数据库中间件解决方案
广+土
09微服务技术核心 java中间件
1.ShardingJDBC1.1分库分表方式回顾分库分表的目的就是将我们的单库的数据控制在合理范围内,从而提高数据库的性能.垂直拆分(按照结构分)垂直分表:将一张宽表(字段很多的表),按照字段的访问频次进行拆分,就是按照表单结构进行拆垂直分库:根据不同的业务,将表进行分类,拆分到不同的数据库.这些库可以部署在不同的服务器,分摊访问压力.水平拆分(按照数据行分)水平分库:将一张表的数据(按照数据行
6.分布式数据库与分库分表
nu11cat
数据库架构 分布式
目录一、分库分表核心概念•核心目标:突破单库性能瓶颈,应对海量数据与高并发•垂直拆分:按业务模块拆分(用户库、订单库、商品库)•水平拆分:单表数据分片(用户ID取模、时间范围分片)二、分片策略与避坑指南•分片键选择:高基数字段(用户ID)、业务关联性、数据均衡性•分片算法:哈希取模(均匀分布)、一致性哈希(扩容友好)、范围分片(冷热分离)•避坑要点:禁止无分片键查询、避免后期改分片键、分片数预留扩
数据库优化实战分享
繢鴻
数据库
数据库优化实战指南一、索引优化策略B+树索引适用场景范围查询(如$WHERE\create_time>'2023-01-01'$)排序操作($ORDER\BY\user_id$)高频等值查询($WHERE\order_no='ABC123'$)索引选择原则通过选择性公式判断索引价值:$$选择性=\frac{不同值数量}{总记录数}$$当选择性>0.3时建议创建索引二、架构设计优化读写分离架构分库分
java面试总结-20250610
川夜施密特
java 面试 开发语言
rediszset查询和插入的时间复杂度?限流的手段有哪些?什么情况会考虑分库分表,如何设计?如何预防和避免死锁发生?cpu的资源达到100%,如何排查?kafka架构设计原理?算法题数组的最大子数组和redis数据类型低层实现和应用场景?rpc框架组成部分?算法题数组旋转java8hashmap底层结构?链表和红黑树的时间复杂度?负载因子的作用?多线程为什么不直接使用runnable中的run而
Android快速开发整理(库、插件、常用网站)
2401_85239863
android
二、第三方库================================================================部分库是jitpack的发布方式,需要在project下的build.gradle中加上(可直接加上,一劳永逸)allprojects{repositories{maven{url“https://jitpack.io”}}}工具Gsonimplementat
数据库面试必备:如何主导分库分表项目实施流程详解
二进制11
# MySQL面试题 数据库 面试 后端 MySQL
MySQL面试题-如果组长要求你主导项目中的分库分表,大致的实施流程是?回答重点1、先分析业务需求:确定数据量及增长趋势,评估分库分表的必要性。(需要一定的预判但是不要过度设计)2、设计分库分表方案:选择适合的分库和分表策略(水平、垂直、哈希、范围等),并规划分库分表的结构。3、实现数据路由:根据分库分表策略设计数据路由机制,一般通过应用层代码或数据库中间件来实现,将请求路由到相应的数据库或表。4
Mysql数据库SaaS多租户实现方案
dragonpeng2008
SaaS多租户专栏 saas mysql
一、前言在上一篇文章中描述了数据库的多租户实现方案主要有3种:1、独立数据库模式2、共享数据库独立schema模式3、共享schema模式那么我们选择哪一种呢?从业界来讲,使用第三种共享schema方式的比较多,这种实现方式我们以前也用过,一般来讲如果数据量不是很大,你的用户也不介意自己的数据跟其他用户的数据都存在一个表里,可以采用这种方式,但是如果数据量很大,后期就涉及到分库分表的问题,反而不如
Postgresql创建只读用户,并开放部分表的权限
慢就是【快】
数据库 postgresql 权限控制
我们团队研发的巡检平台,协助用户进行常规作业两年之久,平台存储了大约300TB的非结构化数据。目前,因甲方总部的要求,需要非结构化数据存储平台从我们平台中抽取所有的非结构化数据,便于他们对非结构化数据进行智能化处理。我们采用的是postgresql数据库,为此我们需要为非结构化平台厂家创建具备只读权限的用户,并向其开放部分非结构化的表,便于他们进行数据抽取工作。在postgresql数据库中,创建
mysql sql语句优化面试_mysql 优化 面试 问答 流程
蛋蛋兽的一生
mysql sql语句优化面试
mysql优化1、MYSQL优化主要分为以下四大方面:设计:存储引擎,字段类型,范式与逆范式功能:索引,缓存,分区分表。架构:主从复制,读写分离,负载均衡。合理SQL:测试,经验。优先考虑的是表结构、选择合适的字段、索引优化、结合Redis缓存、主从分离、(无可奈何才用分区、分表、分库)mysql保存的数据格式是什么?安装mysql时选择的存储引擎是MYISAM的,则数据存储在.MYD文件中;选择
第15篇:数据库中间件高可用架构设计与容灾机制实现
厚衣服_3
数据库 中间件 java
15.1引言:中间件为何需要高可用?在大型分布式系统中,数据库中间件承担着请求路由、读写分离、分库分表、连接池管理等核心功能,一旦宕机或异常:上游服务SQL无法路由连接池失效造成连接雪崩多数据源切换不及时引发主备不一致因此,数据库中间件的高可用架构设计和容灾机制是保障业务连续性的关键。15.2高可用架构设计模式总览graphTDA[客户端]-->B[中间件实例1]A-->C[中间件实例2]A-->
ASM系列四 利用Method 组件动态注入方法逻辑
lijingyao8206
字节码技术 jvm AOP 动态代理 ASM
这篇继续结合例子来深入了解下Method组件动态变更方法字节码的实现。通过前面一篇,知道ClassVisitor 的visitMethod()方法可以返回一个MethodVisitor的实例。那么我们也基本可以知道,同ClassVisitor改变类成员一样,MethodVIsistor如果需要改变方法成员,注入逻辑,也可以
java编程思想 --内部类
百合不是茶
java 内部类 匿名内部类
内部类;了解外部类 并能与之通信 内部类写出来的代码更加整洁与优雅
1,内部类的创建 内部类是创建在类中的
package com.wj.InsideClass;
/*
* 内部类的创建
*/
public class CreateInsideClass {
public CreateInsideClass(
web.xml报错
crabdave
web.xml
web.xml报错
The content of element type "web-app" must match "(icon?,display-
name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,s
泛型类的自定义
麦田的设计者
java android 泛型
为什么要定义泛型类,当类中要操作的引用数据类型不确定的时候。
采用泛型类,完成扩展。
例如有一个学生类
Student{
Student(){
System.out.println("I'm a student.....");
}
}
有一个老师类
CSS清除浮动的4中方法
IT独行者
JavaScript UI css
清除浮动这个问题,做前端的应该再熟悉不过了,咱是个新人,所以还是记个笔记,做个积累,努力学习向大神靠近。CSS清除浮动的方法网上一搜,大概有N多种,用过几种,说下个人感受。
1、结尾处加空div标签 clear:both 1 2 3 4
.div
1
{
background
:
#000080
;
border
:
1px
s
Cygwin使用windows的jdk 配置方法
_wy_
jdk windows cygwin
1.[vim /etc/profile]
JAVA_HOME="/cgydrive/d/Java/jdk1.6.0_43" (windows下jdk路径为D:\Java\jdk1.6.0_43)
PATH="$JAVA_HOME/bin:${PATH}"
CLAS
linux下安装maven
无量
maven linux 安装
Linux下安装maven(转) 1.首先到Maven官网
下载安装文件,目前最新版本为3.0.3,下载文件为
apache-maven-3.0.3-bin.tar.gz,下载可以使用wget命令;
2.进入下载文件夹,找到下载的文件,运行如下命令解压
tar -xvf apache-maven-2.2.1-bin.tar.gz
解压后的文件夹
tomcat的https 配置,syslog-ng配置
aichenglong
tomcat http跳转到https syslong-ng配置 syslog配置
1) tomcat配置https,以及http自动跳转到https的配置
1)TOMCAT_HOME目录下生成密钥(keytool是jdk中的命令)
keytool -genkey -alias tomcat -keyalg RSA -keypass changeit -storepass changeit
关于领号活动总结
alafqq
活动
关于某彩票活动的总结
具体需求,每个用户进活动页面,领取一个号码,1000中的一个;
活动要求
1,随机性,一定要有随机性;
2,最少中奖概率,如果注数为3200注,则最多中4注
3,效率问题,(不能每个人来都产生一个随机数,这样效率不高);
4,支持断电(仍然从下一个开始),重启服务;(存数据库有点大材小用,因此不能存放在数据库)
解决方案
1,事先产生随机数1000个,并打
java数据结构 冒泡排序的遍历与排序
百合不是茶
java
java的冒泡排序是一种简单的排序规则
冒泡排序的原理:
比较两个相邻的数,首先将最大的排在第一个,第二次比较第二个 ,此后一样;
针对所有的元素重复以上的步骤,除了最后一个
例题;将int array[]
JS检查输入框输入的是否是数字的一种校验方法
bijian1013
js
如下是JS检查输入框输入的是否是数字的一种校验方法:
<form method=post target="_blank">
数字:<input type="text" name=num onkeypress="checkNum(this.form)"><br>
</form>
Test注解的两个属性:expected和timeout
bijian1013
java JUnit expected timeout
JUnit4:Test文档中的解释:
The Test annotation supports two optional parameters.
The first, expected, declares that a test method should throw an exception.
If it doesn't throw an exception or if it
[Gson二]继承关系的POJO的反序列化
bit1129
POJO
父类
package inheritance.test2;
import java.util.Map;
public class Model {
private String field1;
private String field2;
private Map<String, String> infoMap
【Spark八十四】Spark零碎知识点记录
bit1129
spark
1. ShuffleMapTask的shuffle数据在什么地方记录到MapOutputTracker中的
ShuffleMapTask的runTask方法负责写数据到shuffle map文件中。当任务执行完成成功,DAGScheduler会收到通知,在DAGScheduler的handleTaskCompletion方法中完成记录到MapOutputTracker中
WAS各种脚本作用大全
ronin47
WAS 脚本
http://www.ibm.com/developerworks/cn/websphere/library/samples/SampleScripts.html
无意中,在WAS官网上发现的各种脚本作用,感觉很有作用,先与各位分享一下
获取下载
这些示例 jacl 和 Jython 脚本可用于在 WebSphere Application Server 的不同版本中自
java-12.求 1+2+3+..n不能使用乘除法、 for 、 while 、 if 、 else 、 switch 、 case 等关键字以及条件判断语句
bylijinnan
switch
借鉴网上的思路,用java实现:
public class NoIfWhile {
/**
* @param args
*
* find x=1+2+3+....n
*/
public static void main(String[] args) {
int n=10;
int re=find(n);
System.o
Netty源码学习-ObjectEncoder和ObjectDecoder
bylijinnan
java netty
Netty中传递对象的思路很直观:
Netty中数据的传递是基于ChannelBuffer(也就是byte[]);
那把对象序列化为字节流,就可以在Netty中传递对象了
相应的从ChannelBuffer恢复对象,就是反序列化的过程
Netty已经封装好ObjectEncoder和ObjectDecoder
先看ObjectEncoder
ObjectEncoder是往外发送
spring 定时任务中cronExpression表达式含义
chicony
cronExpression
一个cron表达式有6个必选的元素和一个可选的元素,各个元素之间是以空格分隔的,从左至右,这些元素的含义如下表所示:
代表含义 是否必须 允许的取值范围 &nb
Nutz配置Jndi
ctrain
JNDI
1、使用JNDI获取指定资源:
var ioc = {
dao : {
type :"org.nutz.dao.impl.NutDao",
args : [ {jndi :"jdbc/dataSource"} ]
}
}
以上方法,仅需要在容器中配置好数据源,注入到NutDao即可.
解决 /bin/sh^M: bad interpreter: No such file or directory
daizj
shell
在Linux中执行.sh脚本,异常/bin/sh^M: bad interpreter: No such file or directory。
分析:这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。
解决:
1)在windows下转换:
利用一些编辑器如UltraEdit或EditPlus等工具
[转]for 循环为何可恨?
dcj3sjt126com
程序员 读书
Java的闭包(Closure)特征最近成为了一个热门话题。 一些精英正在起草一份议案,要在Java将来的版本中加入闭包特征。 然而,提议中的闭包语法以及语言上的这种扩充受到了众多Java程序员的猛烈抨击。
不久前,出版过数十本编程书籍的大作家Elliotte Rusty Harold发表了对Java中闭包的价值的质疑。 尤其是他问道“for 循环为何可恨?”[http://ju
Android实用小技巧
dcj3sjt126com
android
1、去掉所有Activity界面的标题栏
修改AndroidManifest.xml 在application 标签中添加android:theme="@android:style/Theme.NoTitleBar"
2、去掉所有Activity界面的TitleBar 和StatusBar
修改AndroidManifes
Oracle 复习笔记之序列
eksliang
Oracle 序列 sequence Oracle sequence
转载请出自出处:http://eksliang.iteye.com/blog/2098859
1.序列的作用
序列是用于生成唯一、连续序号的对象
一般用序列来充当数据库表的主键值
2.创建序列语法如下:
create sequence s_emp
start with 1 --开始值
increment by 1 --増长值
maxval
有“品”的程序员
gongmeitao
工作
完美程序员的10种品质
完美程序员的每种品质都有一个范围,这个范围取决于具体的问题和背景。没有能解决所有问题的
完美程序员(至少在我们这个星球上),并且对于特定问题,完美程序员应该具有以下品质:
1. 才智非凡- 能够理解问题、能够用清晰可读的代码翻译并表达想法、善于分析并且逻辑思维能力强
(范围:用简单方式解决复杂问题)
使用KeleyiSQLHelper类进行分页查询
hvt
sql .net C# asp.net hovertree
本文适用于sql server单主键表或者视图进行分页查询,支持多字段排序。KeleyiSQLHelper类的最新代码请到http://hovertree.codeplex.com/SourceControl/latest下载整个解决方案源代码查看。或者直接在线查看类的代码:http://hovertree.codeplex.com/SourceControl/latest#HoverTree.D
SVG 教程 (三)圆形,椭圆,直线
天梯梦
svg
SVG <circle> SVG 圆形 - <circle>
<circle> 标签可用来创建一个圆:
下面是SVG代码:
<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
<circle cx="100" c
链表栈
luyulong
java 数据结构
public class Node {
private Object object;
private Node next;
public Node() {
this.next = null;
this.object = null;
}
public Object getObject() {
return object;
}
public
基础数据结构和算法十:2-3 search tree
sunwinner
Algorithm 2-3 search tree
Binary search tree works well for a wide variety of applications, but they have poor worst-case performance. Now we introduce a type of binary search tree where costs are guaranteed to be loga
spring配置定时任务
stunizhengjia
spring timer
最近因工作的需要,用到了spring的定时任务的功能,觉得spring还是很智能化的,只需要配置一下配置文件就可以了,在此记录一下,以便以后用到:
//------------------------定时任务调用的方法------------------------------
/**
* 存储过程定时器
*/
publi
ITeye 8月技术图书有奖试读获奖名单公布
ITeye管理员
活动
ITeye携手博文视点举办的8月技术图书有奖试读活动已圆满结束,非常感谢广大用户对本次活动的关注与参与。
8月试读活动回顾:
http://webmaster.iteye.com/blog/2102830
本次技术图书试读活动的优秀奖获奖名单及相应作品如下(优秀文章有很多,但名额有限,没获奖并不代表不优秀):
《跨终端Web》
gleams:http