分布式-面试题

目录

    • 1.电商行业特点
    • 2.分布式项目
      • 2.1 设计思想
      • 2.2 如何管理jar包
      • 2.3 如何管理工具类
    • 3.Nginx是什么?它的作用
    • 4.谈一下反向代理和负载均衡
      • 4.1反向代理
      • 4.2正向代理
      • 4.3负载均衡
    • 5.数据库数据如何备份(数据备份策略)
    • 8.什么是Mycat
    • 9.Redis
      • 9.1 什么是Redis,运行在哪里
      • 9.2 Redis中的数据持久化策略
          • RDB模式
          • AOF模式
      • 9.3 redis为什么要分片
      • 9.4 一致性Hash算法
        • 9.4.1 缓存雪崩现象
        • 9.4.2 原理
        • 9.4.3 特性
        • 9.4.4 一致性hash的重点
        • 9.4.5 Redis的一致性哈希实现
      • 9.5 哨兵机制怎么实现的,实现了什么功能
      • 9.6 哨兵和分片的优缺点
    • 10 跨域问题
      • 10.1 同源策略
      • 10.2 什么是跨域?
      • 10.3 怎么解决跨域问题?
          • JSONP
          • CORS
    • 11.HttpClient
    • 12.SSO
      • 12.1 你的单点登录是怎么调用的(实现原理)
      • 12.2 如何实现的单点登录SSO
    • 13.Dubbo框架
      • 13.1 你怎么理解SOA(面向服务)
      • 13.2 什么是dubbo框架
      • 13.3 Dubbo框架组件说明
      • 13.4 注册中心的工作原理
      • 13.5 Dubbo 负载均衡策略

1.电商行业特点

  1. 分布式
    垂直拆分:根据功能模块进行拆分;
    水平拆分:根据业务层级进行拆分。
  2. 高并发
    用户单位时间内访问服务器数量,是电商行业中面临的主要问题。
  3. 集群
    抗击高并发的有效手段,同时集群内部实现高可用。
  4. 海量数据处理
    随着公司数据的不断积累,自身的数据量很庞大。

2.分布式项目

2.1 设计思想

为了实现架构之间的松耦合,将项目根据分布式的思想进行拆分。

  1. 项目的垂直拆分
    根据功能模块的不同将项目进行拆分。
  2. 项目的水平拆分
    在大型项目中,由于开发的人数众多,项目复杂度高。为了保证项目开发的耦合性低,实现项目的水平拆分。
    将一个大型项目根据层级模块进行拆分:Controller项目/Service项目/Mapper项目,项目创建时采用聚合项目的方式进行管理。

2.2 如何管理jar包

问题描述:往常进行开发都是将所有的业务都包含在一个项目中,这样我们项目所需要的所有jar包都在一个项目下进行管理。但是如果是多个项目共同开发,怎么管理jar包?

将项目中用到的公共的jar包抽取为一个单独的项目xx-parent,其他的项目只需要继承xx-parent项目,就可获取对应的jar包依赖。从而实现了jar包的统一管理。

2.3 如何管理工具类

问题描述:大型项目中经常会用到一些工具类,如果每个项目都单独引入工具类会造成代码维护的不方便,怎样对工具类进行管理?

可以将工具类抽取为单独的项目xx-common,如果开发时需要用到工具类,只需要将工具类像引用maven的依赖包一样,添加工具类的jar包文件依赖即可。

3.Nginx是什么?它的作用

Nginx (engine x) 是一个轻量级的、高性能的HTTP和反向代理服务器。
其特点是占有内存少,并发能力强。
主要用来反向代理和实现负载均衡。

4.谈一下反向代理和负载均衡

4.1反向代理

反向代理服务器位于用户与目标服务器之间,但是对于用户而言,反向代理服务器就相当于目标服务器,即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时,用户不需要知道目标服务器的地址,也无须在用户端作任何设定。反向代理服务器通常可用来作为Web加速,即使用反向代理作为Web服务器的前置机来降低网络和服务器的负载,提高访问效率。

  • 反向代理服务器位于目标服务器与用户之间.
  • 对于用户而言,反向代理服务器就是目标服务器.
  • 用户访问时根本不清楚真实的服务器资源是谁,保护了真实服务器资源信息.
  • 反向代理服务器一般是服务器端代理,保护真实服务器信息.
    分布式-面试题_第1张图片
    过程:Nginx首先需要监听特定的域名,当用户根据域名进行资源访问时,首先会访问nginx,之后nginx代替请求者根据内部的配置文件,实现虚拟地址与本地磁盘地址之间的映射关系,实现反向代理,将请求转化为特定的请求路径进行资源访问;当Nginx获取资源后将数据返回给用户完成请求,正确响应。

4.2正向代理

正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。

  • 代理服务器位于用户与服务器之间
  • 用户发起请求时,清楚的知道自己访问的真实服务器是谁.
  • 代理服务器将用户的请求转交给服务器获取数据.
  • 正向代理是客户端代理,保护了用户的信息.

一般用户网络通信的使用:路由器
分布式-面试题_第2张图片

4.3负载均衡

在分布式条件下,为了提高用户请求的响应能力,准备多台服务器.一起抗击高并发.需要用户通过同一个网址访问不同服务器的技术称之为负载均衡机制.
访问量高时,可以让服务器尽量分摊压力.

  • 负载均衡策略:轮询 权重 IPHash
    分布式-面试题_第3张图片

5.数据库数据如何备份(数据备份策略)

1.冷备份:定期将数据库中的文件进行转储,定期进行数据备份.

2.热备份:搭建数据库主从结构,当主库数据发生改变时,从库根据主库的二进制日志文件进行备份.可以保证数据的实时备份.

  • 原理:数据库主库将更新的数据信息写入到二进制日志文件中;从库通过IO线程去读取该文件,之后将数据写入到中继日志中;从库中的Sql线程会读取中继日志中的信息,将该信息写入从数据库中,实现数据的同步。并且为了降低组件之间的耦合性,采用异步的方式处理。

3.双机热备:数据库互为主从,数据库代理服务器对主库进行心跳检测,实现数据的高可用,为了防止主库宕机后发生雪崩现象

  • 数据库高可用:当其中有一台数据库宕机之后,用户依然可以正确的访问数据库不受任何影响,(实现了故障迁移).主要数据库能够正常的工作,则重新启动数据库之后则可以实现自动的数据的同步.

8.什么是Mycat

一个数据库中间件,实现读写分离,分库分表和数据库故障迁移.

9.Redis

9.1 什么是Redis,运行在哪里

Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)等。

Redis基于C语言开发,运行在内存中,运行速度很快。

9.2 Redis中的数据持久化策略

Redis的数据都保存在内存中,如果断电或者宕机,会导致数据的丢失.为了防止数据丢失,Redis内部有持久化机制.

如果使用时允许丢失部分数据(少量的),则使用RDB模式,效率高,也是redis默认的策略;如果不允许丢失数据,则采用AOF模式,安全性高,但是效率较低;也可以2种方式都选, 搭建主从结构 , 主机选用RDB模式, 从机选用AOF模式。

RDB模式
  • redis中默认的持久化策略.
  • 定期持久化,保存的是Redis中的内存数据快照,持久化文件占用空间较小.
  • 可能导致内存数据丢失
AOF模式
  • 默认条件下是关闭状态,如果需要开启则需要修改配置文件.
  • 可以实现数据的实时持久化操作,AOF模式记录的是用户的操作过程.
  • 只要开启了AOF模式,则持久化方式以AOF模式为主.

9.3 redis为什么要分片

准备多台redis,共同为用户提供缓存服务。在保证效率的前提下,实现了内存的扩容.

数据存储机制:
分布式-面试题_第4张图片

9.4 一致性Hash算法

9.4.1 缓存雪崩现象

一共有四台服务器S1-S4,将用户请求拼接key通过hash%N获取指定服务器并将请求转发至该服务器;倘若S3因磁盘故障而宕机,此时N=3,如果作为缓存使用,S3上所有的key都丢失了,原本存放在其他服务器如S2上的key=aaa使用新的N计算被转发给另外的服务器如S1,由于S1中找不到aaa的数据,这样aaa也丢失…牵一发而动全身,在缓存场景中会造成缓存击穿,如果量很大就会造成缓存雪崩。

9.4.2 原理

目的:解决数据如何在分布式环境下进行存储!!!
hash取值区间: 8位16进制数 共有 2^32种可能性

  • 哈希环分片
    一致性哈希算法将N设置为2^32,形成了一个哈希环。在将数据key进行hash计算后就落在此环上;将服务器结点也作为一种key分发到哈希环上,如下图。
    分布式-面试题_第5张图片
    一致性哈希算法使用顺时针方法实现结点对哈希环shard的归属。但是由于服务器结点的数量相比2^32会非常少,服务节点分布不均,造成机器负载失衡。就将服务器结点根据某种规则来虚拟出更多结点,把这些虚拟节点就相当于服务器的分身。

9.4.3 特性

  • 目的:解决数据如何在分布式环境下进行存储
  • 特性:
    1.均衡性:指hash的结果应平均分配到各个节点,从算法上解决了负载均衡问题 。 利用虚拟节点实现数据平衡 (平衡数据不能做到绝对平均,只能是相对的)。
    2.单调性:指在新增或者删减节点时,实现数据的动态迁移。
    3.分散性:指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据 。
    4.负载:是分散性另一种表现形式.表现为一个位置有多个key。

9.4.4 一致性hash的重点

  • 大量固定数量的小数据块的分片
    将普通哈希取模的N固定,确保相同的key进行计算后是相同的位置。
  • 小分片的服务器归属问题
    通过虚拟节点的引入,将以前服务器宕机后造成数据大量迁移的情况降低为少量数据的移动。

9.4.5 Redis的一致性哈希实现

Redis cluster 拥有固定的16384个slot,slot是虚拟的且被分布到各个master中,当key 映射到某个master 负责slot时,就由对应的master为key 提供服务。

每个Master节点都维护着一个位序列bitmap为16384/8字节,也就是Master使用bitmap的原理来表征slot的下标,Master 节点通过 bit 来标识哪些槽自己是否拥有,比如对于编号为1的槽,Master只要判断序列的第二位是不是为1即可。这样就建立了分片和服务结点的所属关系。
分布式-面试题_第6张图片

9.5 哨兵机制怎么实现的,实现了什么功能

  • 哨兵机制:
    Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
    监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
    提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
    自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。
  • 功能:实现redis高可用
  • 机制:心跳检测
    分布式-面试题_第7张图片

9.6 哨兵和分片的优缺点

  • 优点:
    1.分片可以使redis动态内存扩容.
    2.分片可以将数据均匀的分配到不同的节点中,使数据分散保存.
    3.哨兵可以实现redis高可用.
  • 缺点:
    1.分片如果有一个节点出现宕机则整个分片都不能正常使用.
    2.哨兵如果发生宕机现象,则影响整个redis服务.
  • 升级:
    1.使用多台redis实现内存空间的动态扩容.
    2.实现在redis内存实现高可用(不再使用哨兵机制)使用组件(ruby)
    搭建集群,实现分片和高可用的全部功能.

10 跨域问题

10.1 同源策略

浏览器在发起AJAX请求时,必须遵守同源策略(协议://域名:端口都和当前页面相同)的规定.否则数据无法正常解析。
若有一项不同,则表示跨域访问.浏览器不予解析返回值结果。.

10.2 什么是跨域?

当浏览器解析ajax时,ajax发起请求的地址如果与当前页面所在的地址违反同源策略时,则称之为跨域(请求)。

10.3 怎么解决跨域问题?

JSONP

JSONP是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的

你可能感兴趣的:(面试,分布式)