Java面试题剖析,不会也太惨了吧!+面试资料

2019-09-16 投稿人 : www.zoiofilmes.com 围观 : 1032 次

在采访中,我们经常在子库表上遇到几次采访和连环枪!我今天会告诉你的!我希望在面试时帮助你!

你为什么要划分库表?使用了哪个子类别中间件?不同的子库中间件有哪些优缺点?你如何垂直或水平地专门拆分数据库?

为什么要划分库表(在设计高并发系统时,应该如何设计数据库级别)?使用了哪个子类别中间件?不同的子库中间件有哪些优缺点?你如何垂直或水平地专门拆分数据库?

实际上,这篇文章必须是高并发性的,因为子库表必须支持高并发和大数据量。而现在说实话,特别是互联网公司的采访,基本上来了这个,子库表的一般技术问题,不要问是不是真的没有,如果你不知道那真是不可能说!

1.为什么要将库分成表格? (在设计高并发系统时,如何设计数据库级别?)

说白了,子库子表是两个不同的东西。你不能混淆他们。可能是光学子库没有划分表格,或者光学子计量表可能不划分图书馆。有可能的。

我会先为大家抛出一个场景。

如果我们现在是一家小型创业公司(或BAT公司刚刚出现的新部门),那么现在有20万注册用户,每天有10,000名活跃用户,每桌有1000个每日数据,然后每秒都达到峰值。并发请求最多可达10天。在这种系统上,只需找几年的工作经验,然后带上一些刚刚训练好的,你可以随心所欲。

结果,我们没想到我们的运气会如此之好。我们遇到了一位CEO,带领我们走上了商业道路。该业务发展迅速。几个月后,注册用户数已达到2000万!每天活跃用户数为100万!单个表的每日数据量为100,000!高峰期每秒的最大请求数为1000!与此同时,公司还进行了两轮融资,并赚了数亿元!该公司的估值达到了惊人的数十亿美元!这是小麒麟的节奏!

好吧,没什么,现在每个人都觉得压力已经有点大了,为什么?由于每天有超过100,000条数据,一个月内有超过300万条数据。现在我们在一个表中有数百万个数据,我们将立即突破1000万。但几乎无法控制它。峰值请求现在为1000.我们已在线部署了多台计算机,并且已完成负载平衡。数据库支持1000QPS也没关系。但现在每个人都开始感到有点担心,然后就会调整.

在接下来的几个月里,我的一天,CEO太强大,公司用户数已经达到1亿,并且公司继续筹集数十亿元人民币!该公司的估值达到了惊人的数十亿美元,成为今年中国最具实力的明星创业公司!天啊,我们太幸运了。

但是,我们同时也很不幸,因为此时每天的活跃用户数量是数千万,并且添加到单个表中的新数据的数量每天高达500,000。目前,一张表中的数据总量已达到20至3000万!忍不住了!数据库磁盘容量不断消耗!高峰期达到惊人的5000~8000!兄弟,别开玩笑吧。我向你保证,现在你的系统不受支持,并且已被挂断!

好的,所以你看到这里几乎是了解子库表的方式。事实上,随后是贵公司业务的发展。公司业务发展越好,用户越多,数据越多。大,请求越大,您就越不能容纳单个数据库。

分表

例如,您的表单上有数千万个数据。你确定可以随身携带吗?绝对不。单个表单中的数据量太大,这将极大地影响SQL执行的性能。之后,您的SQL可能会运行得非常慢。一般来说,根据我的经验,当单个表单达到数百万时,性能会相对较差,您将获得表格。

子表是什么意思?这是将表的数据放入多个表中,然后在查询时查找表。例如,通过根据用户ID划分表,将用户的数据放在表中。然后,您可以在操作时为用户操作该表。这可以控制每个表中可控范围内的数据量,例如,每个表固定在200万以内。

分库

分支是什么意思?这是你的图书馆。根据我们的经验,它最多可以支持并发2000。它必须扩大。此外,您最好将健康的单个库的并发值保持在每秒1000左右,而不是太大。然后,您可以将数据库拆分为多个库,并在访问时访问一个库。

这就是所谓的子数据库子表。为什么我们需要子数据库子表?你看。

2.您使用了哪些子数据库和子表中间件?不同的子数据库和子表中间件有哪些优缺点?

这实际上是为了看看你对子数据库和子表有什么样的中间件,以及每个中间件的优缺点是什么?那么您使用了哪些子数据库和子表中间件?

常见的包括:

CobarTDDLatlassharding-jdbcmycat

cobar

Ali b2b团队开发并开源,属于代理层解决方案,它位于应用服务器和数据库服务器之间。应用程序通过JDBC驱动程序访问cobar集群。 cobar根据SQL和子数据库规则分解SQL,然后将其分发到MySQL集群的不同数据库实例。它可以在早期使用,但近年来尚未更新。它基本上没用。这几乎是被抛弃的状态。它也不支持读写分离,存储过程,跨数据库连接和分页。

TDDL

由淘宝团队开发,属于客户端层解决方案。支持基本的crud语法和读写分离,但不支持连接,多表查询和其他语法。它目前尚未使用,因为它还依赖于淘宝的钻石配置管理系统。

atlas

360开源,属于代理层解决方案,曾经被一些公司使用,但是社区的最新维护是5年前的一个大问题。因此,目前使用的公司基本上很少。

sharding-jdbc

当它是开源时,它属于客户端层方案。它之前的确使用得更多,因为SQL语法支持也更多,没有太多限制,目前引入到2.0版本,支持子数据库分区,读写分离,分布式id生成,灵活事务(最大限度地发送)输入交易,TCC交易)。事实上,之前已经使用过更多的公司(这家公司在官方网站上注册,你可以看到许多公司从2017年到现在都在使用它),社区一直在开发和维护它。仍然相对活跃,个人认为这是一个现在可以选择的计划。

mycat

基于cobar变换,它属于代理层解决方案,支持的功能非常完善。目前,它应该是一个非常热门和流行的数据库中间件。社区非常活跃,一些公司开始使用它。但它比分片jdbc更年轻,而且经验不足。

总之,我们现在真正推荐的是sharding-jdbc和mycat,两者都可以考虑使用。

Sharding-jdbc该客户层解决方案无需部署,运营维护成本低,无需代理层的二级转发请求,性能高。但是,如果遇到升级,则必须重新升级和释放每个系统。每个系统都需要耦合sharding-jdbc依赖项;

mycat的代理层方案的缺点是它需要部署,并且一组中间件由它自己操作和操作。运营和维护成本很高,但优点是每个项目都是透明的。如果您遇到升级,您可以自己完成。它是。

一般来说,这两种方案都可以使用,但我个人建议中小型公司使用sharding-jdbc。客户层方案轻巧,维护成本低。不需要额外的工作人员,中小型公司的系统复杂性会降低,项目不是那么多;但是大中型企业最好使用像mycat这样的代理层方案,因为可能有很多大公司系统和项目,团队规模大,员工足够,那么最好是专攻个人研究。并维护mycat,然后可以直接和透明地使用大量项目。

3.如何专门垂直或水平拆分数据库?

水平分割的意思是将一个表的数据转换成多个库的多个表,但每个库的表结构是相同的,除了每个库表的数据不同外,所有库中的数据都是表中的数据加起来所有数据。水平分割的意义在于将更多数据均匀地放入库中,然后使用多个库来实现更高的并发性,并使用多个存储容量来扩展容量。

垂直拆分意味着将具有许多字段的表拆分为多个表或多个库。每个库表的结构不同,每个库表包含一些字段。通常,具有高访问频率的较少字段被放置在表中,并且具有较低访问频率的更多字段被放置在另一个表中。由于数据库是缓存的,因此访问的行越少,缓存中缓存的行越多,性能就越好。这通常在表级完成。

这很常见。我不一定要说你们很多人可能自己做过,拆开大型手表,订单,订单付款表和订单项目清单。

还有一个表级拆分,它是一个子表。将表转换为N个表是为了控制每个表的数据量在一定范围内,以确保SQL的性能。否则,单个表中的数据量越大,SQL性能越差。它通常是大约200万行,不是太多,但它取决于你如何操作,或者它可能是500万,或100万。 SQL越复杂,单表行越少越好。

好吧,无论子库还是子表,都可以支持上面提到的数据库中间件。基本上,那些中间件可以做你的子库子表。中间件可以根据您指定的某个字段值自动路由到相应的库,例如userid,然后自动路由到相应的表。

您必须考虑如何在项目中划分库?一般来说,纵向拆分,你可以在表级执行,在一些具有很多字段的字段上进行一些拆分;横向拆分,可以说并发负载不能承载,或者数据量太大,容量不能承受你给它拆分,根据什么字段拆除,你想一想;子表,你想想,如果你甚至拆分成每个库,并发和容量都没问题,但每个库的表仍然太大,那么你分表,分开表,并确保金额每个表中的数据不是很大。

有两种方法可以划分表格:

一种是按范围划分,这是每个库的连续数据。这通常基于例如时间范围,但这通常较少使用,因为它易于产生热问题,并且大量流量达到最新。数据已打开。或者根据字段哈希均匀分散,这更常见。

范围的优势在于扩展非常简单,因为您只需要准备,您可以每月准备一个图书馆,当您来到新的月份时,您自然会编写一个新的图书馆;缺点,但大多数请求都是访问最新数据。实际生产范围,视现场而定。

散列分布,优点是可以均匀分配每个库的数据量和请求压力;缺点是扩展更麻烦,会有一个数据迁移过程,以前的数据需要重新计算哈希值并重新分配到不同的库。或表。

http://anzhuo.zqw0011.com.cn