丰巢面试真题讲解系列-NO7

一.说说⼀致性hash?

一致性哈希(Consistent Hashing)是一种用于分布式计算中的哈希算法,主要用于解决节点动态加入和移除时对数据分布的影响问题。它通过将哈希空间映射到一个环状空间,并将数据和节点都映射到该环上,实现了节点和数据的动态负载均衡。

在一致性哈希算法中,每个节点通过哈希算法映射到环上的一个位置,当需要存储或查找数据时,通过哈希算法计算数据的哈希值,并将其映射到环上的一个位置。然后,算法会顺时针查找第一个大于等于该数据位置的节点,并将数据存储在该节点上。这种设计使得当节点加入或离开系统时,只有少量数据需要重新映射,大部分数据仍然可以在原来的位置上找到,从而减少了数据的迁移量。

一致性哈希算法相较于传统的hash算法,具有更好的动态扩缩容能力。在分布式系统中,当节点数量发生变化时,传统hash算法可能导致大量数据迁移,而一致性哈希算法则可以最小化这种迁移量,从而提高了系统的稳定性和性能。

1、⼀致性hash算法:我们的memcached客户端(这⾥我看的spymemcache的源码),使⽤了⼀致性hash算法ketama进⾏数据存储节点的选择。与常规的hash算法思路不同,只是对我们要存储数据的key进⾏hash计算,分配到不同节点存储。⼀致性hash算法是对我们要存储数据的服务器进⾏hash计算,进⽽确认每个key的存储位置。这⾥提到的⼀致性hash算法ketama的做法是:选择具体的机器节点不在只依赖需要缓存数据的key的hash本身了,⽽是机器节点本身也进⾏了hash运算。

 1、⼀致性hash算法是分布式系统中常⽤算法,设计⽬的是为了解决因特⽹中的热点(hot spot)问题。解决了P2P环境最为关键问题—如何在动态⽹络拓扑中分布存储和路由;

 2、⼀致性hash算法引⼊虚拟节点机制,解决服务节点少时数据倾斜问题(即对每⼀个服务节点计算多个哈希,每个计算结果位置都放置⼀个此服务节点,称为虚拟节点。);

2、具体做法:如果有⼀个写⼊缓存的请求,其中Key值为K,计算器hash值Hash(K), Hash(K) 对应于图 – 1环中的某⼀个点,如果该点对应没有映射到具体的某⼀个机器节点,那么顺时针查找,直到第⼀次找到有映射机器的节点,该节点就是确定的⽬标节点,如果超过了2^32仍然找不到节点,则命中第⼀个机器节点。⽐如 Hash(K) 的值介于A~B之间,那么命中的机器节点应该是B节点

3、数据保存流程:

 1、⾸先求出memcached服务器(节点)的哈希值,并将其配置到0~232的圆(continuum)上。

 2、然后采⽤同样的⽅法求出存储数据的键的哈希值,并映射到相同的圆上。

 3、然后从数据映射到的位置开始顺时针查找,将数据保存到找到的第⼀个服务器上。如果超过232仍然找不到服务器,就会保存到第⼀台memcached服务器上。

 

二.对webservice有什么了解?

WebService,顾名思义就是基于Web的服务。它使⽤Web(HTTP)⽅式,接收和响应外部系统的某种请求。从⽽实现远程调⽤.

我们可以调⽤互联⽹上查询天⽓信息Web服务,然后将它嵌⼊到我们的程序(C/S或B/S程序)当中来,当⽤户从我们的⽹点看到天⽓信息时,他会认为我们为他提供了很多的信息服务,但其实我们什么也没有做,只是简单调⽤了⼀下服务器上的⼀段代码⽽已。

学习WebService可以将你的服务(⼀段代码)发布到互联⽹上让别⼈去调⽤,也可以调⽤别⼈机器上发布的WebService,就像使⽤⾃⼰的代码⼀样.。

三.mysql如何进⾏分表分库?

MySQL 的分表分库是一种常见的数据库架构优化手段,主要用于解决单一数据库或单一表在数据量巨大、读写请求频繁时出现的性能瓶颈问题。下面将介绍 MySQL 分表分库的基本思路和常用方法。

分表

分表是将一个大数据量的表按照一定的规则拆分成多个小表的过程。

1. 垂直分表

垂直分表是将一个宽表(列数很多)按照列进行拆分,将经常一起使用的列放在一个表中,而将不经常使用的列放在另一个表中。这样可以减小表的宽度,提高查询效率。

2. 水平分表

水平分表是将一个表中的记录按照某种规则(如范围、哈希等)拆分到多个表中。每个表的结构都是相同的,但包含的数据不同。水平分表可以有效地分散IO负载,提高并发性能。

分库

分库是将数据按照业务或功能划分到不同的数据库实例中。每个数据库实例可以部署在不同的物理服务器上,以实现负载均衡和故障隔离。

1. 按照业务分库

根据业务模块的不同,将相关的数据表分到不同的数据库中。例如,用户数据可以放在一个数据库中,订单数据可以放在另一个数据库中。

2. 按照地区分库

对于具有地域特性的应用,可以按照地区将数据分到不同的数据库中。例如,中国的数据放在一个数据库中,美国的数据放在另一个数据库中。

实现分表分库的方法

1. 手动分表分库

根据业务需求,手动编写 SQL 语句或使用数据库管理工具来创建多个表或数据库,并编写业务代码来路由到相应的表或数据库。这种方法需要较高的维护成本,但灵活性较高。

2. 使用中间件

使用如 Sharding-JDBC、MyCAT 等数据库中间件来实现分表分库。这些中间件提供了丰富的分表分库策略和功能,可以简化分表分库的实现过程,并提供了更好的性能和稳定性。

⼀般就是垂直切分和⽔平切分,这是⼀种结果集描述的切分⽅式,是物理空间上的切分。 我们从⾯临的问题,开始解决,阐述:

⾸先是⽤户请求量太⼤,我们就堆机器搞定(这不是本⽂重点)。

然后是单个库太⼤,这时我们要看是因为表多⽽导致数据多,还是因为单张表⾥⾯的数据多。 如果是因为表多⽽数据多,使⽤垂直切分,根据业务切分成不同的库。

如果是因为单张表的数据量太⼤,这时要⽤⽔平切分,即把表的数据按某种规则切分成多张表,甚⾄多个库上的多张表。 分库分表的顺序应该是先垂直分,后⽔平分。 因为垂直分更简单,更符合我们处理现实世界问题的⽅式。

四.你们如何和前端进⾏接⼝联调?

1. 开发前先定义好接⼝⽂档;

2. 开发时严格按照接⼝⽂档开发;

3. 如接⼝有调整需及时告知前端;

4. 开发完成之后联调测试,保证业务逻辑正常。

五.说说你平时遇到的重⼤难题或者挑战,以及你解决问题的思路和流程。

平时关注⼀下公司线上问题的解决⽅案。

 

  • 5
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

纵然间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值